prometheus要点整理
所属分类 prometheus
浏览量 3702
Prometheus 由 SoundCloud 开源的监控告警解决方案,与Kubernetes同属CNCF,
已经成为炙手可热的Kubernetes生态圈中的核心监控系统,越来越多的项目(如Kubernetes和etcd等 )都加入了丰富的Prometheus原生支持
提供通用的数据模型和便捷的数据采集、存储和查询接口,基于Go实现降低了服务端的运维成本,
可以借助一些优秀的图形化工具(如Grafana)实现友好的可视化和报警。
术语
time series
metric 指标
labels 标签
targes 数据源 抓取目标
alert 警报
exporter 信息收集和数据上报
counter 计数器
Gauge 计量器
quantile 分位数
bucket 桶
Summary 概略图
Histogram 直方图
主要特点
多维数据模型 时序由 metric(指标)和 labels k/v 构成
灵活的查询语句 PromQL
无依赖存储,支持 local 和 remote 不同模型
采用 http 协议, pull 模式拉取数据
监控目标,可以采用服务发现或静态配置方式
支持多种统计数据模型,图形化友好
核心组件
Prometheus Server 用于抓取和存储时序数据,提供API 查询和 Alert Rule 配置
client libraries 用于对接 Prometheus Server, 可以查询和上报数据
push gateway 支持把指标推送到Pushgateway ,然后暴露指标,主要用于业务数据汇报等
exporters 如 node_exporter等
alertmanager 用于告警通知管理
Retrieval 检索拉取到的数据分发给TSDB进行存储
TSDB 当拉取的数据大于配置内存缓存区的时候,将数据持久化到磁盘(HHD/SSD)(如果使用 remote storage 将持久化到云端)。
Prometheus 可以配置 rules,然后定时查询数据,当条件触发的时候,会将 alert(警告) 推送(pushalerts)到配置的 Alertmanager(警告管理器)。
Alertmanager 收到警告的时候,可以根据配置,聚合,去重,降噪,最后发送警告。
API client 使用promQL查询数据
Grafana 数据可视化
Web UI : Prometheus web接口,简单可视化,及语句执行或者服务状态监控。
限制
只支持数值类型
不适合做审计计费
数据模型
时序(time series) 指标+标签 Metric + label key/value
指标名 有 字母,数字,下划线,及冒号组成 必须满足正则表达式
[a-zA-Z_:][a-zA-Z0-9_:]*
http_requests_total http 请求总数
标签 使 数据更加丰富,区分不同的时序数据
按照某个时序以时间维度采集的数据,称之为样本,其值包含:
一个 float64 值
一个毫秒级的 unix 时间戳
时序名字+时序标签
metric_name{label_name1=label_value1, label_name2=label_value2 , ...}
4 种类型
Counter
Gauge
Histogram(采样并统计)
Summary(采样结果)
Histogram
用于表示一段时间范围内对数据进行采样(通常是请求持续时间或响应大小),
并能够对其指定区间以及总数进行统计,通常它采集的数据展示为直方图
Summary
主要用于表示一段时间内数据采样结果(通常是请求持续时间或响应大小),
直接存储 quantile 数据,而不是根据统计区间计算出来的。
prometheus
/metrics
# HELP prometheus_http_request_duration_seconds Histogram of latencies for HTTP requests.
# TYPE prometheus_http_request_duration_seconds histogram
prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="0.1"} 116956
prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="0.2"} 116956
prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="0.4"} 116956
prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="1"} 116956
prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="3"} 116956
prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="8"} 116956
prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="20"} 116956
prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="60"} 116956
prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="120"} 116956
prometheus_http_request_duration_seconds_bucket{handler="/metrics",le="+Inf"} 116956
prometheus_http_request_duration_seconds_sum{handler="/metrics"} 707.1515445999988
prometheus_http_request_duration_seconds_count{handler="/metrics"} 116956
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 0.000114796
go_gc_duration_seconds{quantile="0.25"} 0.000165641
go_gc_duration_seconds{quantile="0.5"} 0.00019543
go_gc_duration_seconds{quantile="0.75"} 0.000244569
go_gc_duration_seconds{quantile="1"} 0.003400243
go_gc_duration_seconds_sum 3.281361499
go_gc_duration_seconds_count 5379
Histogram vs Summary
都包含 basename_sum,basename_count
Histogram 通过 basename_bucket 计算 quantile
Summary 直接存储 quantile 值
job 和 instance
prometheus job 和 instance
拉取数据时自动添加 两个标签
job 抓取目标配置的 job_name
instance 被抓取目标 host:port
标签冲突处理
设置 honor_labels: true ,避免数据本身的 job 和 instance 被覆盖。
PromQL (Prometheus Query Language) 数据查询 DSL 语言
http_requests_total 等价 {__name__='http_requests_total'}
查询相当于对各种标签的筛选
http_requests_total{code="200"}
http_requests_total{code="200",job='api'}
http_requests_total{code="200",job='api',instance="127.0.0.1:9000"}
操作符
算术运算符: +,-,*,/,%,
比较运算符: ==,!=,>,<,>=,<=
逻辑运算符: and,or,unless
聚合运算符: sum,min,max,avg,stddev,stdvar,count,count_values,bottomk,topk,quantile
内置函数
https://prometheus.io/docs/prometheus/latest/querying/functions/
Exporter xxx_exporter
https://prometheus.io/docs/instrumenting/exporters/#exporters-and-integrations
node_exporter 负责主机信息收集
Exporter 提供 http 接口 , 将收集的数据转化为对应的文本格式。
以行 (\n) 为单位,忽略空行, 最后一行为空行。
以 # 开头通常表示注释
以 # HELP 开头表示 metric 帮助说明。
以 # TYPE 开头表示 metric 类型,counter, gauge, histogram, summary untyped
其他表示一般注释
# HELP http_requests_total The total number of HTTP requests.
# TYPE http_requests_total counter
http_requests_total{method="post",code="200"} 1027
http_requests_total{method="post",code="400"} 3
# HELP http_request_duration_seconds A histogram of the request duration.
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{le="0.05"} 24054
http_request_duration_seconds_bucket{le="0.1"} 33444
http_request_duration_seconds_bucket{le="0.2"} 100392
http_request_duration_seconds_bucket{le="0.5"} 129389
http_request_duration_seconds_bucket{le="1"} 133988
http_request_duration_seconds_bucket{le="+Inf"} 144320
http_request_duration_seconds_sum 53423
http_request_duration_seconds_count 144320
# HELP rpc_duration_seconds A summary of the RPC duration in seconds.
# TYPE rpc_duration_seconds summary
rpc_duration_seconds{quantile="0.01"} 3102
rpc_duration_seconds{quantile="0.05"} 3272
rpc_duration_seconds{quantile="0.5"} 4773
rpc_duration_seconds{quantile="0.9"} 9001
rpc_duration_seconds{quantile="0.99"} 76656
rpc_duration_seconds_sum 1.7560473e+07
rpc_duration_seconds_count 2693
histogram 或 summary 类型必需满足以下条件
metric = x
采样数据的总和应表示为 x_sum
采样数据的总量应表示为 x_count
summary quantile x{quantile="y"}
histogram 分区统计数据 x_bucket{le="y"}
histogram x_bucket{le="+Inf"}
summary 和 historam 中 quantile 和 le 必需按从小到大顺序排列。
node_exporter 主机信息监控
CPU 使用率
100 - (avg by (instance) (irate(node_cpu{instance="xxx", mode="idle"}[5m])) * 100)
CPU 各 mode 占比率
avg by (instance, mode) (irate(node_cpu{instance="xxx"}[5m])) * 100
机器平均负载
node_load1{instance="xxx"} // 1分钟负载
node_load5{instance="xxx"} // 5分钟负载
node_load15{instance="xxx"} // 15分钟负载
内存使用率
100 - ((node_memory_MemFree{instance="xxx"}+node_memory_Cached{instance="xxx"}+node_memory_Buffers{instance="xxx"})/node_memory_MemTotal) * 100
1
磁盘使用率
100 - node_filesystem_free{instance="xxx",fstype!~"rootfs|selinuxfs|autofs|rpc_pipefs|tmpfs|udev|none|devpts|sysfs|debugfs|fuse.*"} / node_filesystem_size{instance="xxx",fstype!~"rootfs|selinuxfs|autofs|rpc_pipefs|tmpfs|udev|none|devpts|sysfs|debugfs|fuse.*"} * 100
网络 IO
// 上行带宽
sum by (instance) (irate(node_network_receive_bytes{instance="xxx",device!~"bond.*?|lo"}[5m])/128)
// 下行带宽
sum by (instance) (irate(node_network_transmit_bytes{instance="xxx",device!~"bond.*?|lo"}[5m])/128)
网卡出/入包
// 入包量
sum by (instance) (rate(node_network_receive_bytes{instance="xxx",device!="lo"}[5m]))
// 出包量
sum by (instance) (rate(node_network_transmit_bytes{instance="xxx",device!="lo"}[5m]))
prometheus 配置 prometheus.yml
global:全局的配置,如果后面的任务没有对特定配置项进行覆盖,这里的选项会生效。
scrape_interval: 拉取 targets 的默认时间间隔。太频繁会导致 promethues 压力比较大,如果太久,可能会导致某些关键数据漏掉,推荐根据每个任务的重要性和集群规模分别进行配置。
scrape_timeout: 拉取一个 target 的超时时间。
evaluation_interval: 执行 rules 的时间间隔。
external_labels: 额外的属性,会添加到拉取的数据并存到数据库中。
scrape__configs:主要用于配置拉取数据节点,每一个拉取配置主要包含以下参数:
job_name:任务名称
honor_labels: 用于解决拉取数据标签有冲突,当设置为 true, 以拉取数据为准,否则以服务配置为准
params:数据拉取访问时带的请求参数
scrape_interval: 拉取时间间隔
scrape_timeout: 拉取超时时间
metrics_path: 拉取节点的 metric 路径
scheme: 拉取数据访问协议
sample_limit: 存储的数据标签个数限制,如果超过限制,该数据将被忽略,不入存储;默认值为0,表示没有限制
relabel_configs: 拉取数据重置标签配置
告警配置
可以使用运行参数 -alertmanager.xxx 来配置 Alertmanager, 但是这样不够灵活,无法动态更新加载,以及动态定义告警属性。
alerting 配置主要用来解决这个问题,它能够更好的管理 Alertmanager, 主要包含 2 个参数:
alert_relabel_configs: 动态修改 alert 属性的规则配置。
alertmanagers: 用于动态发现 Alertmanager 的配置。
使用 Java Client构建Exporter
io.prometheus:simpleclient:x.y.z
collector
使用HTTP Server 暴露监控指标
io.prometheus:simpleclient_httpserver:x.y.z
HTTPServer server = new HTTPServer(9999);
启动之前调用Collector的register()方法
new YourCollector().register();
new YourCollector2().register();
http://127.0.0.1:9999/metrics
CollectorRegistry
调用Collector实例register()方法时,将该实例保存到CollectorRegistry中
CollectorRegistry负责维护所有的Collector实例
TextFormat
内置的Collector
simpleclient_hotspot 内置了JVM运行状态数据收集 (GC,内存池,JMX,类加载,线程池等)
io.prometheus:simpleclient_hotspot:x.y.z
业务代码监控埋点
Counter Gauge Summary Histogram
Gauge myGauge = Gauge.build().name("myGauge").help("myGauge help msg").register();
标签定义
Counter
Summary和Histogram 统计和分析样本的分布情况
HTTP请求字节数 响应大小 处理耗时 等统计
Summary 指定统计的分位数
static final Summary requestLatency = Summary.build()
.quantile(0.5, 0.05) // 其中0.05为误差
.quantile(0.9, 0.01) // 其中0.01为误差
.name("requests_latency_seconds").help("Request latency in seconds.").register();
Histogram 默认的分布桶为[.005, .01, .025, .05, .075, .1, .25, .5, .75, 1, 2.5, 5, 7.5, 10]
自定义的桶分布
static final Histogram requestLatency = Histogram.build()
.name("requests_latency_seconds").help("Request latency in seconds.")
.buckets(0.1, 0.2, 0.4, 0.8)
.register();
PushGateway集成
io.prometheus:simpleclient_pushgateway:x.y.z
上一篇
下一篇
vim颜色及行号设置
prometheus job 和 instance
rate与irate的区别
grafana使用模板变量
dubbo架构及调用模型
dubbo支持的rpc协议及使用场景