【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
相关推荐
AI多Agent协作实战派1 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug
gaolei_eit1 小时前
Java+Ai+vue
java·spring·maven
qq_2518364571 小时前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
LayZhangStrive1 小时前
JUC相关的函数、注解、变量杂记
java·面试·多线程·juc
未秃头的程序猿1 小时前
给公司做了个AI客服Agent,用的Spring AI 1.0,3天上线领导拍板了
java·后端·ai编程
来一碗刘肉面1 小时前
栈的应用(表达式求值)
数据结构·算法
曹牧1 小时前
Eclipse 批量文本替换
java·ide·eclipse
程序员清风2 小时前
OpenAI官方发布最新提示词技巧!
java·后端·面试
梅头脑2 小时前
写了3年CRUD,volatile和synchronized的区别还是答不清——直到我画出了这张三性两锁边界图
java
暮暮祈安2 小时前
Celery 新手入门指南
java·数据库·python·flask·httpx