Prometheus|Prometheus 简介

架构
Prometheus 是一个开源的监控框架,它通过不同的组件完成数据的采集,数据的存储,告警,其中Prometheus server只提供了数据存储(time series data),数据的处理(提供了丰富的查询语法[查询,统计,聚合等等]),数据则通过众多的插件(prometheus称之为exporters)来暴露一个http服务的接口给Prometheus定时抓取, 告警则通过Altermanger。
Prometheus|Prometheus 简介
文章图片
image 组件介绍:

  • Prometheus server 包含数据采集scrapes job, stores time series data;
  • push gateway : Prometheus server的一个代理节点, 当一些节点没有提供HTTP endpoint时,可将数据push到代理节点,Prometheus会去代理节点获取数据;
  • exporters: 数据采集插件, 暴露一个http服务的接口给Prometheus server定时抓取;
  • alertmanager: 报警插件;
部署
Note that Prometheus by default uses around 3GB in memory. If you have a smaller machine, you can tune Prometheus to use less memory. For details, see the memory usage documentation.
docker run -p 9090:9090 -d -v ~/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v ~/prometheus/data:/prometheus prom/prometheus# 容器中默认的启动命令 CMD[ "--config.file=/etc/prometheus/prometheus.yml", \ "--storage.tsdb.path=/prometheus", \ "--web.console.libraries=/usr/share/prometheus/console_libraries", \ "--web.console.templates=/usr/share/prometheus/consoles" ]

Prometheus 数据模型
Prometheus所有的存储都是按时间序列去实现的,相同的metricslabel组成一条时间序列,不同的label表示不同的时间序列。为了支持一些查询,有时还会临时产生一些时间序列存储。
{

metrics 和 labels 命名最佳实践
jobs and instances
【Prometheus|Prometheus 简介】在 Prometheus 的术语中,一个可以 scrape 的节点成为一个 instance, 一个 job 中有多个 instance,例如:
job: api-server instance1: 1.2.3.4:5670 instance2: 1.2.3.4:5671

job, instance 会自动地以 label 的形式添加到时间序列的数据中:
up{job="", instance=""}: 1

同时 prometheus 的 target 实例都会包含一些默认的标签:
一般来说,Target以 __ 作为前置的标签是在系统内部使用的,因此这些标签不会被写入到样本数据中
  • __address__: prometheus scrape target 的地址 :
  • __scheme__: scrape 的协议
  • __metrics_path__: scrape 的路径
  • __param_:scrape 的请求参数
Prometheus Metrics 的类型
counter
  • 用于累计,如:请求次数,任务完成数,错误发生次数;
  • 只增加,不减少
  • 重启进程后,会被重置
Gauge
  • 常规数值,例如:温度变化,内存使用变化;
  • 可增加,可减少
  • 重启进程后,会被重置
Histogram
柱状图,常用于跟踪事件发生的规模,例如:请求耗时,相应大小。它会对记录的内容进行分组, 提供 count 和 sum 全部值的功能。如果定于一个 metrics 类型为 Histogram, 则 Prometheus 系统会自动生成三个对应的指标:
  • [metric_name]_bucket{le="上边界"},这个值为小于等于上边界的所有采样点数量。
  • [metric_name]_sum
  • [metric_name]_count
下面来看一个 prometheus metrics 中的一个 histogram 类型的数据:
# HELP prometheus_tsdb_compaction_chunk_range Final time range of chunks on their first compaction # TYPE prometheus_tsdb_compaction_chunk_range histogram prometheus_tsdb_compaction_chunk_range_bucket{le="100"} 0# prometheus_tsdb_compaction_chunk_range 小于或等于100的次数 prometheus_tsdb_compaction_chunk_range_bucket{le="400"} 0 prometheus_tsdb_compaction_chunk_range_bucket{le="1600"} 0 prometheus_tsdb_compaction_chunk_range_bucket{le="6400"} 0 prometheus_tsdb_compaction_chunk_range_bucket{le="25600"} 80 prometheus_tsdb_compaction_chunk_range_bucket{le="102400"} 974 prometheus_tsdb_compaction_chunk_range_bucket{le="409600"} 1386 prometheus_tsdb_compaction_chunk_range_bucket{le="1.6384e+06"} 112157 prometheus_tsdb_compaction_chunk_range_bucket{le="6.5536e+06"} 821535 prometheus_tsdb_compaction_chunk_range_bucket{le="2.62144e+07"} 821545 prometheus_tsdb_compaction_chunk_range_bucket{le="+Inf"} 821545 prometheus_tsdb_compaction_chunk_range_sum 1.334532601458e+12 prometheus_tsdb_compaction_chunk_range_count 821545

这个直方图的 X 轴为 le 的值,Y 轴为次数;如果需要得到百分位数,可以使用 histogram_quantile() 函数:
# 查询 prometheus_tsdb_compaction_chunk_range 95 百分位histogram_quantile(0.95, prometheus_tsdb_compaction_chunk_range_bucket)

Summary
  • 跟Histogram类似,常用于跟踪事件发生的规模;
  • 它提供一个quantiles的功能,可以按%比划分跟踪的结果。例如:quantile取值0.95,表示取采样值里面的95%数据。
还是来看一个 prometheus metrics 中的一个 Summary 类型的数据, 它与 histogram 的不同点是直接返回了 百分位的值:
# HELP prometheus_tsdb_head_gc_duration_seconds Runtime of garbage collection in the head block. # TYPE prometheus_tsdb_head_gc_duration_seconds summary prometheus_tsdb_head_gc_duration_seconds{quantile="0.5"} 0.03043428 prometheus_tsdb_head_gc_duration_seconds{quantile="0.9"} 0.03043428 prometheus_tsdb_head_gc_duration_seconds{quantile="0.99"} 0.03043428 prometheus_tsdb_head_gc_duration_seconds_sum 0.70902013 prometheus_tsdb_head_gc_duration_seconds_count 11

Prometheus Recoding rules
Prometheus 支持两种不同类型的 rule, 一种是 Recoding rules, 另一种是 Alert rules
Recoding rules 用来优化性能,通常在使用联邦集群时,中心的 Prometheus 接收各个 Prometheus 聚合后的数据,详情见:https://www.robustperception.io/federation-what-is-it-good-for
但某些 PromQL 比较复杂且计算量较大时,直接使用 PromQL 可能会导致 Prometheus 响应超时的情况,这是就使用 Recoding rules 在后台将计算聚合过的数据存入数据库中,查询时直接使用这些聚合后的数据。
groups: - name: example rules: - record: job:http_inprogress_requests:sum expr: sum(http_inprogess_requests) by (job)

计算的频率在 global.evaluation_interval 中定义:
global: [ evaluation_interval: | default = 1m ]

Prometheus alert rules
ALERT IF # PromQL 查询的值 [ FOR ]# 触发告警的持续时间 [ LABELS

reload
允许通过 Web 的方式:--web.enable-lifecycle
POST /-/reload
参考
  • 自定义Metrics:让Prometheus监控你的应用程序
  • Prometheus 的非官方中文文档

    推荐阅读