summaryrefslogtreecommitdiff
path: root/rrdformat/format.go
blob: ca0c459078b2bd99afbe32f9d087dfaad4e0db85 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package rrdformat

import (
	"time"

	"git.lukeshu.com/go/librrd/rrdformat/rrdbinary"
)

// File format versions:
//
// For the most part, the layout of the file format hasn't
// changed--the version number just indicates which enum members you
// need to support.  The only parser-breaking change is that the
// 0002->0003 transition added a few bytes to the timestamp, in order
// to go from second-precision to microsecond-precision.
//
//  - "0005" (added in rrdtool 1.5.0, 2015-04-16)
//    * added DST_DCOUNTER
//    * added DST_DDERIVE
//    * otherwise identical to "0004"
//
//  - "0004" (added in rrdtool 1.3.0, 2008-06-10)
//    * added MHWPREDICT function
//    * otherwise identical to "0003"
//
//  - "0003" (added in the unreleased rrdtool 1.1.x in 2003,
//            present in rrdtool 1.2.0, 2005-04-25)
//    * last-updated timestamp gained a `long` microsecond component
//    * otherwise identical to "0002"
//
//  - "0002" (never used by a stable release of rrdtool, but was used
//            by development versions of 1.1.x 2001-2003)
//    * added DST_CDEF
//    * added CF_HWPREDICT
//    * added CF_SEASONAL
//    * added CF_DEVPREDICT
//    * added CF_DEVSEASONAL
//    * added CF_FAILURES
//
//  - "0001" (the original in rrdtool 1.0.0, 1999-07-15)
const (
	RRD_VERSION1 = "0001"
	RRD_VERSION2 = "0002"
	RRD_VERSION3 = "0003"
	RRD_VERSION4 = "0004"
	RRD_VERSION5 = "0005"
)

type Value = rrdbinary.Double

type Header struct {
	Cookie      rrdbinary.String     `rrdbinary:"size=4" xml:"-"`
	Version     rrdbinary.String     `rrdbinary:"size=5" xml:"version"`
	FloatCookie rrdbinary.Double     `xml:"-"`
	DSCnt       rrdbinary.ULong      `xml:"-"`
	RRACnt      rrdbinary.ULong      `xml:"-"`
	PDPStep     rrdbinary.ULong      `xml:"step"`
	Parameters  [10]rrdbinary.Unival `xml:"-"`
}

// Data Source Types
const (
	DST_COUNTER  = "COUNTER"  // version >= RRD_VERSION1
	DST_ABSOLUTE = "ABSOLUTE" // version >= RRD_VERSION1
	DST_GAUGE    = "GAUGE"    // version >= RRD_VERSION1
	DST_DERIVE   = "DERIVE"   // version >= RRD_VERSION1
	DST_CDEF     = "CDEF"     // version >= RRD_VERSION2
	DST_DCOUNTER = "DCOUNTER" // version >= RRD_VERSION5
	DST_DDERIV   = "DDERIV"   // version >= RRD_VERSION5
)

type DSDef struct {
	DSName     rrdbinary.String     `rrdbinary:"size=20" xml:"name"`
	DSType     rrdbinary.String     `rrdbinary:"size=20" xml:"type"`
	Parameters [10]rrdbinary.Unival `xml:"params>item"`
}

type RRADef struct {
	CFName     rrdbinary.String     `rrdbinary:"size=20" xml:"cf"`
	RowCnt     rrdbinary.ULong      `xml:"-"`
	PDPCnt     rrdbinary.ULong      `xml:"pdp_per_row"`
	Parameters [10]rrdbinary.Unival `xml:"params>item"`
	CDPPrep    *CDPPrep             `rrdbinary:"-" xml:"cdp_prep"`
	Database   [][]Value            `rrdbinary:"-" xml:"database>row>v"`
}

type TimeWithUsec struct {
	Sec  rrdbinary.Time
	Usec rrdbinary.Long // signed, but always >= 0 (version >= RRD_VERSION3)
}

func (ts TimeWithUsec) Time() time.Time {
	return time.Unix(int64(ts.Sec), int64(ts.Usec)*1000)
}

type PDPPrep struct {
	LastDS  rrdbinary.String `rrdbinary:"size=30"`
	Scratch [10]rrdbinary.Unival
}

type CDPPrep struct {
	Scratch [10]rrdbinary.Unival
}

type RRAPtr struct {
	CurRow rrdbinary.ULong
}

type RRD struct {
	Architecture rrdbinary.Architecture `rrdbinary:"-" xml:"-"`
	Header       Header
	DSDefs       []DSDef  // .Header.DSCnt
	RRADefs      []RRADef // .Header.RRACnt
	LastUpdated  TimeWithUsec
	PDPPreps     []PDPPrep // .Header.DSCnt
	CDPPreps     []CDPPrep // .Header.DSCnt * .Header.RRACnt
	RRAPtrs      []RRAPtr  // .Header.RRACnt
	Values       []Value   // Σ .RRADefs[i].RowCnt*.Header.DSCnt
}