一,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
Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