TICK stack でモニタリング環境を構築 (Telegraf + InfluxDB + Chronograf + Kapacitor)


概要

TICK stack とやらを最低限の設定で構築する

TICK は以下の Influxdb 改め influxdata ツール群で構成される stack らしい

  • T - Telegraf – Data collection
  • I - InfluxDB – Data storage
  • C - Chronograf – Data visualization
  • K - Kapacitor – Data processing

構成は以下の通り

※公式サイトより

環境

AWS にサーバを2台用意

  • ip-172-31-17-95 : Influxdb, Kapacitor, Chronograf
  • ip-172-31-17-94 : Telegraf

バージョンは以下の通り

  • CentOS release 6.7 (Final)
  • InfluxDB v0.10.0 (Beta)
  • Telegraf v0.10.0
  • Kapacitor v0.2.4
  • Chronograf v0.4

各種インストール

InfluxDB インストール

$ wget https://influxdb.s3.amazonaws.com/influxdb-0.10.0-0.beta1.x86_64.rpm
$ sudo yum localinstall influxdb-0.10.0-0.beta1.x86_64.rpm

Telegraf インストール

$ wget http://get.influxdb.org/telegraf/telegraf-0.10.0-1.x86_64.rpm
$ sudo yum localinstall telegraf-0.10.0-1.x86_64.rpm

Kapacitor インストール

$ wget https://s3.amazonaws.com/influxdb/kapacitor-0.2.4-1.x86_64.rpm
$ sudo yum localinstall kapacitor-0.2.4-1.x86_64.rpm

Chronograf インストール

$ wget https://s3.amazonaws.com/get.influxdb.org/chronograf/chronograf-0.4.0-1.x86_64.rpm
$ sudo yum localinstall chronograf-0.4.0-1.x86_64.rpm

InfluxDB セットアップ

とりあえずデフォルトのまま起動

$ sudo /etc/init.d/influxdb start

Telegraf セットアップ

  • InfluxDB サーバを指定する
  • per cpu は無効にする
$ sudo vi /etc/telegraf/telegraf.conf

urls = ["http://172.31.17.95:8086"]

[[inputs.cpu]]
  percpu = false

Telegraf起動

$ sudo /etc/init.d/telegraf start

デフォルトで入る監視設定は以下

measurement field
cpu time_guest, time_guest_nice time_idle, time_iowait, time_irq, time_nice, time_softirq, time_steal, time_system, time_user, usage_guest, usage_guest_nice, usage_idle, usage_iowait, usage_irq, usage_nice, usage_softirq, usage_steal, usage_system, usage_user
disk free, fstype, inodes_free, inodes_total, inodes_used, path, total, used
diskio io_time name, read_bytes, read_time, reads, serial, write_bytes, write_time, writes
mem available, available_percent, buffered, cached, free, total, used, used_percent
swap free, in, out, total, used, used_percent
system load1, load15, load5

※10秒毎に上記メトリクスを InfluxDB に output する

Kapacitor セットアップ

email 通知を有効化

$ sudo vi /etc/kapacitor/kapacitor.conf
/etc/kapacitor/kapacitor.conf
[smtp]
  enabled = true                   #有効化
  host = "127.0.0.1"
  port = 25
  username = ""
  password = ""
  from = "[email protected]"     #送信元アドレス
  to = ["****@*************"]      #アラートメール通知先
  no-verify = false
  idle-timeout = "30s"

Kapacitor 起動

$ sudo /etc/init.d/kapacitor start

アラート設定

tick スクリプトを作成

cpu_alert.tick
stream
    .from().measurement('cpu')
    .alert()
                .warn(lambda: "usage_idle" < 30)  #idle 30%以下で warning
                .crit(lambda: "usage_idle" < 10)  #idle 30%以下で critical
        .email()                                  #email 通知

task を投入

$ kapacitor define -name cpu_alert -type stream -dbrp telegraf.default -tick cpu_alert.tick

task の有効化

$ kapacitor enable cpu_alert

監視対象のスペックが低いこともあり、軽く負荷かけると大量にメールが飛んできた

メールの件名でホスト名部分が nil になっているので修正する
flapping もうざいので何とかする

アラート調整

  • TagKey を group 化 (host, cpu)
  • window の定義を追加 (60秒毎に60秒間のデータを取得)
  • warn, crit 60秒間のデータの何れかが条件に一致した場合、alert に投げる
  • stateChangesOnly 追加 (ステータスが変化したときのみ)
  • ID 追加 (メールの件名に使用される message が {{ .ID }} is {{ .Level }} のため)
cpu_alert.tick
stream
  .from().measurement('cpu')
    .groupBy('host','cpu')
    .window()
      .period(60s)
      .every(60s)
    .alert()
      .id('{{ index .Tags "host" }}/{{ index .Tags "cpu" }}')
      .warn(lambda: "usage_idle" < 30)
      .crit(lambda: "usage_idle" < 10)
      .stateChangesOnly()
      .email()

task 再投入

$ kapacitor define -name cpu_alert -type stream -dbrp telegraf.default -tick cpu_alert.tick

確認

$ kapacitor show cpu_alert
Name: cpu_alert
Error:
Type: stream
Enabled: true
Executing: true
Databases Retention Policies: ["telegraf"."default"]
TICKscript:
stream
  .from().measurement('cpu')
    .groupBy('host','cpu')
    .window()
      .period(60s)
      .every(60s)
    .alert()
      .id('{{ index .Tags "host" }}/{{ index .Tags "cpu" }}')
      .warn(lambda: "usage_idle" < 30)
      .crit(lambda: "usage_idle" < 10)
      .stateChangesOnly()
      .email()

DOT:
digraph cpu_alert {
stream0 -> stream1 [label="12"];
stream1 -> window2 [label="1"];
window2 -> alert3 [label="0"];
}

task 一覧取得

$ kapacitor list tasks
Name                          Type      Enabled   Executing Databases and Retention Policies
cpu_alert                     stream    true      true      ["telegraf"."default"]

アラートメール確認

注意事項

tick スクリプトの構文エラーは define 時にチェックされてエラーになる、ランタイムエラーが出るような task を突っ込むと panic になって落ちた後、起動不可になった

こんなの(groupBy を下に持ってくる)

cpu_alert.tick
stream
  .from().measurement('cpu')
    .window()
      .period(30s)
      .every(30s)
    .groupBy('host','cpu')
    .alert()
      .warn(lambda: "usage_idle" < 30)
      .crit(lambda: "usage_idle" < 10)
      .log('/tmp/cpu_alert.log'

対応 : task db を削除して初期化した

$ sudo rm /var/lib/kapacitor/tasks/task.db

Chronograf セットアップ

外からアクセスできるようにする

$ sudo vi /opt/chronograf/config.toml

Bind = "0.0.0.0:10000"

Chronograf 起動

$ sudo /etc/init.d/chronograf start

http://{サーバIPアドレス}:10000 にアクセス

「Add new server」より「NICKNAME」を適当に入力して「Save」

「New Graph」にてグラフ名を設定して「BUILDER」でクエリ作成

telegraf で取得した cpu メトリクスのグラフ

次回は telegraf によるメトリクス取得と kapacitor でのイベント処理について深堀する