摘要:Zabbix作为成熟的监控系统,存储了大量基础设施的实时数据。通过Dify与Zabbix集成,可直接用自然语言查询监控指标(如CPU使用率、磁盘空间)并生成动态图表。本文重点从实现思路和方式上进行探索,一些细节性的处理未经验证,有兴趣的小伙伴可以结合思路进行尝
Zabbix作为成熟的监控系统,存储了大量基础设施的实时数据。通过Dify与Zabbix集成,可直接用自然语言查询监控指标(如CPU使用率、磁盘空间)并生成动态图表。本文重点从实现思路和方式上进行探索,一些细节性的处理未经验证,有兴趣的小伙伴可以结合思路进行尝试。
(一)适用场景
需要复杂SQL查询或跨表关联分析已掌握Zabbix数据库结构,需直接读取原始数据(二) 实现步骤
1. 理解Zabbix核心表结构
Zabbix数据存储在MySQL的以下关键表中(以Zabbix 5.x为例):
hosts:存储被监控主机信息SELECT hostid, host, name FROM hosts WHERE status=0; -- 状态0表示启用items:监控项定义(如CPU负载、内存使用率)SELECT itemid, name, key_, units FROM items WHERE hostid=10084;history/history_str:数值型/字符型监控项的历史数据SELECT itemid, clock, value FROM history_uint WHERE itemid=23345;trends:长期趋势数据(每小时聚合)SELECT itemid, clock, value_min, value_avg, value_max FROM trends_uint;2. 配置Dify数据查询工具
在Dify中创建工具,连接Zabbix的MySQL数据库:
from flask import request import mysql.connector def zabbix_mysql_query: query = request.json.get('query') conn = mysql.connector.connect( host="zabbix-db.example.com", user="dify_user", password="SecurePass123!", database="zabbix" ) cursor = conn.cursor(dictionary=True) cursor.execute(query) result = cursor.fetchall cursor.close conn.close return {"data": result}3. 设计自然语言转SQL的Agent提示词
你是一个Zabbix监控数据分析助手,根据用户问题生成SQL。已知表结构: - hosts: hostid, host, name - items: itemid, hostid, name, key_ - history_uint: itemid, clock (UNIX时间戳), value 示例: 用户问:“查询主机web-server01的CPU负载最近10条记录” 你回答: SELECT h.clock, h.value FROM history_uint h JOIN items i ON h.itemid = i.itemid JOIN hosts ho ON i.hostid = ho.hostid WHERE ho.host = 'web-server01' AND i.key_ = 'system.cpu.load[all,avg1]' ORDER BY h.clock DESC LIMIT 10;4. 可视化配置示例
将查询结果转换为可读时间格式并绘制折线图:
from datetime import datetime import matplotlib.pyplot as plt def plot_cpu_load(data): timestamps = [datetime.fromtimestamp(row['clock']) for row in data] values = [row['value'] for row in data] plt.plot(timestamps, values, marker='o') plt.title('web-server01 CPU负载趋势') plt.xlabel('时间') plt.ylabel('Load (1min avg)') plt.grid(True) plt.savefig('cpu_load.png') return "cpu_load.png" 不熟悉Zabbix数据库结构,需标准化数据访问需要利用Zabbix内置的聚合函数或权限控制(二)实现步骤
1. 获取Zabbix API Token
通过API用户登录获取认证Token:
import requests url = "http://zabbix.example.com/api_jsonrpc.php" headers = {"Content-Type": "application/json-rpc"} # 登录获取Token payload = { "jsonrpc": "2.0", "method": "user.login", "params": { "user": "dify", "password": "API-Pass123!" }, "id": 1 } response = requests.post(url, json=payload, headers=headers).json auth_token = response['result']2. 创建Dify工具调用Zabbix API
查询主机CPU负载并返回数据:
def get_cpu_load(host_name: str, limit: int = 10): # 获取hostid payload_host = { "jsonrpc": "2.0", "method": "host.get", "params": { "output": ["hostid"], "filter": {"host": host_name} }, "auth": auth_token, "id": 2 } hostid = requests.post(url, json=payload_host, headers=headers).json['result'][0]['hostid'] # 获取itemid payload_item = { "jsonrpc": "2.0", "method": "item.get", "params": { "output": ["itemid"], "hostids": hostid, "search": {"key_": "system.cpu.load[all,avg1]"} }, "auth": auth_token, "id": 3 } itemid = requests.post(url, json=payload_item, headers=headers).json['result'][0]['itemid'] # 获取历史数据 payload_history = { "jsonrpc": "2.0", "method": "history.get", "params": { "output": "extend", "history": 0, # 0表示数值型数据 "itemids": itemid, "sortfield": "clock", "sortorder": "DESC", "limit": limit }, "auth": auth_token, "id": 4 } history = requests.post(url, json=payload_history, headers=headers).json['result'] return history3. 配置Dify Agent的自然语言解析
用户问:“显示数据库服务器db-prime过去24小时的磁盘使用率” Agent自动转换: - 调用get_disk_usage(host_name="db-prime", period=24) - 对应API方法:`history.get` + 筛选`vfs.fs.size[/,pused]` 生成的折线图自动添加说明: - X轴:时间(自动转换UNIX时间戳) - Y轴:使用率(单位:%) 两种方案对比与选型建议维度直连MySQL方案Zabbix API方案开发复杂度高(需熟悉Zabbix表结构)低(使用标准API方法)数据实时性直接读取原始表,延迟低依赖API缓存,可能有分钟级延迟安全性需开放数据库权限通过Token控制,更安全扩展性支持复杂SQL查询受限于API提供的参数适用场景深度定制分析、跨表关联标准化监控指标查询、快速集成增强实践:构建自动化监控看板场景:实时展示集群健康状态
自然语言触发:“生成当前所有触发器的状态分布饼图”“对比北京和上海机房的平均网络延迟”定时任务配置:每小时自动刷新趋势图当nginx_errors指标突增时,自动发送告警到钉钉看板集成:# 在Dify中组合多个图表组件 dashboard = { "layout": [ {"type": "pie", "title": "触发器状态分布", "data": get_trigger_stats}, {"type": "line", "title": "CPU使用率趋势", "data": get_cpu_trend} ], "refresh_interval": 3600 # 每小时刷新 } 数据库直连方案:创建只读账号,限制访问SELECT权限使用SSH隧道加密数据库连接API方案:为Dify分配独立API账号,限制可访问的主机组定期轮换API Token通用防护:在Dify工具层添加SQL/输入参数校验def sanitize_sql(query: str) -> bool: forbidden_keywords = ['insert', 'delete', 'grant'] return not any(kw in query.lower for kw in forbidden_keywords)来源:运维笔记
免责声明:本站系转载,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与本站联系,我们将在第一时间删除内容!