失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > prometheus监控之alertmanager安装配置(2)接入电话报警 微信告警 短信 邮件等报警

prometheus监控之alertmanager安装配置(2)接入电话报警 微信告警 短信 邮件等报警

时间:2021-04-07 02:23:31

相关推荐

prometheus监控之alertmanager安装配置(2)接入电话报警 微信告警 短信 邮件等报警

电话报警(语音报警)可使用(OpsAlert)支持电话、短信、邮件、微信多种报警,直接使用WebHook配置即可,比较简单。

介绍

Prometheus 将数据采集和报警分成两个模块。报警规则配置在Prometheus Servers上,然后发送报警信息到AlertManger,Alertmanager 对收到的告警信息进行处理,包括去重,降噪,分组,沉默,抑制,策略路由,告警通知。

流程

Alertmanager 接收到告警,根据labels判断属于哪些Route(可存在多个Route,一个Route有多个Group,一个Group有多个Alert)

将告警分配到Group中,没有则新建Group,新的Group等待group_wait指定的时间(等待时可能收到同一Group的告警),根据resolve_timeout判断告警是否解决,然后发送通知

已有的Group等待group_interval指定的时间,判断告警是否解决,当上次发送通知到现在的间隔大于repeat_interval或者Group有更新时会发送通知

分组

分组是指当出现问题时,Alertmanager 会收到一个单一的通知,而当整个系统或网络故障时,很有可能有成百上千的告警会同时生成,这种机制在较大故障中特别有用。如当数十或数百个服务的实例在运行,网络发生故障时,有可能服务实例的一半不可达数据库。在告警规则中配置为每一个服务实例都发送警报的话,那么结果是数百警报被发送至Alertmanager,但是作为用户只想看到单一的报警页面,同时仍然能够清楚的看到哪些实例受到影响,因此,通过配置 Alertmanager 将警报分组打包,并发送一个相对看起来紧凑的通知。

抑制

抑制是指当告警发出后,停止重复发送由此告警引发其他错误的告警的机制。如当警报被触发,通知整个集群不可达,可以配置Alertmanager 忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。

沉默

沉默是一种简单的特定时间静音提醒的机制。一种沉默是通过匹配器来配置,就像路由树一样。传入的警报会匹配RE,如果匹配,将不会为此警报发送通知。

沉默机制可以通过Alertmanager的Web页面进行配置。

安装

Download | Prometheus(下载最新版本的 Alertmanager)

cd/data/alertmanagerwget/prometheus/alertmanager/releases/download/v0.17.0/alertmanager-0.17.0.linux-amd64.tar.gztar-zxvfalertmanager-0.17.0.linux-amd64.tar.gz

配置

cd alertmanager-0.17.0.linux-amd64/vim alertmanager.ymlglobal:resolve_timeout: 5m #处理超时时间,默认为5分钟smtp_from: 'test@'smtp_smarthost: 'smtp.:25'smtp_auth_username: 'test@'smtp_auth_password: '123'route:group_by: ['alertname', 'item'] # 传入报警分组在一起的标签,如item=测试和alertname=Disk的多个报警将批处理为单个组group_wait: 30s # 最初即第一次等待多久时间发送一组警报的通知group_interval: 300s # 在发送新警报前的等待时间repeat_interval: 4h # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝receiver: 'mail.hook' # 发送警报的接收者的名称,以下receivers name的名称routes:- receiver: 'web.hook'group_wait: 10s match: severity: node # 带有 severity=node 的报警将被发送到 web.hook# 定义模板信心# templates:# - '/data/template/*.tmpl'receivers:- name: 'web.hook'webhook_configs:# webhook 接收地址- url: '/alert/prometheus/fd70c90f-823b-4299-b697-eaf27dea204e' send_resolved: false # 是否通知已解决的告警# - url: 'http://127.0.0.1:8070/dingtalk/' # send_resolved: true- name: 'email'email_configs:- to: 'test@'# html: '{{ template "mail.html" . }}'# headers: { Subject: " {{ .CommonAnnotations.summary }}" }#- name: 'mail.hook' # 告警时同时发送到 webhook_configs 和 email_configs# webhook_configs:# - url: 'http://127.0.0.1:8070/hook/'# email_configs:# - to: 'test@' # 多个用逗号隔开# -name: 'wechat'# wechat_configs:# - url: 'https://qyapi./cgi-bin/' # 企业微信地址#to_party: '1' # 接收组的id#agent_id: '1000002' # (企业微信-->自定应用-->AgentId)#corp_id: '******' # 企业信息(我的企业-->CorpId[在底部])#api_secret: '******' # 企业微信(企业微信-->自定应用-->Secret)#message: '{{ template "wechat.html" . }}' # 发送消息模板的设定inhibit_rules: # 抑制规则- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance', 'prod']

接收器 receivers 我这里只测试了webhook_configs 和 email_configs 当然还支持其他的接收器(pagerduty_configs、slack_config、opsgenie_configs、wechat_configs),使用方法都差不多。

