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. 红袖添香,绝代妖娆,Ruby语言基础入门教程之Ruby3基础语法,第一次亲密接触EP01

    书接上回,前一篇我们在全平台构建好了Ruby3的开发环境,现在,可以和Ruby3第一次亲密接触了. Ruby是一门在面向对象层面无所不用其极的解释型编程语言. 我们可以把编写Ruby代码看作是一场行为 ...

  2. 5、Idea同时选择多处光标进行编辑

    1.按住Alt+Shift,然后用鼠标左键点击文本,可以让光标在多个位置出现2.每个光标都会同时输入你正在输入的文本3.ESC退出 搜索 复制

  3. centos更新glibc-2.28

    vps安装alist时提示glibc版本太老,找了一圈教程,就这个解决了问题. 原文: https://www.cnblogs.com/FengZeng666/p/15989106.html

  4. [C++标准模板库:自修教程与参考手册]关于vector

    什么是vector 可以这样认为,vector就是一个动态的数组,其中的元素必须具备assignable(可赋值)和copyable(可拷贝)两个性质. vector的一些重要的性质 vector支持 ...

  5. python paramiko通过远程操作linux

    python-paramiko通过远程操作linux 1. python-paramiko通过远程操作linux python3 远程操作linux 使用第三方paramiko库,对于实现运维自动部署 ...

  6. Unity - 创建C#脚本默认编码格式为UTF8

    嗨咯大家好,哈哈哈哈哈哈哈哈哈哈,今儿小黑加班,目的只有一个,解决Unity创建的脚本通过VS打开后编码格式不正确,导致从Unity的Inspector面板与Mac上边的VS看到的中文为乱码,很气,找 ...

  7. Stats collector is not responding 统计信息收集器没有响应

    统计信息收集器没有响应/Stats collector is not responding 问题现象: kingbase数据库日志提示:统计信息收集器没有响应/Stats collector is n ...

  8. 基于 Ubuntu 服务器配置原生的 Socks5 网关代理服务器

    常见的代理协议有 http.https.socks4/5 这三种,http协议的代理搭建方案最简单,但是http代理无法访问https网站,https代理无法实现调用远端dns,所以我个人推荐使用Sc ...

  9. 【DS】1.2

    top-iron man   算法 效率度量 时间T=T(n) 1.顺序忽略2.只选一个基本操作分析3.多层嵌套只考虑最深的循环循环了几次  test1: test2: 空间   原地工作:算法所需内 ...

  10. JZOJ 2937. 【NOIP2012模拟8.9】监听还原

    题面 分析 注意读题 然后显然字符串哈希 \(Code\) #include<cstdio> #include<cstring> using namespace std; ty ...