Difference between revisions of "Binary protocol"
|Line 88:||Line 88:|
| Data values, see
| Data values, see
|Line 117:||Line 117:|
Revision as of 08:14, 17 January 2010
Until the network plugin has been factorized out into a library, it is useful to have some documentation to reimplement it.
- Default UDP port
- Default IPv4 Multicast group
- Default IPv6 multicast group
- Maximum packet size
- 1024 bytes (payload only, not including UDP / IP headers)
In versions 4.0 through 4.7, the receive buffer has a fixed size of 1024 bytes. When longer packets are received, the trailing data is simply ignored. Since version 4.8, the buffer size can be configured.
Each packet consists of one or more so called “parts”. Each part starts with the same four bytes: Two bytes that specify the “part type” (what kind of information is enclosed in the part) and two bytes which specify the length of the part, including the four header bytes itself. The maximum length of payload in any part is therefore 65531 bytes.
Using this layout, clients can determine the length of a part they don't know and lets them skip unknown data. This makes the protocol forward compatible so that new features can be added easily.
There are two part layouts that are used for a couple of “types”: numeric (an 8 byte integer) and string.
Numeric integer values, e. g. the interval and time values, are transferred using 8 byte integers. The length field of those parts must therefore always be set to 12.
Strings are transferred including a null byte at the end. In the example you can see the encoding of the string “foobar”. The string is six characters long, followed by a null-byte and appended to a four byte header, leading to a length of 11 bytes for this part.
Value parts encode an actual data sample. Preceding time, plugin, plugin instance, type, and type instance parts must have set the context for the data sample. The value part consists of:
- type 0x006
- number of values (16 bit field)
- values, for each one:
- data type code (8 bit field), gauge => 1, counter => 0, derive => 2, absolute => 3
- value (64 bit field), gauge => little endian double, counter/derive/absolute => big endian integer
Many data samples have a single value, such as cpu (see the types.db), but others have multiple values, such as disk_merged, which has read and write values.
The following numeric types are currently used to identify the type of a “part”. Defines are available from src/network.h.
||Host||String||The name of the host to associate with subsequent data values|
||Time||Numeric||The timestamp to associate with subsequent data values, unix time format (seconds since epoch)|
||Plugin||String||The plugin name to associate with subsequent data values, e.g. "cpu"|
||Plugin instance||String||The plugin instance name to associate with subsequent data values, e.g. "1"|
||Type||String||The type name to associate with subsequent data values, e.g. "cpu"|
||Type instance||String||The type instance name to associate with subsequent data values, e.g. "idle"|
||Values||other||Data values, see above|
||Signature (HMAC-SHA-256)||other (todo)|
||Encryption (AES-256/OFB/SHA-1)||other (todo)|
- Small Python script by Adrian Perez
- PacketWriter.java of jcollectd
- Of course the network plugin (src/network.c) of collectd itself
- Ruby implementation by Astro.
- Erlang implementation by Astro