首页   快速返回

prometheus要点整理     所属分类 prometheus
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协议及使用场景