pax_global_header00006660000000000000000000000064126740666540014532gustar00rootroot0000000000000052 comment=b5dddb1667dcc1e6355b9305e2c1608a2db6983c gollectd-1.0.0/000077500000000000000000000000001267406665400133255ustar00rootroot00000000000000gollectd-1.0.0/.gitignore000066400000000000000000000004121267406665400153120ustar00rootroot00000000000000# Compiled Object files, Static and Dynamic libs (Shared Objects) *.o *.a *.so # Folders _obj _test # Architecture specific extensions/prefixes *.[568vq] [568vq].out *.cgo1.go *.cgo2.c _cgo_defun.c _cgo_gotypes.go _cgo_export.* _testmain.go *.exe *.test *.prof gollectd-1.0.0/CHANGELOG.md000066400000000000000000000001341267406665400151340ustar00rootroot00000000000000Changelog --------- 1.0.0 ===== * [issue #8] Maintain tags and versions * Add a changelog gollectd-1.0.0/LICENSE000066400000000000000000000027471267406665400143440ustar00rootroot00000000000000Copyright (c) 2014, Kimo Rosenbaum and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the owner nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. gollectd-1.0.0/README.md000066400000000000000000000010731267406665400146050ustar00rootroot00000000000000gollectd ======== This is yet another implementation of a [collectd binary protocol](https://collectd.org/wiki/index.php/Binary_protocol) parser in [Go](http://golang.org/), heavenly inspired by [gocollectd](https://github.com/paulhammond/gocollectd). Installation ------------ `go get github.com/kimor79/gollectd` Usage ----- ``` import ( collectd github.com/kimor79/gollectd ) types, err := collectd.TypesDBFile("/path/to/types.db") buffer := make([]byte, 1452) n, _, err := socket.ReadFromUDP(buffer) packets, err := collectd.Packets(buffer[:n], types) ``` gollectd-1.0.0/examples/000077500000000000000000000000001267406665400151435ustar00rootroot00000000000000gollectd-1.0.0/examples/parse_typesdb/000077500000000000000000000000001267406665400200075ustar00rootroot00000000000000gollectd-1.0.0/examples/parse_typesdb/parse_typesdb.go000066400000000000000000000007121267406665400232020ustar00rootroot00000000000000package main import ( "flag" "fmt" "os" collectd "github.com/kimor79/gollectd" ) func main() { typesPath := flag.String("typesdb", "", "Path to types.db") flag.Parse() if *typesPath == "" { flag.Usage() os.Exit(1) } types, err := collectd.TypesDBFile(*typesPath) if err != nil { fmt.Printf("%s\n", err) os.Exit(1) } for k, pv := range types { fmt.Printf("%s:\n", k) for _, v := range pv { fmt.Printf("\t%+v\n", *v) } } } gollectd-1.0.0/examples/server.go000066400000000000000000000022751267406665400170060ustar00rootroot00000000000000package main import ( "fmt" "log" "net" collectd "github.com/kimor79/gollectd" ) // Listen for collectd network packets, parse , and send them over a channel func Listen(addr string, c chan collectd.Packet, typesdb string) { laddr, err := net.ResolveUDPAddr("udp", addr) if err != nil { log.Fatalln("fatal: failed to resolve address", err) } conn, err := net.ListenUDP("udp", laddr) if err != nil { log.Fatalln("fatal: failed to listen", err) } types, err := collectd.TypesDBFile(typesdb) if err != nil { log.Fatalln("fatal: failed to parse types.db", err) } for { // 1452 is collectd 5's default buffer size. See: // https://collectd.org/wiki/index.php/Binary_protocol buf := make([]byte, 1452) n, err := conn.Read(buf[:]) if err != nil { log.Println("error: Failed to receive packet", err) continue } packets, err := collectd.Packets(buf[0:n], types) if err != nil { log.Println("error: Failed to receive packet", err) continue } for _, p := range *packets { c <- p } } } func main() { c := make(chan collectd.Packet) go Listen("127.0.0.1:25826", c, "/usr/share/collectd/types.db") for { packet := <-c fmt.Printf("%+v\n", packet) } } gollectd-1.0.0/gollectd.go000066400000000000000000000167031267406665400154600ustar00rootroot00000000000000// Parse data from the collectd network plugin // This is modeled after collectd's own network.c package gollectd import ( "bytes" "encoding/binary" "errors" "fmt" "io/ioutil" "strings" ) const ( TypeCounter = 0 TypeGauge = 1 TypeDerive = 2 TypeAbsolute = 3 ) const ( // Values taken from commit 633c3966f7 of // https://github.com/collectd/collectd/commits/master/src/network.h ParseHost = 0x0000 ParseTime = 0x0001 ParsePlugin = 0x0002 ParsePluginInstance = 0x0003 ParseType = 0x0004 ParseTypeInstance = 0x0005 ParseValues = 0x0006 ParseInterval = 0x0007 ParseTimeHR = 0x0008 ParseIntervalHR = 0x0009 // Notifications ParseMessage = 0x0100 ParseSeverity = 0x0101 ParseSignature = 0x0200 ParseEncryption = 0x0210 ) var ErrorInvalid = errors.New("Invalid packet") var ErrorUnsupported = errors.New("Unsupported packet") var ErrorUnknownType = errors.New("Unknown value type") var ErrorUnknownDataType = errors.New("Unknown data source type") var ValueTypeNames = map[string]uint8{ "absolute": TypeAbsolute, "counter": TypeCounter, "derive": TypeDerive, "gauge": TypeGauge, } var ValueTypeValues = map[uint8]string{ TypeAbsolute: "absolute", TypeCounter: "counter", TypeDerive: "derive", TypeGauge: "gauge", } type Packet struct { Hostname string Interval uint64 IntervalHR uint64 Plugin string PluginInstance string Time uint64 TimeHR uint64 Type string TypeInstance string Values []Value } type Type struct { Name string Type uint8 Min string Max string } type Types map[string][]*Type type Value struct { Name string Type uint8 TypeName string Value float64 } func (p Packet) FormatName() string { metricName := p.Hostname + "/" + p.Plugin if len(p.PluginInstance) > 0 { metricName += "-" + p.PluginInstance } metricName += "/" + p.Type if len(p.TypeInstance) > 0 { metricName += "-" + p.TypeInstance } return metricName } func Packets(b []byte, types Types) (*[]Packet, error) { packets := make([]Packet, 0) buf := bytes.NewBuffer(b) var packetHeader struct { PartType uint16 PartLength uint16 } var err error var packet Packet var time uint64 var valueCount uint16 var valueTypes []uint8 for buf.Len() > 0 { partType := buf.Next(2) if len(partType) < 2 { return nil, ErrorInvalid } packetHeader.PartType = binary.BigEndian.Uint16(partType) partLength := buf.Next(2) if len(partLength) < 2 { return nil, ErrorInvalid } packetHeader.PartLength = binary.BigEndian.Uint16(partLength) if packetHeader.PartLength < 5 { return nil, ErrorInvalid } nextPos := int(packetHeader.PartLength) - 4 partBytes := buf.Next(nextPos) if len(partBytes) < nextPos { return nil, ErrorInvalid } partBuffer := bytes.NewBuffer(partBytes) switch packetHeader.PartType { case ParseEncryption: return nil, ErrorUnsupported case ParseHost: str := partBuffer.String() packet.Hostname = str[0 : len(str)-1] case ParseInterval: err = binary.Read(partBuffer, binary.BigEndian, &time) if err != nil { return nil, err } packet.Interval = time case ParseIntervalHR: err = binary.Read(partBuffer, binary.BigEndian, &time) if err != nil { return nil, err } packet.IntervalHR = time case ParseMessage: // ignore (notification) case ParsePlugin: str := partBuffer.String() packet.Plugin = str[0 : len(str)-1] case ParsePluginInstance: str := partBuffer.String() packet.PluginInstance = str[0 : len(str)-1] case ParseSeverity: // ignore (notification) case ParseSignature: return nil, ErrorUnsupported case ParseTime: err = binary.Read(partBuffer, binary.BigEndian, &time) if err != nil { return nil, err } packet.Time = time case ParseTimeHR: err = binary.Read(partBuffer, binary.BigEndian, &time) if err != nil { return nil, err } packet.TimeHR = time case ParseType: str := partBuffer.String() packet.Type = str[0 : len(str)-1] case ParseTypeInstance: str := partBuffer.String() packet.TypeInstance = str[0 : len(str)-1] case ParseValues: err = binary.Read(partBuffer, binary.BigEndian, &valueCount) if err != nil { return nil, err } valueTypes = make([]uint8, valueCount, valueCount) packet.Values = make([]Value, valueCount, valueCount) var packetValue Value err = binary.Read(partBuffer, binary.BigEndian, &valueTypes) if err != nil { return nil, err } for i, t := range valueTypes { packetValue.Type = t if typeName, ok := ValueTypeValues[t]; ok { packetValue.TypeName = typeName } if _, ok := types[packet.Type]; ok { packetValue.Name = types[packet.Type][i].Name } switch t { case TypeAbsolute: var value uint64 err = binary.Read(partBuffer, binary.BigEndian, &value) if err != nil { return nil, err } packetValue.Value = float64(value) case TypeCounter: var value uint64 err = binary.Read(partBuffer, binary.BigEndian, &value) if err != nil { return nil, err } packetValue.Value = float64(value) case TypeDerive: var value int64 err = binary.Read(partBuffer, binary.BigEndian, &value) if err != nil { return nil, err } packetValue.Value = float64(value) case TypeGauge: var value float64 err = binary.Read(partBuffer, binary.LittleEndian, &value) if err != nil { return nil, err } packetValue.Value = float64(value) default: return nil, ErrorUnknownType } packet.Values[i] = packetValue } packets = append(packets, packet) default: // Ignore unknown fields } } return &packets, nil } func TypesDBFile(path string) (Types, error) { // See https://collectd.org/documentation/manpages/types.db.5.shtml b, err := ioutil.ReadFile(path) if err != nil { return nil, err } return TypesDB(b) } func TypesDB(b []byte) (Types, error) { types := make(Types) content := string(b) lines := strings.Split(content, "\n") for i, line := range lines { line = strings.TrimSpace(line) // Skip empty & comment lines if line == "" || line[0] == '#' { continue } dataSetName, dataSetSources, err := ParseDataSet(line) if err != nil { return nil, fmt.Errorf("Line %d: %s", i+1, err.Error()) } types[dataSetName] = dataSetSources } return types, nil } // ParseDataSet parses one line from a collectd types.db file and returns // the data-set name & a Type struct func ParseDataSet(s string) (string, []*Type, error) { splitFn := func(c rune) bool { return c == '\t' || c == ' ' || c == ',' } fields := strings.FieldsFunc(s, splitFn) if len(fields) < 2 { return "", nil, fmt.Errorf("Minimum of 2 fields required \"%s\"", s) } dataSetName := fields[0] dataSetSources := make([]*Type, len(fields[1:])) // Parse each data source for i, field := range fields[1:] { // Split data source fields dsFields := strings.Split(field, ":") if len(dsFields) != 4 { return "", nil, fmt.Errorf("Exactly 4 fields required \"%s\"", field) } // Parse data source type dsTypeStr := strings.ToLower(dsFields[1]) dsType, ok := ValueTypeNames[dsTypeStr] if !ok { return "", nil, fmt.Errorf("Invalid data-source type \"%s\"", dsTypeStr) } dataSetSources[i] = &Type{ Name: dsFields[0], Type: dsType, Min: dsFields[2], Max: dsFields[3], } } return dataSetName, dataSetSources, nil } gollectd-1.0.0/gollectd_test.go000066400000000000000000000573731267406665400165270ustar00rootroot00000000000000package gollectd import ( "encoding/hex" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) type FormatTests struct { Description string Expected string Packet Packet } var formatTests = []FormatTests{ { Description: "leeloo/cpu-0/cpu-idle", Expected: "leeloo/cpu-0/cpu-idle", Packet: Packet{ Hostname: "leeloo", Plugin: "cpu", PluginInstance: "0", Type: "cpu", TypeInstance: "idle", }, }, { Description: "alyja/memory/memory-used", Expected: "alyja/memory/memory-used", Packet: Packet{ Hostname: "alyja", Plugin: "memory", Type: "memory", TypeInstance: "used", }, }, { Description: "wanda/disk-hdc1/disk_octets", Expected: "wanda/disk-hdc1/disk_octets", Packet: Packet{ Hostname: "wanda", Plugin: "disk", PluginInstance: "hdc1", Type: "disk_octets", }, }, { Description: "leeloo/load/load", Expected: "leeloo/load/load", Packet: Packet{ Hostname: "leeloo", Plugin: "load", Type: "load", }, }, } func TestFormat(t *testing.T) { assert := assert.New(t) for _, test := range formatTests { got := test.Packet.FormatName() assert.Equal(test.Expected, got, test.Description) } } func TestTypesDB(t *testing.T) { typedb, err := TypesDB(TypesDBData) if err != nil { t.Error(err) } dataSources, ok := typedb["compression"] if !ok { t.Error(`"compression" not found`) } found := len(dataSources) expected := 2 if found != expected { t.Errorf("found %d datasources; expected %d", found, expected) return } ds := dataSources[0] if ds.Name != "uncompressed" { t.Errorf("ds.Name = %s; expected \"uncompressed\"", ds.Name) } if ds.Type != TypeDerive { dsType, ok := ValueTypeValues[ds.Type] if !ok { t.Error("unrecognized type") } else { t.Errorf("ds.Type = %s; expected TypeDerive", dsType) } } if ds.Min != "0" { t.Errorf("ds.Min = %s; expected 0", ds.Min) } if ds.Max != "U" { t.Errorf("ds.Max = %s; expected 0", ds.Max) } ds = dataSources[1] if ds.Name != "compressed" { t.Errorf("ds.Name = %s; expected \"uncompressed\"", ds.Name) } if ds.Type != TypeDerive { dsType, ok := ValueTypeValues[ds.Type] if !ok { t.Error("unrecognized type") } else { t.Errorf("ds.Type = %s; expected TypeDerive", dsType) } } if ds.Min != "0" { t.Errorf("ds.Min = %s; expected 0", ds.Min) } if ds.Max != "U" { t.Errorf("ds.Max = %s; expected 0", ds.Max) } } func TestTypesDB2(t *testing.T) { tdb := []byte(` vs_memory value:GAUGE:0:9223372036854775807 vs_processes value:GAUGE:0:65535 vs_threads value:GAUGE:0:65535 # The following line has intentional whitespace `) typesdb, err := TypesDB(tdb) if err != nil { t.Error(err) } assert.Equal(t, 3, len(typesdb), "whitespace") } var typesDB = func() Types { t, err := TypesDB(TypesDBData) if err != nil { panic(err) } return t }() func TestPackets(t *testing.T) { for i, raw := range rawPacketData { _, err := Packets(raw, typesDB) if err != nil { t.Errorf("i = %d: %s", i, err.Error()) } } } func TestPacketsShort(t *testing.T) { var err error require.NotPanics(t, func() { short := []byte("ab") _, err = Packets(short, typesDB) }) assert.NotNil(t, err) } var result *[]Packet func BenchmarkPackets(b *testing.B) { var r *[]Packet for n := 0; n < b.N; n++ { r, _ = Packets(rawPacketData[0], typesDB) } result = r } // Collectd packets captured using Wireshark var rawPacketData = func() [][]byte { strs := []string{ "0000000e6c6f63616c686f7374000008000c1513676ac3a6e0970009000c00000002800000000002000973776170000004000973776170000005000966726565000006000f00010100000080ff610f420008000c1513676ac3a8fc120004000c737761705f696f0000050007696e000006000f00010200000000000000000008000c1513676ac3a9077d000500086f7574000006000f00010200000000000000000008000c1513676ac3bd2a8c0002000e696e74657266616365000003000965746830000004000e69665f6f63746574730000050005000006001800020202000000000000000000000000000000000008000c1513676ac3bd5a970004000e69665f6572726f7273000006001800020202000000000000000000000000000000000008000c1513676ac3bd7fea000300076c6f000004000e69665f6f6374657473000006001800020202000000000009e79c000000000009e79c0008000c1513676ac3bdaae60003000a776c616e30000006001800020202000000001009fa5400000000011cf6670008000c1513676ac3bdb0e00004000e69665f6572726f7273000006001800020202000000000000000000000000000000000008000c1513676ac3bd3d6d0003000965746830000004000f69665f7061636b657473000006001800020202000000000000000000000000000000000008000c1513676ac3bdae290003000a776c616e300000060018000202020000000000032f8f00000000000205e50008000c1513676ac3bdbb7b0003000c646f636b657230000006001800020202000000000000000000000000000000000008000c1513676ac3bda0db000300076c6f000004000e69665f6572726f7273000006001800020202000000000000000000000000000000000008000c1513676ac3bdbde80003000c646f636b657230000006001800020202000000000000000000000000000000000008000c1513676ac3bd8d8e000300076c6f000004000f69665f7061636b6574730000060018000202020000000000000c9c0000000000000c9c0008000c1513676ac3bdb90b0003000c646f636b657230000004000e69665f6f6374657473000006001800020202000000000000000000000000000000000008000c1513676ac469b10f0002000e70726f6365737365730000030005000004000d70735f7374617465000005000c7a6f6d62696573000006000f00010100000000000000000008000c1513676ac469a4a30005000d736c656570696e67000006000f0001010000000000006e400008000c1513676ac469c6320005000b706167696e67000006000f00010100000000000000000008000c1513676ac469f06e0005000c626c6f636b6564000006000f00010100000000000000000008000c1513676ac4698af40005000c72756e6e696e67000006000f00010100000000000000000008000c1513676ac469bbe10005000c73746f70706564000006000f00010100000000000000000008000c1513676ac46b8e710004000e666f726b5f726174650000050005000006000f0001020000000000001bcf0008000c1513676d437f1296000200086370750000030006300000040008637075000005000b73797374656d000006000f00010200000000000021870008000c1513676d437f36020005000969646c65000006000f000102000000000005847a0008000c1513676d437f979b0005000977616974000006000f00010200000000000005210008000c1513676d43802ff60005000c736f6674697271000006000f000102000000000000001f0008000c1513676d43803b3a0005000a737465616c000006000f0001020000000000000000", "0000000e6c6f63616c686f7374000008000c1513676d4380551f0009000c0000000280000000000200086370750000030006310000040008637075000005000975736572000006000f0001020000000000007cad0008000c1513676d43805dbe000500096e696365000006000f00010200000000000001de0008000c1513676d4380697d0005000b73797374656d000006000f0001020000000000001ce80008000c1513676d438072bd0005000969646c65000006000f000102000000000005931c0008000c1513676d43807c430005000977616974000006000f000102000000000000094b0008000c1513676d43808cee0005000c736f6674697271000006000f00010200000000000000120008000c1513676d4380843a0005000e696e74657272757074000006000f00010200000000000000000008000c1513676d438096230005000a737465616c000006000f00010200000000000000000008000c1513676d4380aa9c0003000632000005000975736572000006000f00010200000000000089580008000c1513676d4380b29f000500096e696365000006000f00010200000000000003610008000c1513676d4380c44c0005000969646c65000006000f000102000000000005873d0008000c1513676d4380bc0f0005000b73797374656d000006000f000102000000000000201d0008000c1513676d4380cea40005000977616974000006000f00010200000000000005810008000c1513676d4380d7370005000e696e74657272757074000006000f00010200000000000000000008000c1513676d4380ea830005000a737465616c000006000f00010200000000000000000008000c1513676d437eef62000300063000000500096e696365000006000f00010200000000000003920008000c1513676d4380e0260003000632000005000c736f6674697271000006000f00010200000000000000160008000c1513676d438101410003000633000005000975736572000006000f0001020000000000007d8a0008000c1513676d438109f5000500096e696365000006000f00010200000000000004350008000c1513676d4380244b0003000630000005000e696e74657272757074000006000f00010200000000000000000008000c1513676d438122070003000633000005000969646c65000006000f0001020000000000058eb60008000c1513676d43812e830005000977616974000006000f0001020000000000000ca80008000c1513676d438141480005000c736f6674697271000006000f000102000000000000001e0008000c1513676d43814a5d0005000a737465616c000006000f00010200000000000000000008000c1513676d4381149e0005000b73797374656d000006000f0001020000000000001b9a0008000c1513676d437ea8600003000630000005000975736572000006000f00010200000000000089a80008000c1513676d438138190003000633000005000e696e74657272757074000006000f00010200000000000000000008000c1513676d438a9ca00002000e696e74657266616365000003000965746830000004000e69665f6f63746574730000050005000006001800020202000000000000000000000000000000000008000c1513676d438aea760004000f69665f7061636b657473000006001800020202000000000000000000000000000000000008000c1513676d438b214d0004000e69665f6572726f727300000600180002020200000000000000000000000000000000", "0000000e6c6f63616c686f7374000008000c1513676d438aac590009000c00000002800000000002000764660000030009726f6f74000004000f64665f636f6d706c6578000005000966726565000006000f0001010000004c077e57420008000c1513676d438b6ada0005000d7265736572766564000006000f00010100000000338116420008000c1513676d438b7a170002000e696e7465726661636500000300076c6f000004000e69665f6f63746574730000050005000006001800020202000000000009ecf5000000000009ecf50008000c1513676d438b75780002000764660000030009726f6f74000004000f64665f636f6d706c6578000005000975736564000006000f000101000000e0a41b26420008000c1513676d438b8ed20002000e696e7465726661636500000300076c6f000004000e69665f6572726f72730000050005000006001800020202000000000000000000000000000000000008000c1513676d438b86bf0004000f69665f7061636b6574730000060018000202020000000000000c9d0000000000000c9d0008000c1513676d438bb3e60003000a776c616e300000060018000202020000000000032fab00000000000205ed0008000c1513676d438bd62e0003000c646f636b657230000004000e69665f6f6374657473000006001800020202000000000000000000000000000000000008000c1513676d438bbc8f0003000a776c616e30000004000e69665f6572726f7273000006001800020202000000000000000000000000000000000008000c1513676d438bdf030003000c646f636b657230000004000f69665f7061636b657473000006001800020202000000000000000000000000000000000008000c1513676d438baaf10003000a776c616e30000004000e69665f6f637465747300000600180002020200000000100a042300000000011cfa460008000c1513676d438c5f100002000764660000030009626f6f74000004000f64665f636f6d706c6578000005000966726565000006000f0001010000000010e198410008000c1513676d438c689c0005000d7265736572766564000006000f00010100000000804c68410008000c1513676d438c70ce0005000975736564000006000f0001010000000020ea9e410008000c1513676d438be7bc0002000e696e74657266616365000003000c646f636b657230000004000e69665f6572726f72730000050005000006001800020202000000000000000000000000000000000008000c1513676d43beca8c0002000c656e74726f70790000030005000004000c656e74726f7079000006000f0001010000000000088f400008000c1513676d43bf1d13000200096c6f616400000400096c6f6164000006002100030101019a9999999999a93f666666666666d63f5c8fc2f5285cdf3f0008000c1513676d43c02b85000200096469736b000003000873646100000400106469736b5f6f63746574730000060018000202020000000075887800000000005b6f3c000008000c1513676d43c06d1f0004000d6469736b5f6f7073000006001800020202000000000003cbbd000000000001c0510008000c1513676d43c08b6a0004000e6469736b5f74696d65000006001800020202000000000000003f00000000000001720008000c1513676d43c0a5fb000400106469736b5f6d65726765640000060018000202020000000000001285000000000000f8010008000c1513676d43c0c8b4000300097364613100000400106469736b5f6f63746574730000060018000202020000000001107c000000000000003c00", "0000000e6c6f63616c686f7374000008000c1513676d43c0d00a0009000c0000000280000000000200096469736b000003000973646131000004000d6469736b5f6f7073000006001800020202000000000000029b00000000000000080008000c1513676d43c0d7b20004000e6469736b5f74696d650000060018000202020000000000000004000000000000000f0008000c1513676d43c0df73000400106469736b5f6d65726765640000060018000202020000000000000fb400000000000000010008000c1513676d43c0f87c000300097364613200000400106469736b5f6f6374657473000006001800020202000000000000080000000000000000000008000c1513676d43c1003e0004000d6469736b5f6f7073000006001800020202000000000000000200000000000000000008000c1513676d43c107bf000400106469736b5f6d6572676564000006001800020202000000000000000000000000000000000008000c1513676d43c12fa40003000973646135000004000d6469736b5f6f7073000006001800020202000000000003c867000000000001aef20008000c1513676d43c13d5e000400106469736b5f6d657267656400000600180002020200000000000002d1000000000000f8000008000c1513676d43c136a90004000e6469736b5f74696d65000006001800020202000000000000003f000000000000011c0008000c1513676d43c1740500030009646d2d3000000400106469736b5f6f63746574730000060018000202020000000074596400000000005b6f00000008000c1513676d43c179c70004000d6469736b5f6f7073000006001800020202000000000003cae4000000000002b0f30008000c1513676d43c18abe000400106469736b5f6d6572676564000006001800020202000000000000000000000000000000000008000c1513676d43c181b90004000e6469736b5f74696d650000060018000202020000000000000040000000000000013e0008000c1513676d43c1a95e00030009646d2d3100000400106469736b5f6f637465747300000600180002020200000000000e000000000000000000000008000c1513676d43c1b7ea0004000e6469736b5f74696d65000006001800020202000000000000000200000000000000000008000c1513676d43c1b03e0004000d6469736b5f6f707300000600180002020200000000000000e000000000000000000008000c1513676d43c1c00d000400106469736b5f6d6572676564000006001800020202000000000000000000000000000000000008000c1513676d43c12818000300097364613500000400106469736b5f6f637465747300000600180002020200000000746c6400000000005b6f00000008000c1513676d43d320a80002000c62617474657279000003000630000004000b636861726765000006000f0001018fc2f5285c2f58400008000c1513676d43d36fd60004000c63757272656e74000006000f00010100000000000000800008000c1513676d43d3cdb60004000c766f6c74616765000006000f000101736891ed7cbf28400008000c1513676d43d59dd60002000869727100000300050000040008697271000005000630000006000f00010200000000000000110008000c1513676d43d5d2cf0005000631000006000f00010200000000000000100008000c1513676d43d5fe820005000638000006000f00010200000000000000010008000c1513676d43d635440005000639000006000f00010200000000000035210008000c1513676d43d66265000500073132000006000f0001020000000000000790", "0000000e6c6f63616c686f7374000008000c1513676d43d68e940009000c000000028000000000020008697271000004000869727100000500073136000006000f00010200000000000000210008000c1513676d43d69be20002000a7573657273000004000a75736572730000050005000006000f00010100000000000010400008000c1513676d43d6aa5d00020008697271000004000869727100000500073233000006000f00010200000000000000250008000c1513676d43d6c7dc000500073431000006000f000102000000000000ff7d0008000c1513676d43d6e23d000500073432000006000f00010200000000000008070008000c1513676d43d9aa3a000500073437000006000f0001020000000000079a260008000c1513676d43d9cca9000500073438000006000f00010200000000000000c70008000c1513676d43d9ea5d000500073439000006000f00010200000000000004c20008000c1513676d43da050e000500073530000006000f000102000000000000001c0008000c1513676d43da1efa000500084e4d49000006000f00010200000000000000000008000c1513676d43da3c82000500084c4f43000006000f000102000000000018d3080008000c1513676d43da544e00050008535055000006000f00010200000000000000000008000c1513676d43da6cca00050008504d49000006000f00010200000000000000000008000c1513676d43da885400050008495749000006000f000102000000000000a9da0008000c1513676d43daa23a00050008525452000006000f00010200000000000000030008000c1513676d43dabaed00050008524553000006000f00010200000000000ac8360008000c1513676d43dad4150005000843414c000006000f000102000000000000191f0008000c1513676d43daeef300050008544c42000006000f000102000000000003dbdc0008000c1513676d43db11410005000854524d000006000f00010200000000000000000008000c1513676d43db292c00050008544852000006000f00010200000000000000000008000c1513676d43db411d000500084d4345000006000f00010200000000000000000008000c1513676d43db5b59000500084d4350000006000f000102000000000000003c0008000c1513676d43db680100050008455252000006000f00010200000000000000000008000c1513676d43db758a000500084d4953000006000f00010200000000000000000008000c1513676d43dd2e800002000b6d656d6f7279000004000b6d656d6f7279000005000975736564000006000f00010100000000febbe0410008000c1513676d43dd3f4b0005000d6275666665726564000006000f0001010000000070fbc8410008000c1513676d43dd48700005000b636163686564000006000f00010100000000c008df410008000c1513676d43dd51c60005000966726565000006000f00010100000080481d05420008000c1513676d43dec7e30002000973776170000004000973776170000005000975736564000006000f00010100000000000000000008000c1513676d43ded4490005000966726565000006000f00010100000080ff610f420008000c1513676d43dedcfd0005000b636163686564000006000f00010100000000000000000008000c1513676d43d715e300020008697271000004000869727100000500073434000006000f0001020000000000031b610008000c1513676d43d73116000500073435000006000f00010200000000000000180008000c1513676d43ee00150002000973776170000004000c737761705f696f0000050007696e000006000f0001020000000000000000", } var rawData [][]byte for _, str := range strs { buf, err := hex.DecodeString(str) if err != nil { panic(err) } rawData = append(rawData, buf) } return rawData }() // Taken from /usr/share/collectd/types.db on a Ubuntu system var TypesDBData = []byte(`absolute value:ABSOLUTE:0:U apache_bytes value:DERIVE:0:U apache_connections value:GAUGE:0:65535 apache_idle_workers value:GAUGE:0:65535 apache_requests value:DERIVE:0:U apache_scoreboard value:GAUGE:0:65535 ath_nodes value:GAUGE:0:65535 ath_stat value:DERIVE:0:U backends value:GAUGE:0:65535 bitrate value:GAUGE:0:4294967295 bytes value:GAUGE:0:U cache_eviction value:DERIVE:0:U cache_operation value:DERIVE:0:U cache_ratio value:GAUGE:0:100 cache_result value:DERIVE:0:U cache_size value:GAUGE:0:4294967295 charge value:GAUGE:0:U compression_ratio value:GAUGE:0:2 compression uncompressed:DERIVE:0:U, compressed:DERIVE:0:U connections value:DERIVE:0:U conntrack value:GAUGE:0:4294967295 contextswitch value:DERIVE:0:U counter value:COUNTER:U:U cpufreq value:GAUGE:0:U cpu value:DERIVE:0:U current_connections value:GAUGE:0:U current_sessions value:GAUGE:0:U current value:GAUGE:U:U delay value:GAUGE:-1000000:1000000 derive value:DERIVE:0:U df_complex value:GAUGE:0:U df_inodes value:GAUGE:0:U df used:GAUGE:0:1125899906842623, free:GAUGE:0:1125899906842623 disk_latency read:GAUGE:0:U, write:GAUGE:0:U disk_merged read:DERIVE:0:U, write:DERIVE:0:U disk_octets read:DERIVE:0:U, write:DERIVE:0:U disk_ops_complex value:DERIVE:0:U disk_ops read:DERIVE:0:U, write:DERIVE:0:U disk_time read:DERIVE:0:U, write:DERIVE:0:U dns_answer value:DERIVE:0:U dns_notify value:DERIVE:0:U dns_octets queries:DERIVE:0:U, responses:DERIVE:0:U dns_opcode value:DERIVE:0:U dns_qtype_cached value:GAUGE:0:4294967295 dns_qtype value:DERIVE:0:U dns_query value:DERIVE:0:U dns_question value:DERIVE:0:U dns_rcode value:DERIVE:0:U dns_reject value:DERIVE:0:U dns_request value:DERIVE:0:U dns_resolver value:DERIVE:0:U dns_response value:DERIVE:0:U dns_transfer value:DERIVE:0:U dns_update value:DERIVE:0:U dns_zops value:DERIVE:0:U duration seconds:GAUGE:0:U email_check value:GAUGE:0:U email_count value:GAUGE:0:U email_size value:GAUGE:0:U entropy value:GAUGE:0:4294967295 fanspeed value:GAUGE:0:U file_size value:GAUGE:0:U files value:GAUGE:0:U fork_rate value:DERIVE:0:U frequency_offset value:GAUGE:-1000000:1000000 frequency value:GAUGE:0:U fscache_stat value:DERIVE:0:U gauge value:GAUGE:U:U hash_collisions value:DERIVE:0:U http_request_methods value:DERIVE:0:U http_requests value:DERIVE:0:U http_response_codes value:DERIVE:0:U humidity value:GAUGE:0:100 if_collisions value:DERIVE:0:U if_dropped rx:DERIVE:0:U, tx:DERIVE:0:U if_errors rx:DERIVE:0:U, tx:DERIVE:0:U if_multicast value:DERIVE:0:U if_octets rx:DERIVE:0:U, tx:DERIVE:0:U if_packets rx:DERIVE:0:U, tx:DERIVE:0:U if_rx_errors value:DERIVE:0:U if_rx_octets value:DERIVE:0:U if_tx_errors value:DERIVE:0:U if_tx_octets value:DERIVE:0:U invocations value:DERIVE:0:U io_octets rx:DERIVE:0:U, tx:DERIVE:0:U io_packets rx:DERIVE:0:U, tx:DERIVE:0:U ipt_bytes value:DERIVE:0:U ipt_packets value:DERIVE:0:U irq value:DERIVE:0:U latency value:GAUGE:0:U links value:GAUGE:0:U load shortterm:GAUGE:0:5000, midterm:GAUGE:0:5000, longterm:GAUGE:0:5000 md_disks value:GAUGE:0:U memcached_command value:DERIVE:0:U memcached_connections value:GAUGE:0:U memcached_items value:GAUGE:0:U memcached_octets rx:DERIVE:0:U, tx:DERIVE:0:U memcached_ops value:DERIVE:0:U memory value:GAUGE:0:281474976710656 multimeter value:GAUGE:U:U mutex_operations value:DERIVE:0:U mysql_commands value:DERIVE:0:U mysql_handler value:DERIVE:0:U mysql_locks value:DERIVE:0:U mysql_log_position value:DERIVE:0:U mysql_octets rx:DERIVE:0:U, tx:DERIVE:0:U nfs_procedure value:DERIVE:0:U nginx_connections value:GAUGE:0:U nginx_requests value:DERIVE:0:U node_octets rx:DERIVE:0:U, tx:DERIVE:0:U node_rssi value:GAUGE:0:255 node_stat value:DERIVE:0:U node_tx_rate value:GAUGE:0:127 objects value:GAUGE:0:U operations value:DERIVE:0:U percent value:GAUGE:0:100.1 percent_bytes value:GAUGE:0:100.1 percent_inodes value:GAUGE:0:100.1 pf_counters value:DERIVE:0:U pf_limits value:DERIVE:0:U pf_source value:DERIVE:0:U pf_states value:GAUGE:0:U pf_state value:DERIVE:0:U pg_blks value:DERIVE:0:U pg_db_size value:GAUGE:0:U pg_n_tup_c value:DERIVE:0:U pg_n_tup_g value:GAUGE:0:U pg_numbackends value:GAUGE:0:U pg_scan value:DERIVE:0:U pg_xact value:DERIVE:0:U ping_droprate value:GAUGE:0:100 ping_stddev value:GAUGE:0:65535 ping value:GAUGE:0:65535 players value:GAUGE:0:1000000 power value:GAUGE:0:U protocol_counter value:DERIVE:0:U ps_code value:GAUGE:0:9223372036854775807 ps_count processes:GAUGE:0:1000000, threads:GAUGE:0:1000000 ps_cputime user:DERIVE:0:U, syst:DERIVE:0:U ps_data value:GAUGE:0:9223372036854775807 ps_disk_octets read:DERIVE:0:U, write:DERIVE:0:U ps_disk_ops read:DERIVE:0:U, write:DERIVE:0:U ps_pagefaults minflt:DERIVE:0:U, majflt:DERIVE:0:U ps_rss value:GAUGE:0:9223372036854775807 ps_stacksize value:GAUGE:0:9223372036854775807 ps_state value:GAUGE:0:65535 ps_vm value:GAUGE:0:9223372036854775807 queue_length value:GAUGE:0:U records value:GAUGE:0:U requests value:GAUGE:0:U response_time value:GAUGE:0:U response_code value:GAUGE:0:U route_etx value:GAUGE:0:U route_metric value:GAUGE:0:U routes value:GAUGE:0:U serial_octets rx:DERIVE:0:U, tx:DERIVE:0:U signal_noise value:GAUGE:U:0 signal_power value:GAUGE:U:0 signal_quality value:GAUGE:0:U snr value:GAUGE:0:U spam_check value:GAUGE:0:U spam_score value:GAUGE:U:U spl value:GAUGE:U:U swap_io value:DERIVE:0:U swap value:GAUGE:0:1099511627776 tcp_connections value:GAUGE:0:4294967295 temperature value:GAUGE:U:U threads value:GAUGE:0:U time_dispersion value:GAUGE:-1000000:1000000 timeleft value:GAUGE:0:U time_offset value:GAUGE:-1000000:1000000 total_bytes value:DERIVE:0:U total_connections value:DERIVE:0:U total_objects value:DERIVE:0:U total_operations value:DERIVE:0:U total_requests value:DERIVE:0:U total_sessions value:DERIVE:0:U total_threads value:DERIVE:0:U total_time_in_ms value:DERIVE:0:U total_values value:DERIVE:0:U uptime value:GAUGE:0:4294967295 users value:GAUGE:0:65535 vcl value:GAUGE:0:65535 vcpu value:GAUGE:0:U virt_cpu_total value:DERIVE:0:U virt_vcpu value:DERIVE:0:U vmpage_action value:DERIVE:0:U vmpage_faults minflt:DERIVE:0:U, majflt:DERIVE:0:U vmpage_io in:DERIVE:0:U, out:DERIVE:0:U vmpage_number value:GAUGE:0:4294967295 volatile_changes value:GAUGE:0:U voltage_threshold value:GAUGE:U:U, threshold:GAUGE:U:U voltage value:GAUGE:U:U vs_memory value:GAUGE:0:9223372036854775807 vs_processes value:GAUGE:0:65535 vs_threads value:GAUGE:0:65535 # # Legacy types # (required for the v5 upgrade target) # arc_counts demand_data:COUNTER:0:U, demand_metadata:COUNTER:0:U, prefetch_data:COUNTER:0:U, prefetch_metadata:COUNTER:0:U arc_l2_bytes read:COUNTER:0:U, write:COUNTER:0:U arc_l2_size value:GAUGE:0:U arc_ratio value:GAUGE:0:U arc_size current:GAUGE:0:U, target:GAUGE:0:U, minlimit:GAUGE:0:U, maxlimit:GAUGE:0:U mysql_qcache hits:COUNTER:0:U, inserts:COUNTER:0:U, not_cached:COUNTER:0:U, lowmem_prunes:COUNTER:0:U, queries_in_cache:GAUGE:0:U mysql_threads running:GAUGE:0:U, connected:GAUGE:0:U, cached:GAUGE:0:U, created:COUNTER:0:U `)