1、如果接企业微信请参考下面的文章

https://www.txisfine.cn/archives/9c078bb7.html

感谢上述文章的作者提供的思路

  ChatGPT 是最近很火的 AI 智能机器人程序,2 个月活跃用户突破 1 亿,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代码,写论文等任务。

   Zabbix 开源社区推文 实测|ChatGPT 对 Zabbix 用户有什么影响? 展示了将一些 Zabbix 相关的问题丢给 ChatGPT 处理来提升工作效率。既然都说到这里了,那我们能不能将 Zabbix 告警信息丢给 ChatGPT,在告警的第一时间先给出一份可以参考的建议呢?
  所以,基于 Zabbix 能力,我们将告警发给了 ChatGPT,并通过钉钉发送的方式给出告警信息和修复建议。效果如下图:

 

001、准备

  • 注册 ChatGPT 账号
  • 注册 AirCode 账号
  • 准备 Zabbix 钉钉内部应用

因为需要接入 ChatGPT,必须要现有一个 OpenAI 的账号,AirCode 是一个 nodejs 运行时的 Serverless 平台,主要做 OpenAI 的 APIProxy,因为毕竟是国际服务,网络抖动会影响服务质量。

如何注册网络上很多资料,这里不在赘述。

还要准备一个 Zabbix 钉钉内部应用,用来接受告警和建议

002、开始

获取 OpenAI 的 KEY

 登录到 OpenAI,访问Account API Keys - OpenAI API,点击 Create new secret key,创建一个新的 key,并保存备用。

 

创建一个 AirCode 项目

登录到 AirCode,创建一个新项目。

给项目命名一下,Runtime 和 Region 默认就好,点击 Create 进入编辑区。

 1.创建一个文件,比如 main.js,将 bh1xaq/ChatGPT-zabbixAlert 中的 openai.js 拷贝进去。

 

2.安装 axios 依赖,在 Dependencies 下面搜axios,找最新版本安装即可。

 

3.配置环境变量,我们需要把 OpenAI 的 KEY 配置到环境变量,同时为了您的 API 更安全,我们还需要协商一个 Zabbix 请求我们 APIProxy 的 KEY。

OPENAIKEY - 获取到的 OpenAI 的 KEY
ZAKEY - Zabbix 请求 APIProxy 的 KEY(需要自定义)

4.发布代码,并获得 APIProxy 地址备用。点击 Deploy,填写 Commit,发布代码。下面红框的位置就是 APIProxy 地址。

 

配置 Zabbix 通知媒介

1.登录 Zabbix 管理端,选择报警媒介类型创建媒体类型。 

类型:WebHook

参数:

  • Zakey:Zabbix 请求 APIProxy 的 KEY
  • Openaiurl: OpenAI APIProxy 地址
  • Message:{ALERT.MESSAGE}
  • Subject:{ALERT.SUBJECT}
  • To:{ALERT.SENDTO}

超时时间:60s

粘贴脚本,将 下面的代码拷贝到 脚本 中。需要修改的部分已经标红

