介绍: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