收集 - 随机丢失'type_instance'字段

时间:2014-09-04 07:48:15

标签: logstash collectd

我将collectd 5.4logstashelasticsearchkibana一起用于我的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插件。

2 个答案:

答案 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,直到被覆盖。