Prometheus 安装及应用(内容较全面)

2023-11-15

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

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

本片文章阅读结束

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prometheus 安装及应用(内容较全面) 的相关文章

  • 使用 Exec Maven 插件分叉 Java,而不使用“exec”目标

    来自文档 https www mojohaus org exec maven plugin exec exec在单独的进程中执行程序和Java程序 exec java在同一虚拟机中执行 Java 程序 我想 fork 一个 java 程序
  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • 什么是内部类的合成反向引用

    我正在寻找应用程序中的内存泄漏 我正在使用的探查器告诉我寻找这些类型的引用 但我不知道我在寻找什么 有人可以解释一下吗 Thanks Elliott 您可以对 OUTER 类进行合成反向引用 但不能对内部类实例进行合成 e g class
  • 如何让“grep”从文件中读取模式?

    假设有一个很大的文本文件 我只想打印与某些模式不匹配的行 显然 我可以使用egrep v patter1 pattern2 pattern3 现在 如果所有这些模式都在一个文本文件中怎么办 最好的制作方法是什么egrep从文件中读取模式 g
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 为什么 jar 执行的通配符在 docker CMD 中不起作用?

    我有一个Dockerfile与以下CMD启动我的 Spring Boot 应用程序 FROM java 8 jre CMD java jar app file jar 当我尝试从创建的图像启动容器时 我得到 Error Unable to
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 将矩阵与 SUM 相乘

    我想将一个指标与另一个指标之和的结果相乘 我想尝试做的事情 MeticOne SUM MetricTwo Thanks 假设你有MetricOne带标签id and name 你有MetricTwo还有标签id and name 然后你就得
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • Spring Data Rest 多对多 POST

    首先 让我解释一下我的用例 这非常简单 有一个用户实体和一个服务实体 我使用 UserService 作为连接实体 连接表 在用户和服务之间建立多对多关联最初 会有一些用户集和一些服务集 用户可以在任何时间点订阅任何服务 在这种情况下 将向
  • 使用 Apache 允许 Glassfish 和 PHP 在同一服务器中协同工作

    是否可以建立从 Java 到 php 文件的桥梁 我有一个用 Java 编写的应用程序 我需要执行http piwik org http piwik org 这是用 PHP 编写的 在服务器中 我正在运行 PHP 但无法从浏览器访问 php
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j

