date: 2020-10-14title: Pushgateway部署及应用 #标题
tags: 监控 #标签
categories: 监控 # 分类

Pushgateway是prometheus的一个组件,prometheus server默认是通过exporter主动获取数据(默认采取pull拉取数据),pushgateway则是通过被动方式推送数据到prometheus server,用户可以写一些自定义的监控脚本把需要监控的数据发送给pushgateway, 然后pushgateway再把数据发送给Prometheus server。

Prometheus拉取状态只针对 pushgateway, 不能对每个组件都有效。

Pushgateway优缺点

  • 优点

    • Prometheus 默认采用定时pull模式拉取targets数据,但是如果不在一个子网或者防火墙,prometheus就拉取不到targets数据,所以可以采用各个target往pushgateway上push数据,然后prometheus去pushgateway上定时pull数据
    • 在监控业务数据的时候,需要将不同数据汇总,汇总之后的数据可以由pushgateway统一收集,然后由 Prometheus 统一拉取。
  • 缺点

    • Pushgateway出现问题,整个采集到的数据都会出现问题
    • 监控下线,prometheus还会拉取到旧的监控数据,需要手动清理pushgateway不要的数据。

部署Pushgateway

分别写下二进制部署及k8s部署两种方式,两种方式二选一即可。

二进制部署Pushgateway

  1. $ wget https://github.com/prometheus/pushgateway/releases/download/v1.3.0/pushgateway-1.3.0.linux-amd64.tar.gz
  2. $ tar zxf pushgateway-1.3.0.linux-amd64.tar.gz -C /opt/
  3. $ ln -sf /opt/pushgateway-1.3.0.linux-amd64 /opt/pushgateway
  4. $ cd /opt/pushgateway
  5. $ ./pushgateway --help # 可以执行此指令,查看命令支持的选项
  6. # 启动pushgateway
  7. $ nohup ./pushgateway --web.listen-address=":9091" --web.enable-lifecycle &
  8. $ ss -lnput | grep 9091 # 确定端口在监听
  9. tcp LISTEN 0 128 [::]:9091 [::]:* users:(("pushgateway",pid=17900,fd=3))

浏览器访问

访问pushgateway所在机器的9091端口,看到如下空白页面(因为还没数据):

Pushgateway部署及应用 - 图1

k8s部署Pushgateway

  1. # 编写yaml文件如下
  2. $ cat >> deploy_pushgateway.yaml < EOF
  3. ---
  4. apiVersion: apps/v1
  5. kind: Deployment
  6. metadata:
  7. annotations:
  8. k8s.kuboard.cn/service: NodePort
  9. k8s.kuboard.cn/workload: monitor-pushgateway
  10. labels:
  11. k8s.kuboard.cn/layer: monitor
  12. k8s.kuboard.cn/name: monitor-pushgateway
  13. name: monitor-pushgateway
  14. namespace: prom
  15. spec:
  16. replicas: 1
  17. selector:
  18. matchLabels:
  19. k8s.kuboard.cn/layer: monitor
  20. k8s.kuboard.cn/name: monitor-pushgateway
  21. strategy:
  22. rollingUpdate:
  23. maxSurge: 25%
  24. maxUnavailable: 25%
  25. type: RollingUpdate
  26. template:
  27. metadata:
  28. labels:
  29. k8s.kuboard.cn/layer: monitor
  30. k8s.kuboard.cn/name: monitor-pushgateway
  31. spec:
  32. containers:
  33. - name: pushgateway
  34. image: prom/pushgateway:latest
  35. imagePullPolicy: IfNotPresent
  36. args:
  37. - '--web.enable-lifecycle'
  38. ---
  39. apiVersion: v1
  40. kind: Service
  41. metadata:
  42. name: monitor-pushgateway
  43. namespace: prom
  44. spec:
  45. externalTrafficPolicy: Cluster
  46. ports:
  47. - nodePort: 30099
  48. port: 9091
  49. protocol: TCP
  50. targetPort: 9091
  51. selector:
  52. k8s.kuboard.cn/layer: monitor
  53. k8s.kuboard.cn/name: monitor-pushgateway
  54. type: NodePort
  55. EOF
  56. $ kubectl apply -f deploy_pushgateway.yaml # 执行yaml文件
  57. $ kubectl get pods -n prom # 确定容器已运行
  58. NAME READY STATUS RESTARTS AGE
  59. monitor-pushgateway-655db76c4d-ksv8p 1/1 Running 0 2m22s
  60. .......... # 省略部分内容
  61. # 确定宿主机端口在监听
  62. $ ss -lnput | grep 30099
  63. tcp LISTEN 0 128 *:30099 *:* users:(("kube-proxy",pid=8263,fd=18))

