Prometheus监控系统概述
一. 基本概念
1.1 监控指标-metrics
指标是衡量和描述对象的方式
监控是对指标进行监测和控制
监控指标应满足可量化、标准化、多维度
Flink的metrics
Flink的metrics有四种类型:
- Counter:A Counter is used to count something. 整数
- Gauge:A Gauge provides a value of any type on demand. 数值
- Histogram:A Histogram measures the distribution of long values. 比例
- Meter:A Meter measures an average throughput. 速率
Flink metrics一览:
https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/ops/metrics/#system-metrics
1.2 监控链路
完整的监控链路包括以下功能
- 数据收集
- 解析聚合
- 数据展示
- 规则告警
二. Prometheus监控系统架构
2.1 Metrics Type
Prometheus时序数据分为四种类型:
- Counter
- Gauge
- Histogram 指定区间数据以及总数
- Summary 一段时间内数据采样结果,可由Histogram计算而来
Flink metric types和Prometheus metric types对应关系
Flink | Prometheus | Note |
---|---|---|
Counter | Gauge | Prometheus counters cannot be decremented. |
Gauge | Gauge | Only numbers and booleans are supported. |
Histogram | Summary | Quantiles .5, .75, .95, .98, .99 and .999 |
Meter | Gauge | The gauge exports the meter’s rate. |
2.2 Prometheus Server
Prometheus生态的核心组件,负责实现对监控数据的获取,存储以及查询。
Prometheus Server本身就是一个时序数据库(TSDB),将采集到的监控数据按照时间序列的方式存储在本地磁盘当中。
2.3 Exporter
可以向Prometheus提供监控样本数据的程序,Exporter的一个实例被称为一个target,Prometheus通过轮询的方式定期从target中获取样本数据。
范围 | 常用Exporter |
---|---|
数据库 | MySQL Exporter, Redis Exporter, MongoDB Exporter, MSSQL Exporter等 |
硬件 | Apcupsd Exporter,IoT Edison Exporter, IPMI Exporter, Node Exporter等 |
消息队列 | Beanstalkd Exporter, Kafka Exporter, NSQ Exporter, RabbitMQ Exporter等 |
存储 | Ceph Exporter, Gluster Exporter, HDFS Exporter, ScaleIO Exporter等 |
HTTP服务 | Apache Exporter, HAProxy Exporter, Nginx Exporter等 |
API服务 | AWS ECS Exporter, Docker Cloud Exporter, Docker Hub Exporter, GitHub Exporter等 |
日志 | Fluentd Exporter, Grok Exporter等 |
监控系统 | Collectd Exporter, Graphite Exporter, InfluxDB Exporter, Nagios Exporter, SNMP Exporter等 |
其它 | Blockbox Exporter, JIRA Exporter, Jenkins Exporter, Confluence Exporter等 |
2.4 Pushgateway
Prometheus server以pull模式从Exporter获取指标数据,Pushgateway允许监控目标将指标数据push到pushgateway,再由Prometheus
"The Prometheus Pushgateway allows you to push time series from short-lived service-level batch jobs to an intermediary job which Prometheus can scrape."
应用场景
"We only recommend using the Pushgateway in certain limited cases. Usually, the only valid use case for the Pushgateway is for capturing the outcome of a service-level batch job."
- 监控目标存活周期短,指标数据用pull模式难以拉取到
- Prometheus Server无法直接与Exporter进行通信
- 需要将不同target的数据进行汇总后再由Prometheus统一收集
Pushgateway的局限性
- 单例容错性低,出问题影响范围大
- 监控状态无法精确到每个节点
- pgw会对推送给它的监控数据持久化,Prometheus可能会拉取到旧的数据,需要手动清理
2.5 PromQL
Prometheus提供的表达式语言用于指标数据的查询和聚合,或者由外部系统通过HTTP API调用
"You can use PromQL to create dashboards using the collected data and point it to an instance of Grafana or a hosted monitoring tool such as OpsRamp that natively supports PromQL."
数据类型
在 Prometheus 的表达式语言中,表达式或子表达式包括以下四种类型之一:
- 瞬时向量(Instant vector) - 一组时间序列,每个时间序列包含单个样本,它们共享相同的时间戳。也就是说,表达式的返回值中只会包含该时间序列中的最新的一个样本值。而相应的这样的表达式称之为瞬时向量表达式。
- 区间向量(Range vector) - 一组时间序列,每个时间序列包含一段时间范围内的样本数据。
- 标量(Scalar) - 一个浮点型的数据值。
- 字符串(String) - 一个简单的字符串值。
在最简单的形式中,仅指定指标(metric)名称。这将生成包含此指标名称的所有时间序列的元素的瞬时向量。
过滤器
- 标签匹配过滤器:
用花括号附加一组标签以过滤时间序列 eg.http_requests_total{job="prometheus",group="canary"}
支持正则匹配 eg.http_requests_total{environment=~"staging|testing|development",method!="GET"}
metric名也能视为标签 eg.{__name__=~"job:.*"}
- 时间区间过滤器:
用方括号指定应为每个返回的区间向量样本值中提取多长的时间范围 eg.http_requests_total{job="prometheus"}[5m]
时间单位:s-秒、m-分钟、h-小时、d-天、w-周、y-年 - 时间位移:
时间序列不以当前时间为基准时使用
用offset关键字指定时间基准为多久前 eg.http_requests_total{method="GET"} offset 5m
也适用于区间向量 eg.rate(http_requests_total[5m] offset 1w)
操作符
PromQL支持很多操作符用于运算和聚合操作:
- 二元运算符:包括算数运算符(加减乘除)、布尔运算符(等于大于小于)、集合运算符(与或非)
- 匹配模式:包括一对一、一对多、多对一
- 聚合操作:sum、max、min、avg等等
- 丰富的内置函数:
_over_time()
2.6 AlertManager
Alertmanager是一个独立的告警模块,接收Prometheus等客户端发来的警报,之后通过分组、删除重复等处理,并将它们通过路由发送给正确的接收器;告警方式可以按照不同的规则发送给不同的模块负责人,Alertmanager支持Email, Slack,等告警方式, 也可以通过webhook接入钉钉等国内IM工具。
告警规则
Prometheus中的告警规则允许你基于PromQL表达式定义告警触发条件,Prometheus后端对这些触发规则进行周期性计算,当满足触发条件后则会触发告警通知。
一条典型的告警规则如下所示:
groups:
- name: example
rules:
- alert: HighErrorRate
expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
for: 10m
labels:
severity: page
annotations:
summary: High request latency
description: description info
AlertManager对alert的处理
- Grouping-分组:将类似性质的警报分类为单个通知。
- Inhibition-抑制:当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。
- Silences-静默:简单的特定时间静音提醒的机制,通过匹配器来配置。
alert的状态
- pending:警报被激活,但是低于配置的持续时间。这里的持续时间即rule里的FOR字段设置的时间。该状态下不发送报警。
- firing:警报已被激活,而且超出设置的持续时间。该状态下发送报警。
- inactive:既不是pending也不是firing的时候状态变为inactive
Prometheus触发一条告警的过程:
- prometheus 触发阈值 超出持续时间
- alertmanager 分组|抑制|静默
- 媒体类型 邮件|钉钉|微信等进行通知