prometheus 安装及应用

Prometheus普罗米修斯(希腊神话人物) 是一个开源的系统监控和告警系统,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,同时也支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上万台规模的集群。

为了方便你了解prometheus基本工作原理,还是贴一张从官方获取的图哈:
0.png

放一张简单点好理解的草图(自己画的,比较好理解,快夸我哈):
01.png

想要详细了解更多,可以看官方文档、找度娘哈,下面是以应用实践为主,不做过多介绍,接下来你可以学到哪些内容:

  • prometheus 安装、简单配置规则、应用、集成可视化管理页面
  • prometheus 集成 Grafana 可视化监控页面
  • prometheus 监控服务器资源
  • prometheus 监控docker容器资源
  • prometheus 监控springboot及jvm
  • prometheus 集成 Alertmanager 监控告警通知
  • prometheus Alertmanager 实现邮箱告警通知
  • prometheus Alertmanager 实现企业微信机器人告警通知

Docker prometheus 在线安装

prometheus 开源的系统监控和告警系统

1. Docker 安装 Prometheus

docker pull prom/prometheus:latest

mkdir -p ~/dockerdata/prometheus

#创建 prometheus.yml 内容从下面获取
vim ~/dockerdata/prometheus/prometheus.yml

prometheus.yml 配置(默认配置)

global:
  scrape_interval: 15s
  scrape_timeout: 10s
  evaluation_interval: 1m

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanagerIp:9093

rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

scrape_configs:
- job_name: prometheus
  honor_timestamps: true
  scrape_interval: 5s
  scrape_timeout: 5s
  metrics_path: /metrics
  scheme: http
  follow_redirects: true
  static_configs:
  - targets:
    - localhost:9090

启动

#启动
docker run -d --name prometheus -p 9090:9090 \
-v ~/dockerdata/prometheus:/etc/prometheus \
-v ~/dockerdata/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus:latest

docker logs prometheus

#访问界面 原生 web-ui
http://127.0.0.1:9090
#状态信息查看
http://127.0.0.1:9090/targets启动

2. 配置详解 prometheus.yml

基本配置,监控prometheus服务器,可能没什么作用,但确实一个很好的例子。

#全局配置(如果有内部单独设定,会覆盖这个参数)
global:
  scrape_interval: 15s # 默认情况下,每15秒刮一次目标

  # 默认情况下,每15秒抓取一次目标。与通信时,将这些标签附加到任何时间序列或警报
  # 外部系统(联合、远程存储、警报管理器)
#  external_labels:
#    monitor: 'codelab-monitor'

# 告警插件定义。这里会设定alertmanager这个告警插件。
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanagerIp:9093

#告警规则。 按照设定参数进行扫描加载,用于自定义告警规则,其告警媒介和route路由由alertmanager插件实现。
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

#采集配置。配置数据源,包含分组job_name以及具体target。又分为静态配置和服务发现
# 仅包含一个要刮取的端点的刮取配置:
# 这是普罗米修斯配置
scrape_configs:
  # 这个作业名称将作为标签“job=<job_name>`添加到此配置中抓取的任何时间序列中
  - job_name: 'prometheus'

    # 覆盖全局默认值,并每5秒从该作业中抓取一次目标
    scrape_interval: 5s

    # metrics_path defaults to ' /metrics'
    # scheme defaults to 'http'.

    static_configs:
    #监听的地址
      - targets: ['localhost:9090']


#用于远程存储写配置
#remote_write:

#用于远程读配置
#remote_read:

监控nginx配置示例

scrape_configs:
  - job_name: "Nginx"
    metrics_path: '/status/format/prometheus'
    static_configs:
    - targets: ['172.23.0.242:8088']

Promethrus 集成 Grafana 可视化预览

grafana 监控的web-ui好用的可视化组件, 支持prometheus

#下拉镜像
docker pull grafana/grafana

#启动
docker run -d -p 3000:3000 --name=grafana grafana/grafana

#访问 默认账户:admin/admin
http://127.0.0.1:3000

在 grafana 中配置Promethrus 数据源:
1.png

2.png

3.png

Promethrus Grafana 监控 服务器

1. Docker 安装 node-exporter

监控服务器:主要是用来收集服务器硬件资源使用情况的

注:下载到需要被监控的机器上

#下载镜像
docker pull prom/node-exporter

