Telegraf の ping プラグインを使用したサーバーの死活監視

## はじめに
Telegraf + InfluxDB + Grafana の構成でサーバーの死活監視を実装した。
Telegraf にはたくさんのプラグインがあり色々なメトリクス情報を収集することができるが、そのうち ping プラグインを使用し、監視対象サーバーの ping 応答の情報を収集する。
この情報は InfluxDB に蓄積する。
さらに Grafana にてグラフ化し、fieldKey `result_code`の値に対してアラート設定を行う。
これにより、ping 応答状況の確認と、応答が途絶えた場合のアラート通知が可能となる。

- 参照したドキュメント
    - [Telegraf Documentation](https://docs.influxdata.com/telegraf/v1.20/)
    - [Telegraf Ping Input Plugin](https://github.com/influxdata/telegraf/tree/master/plugins/inputs/ping)
    - [InfluxDB Documentation](https://docs.influxdata.com/influxdb/v2.0/)
    - [Grafana documentation](https://grafana.com/docs/grafana/latest/)
    - [“Template variables are not supported in alert queries” while setting up Alert](https://community.grafana.com/t/template-variables-are-not-supported-in-alert-queries-while-setting-up-alert/2514)

- モジュールのダウンロード先の確認、 Grafana のダッシュボードのテンプレートの検索は以下のリンク先にて実施
    - InfluxDB & Telegraf Download  
      https://portal.influxdata.com/downloads/
    - Telegraf Download （上記に載っていないもの）  
      https://github.com/influxdata/telegraf/releases
    - Grafana Download  
      https://grafana.com/grafana/download
    - Garafana Dashboard   
      https://grafana.com/grafana/dashboards/

- 設定にあたり手順を参考にした記事
    - [AIX の監視：Njmon / infulxDB / Grafana 導入](https://qiita.com/c_u/items/173317979f6ed73f51c4)
    - [grafana / influxdb / telegraf で10年前のシステムを可視化した](https://qiita.com/tuneyukkie/items/cdd961cb7f5b309e0b57)

## 環境

- 1台の監視サーバーに Telegraf 、InfluxDB および Grafana を導入した。
- 監視対象サーバーは既存の AIX サーバーを使用した。

■ 監視サーバー
　OS : CentOS 7.6
　Telegraf : 1.20.0
　Grafana : 8.2.2
　InfluxDB : 1.8.10

- バージョン選定にあたっての補足
    - InfluxDB は既に v2.x 系がリリースされているが、別件で監視対象サーバー (AIX 7.2) での njmon 検証を行っており、 njmon の実行結果も同じ InfluxDB に保管したかったため、njmon が対応している v1.x 系を採用した。
    - Telegraf の構築時点の最新版は v1.20.3 だったが、このバージョンを導入したところサービスが起動できなかったため、v1.20.0 を採用した。


■ 監視対象サーバー
　AIX 7.2

- こちらはモジュール導入等は不要、監視サーバーから ping 応答が返るように NW 設定だけ行った。

## 構築手順
### InfluxDB、Grafana のインストールおよび設定

- 以下のドキュメントを参考に InfluxDB および Grafana を導入し、Granafa でデータソースの設定を実施　（ただし、導入サーバーは IA サーバーなので、モジュールも環境に合わせたものを公式の Web サイトから入手した。）
    - AIX の監視：Njmon / infulxDB / Grafana 導入  
      https://qiita.com/c_u/items/173317979f6ed73f51c4
- InfluxDB 上に作成する、ping プラグインの実行結果の保管用データベース名は `pingdb`とした。

 ```
# influx
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> show databases
name: databases
name
----
_internal
> create database pingdb
> show databases
name: databases
name
----
_internal
pingdb
> quit
 ```

### Telegraf 導入

- モジュールをダウンロードして yum インストール

 ```
# wget https://dl.influxdata.com/telegraf/releases/telegraf-1.20.0-0.rc0.x86_64.rpm
# yum localinstall telegraf-1.20.0-0.rc0.x86_64.rpm
 ```


- 設定ファイルを作成  
    - `telegraf -sample-config`コマンドを実行すると、使用するプラグインに応じた config ファイルのサンプルを生成できる。
    - 導入直後に存在する config ファイルは全プラグインについて記載されており、このコマンドを実行することで必要箇所のみに絞られるぽい。
    - 今回は ping プラグインを使用し、収集したデータを InfluxDB に保管したいので、以下のコマンドを実行した。
    - なお、複数のプラグインを使用したい場合、`-input-filter` で指定するプラグインを`:(カンマ)`区切りで複数指定可能。

 ```
# telegraf -sample-config -input-filter ping -output-filter influxdb > /work/telegraf.conf
 ```

- 設定ファイルを修正
    - Ping Input Pluginの「Configuration」の記載に従って、設定ファイルを修正する。
    - 今回の構成では、InfluxDB と Telegraf は同一サーバーに導入しており、InfluxDB はデフォルトのポート`8086`を使用しているため、outputs.influxdb で指定する url は`http://127.0.0.1:8086`とした。
    - また、ping プラグインの実行結果から応答時間とパケットロスの割合を Grafana のテンプレート「Network Latency」でグラフ化してみるために、テンプレートの Web ページのガイドに従い inputs.ping の`count`は`3`に変更した。
   
```言語:/work/telegraf.conf
[[outputs.influxdb]]
  urls = ["http://127.0.0.1:8086"]
  database = "pingdb"

[[inputs.ping]]
  urls = ["監視対象サーバーの IP アドレス1", "監視対象サーバーの IP アドレス2", "監視対象サーバーの IP アドレス3"]
  count = 3
```
- config ファイルを配置
    - いったん work にconfig ファイルの作成と修正をしたので、本来の場所に配置。
    - 念のため、ファイルの権限を確認した。

 ```
# mv /etc/telegraf/telegraf.conf /etc/telegraf/telegraf.conf_org
# mv /work/telegraf.conf /etc/telegraf/telegraf.conf
# ls -ltr /etc/telegraf/telegraf.conf*
 ```
- サービス起動

 ```
# systemctl start telegraf
# systemctl status telegraf
 ```

- InfluxDB に保管されたデータを確認

```
# influx
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> show databases
name: databases
name
----
_internal
pingdb
> use pingdb
Using database pingdb
> show MEASUREMENTS
name: measurements
name
----
ping
> select * from ping
name: ping
time                average_response_ms host                   maximum_response_ms minimum_response_ms packets_received packets_transmitted percent_packet_loss result_code standard_deviation_ms ttl url
----                ------------------- ----                  ------------------- ------------------- ---------------- ------------------- ------------------- ----------- --------------------- --- ---
1636943222000000000 1.481               監視サーバーのホスト名  1.715               1.328               3                3                   0                   0           0.173                 248 監視対象サーバーのIP アドレス
1636943232000000000 1.304               監視サーバーのホスト名  1.708               0.747               3                3                   0                   0           0.408                 248 監視対象サーバーのIP アドレス
1636943242000000000 1.495               監視サーバーのホスト名  1.655               1.383               3                3                   0                   0           0.116                 248 監視対象サーバーのIP アドレス
1636943252000000000 1.105               監視サーバーのホスト名  1.312               0.906               3                3                   0                   0           0.17                  248 監視対象サーバーのIP アドレス
>
> quit
 ```

### Grafana ダッシュボードの設定

- ダッシュボードのテンプレートの検索画面で 「Telegraf」 で検索したら「Network Latency」があったので、とりあえずこれを使用して応答時間をグラフ化してみた。
    - Network Latency  
      https://grafana.com/grafana/dashboards/12261

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/679667fb-ed33-4d64-026b-9b1e9f543483.png)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/be10a114-060c-92c4-156f-3f7376f3e114.png)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/891e22a8-c673-ed6d-2d4a-908515f8e9fd.png)


- 表示されるダッシュボードはこんな感じ

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/d70de75b-5ff0-94a6-1f26-93360220927b.png)

- 死活監視のためのパネル追加
    - 「Network Latency」のダッシュボードは、応答時間とロスしたパケットの割合は確認できるが、これだと死活監視のアラート設定は実装しにくいかなと感じた(「パケロスx割以上をy分以上継続」というアラートは設定できるが基準が決めにくかった)。
    - ping プラグインの実行結果のうち、fieldKey`result_code`の値がいわゆる ping 応答結果のようなので、これを表示するクエリを作成して、このクエリに対してアラートを設定した。
    - ダッシュボードとパネルを新規に作成してもよいが、ダッシュボードを「Network Latency」と分ける要件もないので、ここにパネル追加をしてみた。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/6856d550-99f9-3868-44e1-6200920328c0.png)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/348d399e-b8b6-9a3d-14cc-20e6f11ca048.png)

- クエリの設定はこんな感じ
    - 下図の「IPアドレス」の箇所は監視対象サーバーの IP アドレスを選択する。
    - 以下のリンクの記載の通り、パラメーター変数はアラート設定に対応していないので、監視するサーバーの数だけクエリを作成してそれぞれ url を指定する。
        - [Template variables are not supported in alert queries” while setting up Alert](https://community.grafana.com/t/template-variables-are-not-supported-in-alert-queries-while-setting-up-alert/2514)
    - クエリは`Duplicate query`でコピーできるが、サーバー数が多すぎて Grafana の GUI でクエリを追加するのが面倒な場合は、JSON を編集するのがよさそう。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/a2d85c8e-a82d-5884-f5c8-e01fb265d340.png)

- 通知ルールの設定
    - 通知ルールを設定する前に`Notification channels`を設定しておく。
    - 今回は事前に設定した slack チャネルへ通知した。
    - 過去10秒間の result_code の最大値が1を超えた状況が1分間継続した場合に通知するルールを設定してみた。
    - 通知ルールを入力したら画面上部の`Apply`をクリック、さらにダッシュボードを `Save` する。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/9a4c9e04-ec12-a1a7-e89a-4961c1c60460.png)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/6431bfa9-c2c1-751a-7855-d18423c06685.png)

- 通知テスト
    - 通知ルールの条件に合致すると通知がされた。
    - 復旧した場合にも通知された。
    - ダッシュボードやアラートの画面からも状態が確認できた。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/c933e9d1-eb72-0b6c-3367-994f1090ad88.png)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/670315c8-2d03-5ab0-89fd-946858e80d6d.png)
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2430408/165f701c-4305-62d0-4adc-23164e636824.png)



- 検証してみて思ったこと
    - 通知の条件は、`max`を使用する他に、`sum`を使用して「x秒間の合計がy以上」とかでも設定できそう。
    - もっと簡単にアラート通知したい場合は、「Network Latency」のダッシュボードにもともとあるパネルにで、「ロスしたパケットx割以上がy秒継続」(average が 100 の状態が 60秒継続とか？)とかでもいいのかもしれない。
    - また、`result_code`のパネルは問題がないときはずっとゼロで見た目イマイチなので、「Network Latency」のダッシュボードの既存のパネルに非表示のクエリを追加して、アラートを設定するのでもいいかもしれないなと思った。