Prometheus

Prometheus

架构

title

  • Prometheus Server:用于抓取和存储时间序列化数据
  • Exporters:主动拉取数据的插件
  • Pushgateway:被动拉取数据的插件
  • Altermanager:告警发送模块
  • Prometheus web UI:界面化,也包含结合Grafana进行数据展示或告警发送
  • 默认端口号为: 9090
Prometheus如何存储数据

TSDB存储原理: https://zhuanlan.zhihu.com/p/498612076

  • 采用time-series(时间序列)方式,存储在本地硬盘

  • time-series数据库以每2小时间隔来分block(块)存储,每个块又分为多个chunk文件,chunk文件用来存放采集的数据的数据,metadata和索引文件;

  • index文件是对metrics和labels进行索引之后存储在chunk中,chunk是作为基本存储单位,index和metadata作为子集;

  • prometheus平时采集到的数据先存放在内存之中,对内存消耗大,以缓存的方式可以加快搜索和访问

  • 在prometheus宕机时,prometheus有一种保护机制WAL,将数据定期存入硬盘中以chunk来表示,在重新启动时,可以恢复进内存当中。

  • 当通过API删除序列时,删除的记录存储在单独的tombstone文件中(而不是立即从块文件中删除数据)

数据采集的方式
  • pull

    • 被监控主机安装各类已有的exporters
    • exporters以守护进程的模式运行,并开始采集数据
    • exporters是http_server,可以对http请求作出响应,并返回K/V数据,也就是metrics
    • prometheus通过用pull的方式(HTTP_GET)去访问每个节点上的exporter并采集回需要的数据
  • push

    • 被监控主机安装官方的pushgateway插件
    • 通过自行编写的各种脚本,将监控数据组织成K/V的形式(metrics形式)发送给pushgateway
    • pushgateway再推送给prometheus
    • pushgateway只是一个中间转发的媒介,可以被安装在任何地方
什么是metrics
  • metrics是对采集过来的数据的一种统称
  • 类型:
    • Gauges: 最简单的度量指标,只有一个简单的返回值,或者叫做瞬时状态
    • Counters: Counters就是计数器
    • Histograms:柱状图,用于观察结果采样
      • histograms 公开桶式观察计数,而histogram 的桶中的分位数计算在服务器端使用 histogram_quantile() 函数。每个配置的存储桶有一个时间序列。
    • Summary:类似Histogram,用于表示一段时间内数据采样结果
      • summaries 在客户端侧计算数据流的分位数并直接公开它们
什么是node-exporter

Prometheus为了支持各种中间件以及第三方的监控提供了exporter,监控适配器,将不同指标类型和格式的数据统一转化为Prometheus能够识别的指标类型。他们将这些异构的数据转化为标准的Prometheus格式,并提供HTTP查询接口。

默认监听9100端口

  • Node exporter主要通过读取Linux的/proc以及/sys目录下的系统文件获取操作系统运行状态
  • redis exporter通过Redis命令行获取指标
  • mysql exporter通过读取数据库监控表获取MySQL的性能数据
PromQL

PromQL是Prometheus内置的数据查询语言,其提供对时间序列数据丰富的查询,聚合以及逻辑运算能力的支持

matric固定格式: <metric name>{<label name>=<label value>, ...}

1
node_memory_MemFree_bytes{instance="node02",job="node02"}

监控名称查询:

1
2
3
4
# 如下查询了cpu的空闲和非空闲时的使用时间
node_cpu_seconds_total{mode='idle'}
node_cpu_seconds_total{mode!='idle'}
node_systemd_unit_state{instance='47.98.138.176:9100', job='node', name='docker.service'}

范围查询:

  • s - 秒
  • m - 分钟
  • h - 小时
  • d - 天
  • w - 周
  • y - 年
1
pushgateway_http_requests_total{instance=~"pushgateway",method='get'}[1m]

时间位移查询

1
pushgateway_http_requests_total{instance=~"pushgateway",method='get'} offset 1d

聚合查询

1
2
3
4
5
# 查询昨天1天内pushgeteway中get的请求总量之和
sum(pushgateway_http_requests_total{instance=~"pushgateway",method='get'} offset 1d)

# 按照mode计算主机CPU的平均使用时间
avg(node_cpu_seconds_total)by(mode)
DownSample原理

前提是:数据的处理符合结合律,多个采样点的值的合并不会影响最终的计算结果。

原理: 降采样说白了就是降低数据的分辨率, 将一定时间间隔内的点,基于一定规则,聚合为一个或者一组值,从而达到降低采样点数,将少数据量,减轻数据查询的压力。比如: 30s采集周期,5min的时间间隔就是将6个点转化为1个点

  • 时间间隔:经验值5min or 1h
    • 5min: 当查询时间跨度在40h-240h之间
    • 1h: 查询时间大于10天
  • 聚合规则
    • max:典型的max_over_time
    • Min: min_over_time
    • Sum: sum_over_time
    • Count: count_over_time
    • avg: 取时间间隔内点的平均值
    • counter: 计算变化率,典型的有rate,increase
step duration区别

title

rate与irate区别

rate(v range-vector) 计算范围向量中时间序列的每秒平均增长率。单调性中断(例如由于目标重新启动而导致的计数器重置)会自动调整。此外,计算还会推断到时间范围的末尾,从而允许遗漏刮擦或刮擦周期与范围时间段的不完美对齐。duration的末尾的点减起始点

1
2
3
value = end-start
time = endTime - startTime
rate = value / time

irate(v range-vector) 计算范围向量中时间序列的每秒瞬时增长率。这是基于最后两个数据点。单调性中断(例如由于目标重新启动而导致的计数器重置)会自动调整。duration中最后两个时间点斜率

1
2
3
value = end1 - end2
time = end1Time - end2Time
rate = value / time

Prometheus
https://zhangfuli.github.io/2023/08/30/prometheus/
作者
张富利
发布于
2023年8月30日
许可协议