#启动
docker run -d --name node-exporter -p 19100:9100 \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
prom/node-exporter

#访问 采集指标接口,查看服务器主机的指标
http://ip:19100/metrics

2. Prometheus 配置

prometheus的配置文件prometheus.yml

#编辑prometheus配置
vim ~/dockerdata/prometheus/prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s
scrape_configs:
  - job_name: 'node-exporter' # 自定义
    static_configs:
    - targets: ['ip:19100']

重启prometheus容器:

#重启
docker restart prometheus

访问 指标检测站点,状态信息查看, 显示up即正常:
http://127.0.0.1:9090/targets

node1.png

3. Grafana 配置

3.1 导入模板并创建仪表盘

模板:监控主机服务器(ECS)指标

模板id:8919

模板地址:https://grafana.com/grafana/dashboards/8919

模板描述:使用8919模板监控主机服务器(ECS)指标,包含整体资源展示与资源明细图表:CPU 内存 磁盘 IO 网络等监控指标。

boot1.jpg

node2.png

node3.png

3.2 成功显示

监控效果图:
node4.png

node5.png

node6.png

Promethrus Grafana 监控 Docker

1. Docker 安装 cadvisor

参考地址:https://zhuanlan.zhihu.com/p/474476816

谷歌开发的容器资源采集信息, 用于获取docker容器的指标

注:下载到需要被监控的机器上

docker pull google/cadvisor

docker run -d --name cadvisor -p 18081:8080 \
-v /:/rootfs:ro \
-v /var/run:/var/run:ro \
-v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro \
-v /dev/disk/:/dev/disk:ro \
google/cadvisor:latest

#访问 采集指标接口,查看docker容器的指标
http://ip:18081/metrics

2. Prometheus 配置

prometheus的配置文件prometheus.yml

告诉prometheus要去哪个端口中拉取对应的监控数据

#编辑prometheus配置
vim ~/dockerdata/prometheus/prometheus.yml

global:
  scrape_interval:     15s
  evaluation_interval: 15s
scrape_configs:
  - job_name: 'cadvisor'
    static_configs:
    - targets: ['ip:18081']  # docker服务器ip + cadvisor端口

重启prometheus容器:

#重启
docker restart prometheus

访问 指标检测站点,状态信息查看, 显示up即正常:
http://127.0.0.1:9090/targets

docker0.png

3. Grafana 配置

3.1 导入模板并创建仪表盘

模板:监控docker容器指标

模板id:893

模板地址:https://grafana.com/grafana/dashboards/893

模板描述:使用893模板监控docker容器指标

boot1.jpg

docker1.png

docker2.png

3.2 成功显示

监控效果图:

docker3.png

docker4.png

Promethrus Grafana 监控 springboot web

1. SpringBoot 配置

监控 springbootJVM

参考地址:https://zhuanlan.zhihu.com/p/474476816

springboot 添加依赖:

        <!--监控-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--适配prometheus-->
        <dependency>
            <groupId>io.micrometer</groupId>
            <artifactId>micrometer-registry-prometheus</artifactId>
            <scope>runtime</scope>
        </dependency>

application.yaml配置:

spring:
  application:
    name: springboot-prometheus-example
    
# 开启监控并可以让prometheus拉取配置
management:
  endpoint:
    health:
      show-details: always
    metrics:
      enabled: true
    prometheus:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "*"
  metrics:
    tags:
      application: ${spring.application.name}
    export:
      prometheus:
        enabled: true

#1、访问 http://127.0.0.1:8080/actuator 路径就能看到一大堆输出的指标了,包括prometheus的采集应用

#访问 采集指标接口,查看springboot应用的指标
http://127.0.0.1:8080/actuator/prometheus

#2、通过prometheus来采集应用的指标,配置 prometheus.yml 文件

2. Prometheus 配置

prometheus.yml 文件配置:

#编辑prometheus配置
vim ~/dockerdata/prometheus/prometheus.yml

scrape_configs:
  - job_name: 'springboot-prometheus-example' # 任务名称随便写
    metrics_path: '/actuator/prometheus' 	# 采集的路径
    static_configs:
    - targets: ['192.168.14.238:8080'] 	# ip和端口写自己springbot应用的

重启prometheus容器:

docker restart prometheus

3. Grafana 配置

