ELK Stackでシステム監視 collectdで監視対象ホストからデータ収集

ELK Stackのインストールの実質的な続き

監視対象ホストからELKスタックの入っている監視用サーバにデータを送る方法としてはいろいろあるけど今回はエージェントとしてcollectdを使うことにする。依存関係を満たすために余計ソフトウエアを大量にインストールされるのが嫌なのと簡単だからという理由でcollectdを採用したけど、流行りなのはbeatsとかかも。Perlをインストール済みならcollectd、Go言語をインストール済みならbeatsでどうぞ。

collectdのインストール

# cd /usr/ports/net-mgmt/collectd5
# make install clean
または
# pkg install net-mgmt/collectd5

せっかくportsでインストールするならconfigオプションで追加で欲しい機能に関係する項目にもチェックする。例えばCURLにチェックしてビルドするとApacheやNginxプラグインでアクセス状況を収集できるようになる。逆にCURLにチェックしないでビルドするとApache, Nginxプラグインは利用できない。configオプションの画面にアドバイスがあるので良く見ておく。
なので、pkgでインストールすると使えないプラグインが多々。cillectdでいろいろな情報を収集するならports推奨。

各プラグインがどのようなものかを確認するならcollectdのWikiで。

collectdの設定

/usr/local/etc/collectd.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Hostname "hoge.example.com"           #collectdを入れたホストの名前等
LoadPlugin df                         #ディスク使用量
LoadPlugin interface                  #ネットワークIF
LoadPlugin load                       #ロードアベレージ
LoadPlugin memory                     #メモリ
LoadPlugin network                    #ELKスタックとの通信用
LoadPlugin processes                  #プロセス数
<Plugin interface>
    Interface "em0"                   #監視するネットワークIF名
    Interface "ng0"                   #複数のIFがあって監視するなら必要なだけ並べる
    IgnoreSelected false
</Plugin>
< network>
    Server "192.168.12.1" "25826"     #←ELKスタックのサーバIPアドレスとポート
    <Server "192.168.12.1" "25826">   #←ELKスタックのサーバIPアドレスとポート
    </Server>
</Plugin>

LoadPlugin hogeでhogeプラグインを有効にした場合でも<Plugin hoge>は変更の必要があるとか何か値を設定しなければならないとかがなければ書かなくて良い。

/etc/rc.conf (追加)
1
2
#collectd_enable="YES"
collectdmon_enable="YES"

collectdは結構簡単に停まってしまうのでcollectdmonに監視させ、collectdが落ちても再起動させるようにする。

2018年2月24日追記: psで起動プロセスを見る限りではcollectdmonだけを有効にしておくので良さそう。逆にcollectd_enableをyesにしているとcollectdが2重に起動しているっぽい。だからcollectd_enableをコメントにしたが、それが正しいかは不明。

ファイアウォールでガチガチならELKスタックのサーバ宛のUDPのポート25826の通信を許可する。(ELKスタックのサーバ側のFWも開けること)

collectdの起動

# service collectdmon start

collectdmonを起動してやればcollectdも一緒に起動する。
逆に停止させる際はcollectdmonを停止してからcollectdを停止する。でないと、collectdを停止してもcollectdmonがcollectdを再起動させてしまう。

逆にcollectdmonが起動した状態でcollectdを再起動させても起動時のメッセージが表示されない。collectdの起動時のメッセージはプラグインの利用可否やエラー情報など設定変更時には有用な情報なので、新しいプラグインを使うときや大きな変更を行った際は一時的にcollectdmonを停めて手動でcollectdの起動・停止・再起動を行う方が良いこともある。

以上を監視対象にしたいホストに入れて回る。

logstashでcollectdからのデータを受ける設定

/usr/local/etc/logstash/logstash.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
input {
    #Collectd
    udp {
        port => 25826
        buffer_size => 65536  #←初期値 調整する
        workers => 4               #初期値 2
        queue_size => 2000  #←初期値 調整する
        codec => collectd { }
        type => "collectd"
    }
}

filter {
}

output {
    #stdout { codec => rubydebug }   #動作確認用
    elasticsearch { hosts => [ "localhost:9200" ] }
}

collectdからのデータ流入確認方法

監視対象ホストにcollectdを入れた時は求めているデータが正しく届いているか確認するべき。
そこで、logstashのテスト用の設定ファイルを1つ用意。

/usr/local/etc/logstash/test.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
input {
    #Collectd
    udp {
        port => 25827           #25826またはその他使用中ポートでなければ可
        buffer_size => 65536  #←初期値 調整する
        workers => 4               #初期値 2
        queue_size => 2000  #←初期値 調整する
        codec => collectd { }
        type => "collectd"
    }
}

