1.Prometheus是什么?
Prometheus(下文称Prom) 是由 SoundCloud 开源监控告警解决方案,与Kubernetes同属CNCF,它已经成为炙手可热的Kubernetes生态圈中的核心监控系统,越来越多的项目(如Kubernetes和etcd等 )都加入了丰富的Prometheus原生支持,
Prom提供了通用的数据模型和便捷的数据采集、存储和查询接口,同时基于Go实现也大大降低了服务端的运维成本,可以借助一些优秀的图形化工具(如Grafana)可以实现友好的图形化和报警。
1.1单词理解
- metric—指标(名字)
- targes–数据源
- alert–警报
- exporter–负责数据汇报和信息收集的程序
- quantile–分位数
- bucket–块
- Summary–概略图
- Histogram–直方图
- labels–标签
1.2主要特点:
- 多维数据模型【时序由 metric(指标) 名字和 k/v 的 labels 构成】。
- 灵活的查询语句(PromQL)。
- 无依赖存储,支持 local 和 remote 不同模型。
- 采用 http 协议,使用 pull 模式拉取数据,简单易懂。
- 监控目标,可以采用服务发现或静态配置的方式。
- 支持多种统计数据模型,图形化友好。
1.3核心组件:
- Prometheus Server:主要用于抓取数据和存储时序数据,另外还提供API供外界查询和 Alert Rule 配置管理。
- client libraries:用于对接 Prometheus Server, 可以查询和上报数据。
- push gateway :允许短暂和批量作业将其指标暴露给普罗米修斯。由于这些类型的作业可能存在时间不足以被删除,因此他们可以将其指标推送到Pushgateway。然后,Pushgateway将这些指标暴露给普罗米修斯,主要用于业务数据汇报等。
- 各种汇报数据的 exporters :例如汇报机器数据的 node_exporter, 汇报 MongoDB 信息的 MongoDB * exporter 等等。
- 用于告警通知管理的 alertmanager 。
1.4基础架构图
1.5模块逻辑解析:
- Prometheus server :定期从静态配置的 Prometheus targets (数据源)或者服务发现的 targets (数据源)拉取数据。
- Retrieval:检索拉去到的数据分发给TSDB进行存储。
- HTTP server:用于接受外界的HTTP请求。
- TSDB:当新拉取的数据大于配置内存缓存区的时候,Prometheus会将数据持久化到磁盘(HHD/SSD)(如果使用 remote storage 将持久化到云端)。
- Prometheus 可以配置 rules,然后定时查询数据,当条件触发的时候,会将 alert(警告) 推送(pushalerts)到配置的 Alertmanager(警告管理器)。
- Alertmanager :收到警告的时候,可以根据配置,聚合,去重,降噪,最后发送警告。
- API client,Grafana:API client通过使用promQL查询数据,Grafana用于聚合数据将数据可视化。
- Web UI: Prometheus的web接口,可用于简单可视化,及语句执行或者服务状态监控。
- short-lived jobs:存在时间不足以被删除的短暂和批量作业
- pushgateway:shaort-lived jobs 在推出时将数据推给pushgateway,主要用于业务数据汇报等。
注意:
- Prometheus 的数据是基于时序的 float64 的值,如果你的数据值有更多类型,无法满足。
- Prometheus 不适合做审计计费,因为它的数据是按一定时间采集的,关注的更多是系统的运行瞬时状态以及趋势,即使有少量数据没有采集也能容忍,但是审计计费需要记录每个请求,并且数据长期存储,这个 Prometheus 无法满足,可能需要采用专门的审计系统。
2.prometheus的数据模型
Prometheus 存储的是时序数据, 即按照相同时序(相同的名字和标签),以时间维度存储连续的数据的集合。
2.1时序索引
-
时序(time series) 是由指标名字(Metric),以及一组 key/value 标签定义的,具有相同的名字以及标签属于相同时序。
-
时序的名字由 ASCII 字符,数字,下划线,以及冒号组成,它必须满足正则表达式
[a-zA-Z_:][a-zA-Z0-9_:]*,
其名字应该具有语义化,一般表示一个可以度量的指标,例如: http_requests_total, 可以表示 http 请求的总数。
-
时序的标签可以使 Prometheus 的数据更加丰富,能够区分具体不同的实例,例如:
http_requests_total{method="POST"} 可以表示所有 http 中的 POST 请求。
-
标签名称由 ASCII 字符,数字,以及下划线组成, 其中 __ 开头属于 Prometheus 保留,标签的值可以是任何 Unicode 字符,支持中文。
2.2时序样本
- 按照某个时序以时间维度采集的数据,称之为样本,其值包含:
- 一个 float64 值
- 一个毫秒级的 unix 时间戳
2.3格式
-
Prometheus 时序格式与 OpenTSDB 相似:
<metric name>{<label name>=<label value>, ...}
其中包含时序名字以及时序的标签。
2.4时序 4 种类型
Prometheus 时序数据分为 Counter(变化的增减量), Gauge(瞬时值), Histogram(采样并统计), Summary(采样结果) 四种类型。
- Counter
Counter 表示收集的数据是按照某个趋势(增加/减少)一直变化的,我们往往用它记录服务请求总量、错误总数等。
例如 Prometheus server 中 http_requests_total, 表示 Prometheus 处理的 http 请求总数,我们