暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

prometheus的告警规则编写

feelwow 2021-03-16
1417

本篇主要讲解alertmanager中关于告警规则的相关介绍,

prometheus 告警规则详解
prometheus 配置文件参考与介绍

告警流程介绍

prometheus会将产生的告警信息推送给alertmanager,alertmanager再根据配置的告警触发规则,进行报警,所以首先看下prometheus如何把告警信息推送给alertmanager

# 修改prometheus的配置文件
    alerting:
      alertmanagers:
      - static_configs:
          - targets: ["alertmanager:9093"]

通过在prometheus的配置文件中指定alertmanager的服务地址来使prometheus与alertmanager进行通信

prometheus把告警信息推送给alertmanager之后,alertmanager会根据告警规则进行报警,所以需要配置告警规则,配置方式如下:

# 修改prometheus的配置文件
    rule_files:
      - "/etc/prometheus-rules/*.yml"
    或者
    rule_files:
      - "/etc/prometheus-rules/system.yml"
      - "/etc/prometheus-rules/mysql.yml"
      - "/etc/prometheus-rules/kafka.yml"

/etc/prometheus-rules
这个目录是自定义的,我把所有的告警规则放在了此目录下,而以上就是关于配置告警的一些配置,贴一个完整版的

global:
  scrape_interval: 20s
  scrape_timeout: 20s
  evaluation_interval: 20s
alerting:
  alertmanagers:
  - static_configs:
      - targets: ["alertmanager:9093"]
rule_files:
  - "/etc/prometheus-rules/*.yml"
scrape_configs:
- job_name: 'k8s-node'
......
......
......

下面说一下告警规则的配置方法

告警规则

示例参考

groups:
- name: sentry
  rules:
  - alert: "Host Alive"
    expr: (up{job='sentry'}) == 0
    for: 60s
    labels:
      team: ops
      severity: critical
      cloud: yizhuang
    annotations:
      summary: "host is down for 60s"
      description: "host: {{$labels.instance}}"
  - alert: "Memory Usage"
    expr: round((1-(node_memory_MemAvailable_bytes{job='sentry'} / (node_memory_MemTotal_bytes{job='sentry'})))* 100) > 85
    for: 5m
    labels:
      team: ops
      severity: warning
      cloud: yizhuang
    annotations:
      summary: "Memory usage is too high and over 85% for 5min"
      description: "The current host {{$labels.instance}}' memory usage is {{ $value }}%"

- name
: 警报规则组的名称
- alert
: 警报规则的名称
expr
: 使用PromQL表达式写的查询语句,用于触发是否进行告警
for
: 当触发告警条件时,持续一段时间后再进行报警
labels
: 自定义标签,设置后,会出现在告警中
annotations
: 自定义告警描述信息

这里面还有一些变量,用来获取告警信息中的值,例如下面这些:

  • {{ $labels. }} 用来获取当前告警实例中指定标签的值
  • {{ $value }} 获取当前PromQL表达式计算的值

比如我这里有一条告警源信息

{
 'receiver': 'webhook',
 'status': 'firing',
 'alerts': [{
  'status': 'firing',
  'labels': {
   'alertname': '内存使用率',
   'instance': '10.127.92.100',
   'job': 'sentry',
   'severity': 'warning',
   'team': 'ops'
  },
  'annotations': {
   'description': '内存使用率已超过55%,内存使用率:58%',
   'summary': '内存使用率'
  },
  'startsAt': '2020-12-30T07:20:08.775177336Z',
  'endsAt': '0001-01-01T00:00:00Z',
  'generatorURL': 'http://prometheus-server:9090/graph?g0.expr=round%28%281+-+%28node_memory_MemAvailable_bytes%7Bjob%3D%22sentry%22%7D+%2F+%28node_memory_MemTotal_bytes%7Bjob%3D%22sentry%22%7D%29%29%29+%2A+100%29+%3E+55&g0.tab=1',
  'fingerprint': '09f94bd1aa7da54f'
 }],
 'groupLabels': {
  'alertname': '内存使用率'
 },
 'commonLabels': {
  'alertname': '内存使用率',
  'job': 'sentry',
  'severity': 'warning',
  'team': 'ops'
 },
 'commonAnnotations': {
  'summary': '内存使用率'
 },
 'externalURL': 'http://alertmanager-server:9093',
 'version': '4',
 'groupKey': '{}:{alertname="内存使用率"}',
 'truncatedAlerts': 0
}

那我这里可以在规则中设置的变量就有下面这些:

team组名:{{ $labels.team}}
severity报警等级:{{ $labels.severity }}
job报警规则名:{{ $labels.job }}
alertname报警名:{{ $labels.alertname }}

如何告警

告警的介质可以有很多,可以通过邮件、企业微信、钉钉、webhook等方式进行,这一块的配置是在alertmanager的配置文件中设置,具体如下:
1) webhook方式

    receivers:
    - name: 'webhook'
      webhook_configs:
      - url: 'http://alert-webhook:5000/webhook'
        send_resolved: true

2) 邮件方式

global:
  resolve_timeout: 5m
  smtp_from: 'xxxx@163.com'
  smtp_smarthost: 'smtp服务器地址'
  smtp_auth_username: 'xxxx@163.com'
  smtp_auth_password: '邮箱密码'
  # 是否启用tls,可根据实际情况开启或关闭
  smtp_require_tls: false
  smtp_hello: '163.com'
  
receivers:
- name: 'email'
  email_configs:
  - to: 'test@163.com'
    # 是否发送恢复通知
    send_resolved: true

3) 企业微信方式使用企业微信告警,需要有企业的企业微信管理员权限,需要在后台里获取企业ID,部门ID等

global:
  resolve_timeouot: 5m
  # 企业微信的接口地址,应该不会变
  wechat_api_url: "https://qyapi.weixin.qq.com/cgi-bin/" 
  wechat_api_corp_id: '企业微信的企业ID'
  wechat_api_secret: '企业微信的应用secret'
  
receivers:
- name: 'wechat'
  wechat_configs:
  - send_resolved: true
    message: '{{ template "wechat.default.message" . }}'
    to_party: '接收告警的部门ID'
    agent_id: '应用ID'
    to_user: '用户ID'
    api_secret: '部门secret'

注意这里使用了一个告警信息的模板,可以大概参考下

{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
==========异常告警==========
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
告警详情: {{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} #调整为北京时间
{{- if gt (len $alert.Labels.instance) 0 }}
实例信息: {{ $alert.Labels.instance }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
==========异常恢复==========
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
告警详情: {{ $alert.Annotations.description}};{{$alert.Annotations.summary}}
故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} #调整为北京时间
恢复时间: {{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} #调整为北京时间
{{- if gt (len $alert.Labels.instance) 0 }}
实例信息: {{ $alert.Labels.instance }}
{{- end }}
============END============
{{- end }}
{{- end }}
{{- end }}

不过这里也可以用wehbook的方式来进行企业微信告警,可以使用企业微信的机器人,通过webhook调用机器人的接口,然后把信息推给机器人,从而完成告警。

注意:本篇文章不对告警模板进行讲解,下篇会详细说明


文章转载自feelwow,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论