我将collectd 5.4
与logstash
,elasticsearch
和kibana
一起用于我的Ubuntu 14.04系统上的监控目的。我的collectd
配置文件如下所示:
Hostname "my-host-name"
Interval 1
LoadPlugin cpu
LoadPlugin load
LoadPlugin df
LoadPlugin memory
LoadPlugin swap
LoadPlugin interface
<Plugin interface>
Interface "eth0"
IgnoreSelected false
</Plugin>
LoadPlugin network
<Plugin network>
Server "127.0.0.1" "25826"
</Plugin>
问题是,在启用df
插件之前,每次操作都非常正常。启用df
插件后,我在type_instance
插件的输出中缺少memory
字段。以下是上述输出:
{"@version":"1","@timestamp":"2014-09-04T07:20:42.143Z","host":"my-host","plugin":"memory","collectd_type":"memory","value":6250332160.0}
{"@version":"1","@timestamp":"2014-09-04T07:20:42.143Z","host":"my-host","plugin":"memory","collectd_type":"memory","type_instance":"buffered","value":55103488.0}
{"@version":"1","@timestamp":"2014-09-04T07:20:42.143Z","host":"my-host","plugin":"memory","collectd_type":"memory","type_instance":"cached","value":1283186688.0}
{"@version":"1","@timestamp":"2014-09-04T07:20:42.143Z","host":"my-host","plugin":"memory","collectd_type":"memory","type_instance":"free","value":665567232.0}
查看给定输出的第一行。没有type_instance
字段。预期的行为是"type_instance":"used"
。它只发生在used
字段,它随机发生。一切正常,直到我启用df
插件。
答案 0 :(得分:2)
我希望这个答案仍有帮助。
我遇到了同样的问题,并通过修复logstash的collectd插件解决了这个问题。
我使用了collectd 5.4.1和logstash 1.4.2。
<强> 1。原因强>
正如您所说,当您同时使用df和内存插件时会出现问题。
这是问题情景。
假设collectd在一个UDP数据包中按顺序设置以下df和内存数据。
{ “@版本”: “1”, “@时间戳”: “2014-10-31T06:04:08.371Z”, “宿主”: “例如”,的 “type_instance”: “已使用”< / strong>下, “插件”: “DF”, “plugin_instance”: “根”, “collectd_type”: “df_complex”, “值”:5076176896.0}
{ “@版本”: “1”, “@时间戳”: “2014-10-31T06:04:08.371Z”, “宿主”: “例如”,的 “type_instance”: “已使用”< / strong>下, “插件”: “存储器”, “collectd_type”: “存储器”, “值”:7530356736.0}
collectd UDP协议如果先前在UDP数据包中设置它(可能是为了最小化数据包大小),则不会设置相同的数据
因此,因为collectd在df数据中将“type_instance”设置为“used”,所以它不会在内存数据中再次设置“type_instance”。 (参见协议规范:https://collectd.org/wiki/index.php/Binary_protocol)
但是当“插件”值发生变化时,logstash collectd插件将“type_instance”重置为空白。
<强> 2。如何解决问题
collectd插件是用jruby编写的。因此,您可以轻松修复源代码。
编辑lib / logstash / inputs / collectd.rb。
找到以下2行并修复它们。
自:
411行:@ collectd.delete(k)if!['host','@ timestamp']。include?(k)
417行:@ collectd.delete(k)if!['host','@ timestamp','plugin','plugin_instance'] .include?(k)
要:
411行:@ collectd.delete(k)if!['host','@ timestamp','type_instance']。include?(k)
417行:@ collectd.delete(k)if!['host','@ timestamp','plugin','plugin_instance','type_instance'] .include?(k)
修好后,问题就消失了。
答案 1 :(得分:1)
自版本1.4以来,不推荐使用collectd输入插件,而是将udp输入插件与collectd编解码器一起使用。 collectd编解码器已经过重构,没有这个问题。它会在事件之间保留type_instance,直到被覆盖。