1. 为什么要把 Zabbix 的数据接到 Grafana 上
Zabbix 自带的 Dashboard 用过的都懂,功能确实全,但那个画风基本停留在十年前,图表样式死板,拼图自由度低,分享给非技术同事看的时候经常被吐槽“看不懂”。而 Grafana 在可视化这块几乎是降维打击:面板拖拽自由、模板变量灵活、时间轴联动丝滑,还能把多个数据源混在一张图里对比。把 Zabbix 的监控数据接到 Grafana 上,本质上就是让专业的采集工具干采集的活,让专业的可视化工具干展示的活,各司其职。
这个组合适合谁?如果你手里已经有一套跑了一段时间的 Zabbix,主机、触发器、监控项都配好了,只是苦于展示效果差、大屏做不出来、跨系统数据没法同图对比,那这套方案基本就是为你准备的。反过来,如果你还没搭 Zabbix,或者只是想要一个轻量级的采集方案,那先别急着上这套,Zabbix 本身的部署和维护成本不低,杀鸡用牛刀没必要。
我这次要拆解的核心链路是:Zabbix 作为数据源,通过官方插件接入 Grafana,再用 Dashboard 把关键指标重新组织成可读性强的图表。整条链路里最容易翻车的不是 Grafana 画图,而是插件安装、API 权限、数据点对齐这几个环节,后面会逐个展开。
2. 整体架构与方案选型拆解
2.1 数据是怎么从 Zabbix 流到 Grafana 的
先把这个链路讲清楚,不然后面配参数的时候容易懵。Grafana 本身不认识 Zabbix 的协议,它靠的是一个叫Zabbix data source plugin的官方插件来打通。这个插件的工作方式是:Grafana 后端通过 Zabbix 的API(默认走 8080 端口的 api_jsonrpc.php)去拉数据,而不是直接读 Zabbix 的数据库。
这一点非常关键,很多人第一反应是“我直接连 Zabbix 的 MySQL 库不就行了”,理论上可以,但强烈不建议。原因有三个:第一,直接读库会绕过 Zabbix 的权限和计算逻辑,历史数据和趋势数据的取舍你得自己处理;第二,Zabbix 的表结构在版本升级时可能变,直连库的脚本很容易在某次升级后集体失效;第三,走 API 是官方支持的路径,插件会帮你处理数据类型转换、时间对齐这些脏活。所以选 API 这条路,是省心而不是绕远。
2.2 为什么用官方插件而不是自己写脚本
市面上确实有人用 Python 脚本定时拉 Zabbix 数据再写进 InfluxDB,然后 Grafana 读 InfluxDB。这套方案我也试过,适合数据量极大、需要长期降采样存储的场景。但对绝大多数中小规模监控来说,它多了一个中间存储层,等于多了一个故障点,而且数据延迟至少是一个采集周期。官方插件的优势在于实时性——你在 Grafana 上刷新,它就去 API 拉一次,看到的基本是当前值,不用等脚本跑完。
代价是每次查询都会打到 Zabbix API 上,如果 Dashboard 面板特别多、刷新间隔又设得很短(比如 5 秒),Zabbix 的 API 压力会明显上升。所以这里有个取舍:面板数量多的时候,刷新间隔别低于 30 秒,这是我踩过坑之后的经验值。
2.3 版本兼容性这张表必须先看
Zabbix 和 Grafana 的版本组合是有讲究的,插件对两边都有版本要求。下面这张表是我实测和社区反馈整理出来的常见组合,配之前先对一下:
| Grafana 版本 | Zabbix 插件版本 | 支持的 Zabbix 版本 | 备注 |
|---|---|---|---|
| 9.x | 4.x | 5.0 - 6.4 | 稳定,推荐 |
| 10.x | 4.2+ | 5.0 - 6.4 | 需注意插件签名 |
| 10.x | 5.x | 6.0 - 7.0 | 新特性多,配置项有变化 |
| 11.x | 5.0+ | 6.0 - 7.0 | 建议用最新插件 |
提示:插件版本和 Grafana 版本不匹配时,最常见的表现是数据源配置页能打开但保存报错,或者查询时返回空数据。遇到这种情况先别怀疑网络,先核对版本。
3. 环境准备与插件安装实操
3.1 装插件之前先把这几件事确认了
动手之前,先花五分钟确认三件事,能省掉后面一大堆排查时间。第一,Zabbix API 是否可达:在 Grafana 所在机器上执行curl -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","method":"apiinfo.version","params":{},"id":1}' http://你的zabbix地址/api_jsonrpc.php,能返回版本号就说明网络和 API 都通。第二,有没有一个专用的只读账号:别用 Admin 去连,建一个专门给 Grafana 用的用户,权限给到只读就够。第三,Grafana 的插件目录权限:如果是容器部署,插件得装在容器能读到的路径里,这个后面细说。
3.2 三种安装方式,按你的部署形态选
插件安装方式取决于你的 Grafana 是怎么部署的,我按常见程度排一下。
方式一:grafana-cli 在线安装(最省事)
grafana-cli plugins install alexanderzobnin-zabbix-app装完重启 Grafana 服务:
systemctl restart grafana-server这种方式适合能连外网的环境,插件会自动装到 Grafana 的插件目录。注意插件 ID 是alexanderzobnin-zabbix-app,别搜错了,社区里有几个名字很像的山寨插件。
方式二:离线安装(内网环境)
去插件市场下载对应版本的 zip 包,解压后放到 Grafana 的插件目录,Linux 下通常是/var/lib/grafana/plugins/。放进去之后要改一下属主:
chown -R grafana:grafana /var/lib/grafana/plugins/alexanderzobnin-zabbix-app然后重启。离线安装最容易出的问题是目录层级搞错,解压出来多套了一层文件夹,导致 Grafana 识别不到,检查一下plugin.json是不是直接在插件目录的第一层。
方式三:容器部署挂载
如果你用容器跑 Grafana,推荐把插件目录挂出来:
docker run -d \ -v /host/plugins:/var/lib/grafana/plugins \ -e "GF_INSTALL_PLUGINS=alexanderzobnin-zabbix-app" \ grafana/grafana:latest用GF_INSTALL_PLUGINS环境变量让容器启动时自动装,比手动挂载省心。但要注意,容器重启后如果插件目录没持久化,装的东西会丢,所以挂载卷这一步不能省。
3.3 启用插件这一步别漏了
插件装完不等于能用,还得在 Grafana 里启用它。登录 Grafana,进Configuration → Plugins,找到 Zabbix 插件,点进去点 Enable。这一步很多人会漏,然后去配数据源的时候发现根本找不到 Zabbix 这个选项,白白折腾半天。
注意:如果 Plugins 页面里压根看不到 Zabbix 插件,说明插件没装成功或者版本不兼容。先去看 Grafana 的日志,
journalctl -u grafana-server或者容器日志,里面会明确告诉你插件加载失败的原因。
4. 数据源配置与权限打通
4.1 建一个专用的只读 API 账号
在 Zabbix 里进Users → User groups,新建一个组,比如叫grafana_ro,权限里把 Hosts、Items、Triggers 这些的读权限勾上,写权限一律不给。然后建用户,把这个用户放进这个组。为什么要单独建账号?因为 Grafana 的 API 调用是明文存在配置里的,用管理员账号等于把整个 Zabbix 的控制权交出去了,一旦 Grafana 被攻破,Zabbix 也跟着沦陷。最小权限原则在这里不是口号,是实打实的安全边界。
4.2 数据源配置页逐项填
进Configuration → Data Sources → Add data source,选 Zabbix。关键配置项如下:
| 配置项 | 填什么 | 说明 |
|---|---|---|
| URL | http://zabbix地址/api_jsonrpc.php | 注意要带完整路径 |
| Access | Server (default) | 让 Grafana 后端去请求,避免浏览器跨域 |
| Username | 刚建的只读账号 | 不要用 Admin |
| Password | 对应密码 | 建议用 Grafana 的加密存储 |
| Trends | 按需勾选 | 数据量大时用趋势数据提速 |
这里有个细节:URL 一定要写到api_jsonrpc.php这一层,只写到域名或 IP 是不行的,插件不会自动补路径。我第一次配的时候就栽在这,保存后测试连接一直失败,查了半天才发现路径少了一截。
4.3 测试连接与常见报错
填完点Save & Test,正常会提示连接成功。如果报错,对照下面这张表排查:
| 报错信息 | 大概率原因 | 解决方向 |
|---|---|---|
| Connection refused | 网络不通或端口错 | 检查防火墙和 API 端口 |
| 401 Unauthorized | 账号密码错 | 核对只读账号凭据 |
| Invalid JSON | URL 路径不对 | 确认写到 api_jsonrpc.php |
| Timeout | API 响应慢 | 检查 Zabbix 负载和网络延迟 |
提示:如果 Grafana 和 Zabbix 不在同一台机器,且 Zabbix 前面有反向代理,要确认代理有没有放行 API 路径,有些代理配置会默认拦掉 POST 请求。
5. Dashboard 构建与图表设计
5.1 先想清楚要展示什么,再动手画
很多人一上来就打开 Grafana 开始拖面板,结果画到一半发现指标选错了、时间范围对不上,返工。我的习惯是先在纸上列清楚:这张 Dashboard 给谁看、看什么、关注什么时间粒度。比如给运维看的,重点是 CPU、内存、磁盘、网络这四件套加上触发器状态;给业务方看的,重点是核心接口的响应时间和错误率。目标不同,选的监控项和图表类型完全不一样。
5.2 查询编辑器里怎么选指标
Grafana 的 Zabbix 数据源查询编辑器分几层:先选Group(主机组),再选Host(主机),然后选Item(监控项),最后选Functions(聚合函数)。这里的关键是用模板变量把 Group 和 Host 做成下拉选择,而不是写死。写死的话,加一台主机就得改一次 Dashboard,维护成本极高。
模板变量的配置在 Dashboard 设置里的Variables页面,新建一个变量,类型选 Query,数据源选 Zabbix,查询语句用插件提供的*通配。这样 Dashboard 顶部就会出现主机组和主机的下拉框,切换主机时所有面板跟着联动,这才是 Grafana 的正确打开方式。
5.3 图表类型怎么选才不浪费
不同指标适合的图表类型不一样,选错了信息传达效率会大打折扣。下面是我常用的对应关系:
- CPU、内存、磁盘使用率:用 Time series 折线图,配合阈值线,一眼看出有没有超标。
- 网络流量:用 Time series 的面积图,上下行用不同颜色叠加。
- 当前状态类(如触发器是否告警):用 Stat 面板,配颜色阈值,红绿分明。
- 主机清单概览:用 Table 面板,把多台主机的关键指标列成表,方便横向对比。
- 告警数量趋势:用 Bar chart,按天或按小时聚合。
注意:折线图的时间范围别设太长,超过 7 天的数据如果没开趋势存储,查询会非常慢。Zabbix 的历史数据默认保留时间有限,长周期展示要走趋势数据(Trends),这个在数据源配置里勾选。
5.4 一个可复用的 CPU 使用率面板配置
拿 CPU 使用率举例,把配置过程走一遍。新建 Panel,数据源选 Zabbix,查询里选好主机组和主机,Item 选CPU utilization相关的监控项。如果 Zabbix 里 CPU 是按核分开采集的,用avg函数聚合成整体使用率。然后在Transform里加一步,把单位转成百分比。最后在Field设置里配阈值:80% 黄色,90% 红色。
这套配置做完,点右上角 Save,然后可以Export成 JSON 存起来。下次要给别的项目复用,直接 Import 这个 JSON,改一下主机组变量就行,不用从头配。我手里攒了一套这样的面板模板,新项目上线基本半小时能搭出一张像样的 Dashboard。
6. 常见问题与排查技巧实录
6.1 数据查不出来,先分三步定位
数据为空是最高频的问题,别一上来就怀疑插件坏了。按这个顺序排查:第一步,确认 Zabbix 里这个监控项真的有数据,去 Zabbix 的 Latest data 页面看一眼,如果那边也是空的,问题在采集端,跟 Grafana 无关。第二步,确认时间范围对得上,Grafana 右上角的时间选择器如果选的是最近 1 小时,而数据是昨天采的,那当然查不到。第三步,确认权限,只读账号有没有这个主机组的读权限,权限不够时 API 会静默返回空,不报错,这个最坑。
6.2 图表时间轴对不齐怎么办
有时候你会发现 Grafana 上的曲线和 Zabbix 上看到的对不上,差个几分钟。这通常是时区问题。检查三处:Grafana 的时区设置、Zabbix Server 的时区、以及浏览器所在时区。三者不一致时,时间轴就会错位。统一成同一个时区,或者干脆都用 UTC,问题就消失了。
6.3 面板一多就卡,怎么优化
Dashboard 面板超过 20 个之后,加载明显变慢,这是 API 查询次数太多导致的。优化手段有几个:降低刷新频率,非关键面板设成 1 分钟甚至 5 分钟;合并查询,同一台主机的多个指标尽量在一个面板里用多个 query 展示,减少面板数量;开启趋势数据,长周期查询走趋势表比走历史表快很多;给 Zabbix API 加缓存,如果版本支持的话。
6.4 常见问题速查表
| 现象 | 排查方向 | 快速验证 |
|---|---|---|
| 数据源保存失败 | 版本不匹配 / URL 错 | 核对版本表,curl 测 API |
| 查询返回空 | 权限 / 时间范围 / 监控项 | 去 Zabbix Latest data 对照 |
| 图表时间错位 | 时区不一致 | 三处时区统一 |
| 加载缓慢 | 面板过多 / 刷新太快 | 降频、合并、开趋势 |
| 插件不显示 | 没启用 / 装错目录 | 看 Grafana 日志 |
提示:排查问题时,Grafana 的Query Inspector是神器,它能显示每个面板实际发出的 API 请求和返回的原始数据,比盯着图表猜高效得多。
7. 我踩过的几个坑和一点经验
第一个坑是只读账号的权限粒度。我一开始图省事,给账号开了整个主机组的读权限,结果发现有些敏感主机不想让它看到。后来改成按主机组细分,Grafana 里用模板变量控制,不同团队看不同组,干净利落。第二个坑是插件的自动更新。有次 Grafana 升级,插件没跟着升,数据源直接失效,排查了半天。现在我固定版本,升级前先在测试环境验证。第三个坑是大屏展示的刷新策略,给领导看的大屏如果设成 5 秒刷新,Zabbix API 压力山大,后来改成 30 秒,既够用又稳。
这套方案跑顺之后,日常维护基本就是加主机、调面板,很少出问题。真正花时间的是一次性把模板变量和面板模板搭好,后面就是复制粘贴的活。如果你也在用 Zabbix 但被它的展示效果劝退,花半天时间接上 Grafana,回报是长期的。