Zabbixで生成AIを使用したログ分析

こんにちは、SCSK株式会社の小寺崇仁です。

先日、複数サーバからログが大量に出力された場合に、生成AIを使って分析したいと要望頂きましたので、実現してみたいと思います。
具体的には、「同一ホストグループ」で発生した「直近1日のログ」を生成AIに分析してもらいます。

検証内容

APサーバ(ap_1229)とDBサーバ(db_1229)を準備します。

APサーバからは、DBに接続できない旨のエラーを出力します。
DBサーバからは、MaxConnectionで接続できない旨のエラーを出力します。

Pythonのスクリプトを作成し、同一ホストグループ、直近1日のログを抽出し、生成AIに分析をさせます。
生成AIには以下のプロンプトを送ります。

次のログが出力されました。原因を分析してください
Host: ap_1229, Time: 2024-12-29 10:59:18, Value: can't connect to mysql database
Host: ap_1229, Time: 2024-12-29 10:59:20, Value: can't connect to mysql database
Host: db_1229, Time: 2024-12-29 10:55:23, Value: FATAL: sorry, too many clients already
Host: db_1229, Time: 2024-12-29 10:55:47, Value: FATAL: too many connections for database zabbix

スクリプト作成

pythonのスクリプトを配置します。pythonのスクリプトも生成AIがベースを作ってくれるので簡単ですね。

import mysql.connector
import argparse    
import json
import sys
import warnings
import boto3
from mysql.connector import Error

warnings.simplefilter('ignore') 
# 引数を処理するための関数
def get_hostid():
    parser = argparse.ArgumentParser(description="Get data for a specific hostid.")
    parser.add_argument('hostid', type=int, help="Host ID to filter the data.")
    args = parser.parse_args()
    return args.hostid

# データベース接続情報
host = 'localhost'
database = 'zabbix'
user = 'zabbix'
password = 'password'

# AWS接続情報
client = boto3.client('bedrock-runtime', region_name='ap-northeast-1', verify=False)
model_id = 'anthropic.claude-3-5-sonnet-20240620-v1:0'


# SQLクエリ
def create_query(hostid):
    sql_query = f"""
    SELECT h.host, 
           CONVERT_TZ(FROM_UNIXTIME(hs.clock), '+00:00', '+09:00') AS time, 
           hs.value 
    FROM items i
    LEFT JOIN hosts h ON h.hostid = i.hostid
    LEFT JOIN hosts_groups hg ON h.hostid = hg.hostid
    LEFT JOIN history_str hs ON i.itemid = hs.itemid
    WHERE h.hostid IN (
        SELECT hostid 
        FROM hosts_groups 
        WHERE groupid IN (
            SELECT groupid 
            FROM hosts_groups  
            WHERE hostid = {hostid}
        )
    )
    AND hs.clock >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 24 HOUR));
    """
    return sql_query

def execute_query(hostid):
    try:
        # MySQLデータベースに接続
        connection = mysql.connector.connect(
            host=host,
            database=database,
            user=user,
            password=password
        )

        if connection.is_connected():

            cursor = connection.cursor()
            sql_query = create_query(hostid)
            cursor.execute(sql_query)

            # 結果の取得
            result = cursor.fetchall()

            # 結果をリストに格納
            result_list = []
            for row in result:
                result_list.append(f"Host: {row[0]}, Time: {row[1]}, Value: {row[2]}")

            return result_list

    except Error as e:
        print(f"エラーが発生しました: {e}")

    finally:
        if connection.is_connected():
            cursor.close()
            connection.close()

# 実行部分
if __name__ == "__main__":
    hostid = get_hostid()  # コマンドライン引数からhostidを取得
    logs = execute_query(hostid)  # クエリを実行
    
    prompt = f"次のログが出力されました。原因を分析してください\n" + "\n".join(logs)

    native_request = {
        "anthropic_version": "bedrock-2023-05-31",
        "max_tokens": 512,
        "temperature": 0.5,
        "messages": [
            {
                "role": "user",
                "content": [{"type": "text", "text": prompt}],
            }
        ],
    }
    request = json.dumps(native_request)
    response = client.invoke_model(modelId=model_id, body=request)
    model_response = json.loads(response["body"].read())

    #回答の部分のみを抽出
    answer = model_response["content"][0]["text"]
    print(answer)

つぎに、ZabbixのWeb管理画面から実行できるようにスクリプトを登録します

実行

障害画面からAPサーバの障害をクリックして、スクリプトを実行します。

スクリプトではAP,DBサーバの直近1日のログを生成AIに分析させます。


ポップアップにて、生成AIの分析結果が表示されます。


出力文字数オーバー?で途中で切れました。。。

コマンドで実行すると以下のレスポンスです。

[root@zb7 externalscripts]# python grouplog.py 11644
このログから、以下のような原因分析が可能です:

1. データベース接続の問題:
   - APサーバー(ap_1229)がMySQLデータベースに接続できていません。
   - これは3回連続で発生しており、持続的な問題であることを示しています。

2. データベースサーバーの過負荷:
   - DBサーバー(db_1229)で2つの重大なエラーが発生しています。
   - "too many clients already" と "too many connections for database zabbix" というエラーは、データベースサーバーが処理できる以上の接続要求を受けているこ
とを示しています。

3. タイミング:
   - DBサーバーのエラーは10:55頃に発生し、その後APサーバーの接続エラーが10:59頃に発生しています。
   - これは、DBサーバーの問題がAPサーバーの接続エラーの原因である可能性を示唆しています。

4. 考えられる根本原因:
   - データベースサーバーのリソース(特に接続数)が不足している。
   - アプリケーションが適切にデータベース接続を管理していない(接続をクローズしていない)。
   - 突然のトラフィック増加やバッチ処理などによる一時的な負荷増大。
   - データベースの設定(最大接続数など)が適切でない。

5. 推奨される対応:
   - データベースサーバーの最大接続数設定を確認し、必要に応じて増加させる。
   - アプリケーションコードを確認し、データベース接続の適切な管理(接続のクローズなど)を確保する。

 

結果

DBサーバの最大接続数設定や、アプリでのクローズ忘れの可能性がある旨の回答がされました。実用できる回答だと思います。

今回のスクリプトは同一ホストグループのログをまとめて送信しているため、各サーバのログを1台づつ確認する手間が省けます。

最後に

弊社ではZabbix関連サービスを展開しています。以下ページもご参照ください。

SCSK Plus サポート for Zabbix

★YouTubeに、SCSK Zabbixチャンネルを開設しました!★

★X(旧Twitter)に、SCSK Zabbixアカウントを開設しました!★

タイトルとURLをコピーしました