filter {
}

output {
    stdout { codec => rubydebug }   #動作確認用
}

テスト用はinput側ポートで25826以外で待ち受けるようにする。
出力は標準出力(コンソール)へ。

/usr/local/etc/collectd.conf (監視対象ホストのcollectdの設定変更)
1
2
3
4
5
<Plugin network>
    Server "192.168.12.1" "25827"      #←ELKスタックのサーバIPアドレスとポート
    <Server "192.168.12.1" "25827">    #←ELKスタックのサーバIPアドレスとポート
    </Server>
</Plugin>

logstashのテスト用設定の待受ポートに合わせる。設定変更したらcollectdを再起動。
テストが終わったらポート番号を戻してもう一度collectdを再起動をお忘れなく。

# /usr/local/logstash/bin/logstash --path.data /tmp -f /usr/local/etc/logstash/test.conf

別にlogstashが動いてて、テスト用に別プロセスのlogstashを動かす場合は--path.dataで書き込み可能なテンポラリディレクトリを指定しないと動かないらしい。(logstash 5.6以降?)
コマンド入力後すぐは反応がない(筈)ので暫く待ってから)エラーが出ていなくてcollectdが集めた情報が表示されればOK.
何故待ち受けポート番号を変えるか。それはlogstashでポート25826で待ち受けていながら更にテスト用のlogstashを実行してポート25826を使おうとすると
UDP listener died {:exception=>#<SocketError: bind: name or service not known> というエラーになる筈だから。
(エラーになるのを悩んでる人が結構いるみたい)

ファイアウォールでcollectdを入れたホストからのUDP ポート25826宛を受けられるように開けておく。(必要に応じてテスト用のポートも)

logstashの再起動

# service logstash restart

これでcollectdで収集した情報がelasticsearchに流れ込む。
情報の活用は次回以降。

関連記事:

NanoPi NEO2を100均の灰皿に入れてみた

NanoPi NEO2を100均の灰皿に入れてみた 1
キャンドゥで買ったのは縦横6cm高さ4cm強の缶の灰皿。店頭で手にとって見たら5cmに見えたので、一辺4cmのNanoPi NEO2を入れて少しだけ余裕で良い感じかなと思ったんだけど、家に帰って計ったら6cmで大きすぎてorz

NanoPi NEO2を100均の灰皿に入れてみた 2
灰皿なので火の付いたタバコを置いたりこすったりする網?がある。

NanoPi NEO2を100均の灰皿に入れてみた 3
網?を取り外してこんな感じ。

NanoPi NEO2を100均の灰皿に入れてみた 4
ウラ面は4mmほど窪んでいるので切り抜いてNanoPi NEO2のヒートシンクを露出させてもいいかなと思ったけど、ペラペラの底板は強度がなさそうなのでネジ留めだけにすることにした。

NanoPi NEO2を100均の灰皿に入れてみた 5
上にNanoPi NEO2を置いてみた。やはり缶が大きすぎだ。縦横4.5cm高さ3cm程度の缶が理想なんだけどなぁ。

NanoPi NEO2を100均の灰皿に入れてみた 6
早速穴を開けた。ペラッペラの缶なので穴の位置だけ決めてザクザク開けるだけ。大きさがぎりぎりの缶ならmicroSDカード用のスロットを切らないといけないんだけど、そこから缶が裂けやすくなるんだよね。運良く?缶が大きいので写真のとおり缶の内側で余裕で差し替えできる。電源用のmicroUSBはちょうどコネクタのプラスチック部分が缶に触れるので缶の側は穴を開けただけでケーブル養生用の処理は無し。

NanoPi NEO2を100均の灰皿に入れてみた 7
裏はNaniPi NEO2の4隅のネジ留めだけ。

NanoPi NEO2を100均の灰皿に入れてみた 8
microUSBコネクタの穴を広げるときに調子に乗ってゴリゴリやったら拡がりすぎてしまった。

NanoPi NEO2を100均の灰皿に入れてみた 9
ネットワークコネクタはぴったりの穴になったけどUSB-Aコネクタの穴は穴の位置決め間違いもあって大きめになってしまった。

力を抜ききって作ったので結構いいかげんだけど、こんなんでもホコリ避けとしては十分かと。
でも、100円缶の安っぽさは半端なくてプラス数十円でアルミのエンクロージャーを買う方が絶対賢いと思った。

関連記事:
Up