ELK Stackでシステム監視 collectdでNTPサーバの情報収集

collectdを使ってホストの情報を集めるのならついでにNTPサーバのoffsetやdelayなどの情報も集めたいというのはあるかと思う。

いつもFreeBSDばかりなので今回はdebian系のLinuxのホストにcollectdを入れるところから。

collectdのインストール

# apt-get update    ← パッケージ関係の情報更新
# apt-cache search collectd       ←collectdパッケージを検索
collectd - statistics collection and monitoring daemon   ←これを入れたい
collectd-core - statistics collection and monitoring daemon (core system)
collectd-dbg - statistics collection and monitoring daemon (debugging symbols)
collectd-dev - statistics collection and monitoring daemon (development files)
collectd-utils - statistics collection and monitoring daemon (utilities)
libcollectdclient-dev - client library for collectd's control interface (development files)
libcollectdclient1 - client library for collectd's control interface
fedmsg - Fedora messaging infrastructure system - general utilities
kcollectd - simple collectd graphing frontend for KDE
shinken-mod-collectd - Shinken mod-collectd module
shinken-mod-collectd-doc - Shinken mod-collectd module - Documentation
mtail - Extract monitoring data from logs for collection in a timeseries database
# apt-get install collectd    ←インストール
後略

collectdの設定

/etc/collectd/collectd.conf
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
Hostname "hoge.localnet"
LoadPlugin cpu
LoadPlugin df
LoadPlugin interface
LoadPlugin load
LoadPlugin memory
LoadPlugin network
LoadPlugin ntpd
LoadPlugin processes
LoadPlugin swap
<Plugin network>
    Server "192.168.12.1" "25826"         #ELK StackホストのIPアドレスとポート
    <Server "192.168.12.1" "25826">
    </Server>
</Plugin>
<Plugin ntpd>
        Host "127.0.0.1" 
        Port 123
        ReverseLookups false
        IncludeUnitID false
</Plugin>

collectdの再起動

# service collectd restart

おそらくcollectdをインストールしたらその時点で勝手にサービス起動されてしまう筈なので起動ではなく再起動。

上手くいかない場合

これだけだとntpdの情報が収集できないことが多い筈。大抵はcollectd側が悪いのではなくてntpdの設定(最近のバージョンの初期値)の問題。

/etc/ntp.conf (追加1行)
enable mode7

ntpdを再起動する。

# service ntp restart

不要だと思うけど、もしcollectdのntpdモジュールが読み込まれないなら

# ldd /usr/lib/collectd/ntpd.so

もし、これで上手くいくなら/etc/ld.so.conf.d下にでも書いておく。

collectdを再起動する。

# service collectd restart

動作確認

確認方法は以前の記事を参照。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
{
       "@timestamp" => 2018-02-09T00:28:58.786Z,
    "type_instance" => "GPS_NMEA",
           "plugin" => "ntpd",
             "host" => "ntp.localnet",
         "@version" => "1",
    "collectd_type" => "delay",
             "type" => "collectd",
            "value" => 0.00055908203125
}
{
       "@timestamp" => 2018-02-09T00:28:58.786Z,
    "type_instance" => "PPS",
           "plugin" => "ntpd",
             "host" => "ntp.localnet",
         "@version" => "1",
    "collectd_type" => "time_offset",
             "type" => "collectd",
            "value" => 0.0001209167316555977
}

こんな風にpluginがntpdであるデータが表示されればOK。
なお、上はntpdのdelayとtime_offsetだけ載せてるけど実際は他の情報もてんこ盛り。ntpdの情報だけでも参照する全てのNTPソース(NTPサーバ)がtype_instanceに登場するので結構すごい量の筈。

関連記事:

ELK Stackでシステム監視 KibanaのSearchで抽出条件を作成する

前々回、監視対象ホストに仕掛けたcollectdで情報を収集してlogstashに送るのをやった。
今回はそのcollectdでNginxの情報を収集してウェブサーバの(ネットワーク的)使用状況をkibanaでデータ抽出する。(ついでにホストのロードアベレージも)

魔法じゃないので何のしかけも無しにcollectdがNginxの使用状況を取得するということはできない。collectdがNginxのステータス情報を見るための設定を追加する。ということはNginxでステータス情報を出してやるというのも必要。
以下、Nginxとcollectdの設定やコマンドはFreeBSD用に書く。

Nginxの設定