var weworkApp = {
//
touser: null,
//
message: null,
//
proxy: null,
//
openai_url: null,
// Zakey
zakey: null, msgtype: 'markdown', // 获取钉钉 AccessToken
getAccessToken: function () {
var url = 'https://oapi.dingtalk.com/gettoken?appkey=************&appsecret=*******************',
request = new CurlHttpRequest(); // 设置代理
if (weworkApp.proxy) {
request.setProxy(weworkApp.proxy);
}
request.AddHeader('Content-Type: application/json');
response = request.Get(url);
try {
response = JSON.parse(response);
return response.access_token;
}
catch (error) {
response = null;
}
if (request.Status() !== 200 || response.errcode !== 0) {
if (typeof response.errmsg === 'string') {
throw response.errmsg;
}
else {
throw 'Unknown error. Check debug log for more information.'
}
}
},
// 不用修改
askOpenAI: function (quesion) {
// OpenAI Proxy On AirCode
var url = weworkApp.openai_url,
request = new CurlHttpRequest(),
data = {
"zakey": weworkApp.zakey,
"quesion": quesion
}; // 设置代理
if (weworkApp.proxy) {
request.setProxy(weworkApp.proxy);
}
request.AddHeader('Content-Type: application/json');
response = request.Post(url, JSON.stringify(data));
try {
response = JSON.parse(response);
}
catch (error) {
response = { message: "" };
}
return response.message;
}, // 发消息
sendMessage: function (access_token) {
var params = {
chatid: weworkApp.touser,
msgtype: weworkApp.msgtype,
markdown: {
title: "Zabbix通知",
text: weworkApp.message
},
enable_duplicate_check: 1,
duplicate_check_interval: 20
},
data,
response,
request = new CurlHttpRequest(),
url = 'https://oapi.dingtalk.com/chat/send?access_token=' + access_token; // 设置代理
if (weworkApp.proxy) {
request.setProxy(weworkApp.proxy);
} request.AddHeader('Content-Type: application/json');
data = JSON.stringify(params); // 在日志中不展示 AccessToken
Zabbix.Log(4, '[weworkApp Webhook] URL: ' + url.replace(weworkApp.access_token, '<ACCESS_TOKEN>'));
Zabbix.Log(4, '[weworkApp Webhook] params: ' + data);
response = request.Post(url, data);
Zabbix.Log(4, '[weworkApp Webhook] HTTP code: ' + request.Status()); try {
response = JSON.parse(response);
}
catch (error) {
response = null;
} if (request.Status() !== 200 || response.errcode !== 0) {
if (typeof response.errmsg === 'string') {
throw response.errmsg;
}
else {
throw 'Unknown error. Check debug log for more information.'
}
}
}
} try {
var params = JSON.parse(value);
if (params.HTTPProxy) {
weworkApp.proxy = params.HTTPProxy;
}
weworkApp.corpid = params.Corpid;
weworkApp.corpsecret = params.Corpsecret;
weworkApp.touser = params.To;
weworkApp.openai_url = params.Openaiurl;
weworkApp.zakey = params.Zakey;
var access_token = weworkApp.getAccessToken();
weworkApp.message = params.Subject + '\n' + params.Message; //如果是故障类型的通知,就问一下 OpenAI
if (params.Subject.indexOf("故障恢复") == -1) {
var aiAnswer = weworkApp.askOpenAI(params.Subject);
weworkApp.message = weworkApp.message + '\n --- \n OpenAI - 砖家建议 - 众所周知砖家建议仅供参考):\n ' + aiAnswer;
}
// 发钉钉通知
weworkApp.sendMessage(access_token);
return '200 OK';
}
catch (error) {
Zabbix.Log(4, '[weworkApp Webhook] notification failed: ' + error);
throw 'Sending failed: ' + error + '.';
}

2.创建消息模板。

添加故障和故障恢复两个类型的消息。以下供参考。

故障: {EVENT.NAME}
定位ID:{EVENT.ID}
出现时间:{EVENT.DATE} {EVENT.TIME}
所属设备:{HOST.NAME}
严重程度:{EVENT.SEVERITY}
{TRIGGER.URL} 故障恢复:{EVENT.RECOVERY.NAME}
定位ID:{EVENT.ID}
恢复时间:{EVENT.RECOVERY.DATE} {EVENT.RECOVERY.TIME}
故障时长:{EVENT.DURATION}
影响设备:{HOST.NAME}
严重程度:{EVENT.SEVERITY}
{TRIGGER.URL}

保存即可,我们可以进行一下测试。

 

3.告警信息定向推送给谁,需要一个 TOUSER 的属性,在这里添加即可。

4.将报警媒介关联到触发器动作中。

zabbix 特别注意:

{ALERT.SUBJECT} 相当于 动作的主题

在zabbix里面把动作的主题配置成 故障: {EVENT.NAME}。这样访问chatapi的时候就能返回想要的信息

特别说明

AI 无法代替人类,提供的建议仅供修复参考,请运维工程师分析合理性后进行执行,以防止扩大故障。

本项目使用的 OpenAI 模型为 text-davinci-003

 
 

