Prometheus使用

发布于:2025-03-20 ⋅ 阅读:(18) ⋅ 点赞:(0)

介绍:Prometheus 是一个开源的 监控与告警系统,主要用于采集和存储时间序列数据(Time Series Data)

Prometheus的自定义查询语言PromQL

Metric类型

为了能够帮助用户理解和区分这些不同监控指标之间的差异,Prometheus定义了4中不同的指标类型(metric type):Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要)

1、Counter:只增不减的计数器

计数器是一种只增不减(除非重置)的累加值,适合用来记录某些事件发生的总次数。

特点: 值只能递增(或重置为 0)、 常用于统计单调递增的指标。

场景:HTTP 请求总数(如 http_requests_total)、已处理任务的总数、 错误发生的总次数、用户访问量

# 查询总数:
http_requests_total
# 计算速率(每秒请求数)
rate(http_requests_total[5m])

2、Gauge:可增可减的仪表盘

Gauge 是一种值可以上下波动的数据类型,适合用来表示某些瞬时状态值。

特点:值可以增大或减小、适合表示当前状态,例如资源使用情况。
场景:当前内存使用量(如 memory_usage_bytes)、当前 CPU 使用率(如 cpu_usage_percentage)、当前并发连接数、磁盘使用量、内存使用量

3、Histogram和Summary分析数据分布情况

Histogram和Summary主用用于统计和分析样本的分布情况

实践

Prometheus函数

rate函数

rate函数 是专门搭配 counter 函数使用的
功能:按照设置一个时间段,取counter在这个时间段中的 平均每秒的增量。
node_network_receive_bytes_total即网络接受字节数为例,这个就是counter类型。这个counter被rate函数包上以后 就可以获取在1分钟之内,平均每秒的增量了即 rate( node_network_receive_bytes_total[1m])

increase函数

在 Prometheus 中,increase() 函数用于计算给定时间窗口内一个计数器的增量。它计算的是时间序列在指定时间范围内的增量(变化量),即数据点的“增加”部分。与 rate() 不同,increase() 更侧重于计算累计量的增长,而不是每秒的速率。

语法

increase(<metric>[<range>])
<metric>Prometheus 中的一个计数器指标,比如 node_cpu_seconds_total。
<range>:时间范围,用来定义增量的计算范围,常见的时间范围单位有 1m(1 分钟)、5m(5 分钟)、1h(1 小时)等。

举例:
increase(node_cpu_seconds_total{mode="idle"}[1m])为例。
计算过去 1 分钟内 node_cpu_seconds_total 的增量,也就是在这段时间内,CPU 空闲时间总共增加了多少秒。

时间(秒) node_cpu_seconds_total{mode=“idle”}
t1 5000
t2 5050

t1 时,CPU 空闲时间累计为 5000 秒。
t2 时,CPU 空闲时间累计为 5050 秒。
如果你计算 increase(node_cpu_seconds_total{mode="idle"}[1m]),则计算的是过去 1 分钟内 node_cpu_seconds_total 增长的部分
increase(node_cpu_seconds_total{mode="idle"}[1m]) = 5050 - 5000 = 50 秒 这表示在过去 1 分钟内,CPU 空闲时间增加了 50 秒。

docekr安装prometheus

安装步骤

1、 拉取prometheus镜像
docler pull prom/prometheus
2、配置文件

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'node_exporter'
    static_configs:
    - targets: ['192.168.31.142:9100']
  - job_name: 'cloud'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 5s
    static_configs:
    - targets: ['10.2.0.187:8080']

3、启动一个prometheus容器

docker run  -d --name prometheus -p 9090:9090 -v /Users/liuyuanyuan/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

4、mac 精准查找ip命令
ifconfig en0 | grep inet| awk ‘{print $2}’
5、访问地址
http://localhost:9090/
在这里插入图片描述

安装node-exporter

1、docker pull prom/node-exporter
2、运行容器

docker run -d --name node-exporter --restart=always -p 9100:9100 -v "/proc:/host/proc:ro" -v "/sys:/host/sys:ro" -v "/:/rootfs:ro" prom/node-exporter

3、访问地址
http://127.0.0.1:9100/metrics
在这里插入图片描述
说明成功。
4、配置到Prometheus中
记住mac要写的是ip地址(获取mac本机地址)ifconfig en0 | grep inet| awk '{print $2}'而不是localhost不然好像配置不生效

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']
  - job_name: 'node_exporter'
    static_configs:
    - targets: ['192.168.31.142:9100']
  - job_name: 'cloud'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 5s
    static_configs:
    - targets: ['10.2.0.187:8080']

加上之后我们看下内存使用率
node_memory_MemFree_bytes
在这里插入图片描述

node_cpu_seconds_total

解释:cpu使用率
第一个问题:时间增量
cpu底层是时间的累积。所以用Counter 刚好满足这个情况,其中increase()函数 在Prometheus 中 专门针对 Counter 这种持续增长的数值,截取其中一段时间的增量 increase(node_cpu[1m])这个意思就是 30分钟内 每1分钟就会对增量取一个值。这样就能获取cpu在1分钟内时间的增量了
第二个问题:实际工作中cpu都是多核
我们在实际中不关心每个cpu核而是看整个cpu表现,此时Prometheus有另一个函数sum() 对结果集加和 比如 sum( increase(node_cpu[1m]) ) 直接统计所有核数值累加

全部cpu时间:node_cpu_seconds_total
在这里插入图片描述

空闲cpu时间:node_cpu_seconds_total{mode="idle"}
在这里插入图片描述

空闲cpu1分钟的增量: increase(node_cpu_seconds_total{mode="idle"}[1m])
在这里插入图片描述

全部cpu1分钟的增量:sum(increase(node_cpu_seconds_total{mode="idle"}[1m]))
在这里插入图片描述

这里有个问题 他怎么变成1条线了?我们是多台服务器进行数据采集,因为sum函数的原因,sum函数他是把所有结果集全部加和了不光把每台机器的cpu核加一起了 还把所有机器的cpu核也加到一起了。最终变成 服务器集群总cpu平均高值了,这显然不是我们的效果。
怎么解决呢?引入函数 by (instance)
它可以按照结果集进行拆分 instance 就是按照机器拆分。
单台机器cpu1分钟的增量:(sum(increase(node_cpu_seconds_total[1m])) by (instance))
结果:
在这里插入图片描述
很明显你看到了左下角有机器分组了,你可以看上一个sum结果明显没有对结果集分组。
所以空闲的的1分钟时间增量:
(sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance))
那么cpu利用率就知道了:

(1 - ((sum(increase(node_cpu_seconds_total{mode="idle"}[1m])) by (instance)) / 
      (sum(increase(node_cpu_seconds_total[1m])) by (instance)))) * 100

在这里插入图片描述