2014-09-04 49 views
0

我使用collectd 5.4以及logstash,elasticsearchkibana用於我的Ubuntu 14.04系統上的監視目的。我collectd配置文件看起來像這樣:Collectd - 隨機丟失'type_instance'字段

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插件everyhing工作完全正常。啓用了df插件後,我在memory插件的輸出中丟失了type_instance字段。這裏是前面提到的輸出:

{"@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

我希望這個答案仍然有幫助。
我遇到了同樣的問題,並修復了logstash的collectd插件。
我用collectd 5.4.1和logstash 1.4.2。

1.原因

就像你說的,當你在同一時間使用DF和內存插件的問題發生。
以下是問題場景。

假設collectd在一個UDP數據包中順序設置以下df和內存數據。

{「@version」:「1」,「@ timestamp」:「2014-10-31T06:04:08.371Z」,「host」:「example」,「type_instance」:「used」, 「插件」:「df」,「plugin_instance」:「root」,「collectd_type」:「df_complex」,「value」:5076176896.0}

{「@version」:「1」,「@ timestamp」 2014-10-31T06:04:08.371Z「,」host「:」example「,」type_instance「:」used「,」plugin「:」memory「,」collectd_type「:」memory「,」value「: 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)如果[ '主機', '@timestamp']包括(k)的
417行:!?@ collectd.delete(K),如果! ['host','@timestamp','plugin','plugin_instance']。include?(K)

到:
411線:@ collectd.delete(K)如果[ '主機', '@timestamp' 'type_instance'] .INCLUDE(k)的
417線?: @ collectd.delete(K)如果![ '主機', '@timestamp', '插件', 'plugin_instance' 'type_instance'] .INCLUDE?(K)

固定後,問題消失。

1

collectd輸入插件自版本1.4開始被棄用,傾向於使用帶有collectd編解碼器的udp輸入插件。 collectd編解碼器已被重構,並沒有此問題。它保留事件之間的type_instance直到被覆蓋。