Prometheus+Pushgateway+VictoriaMetrics+Grafana+Consul开源监控体系搭建

Prometheus+Pushgateway+VictoriaMetrics+Grafana+Consul开源监控体系搭建

  • 监控全局架构图
  • 1. prometheus搭建和配置介绍
    • 1.1 prometheus搭建
    • 1.2 prometheus配置文件详解
      • 1.2.1 prometheus.yml详解
      • 1.2.2 node_job.yml详解
      • 1.2.3 alert_rules.yml详解
      • 1.2.4 remote_write详解
    • 1.3 promql正则表达式
  • 2. Pushgateway搭建
  • 3. prometheus exporter讲解
    • 3.1 node_exporter搭建
    • 3.2 process_exporter搭建
    • 3.3 自定义指标上报Pushgateway
      • 3.3.1 python上报核心业务metrics
      • 3.3.2 shell上报top10进程占用率
  • 4. VictoriaMetrics远程存储搭建
  • 5. Alertmanager告警组件介绍
    • 5.1. Alertmanager组件搭建
    • 5.2. Alertmanager 邮件和微信告警
    • 5.3. Alertmanager webhook 推送dingding
  • 6. Consul注册中心搭建
  • 7. Grafana搭建
  • 8. Grafana Dashboar配置详解
  • 9. FAQ

监控全局架构图

本文基于prometheus开源全家桶 + 互联网企业实战经验,指导小白如何从零搭建一套完整的监控系统,教学内容从基础监控、业务监控、进程监控、自定义指标监控等等多个维度实战讲解;

其中告警中心为自研中间件,主要解决alertmanager没办法降噪、告警升级、按业务分流到人;(可直接通过alertmanager推送告警)
Prometheus+Pushgateway+VictoriaMetrics+Grafana+Consul开源监控体系搭建_第1张图片

1. prometheus搭建和配置介绍

1.1 prometheus搭建

官网下载地址 https://prometheus.io/download/

创建存放目录和运行账号

//创建prometheus本地数据存放目录
mkdir /home/data/prometheus_data
//创建prometheus进程运行账号
groupadd prometheus
useradd -g prometheus prometheus -d /home/prometheus

下载及解压安装包

//进入到软件安装目录
cd /usr/local
//选择最新的稳定版本,下载安装包
wget https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz
//解压安装包
tar -xvf prometheus-2.14.0.linux-amd64.tar.gz
//重命名解压目录
mv  prometheus-2.14.0.linux-amd64  prometheus

配置标准化

//进入到prometheus目录
cd /usr/local/prometheus
//创建数据、配置、日志等目录
mkdir -p {cfg,bin}
//移动二进制文件到bin目录
mv prometheus promtool bin/
//移动主配置文件,到cfg目录
mv prometheus.yml cfg/
//目录和文件授权给prometheus用户
chown -R prometheus.prometheus /usr/local/prometheus
//设置环境变量
cat >> /etc/profile <<'EOF'
PATH=/usr/local/prometheus/bin:$PATH:$HOME/bin
EOF
source /etc/profile

创建systemctl服务文件

//生成配置文件
cat > /usr/lib/systemd/system/prometheus.service <<'EOF'
[Unit]
Description=Prometheus
After=network.target

[Service]
User=prometheus
Restart=always
ExecReload=/bin/kill -HUP $MAINPID
//指定本地时序存储路径storage.tsdb.path 60d为数据存储的天数
//通过api web更新cfg配置文件需要加 --web.enable-lifecycle 参数
ExecStart=/usr/local/prometheus/bin/prometheus --storage.tsdb.retention.time=60d --config.file=/usr/local/prometheus/cfg/prometheus.yml --storage.tsdb.path=/home/data/prometheus_data

[Install]
WantedBy=multi-user.target
EOF

1.5 使用systemctl 启动

//重新加载systemctl配置文件
systemctl daemon-reload
//加入到开启自启动
systemctl enable prometheus
//启动prometheus
systemctl start prometheus
//查看prometheus
systemctl status prometheus

//查看prometheus进程服务的详细日志
journalctl -u prometheus -f

搭建完成后,可以在http://prometheusIP:9090/targets 页面中查看各个监控agent的状态;

1.2 prometheus配置文件详解

1.2.1 prometheus.yml详解

详细介绍prometheus的几种常见配置方法,静态static_configs、file_sd_configs动态文件、consul_sd_configs 注册模式consul;

