こんにちは、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に分析させます。

出力文字数オーバー?で途中で切れました。。。
コマンドで実行すると以下のレスポンスです。
[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アカウントを開設しました!★


