Output filter plugin to rewrite Collectd JSON output to nest into a nested json

Rewrites the message coming from Collectd to store as a nested json. Can be used in Elasticsearch to display metrics.

Installation

Use RubyGems: If you use td-agent

td-agent-gem install fluent-plugin-collectd-nest

If you use fluentd

gem install fluent-plugin-collectd-nest

Configuration

<match pattern>
  type collectd_nest
</match>

If the following record is passed:

{"time":1000, "host":"host_v", "interval":5, "plugin":"plugin_v", "plugin_instance":"plugin_instance_v",
 "type":"type_v", "type_instance":"type_instance_v", "values":["v1", "v2"], "dsnames":["n1", "n2"],
 "dstypes":["t1", "t2"]}

then you get new record:

{"host":"host_v",
 "collectd": {
   "time":1000, "interval":5, "plugin":"plugin_v", "plugin_instance":"plugin_instance_v",
   "type":"type_v", "type_instance":"type_instance_v", "dstypes":"t1",
   "plugin_v": {"type_v": {"n1":"v1", "n2":"v2"}}
 }
}

Empty values in "plugin", "plugin_instance", "type" or "type_instance" will not be copied into the new tag name

If a records has only one value like :

{"time":1000, "host":"host_v", "interval":5, "plugin":"plugin_v", "plugin_instance":"plugin_instance_v",
 "type":"type_v", "type_instance":"type_instance_v", "values":["v1"], "dsnames":["n1"],
 "dstypes":["t1"]}

then the new record will be:

{"host":"host_v",
 "collectd": {
   "time":1000, "interval":5, "plugin":"plugin_v", "plugin_instance":"plugin_instance_v",
   "type":"type_v", "type_instance":"type_instance_v", "dstypes":"t1",
   "plugin_v": {"type_v":"v1"}
 }
}

WARNING

  • This plugin was written to deal with a specific use-case, might not be the best fit for everyone. If you need more configurability/features, create a PR
Author Viaq
LicenseMIT License