将 ChatGPT 接入 Zabbix 为告警提供修复建议(对接钉钉)
1、如果接企业微信请参考下面的文章
https://www.txisfine.cn/archives/9c078bb7.html
感谢上述文章的作者提供的思路
ChatGPT 是最近很火的 AI 智能机器人程序,2 个月活跃用户突破 1 亿,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代码,写论文等任务。
001、准备
- 注册 ChatGPT 账号
- 注册 AirCode 账号
- 准备 Zabbix 钉钉内部应用
因为需要接入 ChatGPT,必须要现有一个 OpenAI 的账号,AirCode 是一个 nodejs 运行时的 Serverless 平台,主要做 OpenAI 的 APIProxy,因为毕竟是国际服务,网络抖动会影响服务质量。
如何注册网络上很多资料,这里不在赘述。
还要准备一个 Zabbix 钉钉内部应用,用来接受告警和建议
002、开始
获取 OpenAI 的 KEY
创建一个 AirCode 项目
登录到 AirCode,创建一个新项目。
给项目命名一下,Runtime 和 Region 默认就好,点击 Create 进入编辑区。
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 为告警提供修复建议(对接钉钉)的更多相关文章
- zabbix 语音告警
之前的文章中已经实现了zabbix 邮件告警和微信告警,生产环境上测试出消息抵达很及时,但是!万一服务器在大半夜突发故障微信.邮件这些通知都是废物了,大晚上还能听到微信通知吗?显然不可能(我的某朋友就 ...
- Zabbix通过与微信、钉钉整合实现实时告警
abbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信.钉钉作为主要的告警方式,这样可以及时有效的把告警信息推送到接收人,方便告警 ...
- zabbix邮件告警
Zabbix邮件告警看了很多文档,写的那叫一个蛋疼,明明没有发出去邮件,硬要糊弄观众,我也跟着被糊弄. 操作系统环境: CentOS 5.5 x84_64位 Zabbix版本2.2.3 Web服务器: ...
- 通过python为zabbix发送告警邮件
最近部署ZABBIX的邮件告警时,用刚学的python来写告警邮件脚本. 由于时间有限,我只对关键步骤做截图,对zabbix的基本配置略过. python代码如下 1 #!/usr/bin/pytho ...
- zabbix系列之九——添加钉钉告警
一.添加钉钉机器人 1. 2. 复制webhook后面脚本用到:https://oapi.dingtalk.com/robot/send?access_token=36e69dd50bbcc54b7b ...
- 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 ...
- zabbix 利用python脚本实现钉钉告警
Zabbix 利用python脚本实现钉钉告警 1.安装python3.6环境 2.创建python脚本 cd local/zabbix-4.0.3/share/zabbix/alertscripts ...
- zabbix邮件告警之 通过shell脚本发送告警
说明:本文讲如何通过shell脚本实现zabbix发送告警邮件,共有5步1.设置mailx账号:是配置mailx的发信账号2.zabbix服务器端编写邮件发送脚本:是增加zabbix的告警方式,增加通 ...
- zabbix:告警、恢复消息次数
之前zabbix配置告警,存在告警信息发送多次并且恢复信息也跟着发送多次了,导致企业微信流量不够用,没有找到恢复信息单独的设置项 动作中的步骤我个人理解为:1-5的意思是发送5条告警消息 3 ...
- Zabbix微信告警
Zabbix微信告警 摘要 Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是越来越多的企业开始使用zabbix结合微信作为主要的告警方式,这样可以及时有效的把告警信 ...
随机推荐
- GOCVHelper图像处理算法库实例整编
GOCVHelper主要包含图像处理.图像增强和基础文件处理三个部分.由于前两个部分较具有通用性,而且我在不同项目中都进行了反复使用,为了进一步说明类库内容,这里反过来从项目角度出发,对现有的 ...
- [编程基础] Python模块和包使用笔记
本文探讨Python模块和Python包,这两种机制有助于模块化编程. 模块化编程是指将大型笨拙的编程任务分解为单独的,较小的,更易于管理的子任务或模块的过程.然后可以像构建模块一样将各个模块拼凑在一 ...
- [编程基础] C++多线程入门10-packaged_task示例
原始C++标准仅支持单线程编程.新的C++标准(称为C++11或C++0x)于2011年发布.在C++11中,引入了新的线程库.因此运行本文程序需要C++至少符合C++11标准. 文章目录 10 pa ...
- kafka详解(01) - 概述
kafka详解(01) - 概述 定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域. 消息队列 MQ传统应用场景之异步处理 使用消 ...
- Web初级——JavaScript
JavaScript JavaScript是一种基于对象的脚本语言,用于开发基于客户端和基于服务器的Internet应用程序 1.了解JS 1.1JavaScript的组成 JavaScript 的核 ...
- 保姆级手把手图文并茂教你配置MAC系统Flutter环境
Flutter 是什么 Flutter是Google开源的构建用户界面(UI)工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动.Web.桌面和嵌入式平台.Flutter 开源.免费,拥 ...
- Go使用协程批量获取数据,加快接口返回速度
服务端经常需要返回一个列表,里面包含很多用户数据,常规做法当然是遍历然后读缓存. 使用Go语言后,可以并发获取,极大提升效率. 使用channel package main import ( &quo ...
- My First Blog Ever——记我在交大ACM班的第一个学期
很巧的是,就在俞老师下发"学期小结"这一任务的前一天,我在跟朋友聊天时想到了要将自己这一学期的经历以文字的形式留存.毕竟,过去的一个学期实在有太多东西值得记述了:我离开了自己从童年 ...
- 了解舵机以及MG996R的控制方法
了解舵机以及MG996R的控制方法 1.舵机基础知识: 舵机是遥控航空.航天模型控制动作,改变方向的重要组成部件,舵机是一种位置(角度)伺服的驱动器. 舵机主要适用于那些需要角度不断变化并可以保持的控 ...
- [POI2011]MET-Meteors 解题报告
语言系统紊乱了 QAQ 这道题感觉不是很难鸭 qwq. 先只考虑一个国家,怎么做?很显然,就直接二分一下就行了.判定答案可以维护一个差分数组,然后最后对它做一个前缀和,再求一下这个国家的流行数量就好了 ...