AIエージェントによるサーバーログ監視:オンコールの「悪夢」からスマートなTelegram通知へ

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

毎朝の「ログの海に溺れる」恐怖

いくつかのVPSやマイクロサービスを運用している方なら、朝起きてすぐにaccess.logjournalctlから流れてくる数千行のログを目の当たりにする光景は珍しくないでしょう。以前はGrepやAwk、Zabbixを組み合わせて使っていましたが、ログファイルが1日5GBを超え、エラーの内容が複雑化するにつれ、その限界を感じるようになりました。

従来の監視ルールは非常に機械的です。「Error」という文字を見つけてアラートを設定すると、些細なエラーでもスマホが鳴り止みません。逆に、500エラーは出さないものの、後にデータベースをフリーズさせるような静かなスキャン攻撃などは、スクリプトでは見逃されがちです。

AIエージェントを導入して6ヶ月、運用のルールがガラリと変わりました。自分でログを読む代わりに、AIにL1サポート(一次対応)としての役割を任せています。AIが文脈を理解し、本当に異常がある時だけTelegramで通知してくれます。その実装方法を以下に紹介します。

アプローチの選択:なぜ「ハイブリッド・エージェント」なのか?

ログ監視には主に3つの方向性がありますが、すべてがコスト効率に優れているわけではありません。

1. ルールベース (Regex/Grep)

  • 実態: 極めて高速で、リソース消費はゼロ。
  • 弱点: 既知の事象しか検知できない。未知の論理エラーが発生するとお手上げ。

2. フルAI (すべてをLLMに送信)

  • 実態: 非常に賢いが、コストが極めて高い。
  • 弱点: システムが100万行のログを出力した場合、GeminiやGPT-4のAPI請求額を見て「悲鳴を上げる」ことになります。

3. ハイブリッド・エージェント (最適解)

  • メカニズム: Pythonスクリプトで機密性の高いキーワードを事前にフィルタリング(プリフィルタリング)。疑わしいログの塊や長いトレースバックのみをLLMに送り、深い分析を行います。
  • 結果: 送信トークン量を90%削減しつつ、的確に問題を特定。
実際のデータ: 対応コマンドの提案(例:「ポート確認のためにコマンドXを実行せよ」)を導入したことで、MTTR(平均復旧時間)を45分から10分未満に短縮できました。

ステップバイステップの実装

ステップ1:リアルタイムでのログキャプチャ

手動でtail -fコマンドを使う代わりに、Pythonのwatchdogライブラリを使用して、ログファイルの変化を能動的に監視します。

import time
import os

def tail_log(path):
    with open(path, "r") as f:
        f.seek(0, os.SEEK_END) 
        while True:
            line = f.readline()
            if not line:
                time.sleep(0.1)
                continue
            yield line

# Nginxのエラーログを監視
for line in tail_log("/var/log/nginx/error.log"):
    if any(k in line.lower() for k in ["error", "critical", "failed"]):
        # AIに処理を渡して分析
        report = analyze_with_ai(line)
        send_telegram(report)

ステップ2:Gemini APIによる文脈分析

AIが推測で答えないよう、前後のログ5行程度をコンテキストとして送信します。Gemini 1.5 Flashは高速で無料枠も充実しているため、非常に良い選択肢です。

import google.generativeai as genai

genai.configure(api_key="あなたのAPIキー")
model = genai.GenerativeModel('gemini-1.5-flash')

def analyze_with_ai(log_block):
    prompt = f"""
    あなたはシニアSREエキスパートです。以下のログを確認してください:
    {log_block}
    
    簡潔に回答してください:
    1. 重要度 (1-10)。
    2. このエラーは何ですか? (分かりやすく説明)。
    3. すぐに実行すべき確認用のLinuxコマンドは何ですか?
    """
    response = model.generate_content(prompt)
    return response.text

ステップ3:Telegramへのアラート通知

Telegramボットの良い点はMarkdownをサポートしていることです。Linuxコマンドを明確に表示できるため、スマホからすぐにコピー&ペーストできます。

import requests

def send_telegram(message):
    payload = {
        "chat_id": "あなたのチャットID",
        "text": f"🔴 **システム異常検知**\n\n{message}",
        "parse_mode": "Markdown"
    }
    requests.post("https://api.telegram.org/bot{TOKEN}/sendMessage", json=payload)

実運用で得た「血の通った」教訓

AIに自動でシステム復旧コマンドを実行させてはいけません。ハルシネーション(幻覚)は実在します。以前、AIが間違った構文のrmコマンドを提案し、データフォルダが消えかけたことがありました。常に人間が最終的な承認を行う役割を維持してください。

システムがループエラーに陥った際の通知スパムを防ぐため、デバウンス(Debouncing)の仕組みを導入しています。具体的には、エラー内容をハッシュ化してキャッシュに保存し、10分以内に同じエラーが繰り返された場合は、エージェントを黙らせてサーバーの復旧に集中できるようにしています。

運用開始から6ヶ月後の評価

  • メリット: AIがエラーの仕分けをしてくれるので、ぐっすり眠れるようになりました。パスワードの誤入力(Warning)と、CPUリソースの異常占有(Critical)を完璧に判別してくれます。
  • デメリット: AIの回答が冗長にならないよう、初期のプロンプト調整に時間がかかりました。

結論として、ログ監視用のAIエージェント構築は難しくありません。重要なのは入力データのフィルタリング方法です。DockerやK8sに最適化されたプロンプトのサンプルが必要な方は、コメントをいただければ共有します!

Share: