ZabbixとChatGPTを連携してみた(メディアタイプ編)

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

今回はZabbixにて検知したSNMPTrapをChatGPTに連携して、対処方法を教えてもらいたいと思います。

機能概要としては、以下となります。
1.CahtGPT用のメディアタイプ(javascript)を作成
2.トリガーアクションでメディアタイプが実行されるように設定
3.障害を検知すると、アクション(メディアタイプ)が実行され、イベントにコメントを付けます。
コメントの内容はChatGPTが考えた対処方法になります。

忙しい方はこちらからメディアタイプがダウンロード可能です。
※拡張子をyamlにして、インポートしてご利用ください。

事前準備

Zabbix 6.x 6系以上のZabbixが必要です。
GhatGPTのAPIキー xxxxxxx ChatGPTの実行アカウントでの発行が必要です。
ZabbixのAPIトークン zzzzzzzz Zabbixの「管理->一般設定->APIトークン」から発行できます。

メディアタイプの作成

メディアタイプのタブ

項目 補足
名前 任意  
タイプ webhook  
↓パラメータ↓    
AI_API_KEY xxxxxxx ChatGPTのAPIキーを指定
AI_MODEL gpt-3.5-turbo  
AI_TEXT {ALERT.MESSAGE} ChatGPTへの問い合わせ文字列
メッセージテンプレートを参照するマクロを指定
AI_URL https://api.openai.com/v1/chat/completions ChatGPTのURLを指定
ZB_API_KEY zzzzzzzz ZabbixのAPIトークンを指定
ZB_EVENT_ID {EVENT.ID} コメントをつけるイベントのIDを指定
イベントIDを参照するマクロを指定
ZB_URL https://127.0.0.1/zabbix/api_jsonrpc.php ZabbixのURLを指定
スクリプト 次に記載  
タイムアウト 60s ChatGPTの実行に時間がかかるので最大値を指定

スクリプト

//////////////////////////////////////////
//初期化処理
//////////////////////////////////////////
params = JSON.parse(value);
const AI_URL = params.AI_URL;
const AI_API_KEY = params.AI_API_KEY;
const AI_MODEL = params.AI_MODEL;
const AI_TEXT = params.AI_TEXT;
const ZB_EVENT_ID = params.ZB_EVENT_ID;
const ZB_URL = params.ZB_URL;
const ZB_API_KEY = params.ZB_API_KEY;

//////////////////////////////////////////
//ChatGPT処理
//////////////////////////////////////////
ai_req = new HttpRequest();
ai_data = {};
//リクエストヘッダー
ai_req.addHeader('Content-Type: application/json');
ai_req.addHeader('Authorization: Bearer '+AI_API_KEY);
//Postデータ
ai_data.model = AI_MODEL;
ai_data.messages = [{'role':'user','content': AI_TEXT}];
//送信
ai_resp = ai_req.post(AI_URL,JSON.stringify(ai_data));
ai_resp = JSON.parse(ai_resp);
//デバッグログ
Zabbix.log(4, 'ai_req:'+JSON.stringify(ai_data));
Zabbix.log(4, 'ai_resp:'+JSON.stringify(ai_resp));

//////////////////////////////////////////
//Zabbix処理
//////////////////////////////////////////
zb_req = new HttpRequest();
zb_data = {};
//リクエストヘッダー
zb_req.addHeader('Content-Type: application/json-rpc');
//Postデータ
zb_data.auth = ZB_API_KEY;
zb_data.method = 'event.acknowledge';
zb_data.id = 1;
zb_data.params = {};
zb_data.params.eventids = ZB_EVENT_ID;
zb_data.params.action = 4;
zb_data.params.message = ai_resp.choices[0].message.content;
zb_data.jsonrpc = '2.0';
//送信
zb_resp = zb_req.post(ZB_URL,JSON.stringify(zb_data));
zb_resp = JSON.parse(zb_resp);
//デバッグログ
Zabbix.log(4, 'zb_data:'+JSON.stringify(zb_data));
Zabbix.log(4, 'zb_resp:'+JSON.stringify(zb_resp));
//処理終了
return 1;

※サンプルプログラムです。自己責任でご利用ください。
※スクリプトの転載はお控えください。

メッセージテンプレートのタブ

項目 補足
メッセージタイプ 障害  
件名 任意 不使用
メッセージ 次のログを検知しました。対処方法を教えてください。
{ITEM.LASTVALUE}
ChatGPTに送信する文字列

実行イメージ

LinkDownのトラップを送信する

# snmptrap -v2c -c public localhost '' .1.3.6.1.6.3.1.1.5.3

Zabbixで受信する

障害として検知する

GhatGPTからの回答がコメントに記載される

今後の展開について

今回はChatGPTを使用したので、一般的な回答になってしまいます。
これでは障害対応するのは難しいと思います。

そのため、次のような回答がもらえるようにAIをつくっていく必要があると思っています。
・〇〇日前に同様の障害を検知しました。その際は△△の対応を行いました。
・先ほど検知した〇〇の件に関連して発生した可能性があります。

最後に

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

SCSK Plus サポート for Zabbix

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

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

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