3.1 导入模板并创建仪表盘

模板:监控Springboot应用

模板id:4701、12900

模板地址:https://grafana.com/grafana/dashboards/4701

模板地址:https://grafana.com/grafana/dashboards/12900

模板描述:使用4701 JVM监控、12900 SpringBoot监控 模块

配置grafana监控模块:

选择两个4701 JVM监控、12900 SpringBoot监控 模块

boot1.jpg

boot2.png

boot3.png

3.2 成功显示

监控效果图:
boot4.png

Promethrus 集成 Alertmanager 告警通知

1、prometheus,配置告警规则
2、node_exporter,收集监控信息
3、alertmanager,管理并发送告警(邮件|钉钉|微信等)

1. Dokcer 安装 alertmanager

下拉镜像

#下拉镜像
docker pull prom/alertmanager

mkdir -p ~/dockerdata/promethrus/alertmanager

#创建 alertmanager.yml 内容从下面获取
vim ~/dockerdata/promethrus/alertmanager/alertmanager.yml

alertmanager.yml 默认配置:

global:
  resolve_timeout: 5m
route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'web.hook'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://127.0.0.1:5001/'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

启动容器:

#启动
docker run -d --name alertmanager -p 19093:9093 \
-v ~/dockerdata/promethrus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml \
prom/alertmanager

#访问 alertmanager web-ui页面
http://ip:19093

2. 配置详解 alertmanager.yml

alertmanager.yml详细配置说明:

详细配置参考

# global:全局配置,主要配置告警方式,如邮件、webhook等。
global:
  resolve_timeout: 5m	# 超时,默认5min
  smtp_smarthost: 'smtp.qq.com:465'	# 这里为 QQ 邮箱 SMTP 服务地址,官方地址为 smtp.qq.com 端口为 465 或 587,同时要设置开启 POP3/SMTP 服务。
  smtp_from: '916719080@qq.com'
  smtp_auth_username: '916719080@qq.com'
  smtp_auth_password: 'lojdeopbholobgah'	# 这里为第三方登录 QQ 邮箱的授权码,非 QQ 账户登录密码,否则会报错,获取方式在 QQ 邮箱服务端设置开启 POP3/SMTP 服务时会提示。
  smtp_require_tls: false	# 是否使用 tls,根据环境不同,来选择开启和关闭。如果提示报错 email.loginAuth failed: 530 Must issue a STARTTLS command first,那么就需要设置为 true。着重说明一下,如果开启了 tls,提示报错 starttls failed: x509: certificate signed by unknown authority,需要在 email_configs 下配置 insecure_skip_verify: true 来跳过 tls 验证。

templates:	#  # 模板
  - '/usr/local/alertmanager/alert.tmp'

# route:用来设置告警的分发策略。Prometheus的告警先是到达alertmanager的根路由(route),alertmanager的根路由不能包含任何匹配项,因为根路由是所有告警的入口点。
# 另外,根路由需要配置一个接收器(receiver),用来处理那些没有匹配到任何子路由的告警(如果没有配置子路由,则全部由根路由发送告警),即缺省
# 接收器。告警进入到根route后开始遍历子route节点,如果匹配到,则将告警发送到该子route定义的receiver中,然后就停止匹配了。因为在route中
# continue默认为false,如果continue为true,则告警会继续进行后续子route匹配。如果当前告警仍匹配不到任何的子route,则该告警将从其上一级(
# 匹配)route或者根route发出(按最后匹配到的规则发出邮件)。查看你的告警路由树,https://www.prometheus.io/webtools/alerting/routing-tree-editor/,
# 将alertmanager.yml配置文件复制到对话框,然后点击"Draw Routing Tree"
route:
  group_by: ['alertname']	# 用于分组聚合,对告警通知按标签(label)进行分组,将具有相同标签或相同告警名称(alertname)的告警通知聚合在一个组,然后作为一个通知发送。如果想完全禁用聚合,可以设置为group_by: [...]
  group_wait: 30s	# 当一个新的告警组被创建时,需要等待'group_wait'后才发送初始通知。这样可以确保在发送等待前能聚合更多具有相同标签的告警,最后合并为一个通知发送。
  group_interval: 2m	# 当第一次告警通知发出后,在新的评估周期内又收到了该分组最新的告警,则需等待'group_interval'时间后,开始发送为该组触发的新告警,可以简单理解为,group就相当于一个通道(channel)。
  repeat_interval: 10m	# 告警通知成功发送后,若问题一直未恢复,需再次重复发送的间隔。
  receiver: 'email'		#  配置告警消息接收者,与下面配置的对应。例如常用的 email、wechat、slack、webhook 等消息通知方式。
  routes:	# 子路由
  - receiver: 'wechat'
    match:	# 通过标签去匹配这次告警是否符合这个路由节点;也可以使用  match_re 进行正则匹配
      severity: Disaster	# 标签severity为Disaster时满足条件,使用wechat警报

