2017年8月14日月曜日

kapacitor を使って Slack に通知を送ってみた

概要

前回 までに InfluxDB, telegraf, Chronograf と試してきました
今回はアラートを送るための kapacitor を使って見ました
デフォルトで Slack に通知できる機能があったのでアラート情報を Slack に送るところまでやってみました

環境

  • macOS X 10.12.6
  • influxdb 1.3.1
  • telegraf 1.3.5
  • chronograf 1.3.3.4
  • kapacitor 1.3.1

インストール

  • brew install kapacitor
  • kapacitor version
Kapacitor v1.3.1

Slack 情報の設定

事前に Incomming Webhooks を作成しておきます

  • vim /usr/local/etc/kapacitor.conf
[slack]
  enabled = true
  url = "https://hooks.slack.com/services/Txxxxxxxx/Bxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxx"
  channel = "#general"
  global = false
  state-changes-only = false

[slack] の部分だけ抜粋しています
また不要なコメントも削除しています

enabled は true にしましょう
url, channel に関しては取得した Incomming Webhook の URL を指定し channel には通知したい Slack のチャネルを指定してください

global は true に設定するとすべてのチャネルに通知が行くようで、チャネルを制御したい場合は後述する TICKscript 内で制御するようです

state-changes-only はアラートの状態が変化したときにだけ通知をするかしないかのフラグです
今回はテストのなのでアラートの条件に合うたびに通知するため false に設定します

起動

  • kapacitord -config /usr/local/etc/kapacitor.conf

設定ファイルを指定して起動します

TICKscript の作成

プロセスを起動したらアラート情報を定義し追加していきます
kapacitor は DSL を使ってアラート情報を定義します
DSL なので結構覚えるのも大変なので今回は CPU を監視する簡単なサンプルを作成しました
また、公式でいくつかサンプルも用意しているみたいなので独自の作成する tick ファイルを作成する際に参考にしてください

  • vim cpu_alert_slack.tick
stream
    // Select just the cpu measurement from our example database.
    |from()
        .measurement('cpu')
        .where(lambda: "cpu" == 'cpu-total')
    |alert()
        .id('{{ index .Tags "host"}}/usage_idel')
        .crit(lambda: "usage_idle" < 99)
        // Whenever we get an alert write it to a file.
        .slack()

かなり簡単な tick ファイルにしました
telegraf が自動で作成したcpu という measurement に対してアラートをかけます
アラート情報として取得するレコードを where で絞込します
今回は cpu というフィールドがありそれの cpu-total というレコードだけ取得します
ここでポイントですが lambda 式の右辺の 'cpu-total' はシングルクオートでなければなりません
どうやら内部的にダブルクオートとシングルクオートは明確な違いがあり文字列のフィールドを比較する場合には値側はシングルクオートでなければなりませんでした

あとは alert() ノードで実際のアラート情報を定義しています
id はアラートを通知した際にどのホストなのかなど識別できる情報を設定します
今回は .Tags という slice に送られてくる host の情報を設定しています
アラートの条件は usage_idle が 99% 以下のときに Slack に通知するので (ほぼ) 確実にアラートが発砲するようにしました
あくまでもテストとして設定しているので実際にはもっと低い数値を設定しましょう

そして最後に .slack() を呼ぶことで kapacitor.conf に指定した Incomming Webhook の URL に対して通知を行います

アラートを定義する

作成した TICKscript を追加します
追加するには kapacitor define コマンドを使います

  • kapacitor define cpu_alert -type stream -dbrp telegraf.default -tick ./cpu_alert_stream.tick

名前、タイプ、使用する DB と .tick ファイルを指定しましょう
定義が追加できたら確認してみましょう

  • kapacitor list tasks
ID        Type      Status    Executing Databases and Retention Policies
cpu_alert stream    disabled  false     ["telegraf"."default"]

動作確認

アラートの定義ははじめは無効になっています
いきなり有効にしてもいいのですが、kapacitor ではアラートをテストする record という機能があります

  • kapacitor record stream -task cpu_alert -duration 20s

これで InfluxDB に入ってくるデータを 20 秒間監視することができます
監視したデータには ID が振られます
list recordings コマンドを使って監視したデータを確認することができます

  • rid=cd158f21-02e6-405c-8527-261ae6f26153
  • kapacitor list recordings $rid

そしてこの ID を指定することで監視したデータを再生することができます

  • kapacitor replay -recording $rid -task cpu_alert

こうすることで監視したデータを使ってアラートのテストを行うことができます
実際に監視したデータ内にアラートに引っかかる情報があると Slack に通知されます

もし問題なく通知が来るようであれば監視を有効にすれば OK です

  • kapacitor enable cpu_alert

.tick ファイルなどに構文エラーがある場合 kapacitor のログファイルにエラーログなども吐いてくれるので、実際にアラートを追加するときはちゃんと record 機能を使ったほうが良いかと思います

最後に

kapacitor を使って InfluxDB 内にあるデータを監視し Slack に通知するところまでやってみました
DSL で監視情報を定義する必要があるので、少し学習コストが必要になりそうです

大変だったのは本当にちゃんと監視できているか確認することでしたが、record の機能に気づいてからは結構簡単にできました

Tips

ログの位置は kapacitor.conf 内で定義されています
Mac のデフォルトのログ保存場所は以下でした

  • tail -f /usr/local/var/log/kapacitor.log

またログレベルが最初は INFO になっているので debug に変更したい場合はコマンドで可能です

  • kapacitor level debug

アラートを削除する場合は delete コマンドを使用すれば OK です

  • kapacitor delete cpu_alert

参考サイト

0 件のコメント:

コメントを投稿