以及如何配置多个remote_write远程存储VictoriaMetrics、alertmanagers告警、rule_files告警规则等;

#my global config
global:
  //间隔时间,15秒pull一次
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

#Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    //配置告警的alertmanagers地址,用于处理监控规则出发的告警
    - targets: ["127.0.0.1:9093"]

#Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  //存放告警规则组的文件,详细配置可查阅2.3
  - "alert_rules.yml"

#remote write VictoriaMetrics
remote_write:
  //写远程存储地址,支持多个prometheus写入,grafana从远程存储读取数据
  - url: http://127.0.0.1:8428/api/v1/write
    remote_timeout: 30s
    queue_config:
      capacity: 500000
      max_shards: 50
      max_samples_per_send: 20000
      batch_send_deadline: 5s
  //同时写入多个远程存储地址,配置多个url即可
  - url: http://127.0.0.1:8428/api/v1/write
    remote_timeout: 30s
    queue_config:
      capacity: 500000
      max_shards: 50
      max_samples_per_send: 20000
      batch_send_deadline: 5s
      max_retries: 3

#A scrape configuration containing exactly one endpoint to scrape:
#Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=` to any timeseries scraped from this config.
  //prometheus 同类监控组的名称,自定义
  //static_configs,通过静态配置,适用于快速测试
  - job_name: 'node_exporter'
    scrape_interval: 30s
    scrape_timeout: 30s
    static_configs:
      - targets: ['127.0.0.1:9090']
        labels:
          instance: 127.0.0.1
          
  //file_sd_configs,通过文件的形式动态加载配置,适用于web化动态管理节点
  - job_name: 'node_monitor'
    scrape_interval: 30s
    scrape_timeout: 30s
    metrics_path: /node
    file_sd_configs:
    - files:
      - node_job.yml
    //可以通过正则表达式做标签过滤,可以省略
    relabel_configs:
    - source_labels: [__address__]
      regex: '(.*):.*'
      replacement: '$1'
      target_label: host
      
  //通过cunsul做动态发现,适用于java/php/go等业务程序上报的指标采集
  - job_name: 'java_metric'
    scrape_interval: 30s
    scrape_timeout: 30s
    metrics_path: /actuator/prometheus
    consul_sd_configs:
    - server: 'consul.cn:80'
      services: []
      //consul 认证的token,只需要consul node和servier的读权限
      token: 'ea298607-8e39-686e-7d05-d9068fe7f984'
      tags: ['java-cls']

  //通过pushgateway做监控监控,和自定义业务指标监控
  - job_name: 'push_metric'
    scrape_interval: 30s
    scrape_timeout: 30s
    static_configs:
      - targets: ['pushgatewayIP:9091']
        labels:
          //自定义业务标签
          typeName: pushgateway
    relabel_configs:
    - source_labels: [__address__]
      regex: '(.*):.*'
      replacement: '$1'
      target_label: host

1.2.2 node_job.yml详解

可以通过自定义业务程序,结合CMDB做监控节点的自动发现,然后通过调用prometheus的api做热更新;可以通过自定义的labels,达到为不同业务打不同标签,方便Alertmanager做告警降噪、告警到人等用途

//可以通过lables自定义各自标签
- labels:
    department: sso
    domains: sso.cn
    env: prd
    product_line: sre
    type: ecs
  //同一个业务绑定多个节点,用 - 持续追加即可
  targets:
  - 127.0.0.1:9090
  - 127.0.0.1:9091
  - 127.0.0.1:9092
//多个配置文件通过-labels持续累加
- labels:
    department: pay
    domains: pay.cn
    env: stg
    product_line: ers
    type: ecs
  targets:
  - 127.0.0.1:9090

1.2.3 alert_rules.yml详解

alert_rules.yml文件用于存放prometheus告警规则,groups监控规则组,用于同类型的监控规则放到一起,方便查阅,功能上和独立的监控规则无区别

#alert_rules.yml示例
groups:
//监控规则组名,可以按业务逻辑规则,也可以按告警类型规则
- name: 支付专用
  rules:
  - alert: pay 5分钟系统负载 >20
    annotations:
      description: pay 5分钟系统负载_当前值:{{$value}} > 20
      value: '{{$value}}'
    expr: node_load5{domains="pay.cn"} >20 //通过domains等于node_job.yml定义的domains标签,做告警规则精确匹配;node_load5 >20则对所有node_job.yml中的业务节点生效
    for: 1m
    //通过{{$labels.xxx}}的形式取node_job.yml中定义的标签信息,传递给alertmanagers做告警过滤
    labels:
      department: '{{$labels.department}}'
      domains: '{{$labels.domains}}'
      env: '{{$labels.env}}'
      product_line: '{{$labels.product_line}}'
      type: '{{$labels.type}}'