随机推荐

  • 生成式对抗网络(GAN)-(Generative Adversarial Networks)算法总结(从原始GAN到....目前)

    本文将按时间顺序总结gan的paper 非所有 会挑选个人认为比较重要的 并将参考其它博客 会给出链接 如有侵权 请私信删除 更新于 19 IS 可以反应图像的生成质量 越大越好 FID 则会更假注重生成的多样性 越小越好 IS score
  • mysql评审_第3章 代码检查、走查与评审

    代码检查与走查 代码检查 走查以及可用性测试是三种主要的人工测试方法 人工测试技术在查找错误方面非常有效 应该在程序开始编码之后 基于计算机的测试开始之前使用这些方法 本章主要介绍的是代码检查与走查的相似之处 而它们的不同之处将在后续章节中
  • Apache和Tomcat

    一 Apache和Tomcat的区别 Apache只是一个Web服务器 可以作为独立的web服务器来运行 不过只支持静态网页 如 asp PHP cgi jsp 等动态网页的就显得无能为力 Tomcat也可以作为独立的web服务器来运行 但
  • 什么是docker?docker有什么优缺点?

    Docker的思想来自于集装箱 集装箱解决了什么问题 在一艘大船上 可以把货物规整的摆放起来 并且各种各样的货物被集装箱标准化了 集装箱和集装箱之间不会互相影响 那么我就不需要专门运送水果的船和专门运送化学品的船了 只要这些货物在集装箱里封
  • UE4 C++ 编辑器模式下属性被修改时触发对应事件

    pragma once include CoreMinimal h include GameFramework Actor h include TestActors generated h UCLASS class TESTACTOR AP
  • 【Python】发布一个简单好用的日志记录器bestlog

    需求 日志是非常重要的一个东西 我们往往习惯于在开发一个新项目的第一行代码时 就用 logging info 代替 print 随时保持记录的好习惯 等代码上线以后也无需修改替换那些 print 直接开跑 有了完善的日志 才便于分析生产环境
  • 微信月活9亿的高效运维之路

    微信业务量增长的时候 其实我们比较关心的是效率 前期可能两三个月就涨了1倍的量 我们怎么能够保证我们的运营效率是跟得上的 后期可能主要是关心成本 我们在2014年以后增长有点放缓 所以主要的精力会在成本这个方面 分为四块来说 运营规范 云化
  • 团队项目负责人的一些感悟

    我们项目随着项目的越来越来 各种问题越来越多 比如表字段的问题 java对象的设计问题 下面是我们项目后期遇到的问题 一一罗列下 以后带团队必须注意的问题 java中 1 同一个意思的字段 在不同对象中具有不同的写法 比如说A类中金额的字段
  • Java中的String(1)

    目录 String不可变 一个例子 是字符串常量的情况下 是对象的情况下 常用的方法 String不可变 摘自JDK1 8 API文档 Strings are constant their values cannot be changed
  • springboot:异步调用@Async

    一 概述 springboot是基于spring框架的 在springboot环境下演示 Async注解的使用方式 先看下该注解的定义 复制代码 Target ElementType METHOD ElementType TYPE Rete
  • JFS及JFS2文件系统

    复杂度2 5 机密度2 5 最后更新2021 04 29 JFS和JFS2都是AIX支持的文件系统类型 JFS2是JFS的增强版 目前JFS结构已经开源 可以下载到jfs for linux的源代码 JFS开源网站 JFS JFS2都是日志
  • 单片机stm32使用ESP8266MQTT AT指令发送json字符串

    一 问题描述 基于文章 lt 单片机stm32使用rt thread软件包at device的AT指令 gt 测试发现使用MQTT AT指令发送主题信息时 直接发送字符串正常 发送json字符串时出问题 提示错误 数据格式的区别如下 s 正
  • 转:最详细的JavaScript 教程,入门级都能看懂

    目录 介绍 JavaScript特点 用法 实例1 head中的script函数 实例2 body中的script函数 实例3 外部调用JavaScript 输出 实例1 aler 弹窗输出 实例2 document write 输出 实例
  • TTL电路的拉电流、灌电流、扇出数及扇出数计算

    电流 灌电流 扇入数 扇出数 扇出数在数字电路中是非常常见的名词 下面我们先给出这些概念的定义 然后从原理出发 介绍这些名词的关系及扇出数的计算方法 灌电流 灌电流是数字电路输出端口为低电平时外部负载输入的电流 表征输入电流的能力 拉电流
  • 算力还是服务器?这不是一道选择题

    关注我们牛年牛气冲天 算力 顾名思义就是设备的计算能力 它无影无形 虽然看不见 摸不到 却真实存在 小到智能手机 PC 大到服务器 超级计算机 算力就 藏 存各种各样的硬件设备中 像沉睡的金矿 等待你去挖掘 算力 说了算 在云计算时代 一切
  • [荐]硕博经验——科研论文阅读与写作实战技巧

    又转自西电好网 http bbs xdnice com b99t378538 htm硕博经验 转来的 早知道就好了 少走很多弯路啊 该文从 举止优雅的猪 那里看见的 感觉很不错 不过我感觉到了博士才知道这些似乎有点晚了 或者是有不少人也不会
  • 21.openssl编程——EVP

    21 1 EVP 简介 Openssl EVP high level cryptographic functions 提供丰富的密码学中的各种函数 EVP主要封装如下功能函数 a 实现了base64编解码BIO b 实现了加解密BIO c
  • Android Studio 界面显示不全问题

    最近想试试google的android studio开发工具 安装完成后 按照向导新建一个工程 发现向导界面太大 整个屏幕显示不过来 调整界面大小也无法搞定 我用的是ubuntu系统 笔记本分辨率为1366 768 上网百度了好多 发现不少
  • redis集群设置密码

    注意事项 1 如果是使用redis trib rb工具构建集群 集群构建完成前不要配置密码 集群构建完毕再通过config set config rewrite命令逐个机器设置密码 2 如果对集群设置密码 那么requirepass和mas
  • Prometheus 安装及应用(内容较全面)

    prometheus 安装及应用 prometheus 官网 grafana dashboards 模板 prometheus 参考示例 Prometheus普罗米修斯 希腊神话人物 是一个开源的系统监控和告警系统 在kubernetes容