receivers:	# 配置告警信息接收者信息。
- name: 'email'	# 警报接收者名称
  email_configs:
  - to: '{{ template "email.to"}}'  # 接收警报的email(这里是引用模板文件中定义的变量)
    html: '{{ template "email.to.html" .}}' # 发送邮件的内容(调用模板文件中的)
#    headers: { Subject: " {{ .CommonLabels.instance }} {{ .CommonAnnotations.summary }}" }	# 邮件标题,不设定使用默认的即可
    send_resolved: true		# 故障恢复后通知

- name: 'wechat'
  wechat_configs:
  - corp_id: wwd76d598b5fad5097		# 企业信息("我的企业"--->"CorpID"[在底部])
    to_user: '@all'		# 发送给企业微信用户的ID,这里是所有人
#   to_party: '' 接收部门ID
    agent_id: 1000004	# 企业微信("企业应用"-->"自定应用"[Prometheus]--> "AgentId") 
    api_secret: DY9IlG0Bdwawb_ku0NblxKFrrmMwbLIZ7YxMa5rCg8g		# 企业微信("企业应用"-->"自定应用"[Prometheus]--> "Secret") 
    message: '{{ template "email.to.html" .}}'	# 发送内容(调用模板)
    send_resolved: true	 	# 故障恢复后通知

inhibit_rules:		# 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

3. Prometheus 配置

3.1 prometheus 集成 alertmanager

prometheus 集成 alertmanager告警通知服务

#编辑prometheus配置
vim ~/dockerdata/prometheus/prometheus.yml

#全局配置
global:
  scrape_interval: 15s
  evaluation_interval: 15s
  
#关联alertmanagers告警通知服务
alerting:
  alertmanagers:
    - static_configs:
    	- targets: ['192.168.159.148:19093']

#监控alertmanager告警通知服务
scrape_configs:
  - job_name: "alertmanager"
    static_configs:
      - targets: ["192.168.159.148:19093"]
3.2 prometheus 配置 alertmanager 告警规则

prometheus.yml中配置告警规则文件存储位置

prometheus会根据全局global设定的evaluation_interval参数进行扫描加载,规则改动后会自动加载

#编辑prometheus配置
vim ~/dockerdata/prometheus/prometheus.yml

#全局配置
global:
  scrape_interval: 15s
  evaluation_interval: 15s # 默认1m
#指定告警规则文件
rule_files:
  - "rules/*.yml"

创建告警规则文件

#创建并编辑告警规则文件
mkdir -p ~/dockerdata/prometheus/rules
vim ~/dockerdata/prometheus/rules/rules-alerts.yml

groups:
- name: 实例存活告警规则
  rules:
  - alert: 实例存活告警 	# 告警规则的名称(alertname)
    expr: up == 0 		# expr 是计算公式,up指标可以获取到当前所有运行的Exporter实例以及其状态,即告警阈值为up==0
    for: 30s	# for语句会使 Prometheus 服务等待指定的时间, 然后执行查询表达式。(for 表示告警持续的时长,若持续时长小于该时间就不发给alertmanager了,大于该时间再发。for的值不要小于prometheus中的scrape_interval,例如scrape_interval为30s,for为15s,如果触发告警规则,则再经过for时长后也一定会告警,这是因为最新的度量指标还没有拉取,在15s时仍会用原来值进行计算。另外,要注意的是只有在第一次触发告警时才会等待(for)时长。)
    labels:		# labels语句允许指定额外的标签列表,把它们附加在告警上。
      severity: Disaster
    annotations:		# annotations语句指定了另一组标签,它们不被当做告警实例的身份标识,它们经常用于存储一些额外的信息,用于告警信息的展示之类的。
      summary: "节点失联"
      description: "节点断联已超过1分钟!"