//多个规则组,用 - name 追加,格式内容一致
- name: sso专用
  rules:
  - alert: sso ECS_FS使用率 > 90%
    annotations:
      description: sso ECS_FS {{$labels.mountpoint}}使用率{{$value}}  > 90%
      value: '{{$value}}'
    expr: (1- node_filesystem_avail_bytes{fstype=~"ext4|xfs",software=~"sso.*"}
      / node_filesystem_size_bytes) * 100 * on(instance, domains) group_left(nodename)
      node_uname_info >90
    for: 1m
    labels:
      department: '{{$labels.department}}'
      domains: '{{$labels.domains}}'
      env: '{{$labels.env}}'
      product_line: '{{$labels.product_line}}'
      type: '{{$labels.type}}'

PS:监控规则乘 * 100 * on(instance, domains) group_left(nodename) 语句,用于获取主机名,promql语句支持正则表达式

配置完成后,可以在http://prometheusIP:9090/alerts 页面中查看监控规则的状态;

1.2.4 remote_write详解

prometheus remote_write参数调优 官方参考:https://prometheus.io/docs/practices/remote_write/

capacity 建议将容量设置为3-10倍max_samples_per_send
max_shards 不建议增加超过默认值
min_shards 不建议增加超过默认值
max_samples_per_sendv 每个发送的最大样本数可以根据使用的后端进行调整
batch_send_deadline 批量发送期限设置单个分片发送之间的最长时间
min_backoff 控制重试失败请求之前等待的最小时间
max_backoff 控制重试失败请求之前等待的最长时间

remote_write:
- url: http://victoriametricsIP:8428/api/v1/write
  remote_timeout: 30s
  queue_config:
    capacity: 500000
    max_shards: 50
    min_shards: 1
    max_samples_per_send: 20000
    batch_send_deadline: 5s
    min_backoff: 30ms //默认时间,可以不需要配置
    max_backoff: 100ms //默认时间,可以不需要配置

1.3 promql正则表达式

#正则表达式说明,即时矢量选择器
=://匹配与标签相等的内容
!=:不匹配与标签相等的内容
=~: 根据正则表达式匹配与标签符合的内容
!~:根据正则表达式不匹配与标签符合的内容

//示例:
node_load5{env==~"prd|gra",domains!="sso"} 
//这将匹配domains不等于sso,env匹配到prd,gra请求内容。
//向量选择器必须指定一个名称或至少一个与空字符串不匹配的标签匹配器。以下表达式是非法的
{job=~".*"} # Bad!
//相反,这些表达式是有效的,因为它们都有一个与空标签值不匹配的选择器。
{job=~".+"} # Good!
{job=~".*",method="get"} # Good!

2. Pushgateway搭建

官方参考:https://github.com/prometheus/pushgateway/
pushgateway提供api给其他业务组件使用push模式进行指标的上报,提供api给prometheus pull采集业务上报的指标,在不使用注册中心的前提下,可以很方便的实现自定义的业务指标上报;

//下载并解压到指定目录
cd /usr/local
wget https://github.com/prometheus/pushgateway/releases/download/v0.8.0/pushgateway-0.8.0.linux-amd64.tar.gz
tar zxvf pushgateway-0.8.0.linux-amd64.tar.gz
mv pushgateway-0.8.0.linux-amd64.tar.gz pushgateway

创建systemctl 服务,运行pushgateway;

cat  >> /usr/lib/systemd/system/pushgateway.service <<'EOF'
[Unit]
Description=Pushgateway
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/pushgateway/pushgateway 
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

运行systemctl启动process-exporter

systemctl daemon-reload
systemctl enable pushgateway.service
systemctl start pushgateway.service
systemctl status pushgateway.service

#查看系统日志,比较详细
journalctl -u pushgateway -f

通过curl查看pshgateway自身的指标,验证是否安装成功

curl http://pushgatewayIP:9091/metrics 

搭建完成后,需要在prometheus.yml中配置job_name: ‘push_metric’,详细见【2.1 prometheus.yml详解】

