Kapacitor & InfluxDB:アラートの自動化とプロフェッショナルな時系列データ処理

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

課題:データベースを「死んだ倉庫」にしないために

午前3時、電話が鳴り止みません。本番環境のサーバーがディスク容量不足で突然ダウンしてしまいました。翌朝ログを確認すると、InfluxDBには4時間前から容量の急増が記録されていました。しかし、単にデータを保存するだけで能動的な監視メカズムがなかったため、静かに進行していたトラブルに全く気づけませんでした。

Kapacitorを知る前、私はPythonスクリプトを5分おきにcron実行してInfluxDBにクエリを投げ、しきい値(threshold)をチェックしていました。この方法はリソースを大量に消費し、常に大きな遅延が発生します。Kapacitorはこの状況を打破するために登場しました。それは、データがデータベースに流れ込んだ瞬間に処理を行い、即座にアクションをトリガーすることを可能にします。

Kapacitorとは?

TICK Stack(Telegraf, InfluxDB, Chronograf, Kapacitor)の中で、Kapacitorは「中央処理ステーション」の役割を担います。InfluxDBがストレージなら、Kapacitorは分析を行う脳です。このツールは、主に3つの能力に優れています:

  • Stream Processing: リアルタイムのデータフローを監視し、即座にアラートを発信。
  • Batch Processing: 大規模な履歴データに対して複雑な計算クエリを実行。
  • 多様な出力先: Telegram、Slack、メールへのアラート送信、またはWebhookを呼び出してサーバーの自動スケールアップを実行。

PrometheusのAlertmanagerと比較して、Kapacitorは独自の言語であるTICKscriptのおかげで非常に柔軟性が高く、プログラマーのように複雑なアラートロジックを記述できます。

ステップ1:UbuntuへのInfluxDBとKapacitorのインストール

このガイドでは、従来のTICKscriptとの最高の互換性を確保するため、Ubuntu 22.04とInfluxDBバージョン1.8を使用します。

# InfluxDataの公式リポジトリを追加
wget -q https://repos.influxdata.com/influxdata-archive_compat.key
echo '393e8779c8945d31955614b03973f3510af1022fe4440455b2395634179739a5 influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list

# InfluxDBとKapacitorのコンボをクイックインストール
sudo apt update && sudo apt install influxdb kapacitor -y

# システムサービスを有効化
sudo systemctl enable --now influxdb
sudo systemctl enable --now kapacitor

kapacitor version コマンドを入力して確認します。ターミナルにバージョン(例:1.6.x)が表示されれば、インストールは成功です。

ステップ2:接続設定

デフォルトでは、Kapacitorは localhost:8086 でInfluxDBを探します。データベースを別のサーバーに分ける場合は、以下の設定ファイルを編集してください:

sudo nano /etc/kapacitor/kapacitor.conf

[[influxdb]] ブロックを探し、正しいURLに更新します:

[[influxdb]]
  enabled = true
  urls = ["http://127.0.0.1:8086"]
  timeout = "0s"

保存後、サービスを再起動します:sudo systemctl restart kapacitor

ステップ3:CPUアラート用のTICKscriptを作成

CPU指標を監視するスクリプトを作成しましょう。1分間の平均CPU使用率が80%を超えた場合にログを記録するように設定します。

cpu_alert.tick ファイルを作成します:

stream
    |from()
        .database('telegraf')
        .retentionPolicy('autogen')
        .measurement('cpu')
        .where(lambda: "cpu" == 'cpu-total')
    |window()
        .period(1m)
        .every(1m)
    |mean('usage_user')
    |alert()
        .crit(lambda: "mean" > 80)
        .log('/tmp/cpu_alerts.log')

このスクリプトの仕組みは非常にシンプルです。window() 関数によって60秒間のデータをグループ化して平均を算出します。これは、一時的なCPUのスパイク(急上昇)による誤報を防ぐために非常に重要です。

ステップ4:タスクのデプロイ

スクリプトを実際に実行するには、定義(define)と有効化(enable)の2つのステップを経てKapacitorに読み込ませる必要があります。

# 新しいタスクを定義
kapacitor define cpu_high_alert -tick cpu_alert.tick -dbrp telegraf.autogen

# タスクを有効化
kapacitor enable cpu_high_alert

kapacitor show cpu_high_alert コマンドでステータスを確認できます。各ノードを通過するデータポイント(points)の数を示すテキスト形式のチャートが表示されます。

ステップ5:Telegramと連携して即座に通知を受け取る

ファイルへのログ記録だけでは不十分です。スマートフォンの通知でアラートを受け取るには、/etc/kapacitor/kapacitor.conf を開き、[telegram] セクションを探します:

[telegram]
  enabled = true
  url = "https://api.telegram.org/bot"
  token = "123456789:ABCDefGhIJK..." # BotFatherから取得したトークン
  chat-id = "987654321"

TICKscriptのalertノードを更新します:

    |alert()
        .crit(lambda: "mean" > 80)
        .telegram()

その後、再度 kapacitor define cpu_high_alert -tick cpu_alert.tick を実行して、Kapacitorに新しい構成を反映させます。

500ノード以上のシステム運用から得た実践的な経験

大規模なIoTや監視システムを長年運用してきた中で、3つの重要な注意点を見出しました:

  1. 大規模データにはBatchを優先: 秒間数千のセンサーがデータを送信している場合、stream を使用するとRAMを使い果たします。5〜10分周期でデータをクエリする batch 処理に切り替えましょう。
  2. Deadman’s Switch: これは「命綱」のような機能です。デバイスが突然沈黙した場合(ネットワーク遮断や故障)、Kapacitorがデータの欠落を検知して即座にアラートを出します。
  3. Retention Policyの確認: TICKscript内でデータベース名やリテンションポリシーの宣言を間違えると、タスクは決して実行されません。常にInfluxDBの設定値と照らし合わせて確認してください。

おわりに

Kapacitorは単なるアラートツールではなく、強力なデータ処理エンジンです。InfluxDBとKapacitorを組み合わせ、データベースからビジネスメトリクスを直接監視することで、受動的な対応から完全な能動的監視へと移行できます。システムは単にデータを保存するだけでなく、自ら考え、トラブルに即座に反応できるようになります。

Share: