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 }