配置完成后,可以在http://prometheusIP:9090/targets 页面中查看组件的状态;

3. prometheus exporter讲解

以常用的node_exporter、process_exporter为例,讲解PULL采集;以python_client为例,讲解push pushgateway采集方式;

3.1 node_exporter搭建

官网参考 https://github.com/prometheus/node_exporter,暴露本地端口,提供pull
选择最新版本,下载并解压node_exporter

cd /usr/local
wgat https://github.com/prometheus/node_exporter/releases/download/v1.0.0/node_exporter-1.0.0.linux-amd64.tar.gz
tar zxvf node_exporter-1.0.0.linux-amd64.tar.gz
mv node_exporter-1.0.0.linux-amd64 node_exporter

创建systemctl 服务,运行node_exporter;

cat > /usr/lib/systemd/system/lala_exporter.service <<'EOF'
[Unit]
Description=node_exporter
After=network.target

[Service]
ExecStart=/usr/local/node_exporter/node_exporter
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

运行systemctl启动node_exporter

//加载配置
systemctl daemon-reload
//加入的开机自启
systemctl enable node_exporter
//启动
systemctl start node_exporter
//查询运行状态
systemctl status node_exporter

#查看系统日志,比较详细
journalctl -u node_exporter -f

通过curl查看node_exporter的指标

curl  http://127.0.0.1:9100/metrics

因为是pull模式,搭建完成后,统一把节点添加至node_job.yml中即可,详细见【2.2 node_job.yml详解】

配置完成后,可以在http://prometheusIP:9090/targets 页面中查看组件的状态;

3.2 process_exporter搭建

官方参考 https://github.com/ncabatoff/process-exporter,暴露本地端口,提供pull
选择最新版本,下载并解压node_exporter

cd /usr/local
wgat https://github.com/ncabatoff/process-exporter/releases/download/v0.6.0/process-exporter-0.6.0.linux-amd64.tar.gz
tar zxvf process-exporter-0.6.0.linux-amd64.tar.gz
mv process-exporter-0.6.0.linux-amd64.tar.gz process-exporter

创建systemctl 服务,运行node_exporter;

cat > /usr/lib/systemd/system/process-exporter.service <<'EOF'
[Unit]
Description=Process-exporter
After=network.target

[Service]
Restart=always
ExecReload=/bin/kill -HUP $MAINPID
//web.listen-address 为要指定的端口
ExecStart=/usr/local/process-exporter/process-exporter -config.path /usr/local/process-exporter/process.yaml -web.listen-address 0.0.0.0:9256

[Install]
WantedBy=multi-user.target
EOF

配置process.yaml规则,默认取全部,详细的过滤看官方文档

cat > /usr/local/process-exporter/process.yaml <<'EOF'
process_names:
  - name: "{{.Comm}}"
    cmdline:
    - '.+'
EOF

运行systemctl启动process-exporter

systemctl daemon-reload
systemctl enable process-exporter
systemctl start process-exporter
systemctl status process-exporter

#查看系统日志,比较详细
journalctl -u process-exporter -f

通过curl查看node_exporter的指标

curl  http://127.0.0.1:9256/metrics

因为是pull模式,搭建完成后,统一把节点添加至node_job.yml中即可,详细见【2.2 node_job.yml详解】

配置完成后,可以在http://prometheusIP:9090/targets 页面中查看组件的状态;

3.3 自定义指标上报Pushgateway

支持任意开发语言,如java/python/go/shell等,本文采用python、shell分别做业务和系统监控上报,采用push模式上报至pushgateway;

3.3.1 python上报核心业务metrics

官网参考 https://github.com/prometheus/client_python#exporting-to-a-pushgateway
自定义指标的时候需要了解一下,Prometheus提供4种类型Metrics:Counter, Gauge, Summary和Histogram,篇幅有限不做单独说明
下面通过使用python第三方包prometheus_client实现自定义指标,上报至pushgateway

//vi test.py,需用通过php3 install prometheus_client包
from prometheus_client import CollectorRegistry, Gauge, push_to_gateway

registry = CollectorRegistry()
//(指标名称,说明,标签)
g = Gauge('job_last_success_unixtime', 'Last time a batch job successfully finished', registry=registry)
g.set_to_current_time()
//job为prometheus.yml文件中的- job_name: 'push_metric'
push_to_gateway('http://pushgatewayIP:9091', job='push_metric', registry=registry)
//python3 test.py

