对于运维监控来说,最为广泛使用的开源监控系统是zabbix和prometheus。zabbix是运维监控系统里面的一员老将了,其在基础监控方面有着广泛的用户使用基础;prometheus则是一位后起之秀,伴随着容器技术的逐步发展越来越受到用户的青睐,两个监控系统各有其擅长的领域。
zabbix
功能强大的开源监控系统,主要覆盖主机、网络、应用程序的监控,具有数据采集、告警触发、告警通知等功能。数据采集上支持agent数据采集、被动式数据监控(通过SNMP, IPMI等),同时支持通过插件和自定义脚本的方式来扩展数据采集功能。
prometheus
云原生开源监控系统,核心功能在于时序数据的收集与分析,其自带数据库,并有一套专门的PromQL查询语法,其在容器监控方面相比zabbix具有极大的优势,在云原生时代,使用kubernetes的场景中,prometheus技术算是必备的监控手段。一般在使用时会搭配alertmanager。
表1是两者的特点对比:
| zabbix | prometheus | |
|---|---|---|
| 功能 | 采集、分析、告警 | 采集、分析、告警 |
| 开发语言 | C、PHP | Golang |
| 数据库 | MySQL PostgreSQL SQLite Oracle IBMDB2 | 自带tsdb |
| 使用规模 | 中小型规模 | 规模不限 |
| 数据模型/查询语言 | 数据模型和查询语言 | 计数器(counter)、仪表盘(gauge)、直方图(histogram)、摘要(summary)四种数据模型包含指标、标签,聚合函数PromQL查询语法 |
| 告警 | 自带告警,web配置 | 结合alertmanager通知 |
| 可视化 | Web功能较多 | 简单的页面、仅支持查询 |
| 配置 | 手动配置 很难适应多变的环境 | 可自动化配置、自发现服务指标 |
| 扩展性 | 可扩展 | 可扩展 |
| 优势场景 | 传统监控 | 云原生监控 |
| 数据采集 | Agent/插件、脚本 | 自发现、exporter |
表1. zabbix与prometheus特点对比
应该选择哪一款监控系统,其实还需要企业根据自身的特点来决定。很多时候是将这些系统和其他系统进行组合使用,构建适合企业运维场景的监控体系。具体到实践中该如何取舍,就需要更多地了解它们的特性。
zabbix会消耗更多的系统资源,一旦监控的规模上来之后,zabbix自身会存在性能瓶颈,而且由于默认使用的是关系DB存储,因此在查询性能以及存储空间方面不如prometheus。实践中可能会通过部署多套独立的zabbix来解决规模问题,或者通过二次开发将数据转存到opentsdb这种时序数据库等方法来解决,也可以使用postgresql的扩展为TimescaleDB,不过目前该项技术还处于实验性阶段。
prometheus其本身在数据展示方面比较简单,在告警的处理上也只是简单的通知,因此一般情况下会结合grafana进行数据展示,与alertmanager结合进行告警的抑制、屏蔽等。其告警规则由于采用PromQL语法,与zabbix在告警原理上存在本质不同,因此可以配置更加强大和复杂的告警规则,基本可以覆盖日常的所有告警场景,很多告警指标无需要提前生成。当然prometheus的告警也并非完美,比如某项监控指标如果在某段时间内没有上报数据,就可能导致告警误报的情况,即nodata问题,这个在后续文章中将讲述如何处理。
何时zabbix最优
-
规模较小,小于1000台设备,无需处理海量指标
-
需要监控服务器、网络设备等传统基础监控信息
-
需要丰富的监控功能组件和预定义模板
何时prometheus最优
-
需要监控容器、服务网格、微服务等云原生环境
-
规模较大、指标多、高可扩展性
-
需要更加丰富的告警规则、更加全面的数据分析
监控系统也不是一劳永逸,如何充分利用好这些系统,还有很多事情需要去做。比如zabbix中的主机监控,如何去维护hostgroup、配置各种模板、网络自发现、自动加监控、去监控、进行监控数据的后处理,分析等。promethues中如何进行数据清洗、数据丰富,如何配置告警规则生效时间,关联cmdb、告警事件后续如何处理等等。
很多公司由于开展监控比较早,因此可能同时存在这两套监控系统,各取所长。为了充分利用prometheus在数据分析处理方面的优势,我们也可以将zabbix的数值型数据转换到prometheus的tsdb数据库中,统一对数据进行监控、分析等。
将zabbix监控数据转换为prometheus的tsdb数据的方法一般有两种,一种是直接通过读取数据库数据进行转换,另一种是通过zabbix的api进行读取,通过api读取比较简单,可以不用关注zabbix本身存储的是哪种数据格式。
关于zabbix转换到prometheus的方法,可以参考github.com/veops/ops-t…