常见监控告警系统对比分析

目录

  • 监控告警系统的总体介绍
  • 常见的监控告警系统介绍
    • Prometheus
      • 架构
      • Prometheus Server
      • Metric Type
      • Prometheus Exporter
    • AlertManager
      • 架构
    • Open-Falcon
      • 架构
      • Data model
      • Data collection
      • Alert
      • Heartbeat server
    • Zabbix
      • Zabbix组件图
        • Zabbix Server
        • Zabbix Database
        • Zabbix Web
        • Proxy
        • Agent
    • InfluxData
      • TICK技术栈
      • InfluxDB metric type
      • Kapacitor
    • Bosun
    • Unisphere Unity300
  • 对比分析
  • References

监控告警系统的总体介绍

监控告警系统的实现各有不同,大致如下所述。

  • 在数据采集方面,有的监控系统采用主动采集方式,有的监控系统采用被动上报方式,有的监控系统采用上述两者兼备的方式。
  • 在数据传输方面,有的监控系统采用socket传输,有的监控系统采用HTTP传输。
  • 在数据存储方面,有的监控系统将监控数据保存在MySQL中,有的监控系统将数据保存在MongoDB,OpenTSDB, InfluxDB等时序数据库中。

但是,所有的监控告警系统的核心都是采集和处理数据。

监控系统通常由指标采集子系统和数据处理子系统组成。

  • 指标采集子系统主要负责信息采集,过滤,汇总和存储。
  • 数据处理子系统主要负责数据分析,展现,预警,告警动作触发和告警等。



常见的监控告警系统介绍

常见的监控告警系统主要有Prometheus,Prometheus AlertManager,Zabbix,Open-Falcon, Bosun, InfluxData, Unity300等。下面分别进行简单的介绍和对比分析。

Prometheus

Prometheus是由SoundCloud公司开发的开源告警系统并且带时序数据库,基于Go语言开发。

架构

Prometheus的基本原理是通过HTTP周期性地抓取被监控组件的状态,任意组件只要提供对应的HTTP接口并且符合Prometheus定义的数据格式,就可以接入Prometheus监控。其架构图及其生态系统组件图如下所示。


Prometheus Server

Prometheus Server是Prometheus的核心,根据配置完成数据采集,服务发现以及数据存储 ,推送告警,以及提供PromQL查询语言的支持。

  • Prometheus Server负责定时在目标上抓去Metrics数据,每个抓取目标都需要暴露一个HTTP服务接口用于Prometheus定时抓取。这种调用监控对象获取监控数据的方式成为Pull。Pull方式可以降低耦合,通过Pull方式,被采集端无须感知监控系统的存在,完全独立于监控系统之外,这样数据的采集完全由监控系统控制,增强了整个系统的稳定性。
  • Prometheus Server通过如下两种方式获取监控对象。
    • 通过配置文件,文本文件等进行静态配置。
    • 支持Kubernetes,file_sd,Consul等方式进行动态发现。
  • Storage通过一定的规则清理和整理数据,并把得到的结果存储到新的时间序列中,主要有两种存储方式。
    • 本地存储。通过Prometheus自带的时序数据库保存到本地磁盘。
    • 远端存储。通过中间层的适配器的转化,目前Prometheus支持OpenTSDB, InfluxDB,ElasticSearch等后端存储。
  • Prometheus通过PromQL和其他API可视化地展示收集的数据。
  • AlertManager是独立于Prometheus的一个组件,在触发了预先设置在Prometheus中的告警规则后,Prometheus便会push告警信息到AlertManager。

Metric Type

Prometheus的所有监控指标(Metric)被统一定义为:

<metric_name>{<label_name>=<label_value>, ...}

其中指标名称说明指标的含义,标签可以体现指标的维度特征,用于过滤和聚合。

Prometheus的Client Library提供度量的四种基本类型包括: Counter(计数器), Gauge(仪表盘), Histogram(柱状图), Summary(概要)。

Prometheus Exporter

AlertManager