/usr/local/etc/nginx/nginx.conf
1
2
3
4
5
#前略
http {
#中略
        include /usr/local/etc/nginx/vhosts/*.conf;
}

/usr/local/etc/nginx/vhostsにnginxのバーチャルホストの設定を置くとする。
そこで/usr/local/etc/nginx/vhosts/にある.conf設定ファイルをインクルードする設定を追加。

/usr/local/etc/nginx/vhosts/localhost.conf
1
2
3
4
5
6
7
server {
    listen 127.0.0.1:80;
    location /ngstat {
        stub_status on;
        access_log off;
    }
}

Nginxのバーチャルホストの1つとして127.0.0.1:80で待ち受けるものを作成する。
その/ngstatにアクセスすることでNginxのステータスを取得する。
なので、Nginxのhttp_stub_statusモジュールが使える状態でないと当然動かない。
ローカルホスト専用なのでアクセス制限は考えなくてOK.

collectdの設定

/usr/local/etc/collectd.conf (既存の設定に追加)
1
2
3
4
LoadPlugin nginx
<Plugin "nginx">
    URL "http://127.0.0.1/ngstat"
</Plugin>

Nginxプラグインの設定を追加。Nginxのステータスを取得するためのURLとして先に設定したバーチャルホストのURLを書く。

Nginxとcollectdを再起動(再読み込み)

# service nginx reload
# service collectd restart

Nginxは再起動ではなく設定の再読み込みをする。collectdは普通に再起動。

Nginxのステータスが出力されていることを確認しておく。

% wget -q -O - http://127.0.0.1/ngstat
Active connections: 9
server accepts handled requests
 12218 12218 26536
Reading: 0 Writing: 1 Waiting: 8
%

こんな感じで出力される。

collectdでNginxのステータス情報を受信できていることを確認する。方法はcollectdの設定の記事を参照。

これでNginxのステータス情報がcollectd経由でlogstashに集められてelasticserchデータベースに流れ込むようになった。
ここからが本題。

KibanaのSearchで抽出条件を作成する

KibanaのSearchで情報を見る 1
画面1:
kibanaにアクセスし、左列のメニューからDiscoverをクリック。

Discoverを表示するときは最低でもブラウザの幅を1000px以上にしないと欲しい情報が見えなくて使いづらいのでできるだけブラウザの窓を拡げること。

Discoverの初期値はLast 15 minutesのようなので直近15分のlogstash-*の全データが表示される筈。
フィールド名のリストの項目は表示されているデータ(抽出されているデータ)に含まれる分だけなので、存在する筈なのに表示されないと言う場合は抽出の仕方を変えるなどしなければならない。
右列はデータソース。

KibanaのSearchで情報を見る 2
画面2:
データの絞り込みを行う。特に決まりはない筈だか欲しいデータが得られるように抽出条件を追加する。
今回は先ず特定のホストだけを抽出させたい。
フィールド名のリストで[host]を押すと抽出範囲に含まれるホストのリストが表示される。
その中から「抽出したい」ホストを探し、ホスト名の右側の(抽出の追加)を押す。

KibanaのSearchで情報を見る 3
画面3:
上部に抽出中の項目が表示されるようになった。
右列のデータソースも抽出したホストのデータだけになっている筈。
フィールド名リストの[host]の項目も抽出対象として選んだホストだけが表示されている。
さらに絞り込むため、[collectd_type]を押す。
collectd_typeに含まれる項目が表示される。(ここで注意としては項目名が多いと全てが表示されるとは限らないこと)
今回はNginxの接続ステータスに絞りたいと思うのでnginx_connectionsの右側の(抽出の追加)を押す。
ちなみにその下のconnectionsもNginxのステータス情報の一部。(今回は用は無し)

KibanaのSearchで情報を見る 4
画面4:
上部の抽出中の項目の表示が増えた。
フィールド名リストの[collectd_type]がnginx_connectionsだけになった。
試しにデータソースの中の1つを開いてみる。Time列の時間の左側の(右向き三角)を押すとそのデータソースが展開される。
type_instanceがwaitingになっている。こういうのは他の種類のtype_instanceがある筈。

KibanaのSearchで情報を見る 5
画面5:
フィールド名のリストから[type_inctance]を押す。
4種類のtype_instanceが見えている。(抽出した時間内に含まれるものだけなのでこれが全種類とは限らないし全種類かもしれない)
今回はwritingに絞りたいと思うのでwritingの右側の(抽出の追加)を押す。

KibanaのSearchで情報を見る 6
画面6:
上部の抽出中の項目の表示が増えた。
取り敢えずこの抽出条件を保存したい。画面上部の[Save]を押す。

KibanaのSearchで情報を見る 7
画面7:
わかりやすい名前を付けて[Save]を押す。
(個人的には抽出条件を並べた名前を付けるようにしている)

KibanaのSearchで情報を見る 8
画面8:
上の画面5でtype_instanceをwritingで抽出したが、type_instanceの別のものも抽出したい。
そこで上部で現在抽出中の項目でtype_instance:"writing""になっている部分にマウスカーソルを合わせる。
幾つかアイコンが表示されるので(ゴミ箱)をクリック。

抽出状態としては画面5の状態になる。
今回はactiveに絞りたいと思うのでactiveの右側の(抽出の追加)を押す。

KibanaのSearchで情報を見る 9
画面9:
現在抽出中の項目にtype_instance:"active"が追加される。この抽出条件を保存したいので最上部の[Save]を押す。
新しい名前を付け、Save as a new searchにチェックして[Save]を押す。このときSave as a new searchにチェックしないと画面6,7で保存した抽出条件が新しく指定した名前に変更になって上書き保存されてしまう。

KibanaのSearchで情報を見る 10
画面10:
今度はロードアベレージ。
特定のホストに絞って、collectd_typeにloadを指定して更に絞った。
データソースを見るとlongterm, midterm, shorttermという項目にそれぞれ値が入っている。(こういうのは直感的に分かりやすくてある意味ありがたいがデータとしては汚い)
同じく名前を付けてこの条件で保存する。
(次回Visualizeで使う)

KibanaのSearchで情報を見る 11
画面11:
ここまで抽出条件を作って保存したが、それの管理は左列メニューのManagementで行う。
左列の Managementをクリック。
Management画面で「Saved Object」をクリック。

KibanaのSearchで情報を見る 12
画面12:
上部のタブがSaved Objectであること(赤色の破線四角部分)を確認してその少し下のタブから[Searches]をクリックする。
保存した抽出条件がリスト表示されるので、削除したい条件があればその条件の名前の左にあるチェックボックスにチェックして[Delete]ボタンを押す。

次は今回作成した抽出条件からVisualizeでグラフを作成する。

関連記事:
Up