- name: 内存告警规则
  rules:
  - alert: "内存使用率告警"
    expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes )) / node_memory_MemTotal_bytes * 100 > 75	# 告警阈值为当内存使用率大于75%
    for: 30s
    labels:
      severity: warning
    annotations:
      summary: "服务器内存告警"
      description: "内存资源利用率大于75%!(当前值: {{ $value }}%)"

- name: 磁盘告警规则
  rules:
  - alert: 磁盘使用率告警
    expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100 > 80	# 告警阈值为某个挂载点使用大于80%
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "服务器 磁盘告警"
      description: "服务器磁盘设备使用超过80%!(挂载点: {{ $labels.mountpoint }} 当前值: {{ $value }}%)"

查看prometheus配置告警规则效果图:

http://192.168.159.148:9090/alerts

rules1.png

rules2.png

3.3 配置详解 *rules.yml

详解规则配置*rules.yml文件说明

groups:
- name: 实例存活告警规则
  rules:
  - alert: 实例存活告警 	# 告警规则的名称(alertname)
    expr: up == 0 		# expr 是计算公式,up指标可以获取到当前所有运行的Exporter实例以及其状态,即告警阈值为up==0
    for: 30s	# for语句会使 Prometheus 服务等待指定的时间, 然后执行查询表达式。(for 表示告警持续的时长,若持续时长小于该时间就不发给alertmanager了,大于该时间再发。for的值不要小于prometheus中的scrape_interval,例如scrape_interval为30s,for为15s,如果触发告警规则,则再经过for时长后也一定会告警,这是因为最新的度量指标还没有拉取,在15s时仍会用原来值进行计算。另外,要注意的是只有在第一次触发告警时才会等待(for)时长。)
    labels:		# labels语句允许指定额外的标签列表,把它们附加在告警上。
      severity: Disaster
    annotations:		# annotations语句指定了另一组标签,它们不被当做告警实例的身份标识,它们经常用于存储一些额外的信息,用于告警信息的展示之类的。
      summary: "节点失联"
      description: "节点断联已超过1分钟!"
      
- name: 内存告警规则
  rules:
  - alert: "内存使用率告警" # 告警名称,自定义
    expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes )) / node_memory_MemTotal_bytes * 100 > 75	# 告警的判定条件,告警阈值为当内存使用率大于75%
    for: 30s # 满足告警条件持续时间多久后,才会发送告警
    labels: #标签项
      severity: warning # 指定告警级别。分别为warning,critical,emergency。严重等级依次递增。
    annotations: # 解析项,详细解释告警信息
      summary: "服务器内存告警"
      description: "内存资源利用率大于75%!(当前值: {{ $value }}%)"
3.4 模拟告警发送
#下载linux 系统压测工具
yum install -y epel-release && yum install stress -y