添加pushgateway至Prometheus

  1. # Prometheus配置文件中增加如下job(targets指定的是pushgateway的IP+端口):
  2. - job_name: 'pushgateway'
  3. scrape_interval: 5s
  4. static_configs:
  5. - targets: ['192.168.20.2:30099']
  6. honor_labels: true

honor_labels: true一般会在添加pushgateway时填写,其含义是为了防止推送到pushgateway上的job和instance标签产生冲突,官方文档解释如下:

Pushgateway部署及应用 - 图2

增加job后,重启Prometheus生效,Prometheus的targets列表中看到如下,即表示配置完成:

Pushgateway部署及应用 - 图3

推送指定的数据到pushgateway

参考:Github官方文档

推送简单数据到pushgateway

  1. $ echo "some_metric 10.12" | curl --data-binary @- http://192.168.20.2:30099/metrics/job/test_job
  2. # --data-binary:表示发送二进制数据,注意:它是使用POST方式发送的!
  3. # @- http://192.168.20.2:30099/metrics/job/:为固定格式,只需将IP+Port改为你自己pushgateway的即可。
  4. # test_job:为推送到pushgateway的job名称。

访问pushgateway看到如下数据,即表示推送成功:

Pushgateway部署及应用 - 图4

访问Prometheus亦可以查询到刚刚推送的数据:

Pushgateway部署及应用 - 图5

推送复杂数据到pushgateway

  1. $ cat <<EOF | curl --data-binary @- http://192.168.20.2:30099/metrics/job/test_job/instance/192.168.20.3
  2. # TYPE some_metric counter
  3. one_metric{label="va11"} 42
  4. # TYPE another_metric gauge
  5. # HELP another_metric Just an example.
  6. another_metric 2398.283
  7. EOF
  8. # 在上面的url中,instance为固定路径,192.168.20.3为你想定义的实例名称

pushgateway查看数据如下:

Pushgateway部署及应用 - 图6

删除pushgateway的数据

  1. # 删除某个组下某个实例的所有数据
  2. curl -X DELETE http://192.168.20.2:30099/metrics/job/test_job/instance/192.168.20.3
  3. # 删除某个组下的所有数据
  4. $ curl -X DELETE http://192.168.20.2:30099/metrics/job/test_job

亦可以直接在pushgateway界面进行删除,如下:

Pushgateway部署及应用 - 图7

Pushgateway实践

自定义数据采集至Prometheus

此处的示范可套用于实际工作中,我只是简单的提取两个指标,可以在脚本中提取自己感兴趣的指标。

  1. $ cat nginx_chk.sh # 以下脚本以监控nginx服务为例
  2. #!/usr/bin/env bash
  3. job_name="nginx_port_check"
  4. instance_name=(192.168.20.2:80
  5. 192.168.20.3:8085
  6. )
  7. for i in ${instance_name[@]}
  8. do
  9. result=$(curl -o /dev/null -s -w %{http_code}"\n" ${i})
  10. #echo $i $result
  11. cat <<EOF | curl --data-binary @- http://192.168.20.2:30099/metrics/job/$job_name/instance/$i
  12. #TYPE node_memory_usages gauge
  13. nginx_status_code ${result}
  14. EOF
  15. done
  16. $ chmod 755 nginx_chk.sh # 增加执行权限
  17. $ crontab -e # 编写计划任务,每分钟执行一次
  18. */1 * * * * /root/nginx_chk.sh

系统自带计划任务,仅支持每分钟运行,若想精准到秒,可以写个死循环脚本,执行一次循环体后休眠几秒,然后再执行一次….. 把这个死循环脚本放置后台运行即可,无需计划任务。

一分钟后访问pushgateway,即可看到如下数据:

Pushgateway部署及应用 - 图8

访问Prometheus查询相关指标,即可看到如下值:

Pushgateway部署及应用 - 图9

针对采集数据配置报警

  1. # 修改Prometheus的rules文件,添加如下告警字段
  2. groups:
  3. - name: example
  4. rules: # rules下增加如下配置
  5. - alert: web服务异常
  6. expr: nginx_status_code != 200
  7. for: 2s
  8. labels:
  9. severity: warnning
  10. annotations:
  11. description: "{{$labels.instance}}的{{$labels.job}}异常,目前状态码为:{{$value}}(状态码为0表示无法连接web服务)"

模拟web服务出现403状态码,你会收到如下告警信息:

Pushgateway部署及应用 - 图10

待服务正常后,即可收到告警恢复邮件:

Pushgateway部署及应用 - 图11