Alertmanager作为一个独立的组件,负责接收并处理来自Prometheus Server(也可以是其它的客户端程序)的告警信息。Alertmanager可以对这些告警信息进行进一步的处理,比如当接收到大量重复告警时能够消除重复的告警信息,同时对告警信息进行分组并且路由到正确的通知方,Prometheus内置了对邮件,Slack等多种通知方式的支持,同时还支持与Webhook的集成,以支持更多定制化的场景。同时AlertManager还提供了静默和告警抑制机制来对告警通知行为进行优化。

  1. 客户端通过POST请求向AlertManager推送告警信息。
  2. 每条告警信息中的labels可用于唯一识别告警信息并用于去重。
[
  {
    "labels": {
      "alertname": "<requiredAlertName>",
      "<labelname>": "<labelvalue>",
      ...
    },
    "annotations": {
      "<labelname>": "<labelvalue>",
    },
    "startsAt": "<rfc3339>",
    "endsAt": "<rfc3339>",
    "generatorURL": "<generator_url>"
  },
  ...
]

架构


AlertManager主要分为两个部分,路由(router)和接收器(receiver)。告警消息先被经过路由树,然后被分配到对应的接收器中。路由树是由预先设定的路由规则生成的。其高可用架构如上图所示,具体流程如下:

  1. Prometheus会通过调用AlertManager提供的告警接口将原始的告警消息发送到AlertManager。
  2. AlertManager的API除了接收告警,还接收静默请求,将其分别保存到各自的provider里。
  3. provider提供了一个订阅(subscribe)接口,这样Dispatcher组件便可以获取告警数据,并对数据进行分组,通过用户预先设置的规则进入告警抑制阶段或静默阶段。
  4. 如果通过了上面的告警静默阶段,则进入路由分发阶段,最终发送通知。

Open-Falcon

Open-Falcon是小米公司开源的一款监控与告警系统,已被多家国内互联网公司所使用,基于Go语言开发。

架构

Data model

open-falcon采用和opentsdb相同的数据格式:metric、endpoint加多组key value tags。例如:

{
    metric: load.1min,
    endpoint: open-falcon-host,
    tags: srv=falcon,idc=aws-sgp,group=az1,
    value: 1.5,
    timestamp: `date +%s`,
    counterType: GAUGE,
    step: 60
}

Data collection

falcon-agent用于采集各项基础监控数据指标,主动上报,不需要用户在server做任何配置。falcon-agent还可以执行用户自定义的插件返回的数据。同时falcon-agent提供了一个proxy-gateway,用户可以方便的通过http接口,push数据到本机的gateway,gateway会帮忙高效率的转发到server端。

transfer接收客户端发送的数据,做一些数据规整,检查之后,转发到多个后端系统去处理。在转发到每个后端业务系统的时候,transfer会根据一致性hash算法,进行数据分片,来达到后端业务系统的水平扩展。transfer目前支持三种业务后端,分别为judge、graph、opentsdb。其中judge是告警判定组件,graph是数据存储、归档、查询组件,opentsdb是开源的时间序列数据存储服务。

Alert

Judge组件用户告警的判定。用户在web portal来配置相关的报警策略,存储在MySQL中。heartbeat server 会定期加载MySQL中的内容。judge也会定期和heartbeat server保持沟通,来获取相关的告警策略。

Heartbeat server

heartbeat sever从数据库中加载模板策略,根据模板继承、模板项覆盖、报警动作覆盖、模板和hostGroup绑定,计算出最终关联到每个endpoint的告警策略,提供给judge组件来使用。

Zabbix

Zabbix 是由 Alexei Vladishev 开发的一种网络监视、管理系统,支持多种采集方式和采集客户端,同时支持SNMP,IPMI,JMX,Telnet,SSH等多种协议,它将采集到的数据存放到数据库中,然后对其进行分析整理,如果符合告警规则,则触发相应的告警。

Zabbix组件图

Zabbix Server