API

# GET 查看 receivers (发送渠道)列表https://localhost/api/v2/receivers # GET 查看 alerts (报警)列表https://localhost/api/v2/alerts?silenced=false&inhibited=false # POST 添加报警alerts='[{"labels": {"alertname": "DiskAll","dev": "sda1","instance": "example"},"annotations": {"info": "The disk sda1 is running full","summary": "please check the instance example"}}]curl -XPOST -d"$alerts" https://localhost/api/v2/alerts# GET 查看 silences (静默)列表https://localhost/api/v2/silences?silenced=false&inhibited=false # POST 添加静默https://localhost/api/v2/silences

注意: API 添加 silences 的时候,因 prometheus 默认时区为UTC且无法改变时区,因此我们的报警时间应该 -8:00,如下脚本

#! /usr/bin/env python# -*- coding:utf8 -*-import datetimeimport urllib2import jsonimport timedef add(matchers, username, commit):UTC_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ"now_stamp = time.time()startsAt = datetime.datetime.utcfromtimestamp(now_stamp)endsAt = startsAt + datetime.timedelta(hours=4)data = {"matchers": matchers,"startsAt": startsAt.strftime(UTC_FORMAT),"endsAt": endsAt.strftime(UTC_FORMAT),"createdBy": username,"comment": commit,"id": "","status": {"state": "active"}}request_header = {'Content-Type': 'application/json'}request = urllib2.Request("/api/v2/silences", headers=request_header, data = json.dumps(data))response = urllib2.urlopen(request).read()print responsematchers = [{'isRegex': False, 'name': 'test', 'value': 'test'}]add(matchers, "test", "测试")

启动

vim /usr/lib/systemd/system/alertmanager.service[Unit]Description=alertmanager server daemonDocumentation=https://prometheus.io/docs/introduction/overview/After=network.target[Service]ExecStart=/data/alertmanager/alertmanager-0.17.0.linux-amd64/alertmanager --config.file=/data/alertmanager/alertmanager-0.17.0.linux-amd64/alertmanager.yml --storage.path=/data/alertmanager/dataExecReload=/bin/kill -HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDKillMode=processRestart=on-failureRestartSec=42s[Install]WantedBy=multi-user.target# 启动systemctl daemon-reloadsystemctl restart alertmanager.service

Prometheus 配置添加Alertmanager

# 添加如下配置并重启 prometheus 服务vim prometheus.ymlalerting:alertmanagers:- static_configs:- targets:- localhost:9093rule_files:- /data/prometheus/prometheus/rules/*.rules # 规则配置文件

模板

cat /data/template/wechat.tmpl{{ define "wechat.html" }}{{ range $i, $alert := .Alerts.Firing }}[报警项名]:{{ index $alert.Labels "alertname" }}[报警主机]:{{ index $alert.Labels "instance" }}[报警阀值]:{{ index $alert.Annotations "value" }}[开始时间]:{{ $alert.StartsAt }}{{ end }}{{ end }}

Prometheus 添加规则(rules)

警报规则允许你基于Prometheus表达式语言的表达式定义报警报条件,并在触发警报时发送通知给外部的接收者。每当警报表达式在给定时间点产生一个或者多个向量元素,这个警报统计活跃的这些元素标签集。

vim /data/prometheus/prometheus/rules/hoststats-alert.rulesgroups:- name: hostStatsAlertrules:- alert: instanceDownexpr: up == 0for: 5mlabels:severity: nodeannotations:summary: "Instance {{ $labels.instance }} down"description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."- alert: diskFreeexpr: (1-(node_filesystem_free_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"}) ) * 100 > 85for: 5mlabels:severity: pageannotations:summary: "Instance {{ $labels.instance }} down"description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

FOR 选项语句会使Prometheus服务等待指定的时间, 在第一次遇到新的表达式输出向量元素(如:具有高HTTP错误率的实例)之间,并将该警报统计为该元素的触发。如果该元素的活跃的,且尚未触发,表示正在挂起状态。

LABELS 选项语句允许指定额外的标签列表,把它们附加在警告上。任何已存在的冲突标签会被重写。这个标签值能够被模板化。

ANNOTATIONS 选项语句指定了另一组标签,它们不被当做警告实例的身份标识。它们经常用于存储额外的信息,例如:警告描述,后者runbook链接。这个注释值能够被模板化。

我这里添加了2条报警规则,分别是实例Down了及磁盘使用大于85%就触发报警。

如果实例Down了的话就触发label为severity=node的receiver(上面alertmanager 配置文件中),可以看到上面的配置就会匹配web.hook这个receiver,然后会将报警信息POST到我们提供的 hook 接口中。

一个报警信息在生命周期内有下面3中状态:

inactive: 表示当前报警信息既不是firing状态也不是pending状态

pending: 表示在设置的阈值时间范围内被激活了

firing: 表示超过设置的阈值时间被激活了

如果觉得《prometheus监控之alertmanager安装配置(2)接入电话报警 微信告警 短信 邮件等报警》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。