【Prometheus】实战二:Prometheus数据监控自定义组件Pushgateway

一,PromQL语法

概念

PromQL(Prometheus Query Language)是 Prometheus 自己开发的表达式语言,内置函数很多。使用它可以对时序数据进行筛选和聚合。

数据类型

  • 瞬时向量 (Instant vector): 一组时序,每个时序只有一个采样值。
  • 区间向量 (Range vector): 一组时序,每个时序包含一段时间内的多个采样值。
  • 标量数据 (Scalar): 一个浮点数。
  • 字符串 (String): 一个字符串,暂时未用。

匹配标签值

=:完全相等

!=: 不相等

=~: 正则表达式匹配

!~: 正则表达式不匹配

时长的单位简写:

s:seconds

m:minutes

h:hours

d:days

w:weeks

y:years

聚合操作符

sum:求和

min:最小值

max:最大值

avg:平均值

stddev:标准差

stdvar:方差

count:元素个数

count_values:等于某值的元素个数

bottomk:最小的 k 个元素

topk:最大的 k 个元素

quantile:分位数

函数

abs():绝对值

sqrt():平方根

exp():指数计算

ln():自然对数

ceil():向上取整

floor():向下取整

round():四舍五入取整

delta():计算区间向量里每一个时序第一个和最后一个的差值

sort():排序

书写样例

python 复制代码
# 用大括号包围起来的一组标签键值对来对时序进行过滤
apiserver_request_total {job="kubernetes-apiserver",resource="pods"}

# 选出了container是kube-scheduler或kube-proxy或kube-apiserver的时序数据
container_processes{container=~"kube-scheduler|kube-proxy|kube-apiserver"}

# 选出了所有度量指标为apiserver_request_total且resource是pod的时序在过去1 分钟的采样值
apiserver_request_total{job="kubernetes-apiserver",resource="pods"}[1m]

# 选择度量名称为apiserver_request_total的所有时序在 5 分钟前的采样值。
apiserver_request_total{job="kubernetes-apiserver",resource="pods"} offset 5m

# 选择apiserver_request_total 度量指标在 1 周前的这个时间点过去 5 分钟的采样值。
apiserver_request_total{job="kubernetes-apiserver",resource="pods"} [5m] offset 1w

二,Pushgateway自定义数据采集

Pushgateway是Prometheus的一个组件。

Prometheus server默认是通过exporter主动获取数据(默认采取pull拉取数据)。

Pushgateway是通过被动方式推送数据到Prometheus server。

用户可以自定义的监控脚本,把需要监控的数据发送给Pushgateway, 然后Pushgateway再把数据发送给Prometheus server。

1,安装

导入所需环境镜像:pushgateway.tar.gz

在k8s-node节点操作

python 复制代码
ctr -n=k8s.io images import pushgateway.tar.gz
# 或者命令
docker load -i pushgateway.tar.gz

创建容器:

python 复制代码
docker run -d --name pushgateway -p 9091:9091 prom/pushgateway

在浏览器访问192.168.40.181:9091出现如下ui界面:

2,配置

在master节点,更改配置文件prometheus-alertmanager-cfg.yaml,添加一下内容:

yaml 复制代码
- job_name: 'pushgateway'
      scrape_interval: 5s
      static_configs:
      - targets: ['192.168.40.181:9091']  # 安装Pushgateway的node的ip地址+端口
  honor_labels: true

添加 honor_labels: true 参数:

可以避免promethues的targets列表中的job_name是pushgateway的 job 、instance 和上报到pushgateway数据的job和instance冲突。

配置完成后,使得配置生效后,查看targets列表:

3,测试推送数据

(1)向 {job="test_job"} 添加单条数据
python 复制代码
echo " metric 3.6" | curl --data-binary @- http://192.168.40.181:9091/metrics/job/test_job

 # 注:--data-binary 表示发送二进制数据。采用POST方式发送的!
(2)添加复杂数据
python 复制代码
cat <<EOF | curl --data-binary @- http://192.168.40.181:9091/metrics/job/test_job/instance/test_instance
#TYPE node_memory_usage gauge
node_memory_usage 36
# TYPE memory_total gauge
node_memory_total 36000
EOF
(3)删除数据
python 复制代码
# 删除某个组下某个实例的所有数据
curl -X DELETE http://192.168.40.181:9091/metrics/job/test_job/instance/test_instance


# 删除某个组下的所有数据:
curl -X DELETE http://192.168.40.181:9091/metrics/job/test_job

4,自定义shell脚本推送数据

把192.168.40.181这个机器的内存数据上报到pushgateway

powershell 复制代码
# cat push.sh
node_memory_usages=$(free -m | grep Mem | awk '{print $3/$2*100}')
job_name="memory"
instance_name="192.168.40.181"
cat <<EOF | curl --data-binary @- http://192.168.40.181:9091/metrics/job/$job_name/instance/$instance_name
#TYPE node_memory_usages  gauge
node_memory_usages $node_memory_usages
EOF

设置计划任务,定时上报数据

python 复制代码
chmod +x push.sh
python 复制代码
crontab -e  
*/1 * * * * /usr/bin/bash  /root/push.sh
相关推荐
程序员JerrySUN16 分钟前
驱动开发硬核特训 · Day 21(上篇) 抽象理解 Linux 子系统:内核工程师的视角
java·linux·驱动开发
wuqingshun31415933 分钟前
蓝桥杯 11. 打印大X
数据结构·算法·职场和发展·蓝桥杯·深度优先
只因只因爆40 分钟前
如何在idea中写spark程序
java·spark·intellij-idea
你憨厚的老父亲突然1 小时前
从码云上拉取项目并在idea配置npm时完整步骤
java·npm·intellij-idea
全栈凯哥1 小时前
桥接模式(Bridge Pattern)详解
java·设计模式·桥接模式
PXM的算法星球1 小时前
【软件工程】面向对象编程(OOP)概念详解
java·python·软件工程
两点王爷1 小时前
springboot项目文件上传到服务器本机,返回访问地址
java·服务器·spring boot·文件上传
小吕学编程1 小时前
ES练习册
java·前端·elasticsearch
Blossom.1181 小时前
量子网络:构建未来通信的超高速“高速公路”
网络·opencv·算法·安全·机器学习·密码学·量子计算
qsmyhsgcs1 小时前
Java程序员转人工智能入门学习路线图(2025版)
java·人工智能·学习·机器学习·算法工程师·人工智能入门·ai算法工程师