需要自定义标签的参考下面代码生成标签

from prometheus_client import Counter
c = Counter('my_requests_total', 'HTTP Failures', ['method', 'endpoint'])
c.labels(method='get', endpoint='/').inc()
c.labels(method='post', endpoint='/submit').inc()

通过curl查看上报的指标

curl http://pushgatewayIP:9091/metrics |grep 'job_last_success_unixtime'

pushtageway上报成功后,需要在prometheus.yml文件中配置添加push_metrics job name配置即可,详细见【2.1 prometheus.yml详解】

配置完成后,可以在http://prometheusIP:9090/targets 页面中查看组件的状态;

3.3.2 shell上报top10进程占用率

官方参考: https://devconnected.com/monitoring-linux-processes-using-prometheus-and-grafana/

pushgateway的推送url示例: /metrics/job/{//} =
/metrics/job/push_metric/instance/$host_ip
是prometheus.yml文件中job_name,后面跟任意数量的标签对,instance标签可以有也可以没有。

下面通过shell演示上报系统进程占用cpu/memroy使用率的top10,使用相同方法完成其他进程占用率抓取即可,不挨个说明;

#!/bin/bash
host_ip=$(/sbin/ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d '/')
while true
do
        //ps auxw get process cpu metrics $3
        process_cpu=$(ps aux --sort=-%cpu|head -n 10)
        while read -r z
        do
        		//生成top10进程占用cpu情况,指标名称:cpu_usage
                awk '{print "cpu_usage{process=\""$11"\", pid=\""$2"\"}", $3z}'|curl --data-binary @- http://pushgatewayIP:9091/metrics/job/push_metric/instance/$host_ip
        done <<< "$process_cpu"

        //ps auxw get process memroy metrics $4
        process_mem=$(ps aux --sort=-rss |head -n 10)
        z=$(ps aux)
        while read -r z
        do
        		//生成top10进程占用内存情况,指标名称:memory_usage
                awk '{print "memory_usage{process=\""$11"\", pid=\""$2"\"}", $4z}' | curl --data-binary @- http://pushgatewayIP:9091/metrics/job/push_metric/instance/$host_ip
        done <<< "$process_mem"

        #push time
        sleep 10s
done

通过curl查看上报的指标

curl http://pushgatewayIP:9091/metrics |grep 'memory_usage'

pushtageway上报成功后,需要在prometheus.yml文件中配置添加push_metrics job name配置即可,详细见【2.1 prometheus.yml详解】

配置完成后,可以在http://prometheusIP:9090/targets 页面中查看组件的状态;

4. VictoriaMetrics远程存储搭建

官方参考 https://victoriametrics.github.io/
prometheus支持的TSDB存储类型说明https://prometheus.io/docs/operating/integrations/#remote-endpoints-and-storage

VictoriaMetrics是prometheus支持的TSDB时序数据存储,开箱即用,能够很方便的做到数据的读写分离,VictoriaMetrics完美兼容promql语句,grafana直接读取远程存储,最大程度的减少prometheus的压力;

//下载并解压到指定目录
cd /usr/local
wget https://github.com/VictoriaMetrics/VictoriaMetrics/releases/download/v1.36.3/victoria-metrics-v1.36.3.tar.gz
tar zxvf victoria-metrics-v1.36.3.tar.gz
mv victoria-metrics-v1.36.3 victoria-metrics

创建systemctl 服务,运行VictoriaMetrics;

vi /usr/lib/systemd/system/victoriaMetrics.service

[Unit]
Description=VictoriaMetrics
After=network.target

[Service]
Type=simple
StartLimitBurst=5
StartLimitInterval=0
Restart=on-failure
RestartSec=3s
PIDFile=/home/data/victoria-metrics-data/victoriaMetrics.pid
//retentionPeriod指定要存储的时间,月为单位;
ExecStart=/usr/local/victoria-metrics-prod -retentionPeriod 24 -storageDataPath /home/data/victoria-metrics-data
ExecStop=/bin/kill -s SIGTERM $MAINPID

[Install]
WantedBy=multi-user.target

运行systemctl启动victoriaMetrics

//加载配置
systemctl daemon-reload
//加入的开机自启
systemctl enable victoriaMetrics
systemctl start victoriaMetrics
systemctl status victoriaMetrics
//victoriaMetrics默认启动8428端口
netstat -nlp|grep 8428

#查看系统日志,比较详细
journalctl -u victoriaMetrics -f

搭建完成后,需要在prometheus.yml文件中配置remote_write,详细见【2.1 prometheus.yml详解】

配置完成后,可以在http://prometheusIP:9090/config 页面中查看prometheus配置情况;

5. Alertmanager告警组件介绍

官方参考:https://github.com/prometheus/alertmanager/
alertmanager是一个开源的监控告警组件,提供http api很方便的接收来着不同应用推送的监控告警,自带告警状态恢复通知,非常便捷;
缺点不支持查询业务cmdb系统,告警按业务分流到人,和告警自定义降噪等;
alertmanager提供了一个很好的功能来弥补这一块的坑缺,就是支持webhook推送,基于推送的告警做二次过滤,笔者就是使用go自演了告警中心,做更精细化的管理;(本文介绍邮件/微信/钉钉告警)

5.1. Alertmanager组件搭建

//下载并解压到指定目录
cd /usr/local
wget https://github.com/prometheus/alertmanager/releases/download/v0.19.0/alertmanager-0.19.0.linux-amd64.tar.gz
tar zxvf alertmanager-0.19.0.linux-amd64.tar.gz
mv alertmanager-0.19.0.linux-amd64 alertmanager

创建systemctl 服务,运行alertmanager;(alertmanager.yml配置请查看7.2章节)

cat  >> /usr/lib/systemd/system/alertmanager.service <<'EOF'
[Unit]
Description=Alertmanager
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/home/data/alertmanager_data
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

运行systemctl启动alertmanager

//加载配置
systemctl daemon-reload
//加入的开机自启
systemctl enable alertmanager
systemctl start alertmanager
systemctl status alertmanager

#查看系统日志,比较详细
journalctl -u alertmanager -f

搭建完成后,需要在prometheus.yml文件中配置alertmanager,详细见【2.1 prometheus.yml详解】

配置完成后,可以在http://alertmanagerIP:9093/#/alerts 页面中查看prometheus推送的告警信息;

5.2. Alertmanager 邮件和微信告警

Alertmanager配置主要分为如下几部分:
global:全局配置,用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容;
templates:模板,用于定义告警通知时的模板,如HTML模板,邮件模板等;
route:告警路由,根据标签匹配,确定当前告警应该如何处理;
receivers:接收人,接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack或者Webhook等,接收人一般配合告警路由使用;
inhibit_rules:抑制规则,合理设置抑制规则可以减少垃圾告警的产生
alertmanager.yml文件配置;

如下配置介绍alertmanager推送邮件告警、微信告警:

//全局变量
global:
  resolve_timeout: 5m
  smtp_from: altermanager@mail.cn
  smtp_auth_username: altermanager@mail.cn
  smtp_auth_password: xxxxxxxx
  smtp_require_tls: false
  smtp_smarthost: smtp.exmail.qq.com:25
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
  
//告警通知内容模版,没有配置就默认使用alertmanager原生模块
templates:
  - '/usr/local/alertmanager/template/wechat.tmpl'
  - 
//告警过滤规则
route:
  group_by: ['alertname']
  //需要等待至少group_wait时间来初始化通知
  group_wait: 10s
  //当第一个报警发送后,等待'group_interval'时间来发送新的一组报警信息
  group_interval: 10s
  //如果一个报警信息已经发送成功了,等待'repeat_interval'时间来重新发送他们
  repeat_interval: 1h
  //默认的receiver:如果一个报警没有被一个route匹配,则发送给默认的接收器
  receiver: 'admin.mail'
  routes:
  //配置规则发送给那个告警通知接收组名
  - receiver: dev.mail
    //alertmanager告警规则的标签
    match:
      //匹配app_name等于dev_pro的告警
      app_name: dev_pro
  - receiver: test.mail
    match:
      app_name: test_pro

//告警发送规则
receivers:
  //告警通知接收组名
  - name: 'dev.mail'
    email_configs:
    - to: dev@mail.cn,person1@mail.cn,person2@mail.cn
      //告警恢复后否发送通知
      send_resolved: true
  - name: 'test.mail'
    email_configs:
    - to: test@mail.cn,person3@mail.cn,person4@mail.cn
      send_resolved: true
  //配置企业微信,其他方式都类似,篇幅有限不挨个介绍
  - name: 'admin.mail'
    //演示同时配置多个告警接收渠道
    email_configs:
    - to: admin@mail.cn
    //企业微信
    wechat_configs:
    //企业id,在企业的配置页面可以看到
    - corp_id: 'xxxxid'
      //template文件中配置的 define名称
      message: '{{ template "wechat.default.message" . }}'
      to_party: '@all'
      //应用的AgentId,在应用的配置页面可以看到
      agent_id: '9527'
      //应用的secret,在应用的配置页面可以看到
      api_secret: 'BKjfJoTSjsm7MiO7KjHimHxIn5iiILJ_I7IVDtvtoC9'
      send_resolved: true

template 模版文件介绍,以wechat.tmpl文件配置如下:

{{ define "wechat.default.message" }}
{{ if gt (len .Alerts.Firing) 0 -}}
Alerts Firing:
{{ range .Alerts }}
告警环境:PRD
告警级别:{{ .Labels.severity }}
告警类型:{{ .Labels.alertname }}
告警实例:{{ .Labels.instance }}
告警详情: {{ .Annotations.summary }}
//触发时间: {{ .StartsAt.Format "2000-01-01 11:01:01" }}
=========
{{- end }}
{{- end }}
{{ if gt (len .Alerts.Resolved) 0 -}}
Alerts Resolved:
{{ range .Alerts }}
恢复环境:PRD
恢复级别:{{ .Labels.severity }}
恢复类型:{{ .Labels.alertname }}
恢复实例:{{ .Labels.instance }}
恢复详情: {{ .Annotations.summary }}
触发时间: {{ .StartsAt.Format "22000-01-01 11:01:01" }}
//恢复时间: {{ .EndsAt.Format "2000-01-01 11:01:01" }}
=========
{{- end }}
{{- end }}
{{- end }}

5.3. Alertmanager webhook 推送dingding

官方参考:https://github.com/timonwong/prometheus-webhook-dingtalk
alertmanager只做告警推送,会抑制所有告警,不会触发告警通知,达到告警又自定义的告警中心过滤处理;
alertmanager搭建方式7.1一致,唯一不同的就是alertmanager.yml 配置文件,替换alertmanager.yml webhook推送配置,重启alertmanager服务即可:
首先搭建并运行dingtalk,默认port 8060可以通过–web.listen-address=xxx指定

cd /usr/local
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
tar zxvf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
mv prometheus-webhook-dingtalk-1.4.0 prometheus-webhook-dingtalk

创建systemctl服务prometheus-webhook-dingtalk

cat  >> /usr/lib/systemd/system/prometheus-webhook-dingtalk.service <<'EOF'
[Unit]
Description=prometheus-webhook-dingtalk
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/dingtalk/prometheus-webhook-dingtalk --ding.profile="webhook=https://oapi.dingtalk.com/robot/send?access_token=your dingding token"
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

运行systemctl启动prometheus-webhook-dingtalk

//加载配置
systemctl daemon-reload
//加入的开机自启
systemctl enable prometheus-webhook-dingtalk
systemctl start prometheus-webhook-dingtalk
systemctl status prometheus-webhook-dingtalk

#查看系统日志,比较详细
journalctl -u prometheus-webhook-dingtalk -f

alertmanager webhook推送告警至钉钉机器人yml配置

global:
  //在没有报警的情况下声明为已解决的时间
  resolve_timeout: 5m
  
route:
  group_by: ['alertname']
  //需要等待至少group_wait时间来初始化通知
  group_wait: 1m
  //当第一个报警发送后,等待'group_interval'时间来发送新的一组报警信息
  group_interval: 10m
  //如果一个报警信息已经发送成功了,等待'repeat_interval'时间来重新发送他们
  repeat_interval: 4h
  //默认的receiver:如果一个报警没有被一个route匹配,则发送给默认的接收器
  receiver: 'web.hook'
receivers:
//接收receiver配置信息
- name: 'web.hook'
  webhook_configs:
  //prometheus-webhook-dingtalk启动url,其中webhook为--ding.profile指定的名称
  - url: 'http://localhost:8060/dingtalk/webhook/send'
    send_resolved: true
//inhibit_rules是告警的抑制规则
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    //抑制由'alertname', 'type'的告警,不出发告警通知
    equal: ['alertname', 'type']

6. Consul注册中心搭建

7. Grafana搭建

8. Grafana Dashboar配置详解

9. FAQ

有疑问的可以评论,尽可能及时回复

你可能感兴趣的:(#,prometheus,监控体系)