开源监控系统浅析

为什么需要监控系统?

监控系统是整个运维体系的重要环节之一,主要服务于运维人员和开发人员;运维人员需要监控硬件、软件、网络等状态,做到故障预警、自动转移、自动恢复等,开发人员需要根据监控数据快速定位问题,提高服务的可用性。尤其是「微服务架构」,若没有监控系统,一但出现故障,定位问题就需要花费大量的时间。

监控系统的核心

抽象来看,监控系统最主要的有两部分:监控指标、告警。

监控指标

为了实现我们的监控目的,我们需要制定一些监控指标,一般我们可以把监控指标分为:基础监控指标、业务监控指标。

基础监控指标

通常包括CPU、内存、磁盘、端口和进程等机器、网络相关的操作系统级别的信息,一般开源监控软件都提供此类指标的数据采集。

业务监控指标

一般都是由业务系统内部服务产生/上报,反应业务的健康状态。通常采集的有以下几类:

  1. 日志。日志是主要的监控数据来源。针对 PHP 来说,通常会采集 web server 的日志、php-fpm 慢日志、web 框架日志、数据库慢日志等。通过日志我们可以分析出大量有用的信息,比如:异常状态码的分布、接口请求量分布、请求延迟、用户地域分布、服务性能瓶颈等;最重要的是,若服务出现异常,我们可以通过日志快速的定位并复现问题。日志类的数据采集,一般监控软件都会提供日志采集插件,除此之外还可以使用 Elastic Stack 。
  2. 接口。一般对外接口都需要提供健康接口;针对分布式服务,需要 Trace 系统来追踪整个请求链。
  3. 命令行。一些开源软件提供本地的命令来输出监控指标,比如 Nginx、MySQL、PHP-FPM、Redis等
  4. 上报。可以通过插件、埋点等方式主动 push 监控指标给监控系统。

告警

告警最主要的是:收敛、可用性。

收敛

收敛问题主要体现在:告警信息多,关联告警多,运维期间不断告警。

可用性

可用性问题主要体现在:监控与告警耦合在一起。

常见的开源监控系统

项目 Prometheus Open-falcon Zabbix
自动发现 YES YES YES
Agent YES YES YES
SNMP YES YES YES
外部脚本 NO YES YES
插件 YES YES YES
告警 YES YES YES
数据储存方法 TSDB MySQL/OpenTSDB/Redis MySQL
报表 NO NO YES
开发语言 Go Go Python C PHP
用户权限 NO NO 灵活分配

在公司起步阶段,基本都选择 zabbix,但随着业务发展 zabbix 在数据存储上有很大的瓶颈;这时可以选择 open-falcon 或者 prometheus;若是微服务(容器化),使用 k8s 作为容器编排,那首选 prometheus。

参考资料

  1. 监控系统选型Prometheus、TICK、Open-falcon、Zabbix
  2. 常见开源告警系统对比分析(prometheus、open-falcon、zabbix)