【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
相关推荐
不是二师兄的八戒5 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生17 分钟前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰34 分钟前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
爱敲代码的憨仔36 分钟前
《线性代数的本质》
线性代数·算法·决策树
yigan_Eins1 小时前
【数论】莫比乌斯函数及其反演
c++·经验分享·算法
阿史大杯茶1 小时前
AtCoder Beginner Contest 381(ABCDEF 题)视频讲解
数据结构·c++·算法
计算机毕设指导61 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study1 小时前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
Chris _data1 小时前
二叉树oj题解析
java·数据结构
牙牙7051 小时前
Centos7安装Jenkins脚本一键部署
java·servlet·jenkins