«

Zabbix对接Deepseek,实现对报警信息的自动分析

时间:2025-2-28 16:17     作者:Anglei     分类: 自动化运维


目的

在zabbix通过webhook推送告警信息到企业微信时,添加处理建议。

效果

deepseek充值后创建api key

zabbix报警媒介设置deepSeekApiKey 填写我们刚刚创建的api key

脚本

try {
    // 从 Zabbix 获取传递的参数
    var params = JSON.parse(value),
        req = new HttpRequest();

    // 获取 DeepSeek 故障处理建议(请求中直接要求答复不超过200字)
    var suggestion = getDeepSeekAdvice(params.Subject, params.Message, params.deepSeekApiKey);

    // 生成告警信息,并追加故障处理建议
    var alertMessage = generateMessage(params.Subject, params.Message);
    var finalMessage = alertMessage + "\n\n**deepseek**:" + suggestion;

    // 构造企业微信推送消息体
    var msg = {
        "msgtype": "markdown",
        "markdown": {
            "content": finalMessage
        }
    };

    // 判断是否需要配置 HTTP 代理
    if (params.HTTPProxy) {
        req.setProxy(params.HTTPProxy);
    }

    // 添加 header 头变量
    req.addHeader('Content-Type', 'application/json');

    // 发送 HTTP POST 请求到企业微信
    var resp = req.post(params.To, JSON.stringify(msg));

    // 判断 HTTP 请求返回的状态码,非 200 则抛出异常
    if (req.getStatus() != 200) {
        Zabbix.log(Zabbix.LOG_LEVEL_ERROR, 'Response code: ' + req.getStatus());
        throw 'Response code: ' + req.getStatus();
    }

    // 返回响应结果
    resp = JSON.parse(resp);
    return JSON.stringify(resp);
} catch (error) {
    Zabbix.log(Zabbix.LOG_LEVEL_ERROR, 'Failed with error: ' + error);
    throw 'Failed with error: ' + error;
}

// 用于生成告警消息的函数
function generateMessage(Subject, Message) {
    // 当前时间,调整为北京时间
    var currentDate = new Date();
    var currentTimeInUTC = currentDate.getTime();
    var currentTimeInBeijing = new Date(currentTimeInUTC + 8 * 60 * 60 * 1000);
    var formattedCurrentTime = currentTimeInBeijing
      .toISOString()
      .replace('T', ' ')
      .replace('Z', '')
      .slice(0, -4)
      .replace(/-/g, '.');

    var message = Subject + "\n" + Message + "\n**当前时间**:" + formattedCurrentTime;
    message = message.replace('Not classified', '未分类')
                     .replace('Information', '信息')
                     .replace('Warning', '警告')
                     .replace('Average', '一般严重')
                     .replace('High', '严重')
                     .replace('Disaster', '灾难');

    return message;
}

// 调用 DeepSeek API 获取故障处理建议(要求返回不超过200字),添加了10秒超时设置
function getDeepSeekAdvice(subject, message, deepSeekApiKey) {
    var deepSeekApiUrl = 'https://api.deepseek.com/v1/chat/completions'; // 确保使用正确的 API 地址

    try {
        var req = new HttpRequest();
        // req.setTimeout(50000);  // 设置10秒超时时间 
        req.addHeader('Content-Type: application/json'); // 修复语法错误
        req.addHeader('Authorization: Bearer ' + deepSeekApiKey);

        var requestBody = {
            "model": "deepseek-chat", // 确保模型名称正确
            "messages": [
                {
                    "role": "system", 
                    "content": "你是一个专业的运维工程师,精通linux、windows等各类操作系统的运维、网络设备运维、各类中间件运维,可以通过zabbix的告警信息,给出专业的处理意见。"},
                {
                    "role": "user",
                    "content": "以下是一条告警信息,请提供不超过100字的处理建议:\n主题:" + subject + "\n内容:" + message
                }
            ],
            "max_tokens": 100, // 限制返回的 token 数量
            "temperature": 0.7
        };

        var response = req.post(deepSeekApiUrl, JSON.stringify(requestBody));
        if (req.getStatus() != 200) {
            return req.getStatus() + response
            Zabbix.log(Zabbix.LOG_LEVEL_ERROR, 'DeepSeek API error: ' + req.getStatus());
            return "无法获取 DeepSeek 建议,请检查 API 状态。";
        }
        var responseData = JSON.parse(response);
        return responseData.choices[0].message.content.trim();
    } catch (error) {
        // 判断错误信息中是否包含超时提示
        if (error && error.toString().toLowerCase().indexOf("timeout") !== -1) {
            return '接口调用超时!' + error.toString().toLowerCase();
        }
        Zabbix.log(Zabbix.LOG_LEVEL_ERROR, 'Failed to call DeepSeek API: ' + error);
        return "调用 DeepSeek 接口失败,请检查日志。" + error.toString().toLowerCase();
    }
}

本文完结,相关标签: zabbix deepseek 告警

 版权所有:Anglei
 文章标题:Zabbix对接Deepseek,实现对报警信息的自动分析
 除非注明,本站文章如未特殊说明均为 MAXADA社区知识库 原创,且版权所有,请勿用于任何商业用途。

推荐阅读:

看完后感想如何?

路过(0)

雷人(0)

握手(1)

鲜花(0)

鸡蛋(0)
分享到: