1. 为什么要把 Zabbix 的数据接到 Grafana 上
如果你已经在用 Zabbix 做基础设施监控,大概率经历过这样的场景:老板或者业务方跑过来问“给我看一下最近一周核心业务的资源水位趋势”,你打开 Zabbix 自带的 Dashboard,发现图形能看,但要做多主机对比、要做跨机房聚合、要拼一张能放进周报里的大盘,操作起来相当别扭。Zabbix 的强项在于采集、触发器、告警这条链路,它天生是一个“监控告警系统”,而不是一个“数据可视化平台”。它的图表能力够用,但不够灵活,尤其是当你想把监控数据和业务数据放在同一张图里对照的时候,基本就卡住了。
Grafana 恰好补上了这块短板。它本身不采集数据,只负责“把数据源里的数据画出来”,而且画得漂亮、交互流畅、支持多数据源混排。把 Zabbix 作为数据源接进 Grafana,你就能用 Grafana 的 Dashboard 能力去消费 Zabbix 已经采集好的指标,既不用重复部署采集器,又能拿到一套现代化的可视化体验。这套组合在中小规模运维团队里非常常见,原因很直接:Zabbix 负责“发现问题”,Grafana 负责“展示问题”,各干各擅长的事。
这篇文章面向的是已经有一定 Zabbix 使用经验、想进一步把监控数据可视化做起来的运维或 SRE。我会从整体架构思路讲起,然后拆解数据源配置、查询语法、面板设计、变量联动这些核心环节,最后把我自己在实际搭建过程中踩过的坑和排查方法整理出来。整套方案不需要你改动 Zabbix 的采集逻辑,属于“增量式”改造,风险可控。
2. 整体方案设计与选型思路
2.1 两种主流接入路径的取舍
把 Zabbix 数据搬进 Grafana,市面上主要有两条路。第一条是使用 Grafana 官方的 Zabbix 数据源插件,直接通过 Zabbix 的 API 拉取历史和趋势数据;第二条是让 Zabbix 把数据同时写入一个时序数据库(比如把监控项数据通过某种方式同步出去),Grafana 再去查那个时序库。这两条路我都试过,最后在绝大多数场景下我会推荐第一条,原因如下。
官方插件这条路的优势在于“零侵入”。你不需要在 Zabbix Server 上装额外的组件,不需要改数据库结构,也不需要维护一条额外的数据同步链路。插件通过 Zabbix 暴露的 API 去查询数据,本质上和你手动在 Zabbix 前端点开一个图表看到的数据是同一份。它的代价是查询性能受限于 Zabbix API 和 Zabbix 数据库本身,当 Dashboard 面板数量多、时间范围大的时候,API 压力会比较明显。但对于日常运维看板来说,这个代价完全可以接受。
第二条路(数据同步到时序库)适合超大规模或者对查询性能有极致要求的场景,比如几万个监控项、需要做长期趋势分析。但它的复杂度高出一个量级:你要保证同步不丢数据、要处理 Zabbix 数据模型和时序模型之间的映射、要额外维护一套存储。除非你确实有这种量级的需求,否则没必要一上来就上这套。
提示:选型的第一原则是“先跑通再优化”。先用官方插件把 Dashboard 搭起来,等真的遇到性能瓶颈了,再考虑引入时序库做分流,不要为了想象中的规模提前把架构做复杂。
2.2 插件版本与 Grafana 版本的匹配
这里有一个非常容易被忽略但极其关键的细节:Zabbix 数据源插件对 Grafana 版本和 Zabbix 版本都有要求。插件本身是独立于 Grafana 主程序发布的,你需要确认三件事:Grafana 的版本是否满足插件的最低要求、插件版本是否支持你正在用的 Zabbix 版本、以及插件的签名状态。
Grafana 从某个版本开始对插件签名做了强制要求,未签名的插件需要额外配置才能加载。官方维护的 Zabbix 插件是签名的,安装相对省心。安装方式上,如果你用的是容器化部署,最干净的做法是在 Grafana 的配置里声明要安装的插件,让容器启动时自动拉取;如果是裸机部署,用命令行工具安装到插件目录即可。我个人的习惯是容器化,因为插件版本和 Grafana 版本可以一起写进编排文件里,环境一致性有保障。
2.3 数据查询走 API 还是走数据库直连
官方插件支持两种后端查询模式:一种是通过 Zabbix API,另一种是直接连 Zabbix 的数据库。这两种模式在插件配置里可以选,很多人会纠结。我的经验是这样:API 模式更“正规”,它走的是 Zabbix 官方支持的接口,权限控制、数据一致性都由 Zabbix 自己保证,缺点是查询要经过 Zabbix Server 的处理,重查询会占用 Server 资源。数据库直连模式查询更快,因为它跳过了 API 层直接读表,但它绕过了 Zabbix 的权限体系,而且一旦 Zabbix 的数据库结构在升级中发生变化,直连查询可能会失效。
对于生产环境,我倾向于 API 模式,尤其是当 Grafana 和 Zabbix 分属不同团队管理的时候,走 API 意味着权限边界清晰。数据库直连更适合那种“Zabbix 和 Grafana 都是自己一个人在维护”的小团队,追求的是查询响应速度。这个选择没有绝对的对错,取决于你的组织结构和性能诉求。
3. 核心细节解析与实操要点
3.1 数据源配置里的关键参数
配置 Zabbix 数据源的时候,界面上有一堆字段,但真正影响能不能跑通、跑得顺的其实就那么几个。我把它们拆开讲。
URL 字段填的是 Zabbix 前端的访问地址,注意这里要填到能访问api_jsonrpc.php的那一层,通常就是 Zabbix Web 的根地址。很多人填错成 Server 的地址或者数据库地址,结果连不上。认证方式上,插件支持用用户名密码,也支持用 API Token。用 Token 的好处是不依赖某个具体用户的登录态,也不会因为用户改密码而失效,生产环境我更推荐 Token。
还有一个容易被忽略的参数是“Direct DB Connection”相关的数据库连接信息。如果你选了数据库直连模式,这里要填 Zabbix 数据库的主机、端口、库名、账号密码。这里有个坑:直连模式下,Grafana 需要能网络可达 Zabbix 的数据库,而数据库通常只对 Zabbix Server 开放,你需要额外放行 Grafana 的访问。这一步没做通,表现就是数据源测试能过(因为 API 通了),但一画图就报数据库连接错误。
3.2 查询语法:从监控项到图表的映射
Zabbix 插件在 Grafana 里的查询编辑器是它自己的一套语法,和 Prometheus 的 PromQL 完全不一样,新手第一次看会有点懵。它的核心逻辑是:你先选一个“查询模式”(比如选监控项、选主机组、选触发器),然后在对应的字段里做筛选,最后插件把这些条件翻译成对 Zabbix 的查询。
最常用的模式是“Metrics”,也就是按监控项查数据。你需要指定主机(或主机组)、监控项名称(支持通配符)、以及要取的值类型(比如平均值、最大值、最小值)。这里的关键在于监控项名称的匹配。Zabbix 里的监控项名称往往是带参数的,比如“CPU utilization on core 0”,如果你直接写全名,就只能匹配到一台主机的一个核。正确做法是用通配符,比如CPU utilization*,再配合主机变量,让 Grafana 为每台主机生成一条曲线。
值类型的选择也很有讲究。Zabbix 存储数据时,历史数据和趋势数据是分开的。历史数据精度高但保留时间短,趋势数据是小时级的聚合但保留时间长。插件在查询时会根据你选的时间范围自动决定查历史还是查趋势。如果你发现长时间范围的图很“粗糙”,那是正常的,因为它在读趋势数据;如果你需要长时间范围也保持高精度,那得去 Zabbix 里调整历史数据的保留策略,代价是存储膨胀。
3.3 主机与监控项的变量化设计
一个真正好用的 Dashboard,不应该每换一台主机就改一次面板。这就需要用到 Grafana 的变量功能。我通常会在 Dashboard 顶部放两个变量:一个是“主机组”,一个是“主机”。主机组变量从 Zabbix 的主机组列表里拉,主机变量则根据选中的主机组动态过滤。
这样设计之后,看板使用者只需要在下拉框里选一下主机组和主机,所有面板自动刷新。变量之间的联动是 Grafana 原生支持的,配置的时候在主机变量的查询里引用主机组变量即可。这里有个细节:如果主机组里主机特别多,主机变量的下拉列表会很长,可以开启“多选”并配合“全选”功能,或者干脆用正则过滤。
注意:变量查询本身也是要走 Zabbix API 的,如果变量配置得太复杂(比如嵌套了好几层过滤),每次打开 Dashboard 都会触发一批 API 调用,会拖慢加载速度。变量能精简就精简。
4. 实操过程与核心环节实现
4.1 环境准备与插件安装
假设你已经有了一套运行中的 Zabbix 和一套 Grafana。第一步是确认 Grafana 能加载 Zabbix 插件。容器化部署的话,在编排文件里给 Grafana 服务加上环境变量,声明需要安装的插件标识,重启容器后进 Grafana 的插件页面确认插件已经出现并且状态正常。裸机部署的话,用 Grafana 自带的命令行工具执行安装,然后重启服务。
安装完成后,进入 Grafana 的“数据源”配置页面,新增一个 Zabbix 类型的数据源。填好名称、URL、认证信息,先点“保存并测试”。如果测试通过,说明 API 这条链路是通的。如果你打算用数据库直连模式,接着展开数据库连接配置,填入 Zabbix 数据库的信息,再测一次。两次都通过,数据源才算配置完整。
4.2 第一个面板:单主机 CPU 使用率
不要一上来就搭大而全的看板,先用一个最简单的面板验证整条链路。新建一个 Dashboard,添加一个 Time series 面板,数据源选刚配好的 Zabbix。查询模式选 Metrics,主机填一台测试机,监控项名称填 CPU 相关的关键词加通配符,值类型选平均值。
保存之后你应该能看到曲线。如果看不到,先检查时间范围是不是选在了没有数据的区间,再检查监控项名称是否匹配正确。这一步跑通的意义在于,它验证了“Grafana 到 Zabbix 到数据”这条完整链路,后面的复杂面板都是在这个基础上叠加。
4.3 多主机对比面板的实现
单主机面板跑通后,把它改造成多主机对比。做法是把主机字段从固定值改成引用变量,然后在 Dashboard 设置里定义主机变量。变量类型选 Query,数据源选 Zabbix,查询内容选“主机”这一类,再根据主机组做过滤。
配置好之后,面板的查询里主机字段填$host,Grafana 就会为变量里选中的每一台主机生成一条曲线。这时候你会发现图例(Legend)需要调整,默认的图例可能只显示监控项名称,多主机的时候分不清哪条线是哪台机器。把图例格式改成同时包含主机名和监控项名,可读性会好很多。
4.4 用 Transform 做数据加工
Grafana 的 Transform 功能是它区别于 Zabbix 原生图表的一大杀器。举个实际例子:你想把“CPU 使用率”和“内存使用率”画在同一张图上做对照,但这两个是不同量纲的指标。你可以用 Transform 里的“Add field from calculation”做归一化,或者用“Organize fields”重命名、隐藏不需要的字段。
再比如,Zabbix 返回的数据里时间戳格式有时候需要转换,或者你想对多个监控项做聚合(比如把多个网卡的流量加总),这些都可以在 Transform 里完成,而不需要去改 Zabbix 的采集配置。Transform 是链式执行的,你可以叠加多个步骤,每一步的输出是下一步的输入,这个设计非常灵活。
4.5 告警状态的展示
除了画曲线,很多人还想在 Grafana 里看到 Zabbix 的告警状态。插件支持查询“触发器”和“问题”这两类数据。你可以做一个表格面板,查询当前处于 Problem 状态的问题列表,展示主机、问题名称、严重级别、持续时间这些字段。
这里有个实用技巧:用 Grafana 的“值映射”功能,把 Zabbix 的严重级别数字映射成带颜色的文字标签,比如把最高级别映射成醒目的红色。这样一张表扫过去,哪些是紧急问题一目了然。表格面板还支持按严重级别排序,把最严重的问题顶到最上面。
5. 常见问题与排查技巧实录
5.1 数据源测试通过但画图无数据
这是最常见的一类问题,表现是数据源配置页面测试成功,但面板里就是空的。排查思路要分两层:先确认查询条件本身能不能在 Zabbix 里查到数据,再确认 Grafana 发出的查询有没有被正确翻译。
第一层,你可以直接在 Zabbix 前端用相同的监控项名称和时间范围查一次,确认数据确实存在。如果 Zabbix 里也没有,那是采集或保留策略的问题,跟 Grafana 无关。第二层,打开 Grafana 面板的查询检查器,看它实际发出的查询语句和返回结果。如果返回是空的,多半是监控项名称的通配符没匹配上,或者主机变量没选对。
5.2 长时间范围图表变粗糙
前面提过,这是历史数据和趋势数据切换导致的。Zabbix 默认历史数据只保留一段时间(比如几天到几周),超过之后只能读小时级的趋势数据。如果你需要长时间范围也保持细粒度,得去调整 Zabbix 的历史数据保留天数,但这会显著增加数据库体积。我的建议是接受这个特性,长时间看趋势、短时间看细节,本来就是合理的用法。
5.3 Dashboard 加载缓慢
面板一多、时间范围一大,加载就慢。优化方向有几个:一是减少单个 Dashboard 的面板数量,把不相关的图拆到不同看板;二是缩短默认时间范围,比如默认只看最近 6 小时而不是最近 7 天;三是检查变量配置,避免每次加载触发大量 API 调用;四是如果用了数据库直连模式,确认数据库本身有没有针对查询做索引优化。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 数据源测试失败 | URL 或认证信息错误 | 确认 URL 指向 API 入口,Token 未过期 |
| 测试通过但无数据 | 监控项名称不匹配 | 用通配符,检查主机变量 |
| 直连模式报数据库错误 | 网络不通或权限不足 | 确认 Grafana 可达数据库并放行 |
| 图表粗糙 | 读到的是趋势数据 | 属正常,调整历史保留策略可缓解 |
| 加载缓慢 | 面板过多或变量复杂 | 拆分看板,精简变量,缩短默认范围 |
| 图例混乱 | 未配置图例格式 | 图例包含主机名和监控项名 |
5.5 几个我踩过的坑
第一个坑是权限。用 API 模式时,Zabbix 里那个用于认证的用户需要有读取主机和监控项的权限。如果权限不够,表现是部分主机查不到数据,而不是完全报错,很容易误判成配置问题。第二个坑是时区。Grafana 和 Zabbix 如果时区设置不一致,图表上的时间会对不上,尤其是跨时区团队协作的时候。第三个坑是监控项名称里的特殊字符,通配符匹配时某些字符需要转义,不然匹配不到。
提示:搭建过程中养成“先用 Zabbix 前端验证数据存在,再回 Grafana 排查”的习惯,能省掉一大半的无效排查时间。
6. 面板布局与看板组织的一些经验
6.1 按“角色”而不是按“技术”组织看板
我见过很多看板是按技术栈组织的,比如“MySQL 看板”“Nginx 看板”“主机看板”。这种组织方式在排查具体问题时有用,但不适合给业务方或者管理层看。更好的做法是按“角色”组织:给值班同学看的看板突出告警和异常,给业务方看的看板突出服务水位和趋势,给容量规划用的看板突出资源增长曲线。同一份 Zabbix 数据,针对不同角色做不同的呈现,这才是 Grafana 的价值所在。
6.2 善用 Row 做折叠分组
Grafana 的 Row 可以把一组面板折叠起来。把不常看的面板折起来,需要的时候再展开,能大幅提升看板的清爽度。我通常会把“概览”放在最上面不折叠,“明细”和“历史对比”折起来放下面。这样打开看板第一眼看到的是关键信息,不会被细节淹没。
6.3 颜色和阈值的一致性
多个看板之间,同一类指标的颜色最好保持一致,比如 CPU 用蓝色、内存用绿色、磁盘用橙色。这样使用者在不同看板之间切换时,不需要重新建立认知。阈值线也要统一,比如 CPU 告警线统一画在 80%,不要这个看板画 80% 那个画 90%,否则会让人困惑。
7. 写在最后的一点个人体会
这套 Zabbix 加 Grafana 的组合,我从几年前开始用,中间换过好几个项目,每次重新搭的时候都会比上一次更顺手一点。最大的感受是:不要试图一次性把看板做到完美。先搭一个能用的最小版本,让使用它的人提意见,然后迭代。我见过太多人花了两周做了一套自认为很精美的看板,结果没人用,因为不符合实际工作流。
另外一个体会是关于性能的。Zabbix 插件走 API 查询,本质上是在“借用”Zabbix Server 的处理能力。如果你的 Zabbix 本身就已经在高负载运行,再挂一堆 Grafana 看板上去,可能会让 Server 更吃力。这种情况下,要么控制看板数量,要么考虑前面提到的数据库直连模式做分流。监控系统本身也是系统,也需要考虑它的承载能力,这一点很容易被忽略。
最后分享一个小技巧:Grafana 的 Dashboard 可以导出成 JSON,我习惯把搭好的看板 JSON 存进版本控制,这样换环境的时候直接导入,不用重新配一遍。变量、面板、Transform 全都跟着走,迁移成本几乎为零。