将 ChatGPT 接入 Zabbix 为告警提供修复建议(对接钉钉)的更多相关文章

  1. zabbix 语音告警

    之前的文章中已经实现了zabbix 邮件告警和微信告警,生产环境上测试出消息抵达很及时,但是!万一服务器在大半夜突发故障微信.邮件这些通知都是废物了,大晚上还能听到微信通知吗?显然不可能(我的某朋友就 ...

  2. Zabbix通过与微信、钉钉整合实现实时告警

    abbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信.钉钉作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人,方便告警 ...

  3. zabbix邮件告警

    Zabbix邮件告警看了很多文档,写的那叫一个蛋疼,明明没有发出去邮件,硬要糊弄观众,我也跟着被糊弄. 操作系统环境: CentOS 5.5 x84_64位 Zabbix版本2.2.3 Web服务器: ...

  4. 通过python为zabbix发送告警邮件

    最近部署ZABBIX的邮件告警时,用刚学的python来写告警邮件脚本. 由于时间有限,我只对关键步骤做截图,对zabbix的基本配置略过. python代码如下 1 #!/usr/bin/pytho ...

  5. zabbix系列之九——添加钉钉告警

    一.添加钉钉机器人 1. 2. 复制webhook后面脚本用到:https://oapi.dingtalk.com/robot/send?access_token=36e69dd50bbcc54b7b ...

  6. zabbix监控告警Received empty response from Zabbix Agent Assuming that agent dropped connection

    zabbix监控告警Received empty response from Zabbix Agent Assuming that agent dropped connection错误 查看zabbi ...

  7. zabbix 利用python脚本实现钉钉告警

    Zabbix 利用python脚本实现钉钉告警 1.安装python3.6环境 2.创建python脚本 cd local/zabbix-4.0.3/share/zabbix/alertscripts ...

  8. zabbix邮件告警之 通过shell脚本发送告警

    说明:本文讲如何通过shell脚本实现zabbix发送告警邮件,共有5步1.设置mailx账号:是配置mailx的发信账号2.zabbix服务器端编写邮件发送脚本:是增加zabbix的告警方式,增加通 ...

  9. zabbix:告警、恢复消息次数

    之前zabbix配置告警,存在告警信息发送多次并且恢复信息也跟着发送多次了,导致企业微信流量不够用,没有找到恢复信息单独的设置项 动作中的步骤我个人理解为:1-5的意思是发送5条告警消息      3 ...

  10. Zabbix微信告警

    Zabbix微信告警 摘要 Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信 ...

随机推荐

  1. 使用idea进行gitee代码管理

    目录 1.在idea插件市场安装gitee插件 2.把本地仓库的release分支上的代码合到dev分支上 3.把本地dev分支上的代码合到远程dev分支上去 1.在idea插件市场安装gitee插件 ...

  2. [深度学习] caffe分类模型训练、结果可视化、部署及量化笔记

    本文为本人caffe分类网络训练.结果可视化.部署及量化具体过程的心得笔记.caffe目前官方已经停止支持了,但是caffe是目前工业落地最常用的深度学习框架,用的人挺多.其实主要怕自己忘了,弄个备份 ...

  3. 使用 Link Cut Tree 维护最小生成树

    简介 本文将简单介绍如何使用 Link Cut Tree 维护动态图最小生成树. 思路 最小生成树的性质:一个基环树的最小生成树,为将环上边权最大的边删除后所组成的树. Proof:如果删除环上的其他 ...

  4. 期望与概率 dp

    期望与概率 dp \(\text{By DaiRuiChen007}\) I. [洛谷4316] - 绿豆蛙的归宿 \(\text{Link}\) 思路分析 DAG 上做期望 dp,可以爆搜,也可以拓 ...

  5. Django推导流程,Django模块的下载和基本使用、Django的应用和目录结构讲解、Django三板斧

    今日内容 纯手撸web框架 1.web框架的本质: 理解1:连接前端与数据库的中间介质 理解2:socket服务端 2.手写web框架: 1.编写socket服务端代码 import socket s ...

  6. Typora软件下载与markdown语法的使用

    Typora软件下载与markdown语法的使用 一.Typora下载 1.Typora的简介 Typora是一款轻量级文本编辑器,文本阅读器,是目前最火爆的文本编辑器. Typora中格式,字体,主 ...

  7. MyBatis使用四(查询详解)

    本文主要讲述如何在mybatis中进行查询操作[详解] 一. 查询User对象 1.查询单个对象User SelectUser接口声明如下 // 主要条件是使用id public interface ...

  8. KingbaseES函数三态

    理解函数的三态1 VOLATILE: volatile函数没有限制,可以修改数据(如执行delete,insert,update), 使用同样的参数调用可能返回不同的值. STABLE: 不允许修改数 ...

  9. ElasticSearch使用教程

    一.ElasticSearch使用说明 1. 索引 index,相当于数据库表Table 1.1 查看所有索引 GET _cat/indices?v 1.2 创建索引字段映射关系 PUT /test ...

  10. STM32F0_HAL初始化系列:输入捕捉

    1.使用的TIM1,配置如下: 2.代码: int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Ini ...