【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():排序
书写样例
# 用大括号包围起来的一组标签键值对来对时序进行过滤
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节点操作
ctr -n=k8s.io images import pushgateway.tar.gz
# 或者命令
docker load -i pushgateway.tar.gz
创建容器:
docker run -d --name pushgateway -p 9091:9091 prom/pushgateway
在浏览器访问192.168.40.181:9091出现如下ui界面:
2,配置
在master节点,更改配置文件prometheus-alertmanager-cfg.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”} 添加单条数据
echo " metric 3.6" | curl --data-binary @- http://192.168.40.181:9091/metrics/job/test_job
# 注:--data-binary 表示发送二进制数据。采用POST方式发送的!
(2)添加复杂数据
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)删除数据
# 删除某个组下某个实例的所有数据
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
# 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
设置计划任务,定时上报数据
chmod +x push.sh
crontab -e
*/1 * * * * /usr/bin/bash /root/push.sh