原文出自: https://blog.mickeyzzc.tech/posts/opentelemetry/prometheus-evolution-history-one/
Prometheus
是一个开源的监控与时间序列数据库系统,在近年来得到了越来越广泛的应用。
官方的架构图如图所示:
本系列文章会以Prometheus
的在一个企业里的部署架构演进过程中逐步理解和深入各种组件和概念。
刚开始接触Prometheus
监控体系,只需要在服务端部署Prometheus
的二进制文件,用最基础的文件服务发现配置file_sd_config
来实现对主机基础监控node_exporter
进行拉取指标采集即可。
再通过Grafana
的datasource
配置Prometheus
的url
地址即可开始配置查看监控数据。
Prometheus的数据模型主要由Metric、Label和 Sample组成。
一个Prometheus Sample包含:
Metric - 时序指标名称
Timestamp - 时间戳,毫秒精度
Value - 指标数值
Label - 数据属性集
例如:
###################################################
Metric: cpu_usage
Timestamp: 1577836800000
Value: 0.6
Label: instance="web01", job="webapp"
###################################################
Metric: free_memory
Timestamp: 1577836800000
Value: 20*1024*1024
Label: instance="web01", job="webapp"
###################################################
如下所示是采集到的数据结构样例
# HELP thanos_grpc_req_panics_recovered_total Total number of gRPC requests recovered from internal panic.
# TYPE thanos_grpc_req_panics_recovered_total counter
thanos_grpc_req_panics_recovered_total 0
# HELP thanos_objstore_bucket_last_successful_upload_time Second timestamp of the last successful upload to the bucket.
# TYPE thanos_objstore_bucket_last_successful_upload_time gauge
thanos_objstore_bucket_last_successful_upload_time{bucket="thanos"} 1.591146025002795e+09
# HELP thanos_objstore_bucket_operation_duration_seconds Duration of successful operations against the bucket
# TYPE thanos_objstore_bucket_operation_duration_seconds histogram
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="0.001"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="0.01"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="0.1"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="0.3"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="0.6"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="1"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="3"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="6"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="9"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="20"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="30"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="60"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="90"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="120"} 0
thanos_objstore_bucket_operation_duration_seconds_bucket{bucket="thanos",operation="delete",le="+Inf"} 0
thanos_objstore_bucket_operation_duration_seconds_sum{bucket="thanos",operation="delete"} 0
thanos_objstore_bucket_operation_duration_seconds_count{bucket="thanos",operation="delete"} 0
Prometheus中定义了四种主要的指标类型:
这四种指标类型可以表示不同类型的指标:
根据需要的监控指标类型选择合适的类型。Prometheus在抓取和存储样本时,会根据类型做不同的处理。我们看一下以下案例。
当需要告警的时候,就要部署Alertmanager
组件,并且开始在Prometheus
配置Alertmanager
的信息,告警规则需要在Prometheus
配置以进行周期性计算,把达到阈值的告警信息发送给Alertmanager
组件来做处理。
关于
Prometheus
的告警机制,以及它和Alertmanager
的关系,以下简要说明:
Prometheus
告警规则
Prometheus
服务器中定义了告警规则(rules
),它根据PromQL
指定的表达式判断是否要生成告警。一旦表达式输出结果为true
,则会创建一个告警事件。Prometheus
处理告警
Prometheus
会记录这些告警事件,并在其状态页面上展示告警信息。Prometheus
还可以通过Webhook
将告警信息发送到外部系统。Alertmanager
概述
Alertmanager
是一个独立的告警管理组件。它支持告警去重、分组、路由、发送等功能。Prometheus
服务器生成的告警会发送给Alertmanager。Alertmanager
处理告警
Alertmanager
收到告警后,可以按照定义的分组方式对其进行分组,再按照路由规则发送到对应接收方,比如邮箱、Slack
等。它也负责告警的去重。Prometheus
和Alertmanager
集成
在Prometheus
中配置Alertmanager
的URL
地址,这样Prometheus
生成的告警可以自动发送到Alertmanager
。二者集成后,可以构成动态的告警管理机制。综上,
Prometheus
负责告警检测与生成,Alertmanager
专注于告警的后续分发、处理与告知流程。二者的集成可以完整实现从监控到告警的全链路。
这里开始我们要理解Prometheus
的告警在时序上的状态
1、inactive
:没有触发阈值
2、pending
:已触发阈值但未满足告警持续时间
3、firing
:已触发阈值且满足告警持续时间
用一个简单的例子来理解一下,以下配置一个mysql
的告警,该指标的采集周期是5s
一个样本点,配置了规则策略是每10s
计算一次,当运行时小于30s
则触发告警状态。
groups:
- name: example
rules:
- alert: mysql_uptime
expr: mysql:server_status:uptime < 30
for: 10s
labels:
level: "CRITICAL"
annotations:
detail: 数据库运行时间
如上图所示
mysql_uptime>=30
,告警状态为inactive
mysql_uptime<30
,且持续时间小于10s
,告警状态为pending
mysql_uptime<30
,且持续时间大于10s
,告警状态为firing
? 注意:配置中的for语法就是用来设置告警持续时间的;如果配置中不设置for或者设置为0,那么pending状态会被直接跳过。
其内部机制可以总结为以下几个步骤:
当达到一定规模,我们需要多个Prometheus帮忙分担采集和计算压力,可以尝试用联邦部署的方式来扩展架构。
? 注意:个人不建议这种联邦架构,主要原因是管理成本较高,且该架构对后期的自动化二次开发不太友好。
随着业务的扩展,监控系统也随之扩大,无论从架构管理上还是稳定性考虑都要从单体架构升级到集群架构,业界有多种方案选择:
Grafana
社区的Cortex
方案Thanos
社区方案这里选择了Thanos
社区的分布式方案,同时在服务发现能力上引入HashiCorp
的Consul
来取替文件配置服务发现的能力.
通过引入Consul
管理需被监控采集的exporter采集器
信息,这样运维就可以通过脚本开发定时从CMDB/CICD
系统同步基建和业务组件等可被采集的信息到该架构实现动态发现采集能力。
另外通过Thanos Sidecar
组件同步TSDB BLOCK
到对象存储备份。
前端查询用Thanos Query
组件来实现整个分布式集群的统一入口查询能力,Thanos Query
组件自身具备数据去重和联合查询。
历史数据可以通过Thanos Compact
组件长周期数据聚合和降分辨率重聚合来优化底层TSDB BLOCK
。
对象存储的数据通过Thanos Store
暴露API接口查询以减轻Prometheus
的计算压力。