Zabbix的核心组件,由C语言编写,主要负责接收Agent发送的监控信息,并进行汇总存储。Zabbix Server主要包括三个方面的工作。

  1. 设备注册。
    • 手动配置Agent地址。
    • 自动发现机制。
  2. 数据收集。采集到数据首先会被放置在内存中,然后被批量保存在数据库中。
    • 主动收集
    • 被动接收
  3. 定期的数据清理和告警触发。

Zabbix Database

用于存储配置信息以及收集的监控数据。后端数据库支持MySQL,PostgreSQL,Oracle等,并提供Zabbix Web页面的数据查询方式。由于采用关系型数据库存储时序数据,所以Zabbix在监控大规模集群时常常在数据存储方面捉襟见肘。

Zabbix Web

Zabbix的GUI组件,由PHP编写。通常于Server运行在同一台主机上。提供监控数据的展现和系统配置,主要配置包括监控模板,告警等。

Proxy

主要解决两个问题。

  • Server和Agent之间网络不通。
  • 大规模部署时减轻Server的压力。

Agent

部署在被监控主机上,负责收集本地数据并发往Server端或Proxy端,Agent端会启动一个Agentd的守护进程。

  • 主动
  • 被动

InfluxData

TICK技术栈

TICK技术栈是InfluxData 平台提供的监控方案,代表了用于解决时序数据库问题的四个组件:Telegraf(数据收集器)、InfluxDB(时序数据库)、Chronograf(可视化 UI)和 Kapacitor(处理和监控服务)。



InfluxDB metric type

InfluxDB与传统数据库的比较

InfluxDB MySQL
database 数据库
measurement 数据库中的表
points 表里面的一行数据

InfluxDB的数据类型


<measurement>[,<tag-key>=<tag-value>...] <field-key>=<field-value>[,<field2-key>=<field2-value>...] [unix-nano-timestamp]

InfluxDB数据的构成:Point由时间戳(time)、数据(field)、标签(tags)组成。

Pointer属性 传统数据库中的概念
fields 各种记录值(没有索引的属性)也就是记录的值:温度, 湿度
tags 各种有索引的属性:地区,海拔
time 每个数据记录时间,是数据库中的主索引(会自动生成)

Kapacitor

Kapacitor 是TICK技术栈的告警服务,用户通过tickScript脚本来对时序数据库当中的数据进行过滤,筛选,批处理等进行告警,告警信息可以通过日志保存在本地,或回插到InfluxDB,还可以直接在告警产生后发起http请求到指定地址,kapacitor支持数据流(stream)和批处理(batch)数据。

kapacitor是一个脚本定义告警规则服务,与InfluxDB强相关,安装kapacitor后通过配置kapacitor.conf文件来配置和InfluxDB连接(通常是与InfluxDB开放的本地端口8086连接)

Example:

stream
  |from()
    .measurement('cpu')
    .where(lambda: "host" == 'serverA')
    .groupBy('host')
  |alert()
    .id('kapacitor/{{ index .Tags "service" }}')
    .message('{{ .ID }} is {{ .Level }} value:{{ index .Fields "value" }}')
    .info(lambda: "value" > 60)
    .warn(lambda: "value" > 70)
    .crit(lambda: "value" > 80)
    .post("http://example.com/api/alert")
    .post("http://another.example.com/api/alert")
    .tcp("exampleendpoint.com:5678")
    .email('oncall@example.com')

Bosun

Unisphere Unity300





对比分析

监控与告警系统 开发语言 成熟度 配置 可扩展性 故障域 性能 告警源 告警目标 社区活跃度 对容器的支持 企业使用度
Zabbix C + PHP 基于模版 大,集成 多通道 多通道
Prometheus Go 基于模版 小,单组件 多通道 多通道
Open-Falcon Go + Python 树形结构 小,单组件 多通道 多通道 中 (主要是国内企业使用,包括美团,滴滴,360等)
InfluxDB Go 小,单组件 多通道 多通道
Bosun Go
Unity300 Dell EMC产品

References

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容