[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           3.7G        376M        2.9G         11M        439M        3.1G
Swap:          3.9G          0B        3.9G

#模拟。内存压测
# 总内存4G,我们设置的告警阈值为内存使用率为%75则告警,4096*%75=3027M
# 表示运行6个进程,每个进程分配500M内存,分配后不释放,长期保持测试 or 测试80秒
# 长期保持测试,需Ctrl+Z手动停止
stress --vm 6 --vm-bytes 500M --vm-keep
#故障恢复
Ctrl+Z 手动停止
#stress --vm 6 --vm-bytes 500M --timeout 80

#模拟。CPU测试
# 压满6个cpu,执行100秒(--timeout可以直接用--t)
stress --cpu 6 --timeout 100

#模拟。磁盘使用超过80%时
df -h
dd if=/dev/zero of=./test.io count=1 bs=80M
df -h
#故障恢复
rm -rf test.io

4. Alertmanager 配置邮件告警通知

alertmanager.yml 配置邮件告警:

完成 3.2 prometheus 配置 alertmanager 告警规则 后,进行邮件通知配置。

# 编辑 alertmanager 配置
vim ~/dockerdata/promethrus/alertmanager/alertmanager.yml

global:
  resolve_timeout: 5m
  # 全局邮箱配置
  smtp_auth_username: "1263598328@qq.com"
  smtp_auth_password: "QQ邮箱授权码而不是密码"
  #smtp_auth_secret: ""
  smtp_require_tls: false
  smtp_smarthost: "smtp.qq.com:465"
  smtp_from: "1263598328@qq.com"
  
route:
  # 全局路由配置
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'web.hook'
  #子路由,会继承父路由配置,如果不覆盖.
  routes:
  - receiver: 'email-zhengja'
    group_wait: 10s
    group_interval: 10s
    
# 接收器
receivers:
- name: 'email-zhengja'
  email_configs:
  - send_resolved: true
    to: 1263598328@qq.com

演示告警操作:

http://192.168.159.148:9090/targets

email2.png

docker stop cadvisor

邮箱接收效果图示例:

email1.png

调试过程中常见错误及解决方案:

问题1:does not advertise the STARTTLS extension:
解决方案:smtp_require_tls: false即可。

问题2:email.loginAuth auth: 535 Error
解决方案:smtp_auth_password: 这个配置项设置为授权码,而不是QQ邮箱登陆,详细获取授权码参考地址: https://zhidao.baidu.com/question/878811848141402332.html

问题3:一切配置正确,就是发不出去。
解决方案:查看是否使用了25端口,默认云厂商会禁用25端口, 可以向云厂商申请解封25端口,或者使用465端口。

问题4:告警消息能发送,但是告警恢复消息收不到。
解决方案:缺少 send_resolved: true 配置文件, 请确保对应email_config配置文件,有此属性。

5. Alertmanager 配置企业微信告警通知-未测试

参考企业微信接入

注意:需要企业微信管理员提供【部门id】和认证id等

# 编辑 alertmanager.yml 配置
vim ~/dockerdata/promethrus/alertmanager/alertmanager.yml

- name: 'wechat'
  wechat_configs:
  - corp_id: wwd76d598b5fad5097
    to_user: '@all'
#   to_party: '' 接收部门ID
    agent_id: 1000004
    api_secret: DY9IlG0Bdwawb_ku0NblxKFrrmMwbLIZ7YxMa5rCg8g
    message: '{{ template "email.to.html" .}}'
    send_resolved: true

6. Alertmanager 配置企业微信机器人告警通知

6.1 添加企业微信机器人并获取webhook地址(自己创建的机器人才能查看信息)

weixin-webhook1.png

weixin-webhook2.png

企业微信机器人 webhook 地址:

#注意,请使用自己创建的机器人 key为自己机器人的唯一id
https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ae93586b-7593-44b8-af7a-09d67f77da0e
6.2 Docker 安装 webhook-adapter

guyongquan/webhook-adapter 支持企业微信机器人通知

#注意:key (自己的微信机器人key)
#启动企业机器人适配
docker run -d --name wechat-webhook -p 19800:80 \
guyongquan/webhook-adapter \
--adapter=/app/prometheusalert/wx.js=/wx=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=ae93586b-7593-44b8-af7a-09d67f77da0e

#webhook-adapter的机器地址
http://ip:19800/adapter/wx
6.3 Alertmanager 配置

配置 alertmanager.yml 文件:

# 编辑 alertmanager.yml 配置
vim ~/dockerdata/promethrus/alertmanager/alertmanager.yml

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'web.hook'

receivers:
# 企业微信机器人通知
- name: 'web.hook'
  webhook_configs:
  - url: 'http://192.168.159.148:19800/adapter/wx' # 企业微信机器人 webhook-adapter地址

效果图:

weixin-webhook3.png

所有配置文件信息完整版参考

1. 配置文件 prometheus.yml

文件作用:配置抓取指标应用、配置告警通知、配置告警规则等

文件存储路径:~/dockerdata/prometheus/prometheus.yml

global:
  scrape_interval: 15s # 默认情况下,每15秒刮一次目标
  evaluation_interval: 10s

# 关联alertmanagers告警通知服务
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['192.168.159.148:19093']

#指定告警规则文件
rule_files:
  - "rules/*.yml"

scrape_configs:

  # 监控prometheus,可能没有意义,但是个好示例
  - job_name: 'prometheus'
    scrape_interval: 5s # 覆盖全局默认值,并每5秒从该作业中抓取一次目标
    static_configs:
    - targets: ['localhost:9090','192.168.159.148:9090'] # 监听的地址
  
  # 监控springboot web应用
  - job_name: 'springboot-prometheus-example'
    metrics_path: '/actuator/prometheus'  # # 采集的路径
    static_configs:
    - targets: ['192.168.14.238:8080'] # ip和端口写自己springbot应用的

  # 监控docker容器指标
  - job_name: 'cadvisor'
    static_configs:
    - targets: ['192.168.159.148:18081']

  # 监控主机服务信息 master
  - job_name: 'node-exporter-master'
    static_configs:
    - targets: ['192.168.159.148:19100']

  # 监控主机服务信息 slave
  - job_name: 'node-exporter-slave'
    static_configs:
    - targets: ['192.168.159.145:19100'] 

  # 监控alertmanager告警通知服务
  - job_name: "alertmanager"
    static_configs:
    - targets: ["192.168.159.148:19093"]

2. 配置文件 alertmanager.yml

文件作用:配置告警通知、告警通知规则

文件路径:~/dockerdata/prometheus/alertmanager/alertmanager.yml

global:
  resolve_timeout: 5m

  # 全局邮箱配置
  smtp_auth_username: "1263598336@qq.com"
  smtp_auth_password: "yoypgcyowgofieda"
  smtp_require_tls: false
  smtp_smarthost: "smtp.qq.com:465"
  smtp_from: "1263598336@qq.com"


route:
  #全局默认配置
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'web.hook'

#接收器
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://192.168.159.148:19800/adapter/wx'
# 邮箱发送通知
- name: 'email-zhengja'
  email_configs:
  - send_resolved: true
    to: 1263598336@qq.com

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

3. 配置文件 rules-alerts.yml

文件作用:配置告警规则

文件存储路径:~/dockerdata/prometheus/rules/reles-alerts.yml

groups:
- name: 实例存活告警规则
  rules:
  - alert: 实例存活告警         # 告警规则的名称(alertname)
    expr: up == 0               # expr 是计算公式,up指标可以获取到当前所有运行的Exporter实例以及其状态,即告警阈值为up==0
    for: 30s    # for语句会使 Prometheus 服务等待指定的时间, 然后执行查询表达式。(for 表示告警持续的时长,若持续时长小于该时间就不发给alertmanager了,大于该时间再发。for的值不要小于prometheus中的scrape_interval,例如scrape_interval为30s,for为15s,如果触发告警规则,则再经过for时长后也一定会告警,这是因为最新的度量指标还没有拉取,在15s时仍会用原来值进行计算。另外,要注意的是只有在第一次触发告警时才会等待(for)时长。)
    labels:             # labels语句允许指定额外的标签列表,把它们附加在告警上。
      severity: Disaster
    annotations:                # annotations语句指定了另一组标签,它们不被当做告警实例的身份标识,它们经常用于存储一些额外的信息,用于告警信息的展示之类的。
      summary: "节点失联"
      description: "节点断联已超过1分钟!"

- name: 内存告警规则
  rules:
  - alert: "内存使用率告警"
    expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes )) / node_memory_MemTotal_bytes * 100 > 20        # 告警阈值为当内存使用率大于75%
    for: 30s
    labels:
      severity: warning
    annotations:
      summary: "服务器内存告警"
      description: "内存资源利用率大于20%!(当前值: {{ $value }}%)"

- name: 磁盘告警规则
  rules:
  - alert: 磁盘使用率告警
    expr: (node_filesystem_size_bytes - node_filesystem_avail_bytes) / node_filesystem_size_bytes * 100 > 80    # 告警阈值为某个挂载点使用大于80%
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "服务器 磁盘告警"
      description: "服务器磁盘设备使用超过80%!(挂载点: {{ $labels.mountpoint }} 当前值: {{ $value }}%)"

本片文章阅读结束

作者:宇宙小神特别萌
个人博客:www.zhengjiaao.cn
个人博客-CSDN:https://blog.csdn.net/qq_41772028?type=lately
个人博客-掘金:https://juejin.cn/user/3227821871211390/posts
个人博客-简书:https://www.jianshu.com/u/70d69269bd09

代码仓库:
Gitee 仓库:https://gitee.com/zhengjiaao
Github 仓库:https://github.com/zhengjiaao

描述:喜欢文章的点赞收藏一下,关注不迷路,避免以后找不到哦,大家遇到问题下方可评论

本片文章阅读结束

Logo

开源、云原生的融合云平台

更多推荐