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

技术干货|Prometheus之Alertmanager路由配置

西安川石 2022-11-25
725



GUIDE

导读


在前面的部分中已经简单介绍过在Alertmanager中通过路由(Route)来定义告警的处理方式。路由是一个基于标签匹配的树状匹配结构。根据接收到告警的标签匹配相应的处理方式。这里将详细介绍路由相关的内容。

Alertmanager主要负责对Prometheus产生的告警进行统一处理,因此在Alertmanager配置中一般会包含以下几个主要部分:

  • 全局配置(global):用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容;
  • 模板(templates):用于定义告警通知时的模板,如HTML模板,邮件模板等;
  • 告警路由(route):根据标签匹配,确定当前告警应该如何处理;
  • 接收人(receivers):接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack或者Webhook等,接收人一般配合告警路由使用;
  • 抑制规则(inhibit_rules):合理设置抑制规则可以减少垃圾告警的产生;
其完整配置格式如下:
    global:
    [ resolve_timeout: <duration> | default = 5m ]
    [ smtp_from: <tmpl_string> ]
    [ smtp_smarthost: <string> ]
    [ smtp_hello: <string> | default = "localhost" ]
    [ smtp_auth_username: <string> ]
    [ smtp_auth_password: <secret> ]
    [ smtp_auth_identity: <string> ]
    [ smtp_auth_secret: <secret> ]
    [ smtp_require_tls: <bool> | default = true ]
    [ slack_api_url: <secret> ]
    [ victorops_api_key: <secret> ]
    [ victorops_api_url: <string> | default =
    "https://alert.victorops.com/integrations/generic/20131114/alert/" ]
    [ pagerduty_url: <string> | default = "https://events.pagerduty.com/v2/enqueue"
    ]
    [ opsgenie_api_key: <secret> ]
    [ opsgenie_api_url: <string> | default = "https://api.opsgenie.com/" ]
    [ hipchat_api_url: <string> | default = "https://api.hipchat.com/" ]
    [ hipchat_auth_token: <secret> ]
    [ wechat_api_url: <string> | default = "https://qyapi.weixin.qq.com/cgi-bin/"
    ]
    [ wechat_api_secret: <secret> ]
    [ wechat_api_corp_id: <string> ]
    [ http_config: <http_config> ]
    templates:
    [ - <filepath> ... ]
    route: <route>
    receivers:
    - <receiver> ...
    inhibit_rules:
    [ - <inhibit_rule> ... ]
    在全局配置中需要注意的是resolve_timeout ,该参数定义了当Alertmanager持续多长时间未接收到告警后标记告警状态为resolved(已解决)。该参数的定义可能会影响到告警恢复通知的接收时间,读者可根据自己的实际场景进行定义,其默认值为5分钟。在接下来的部分,我们将举一些实际的例子解释Alertmanager的其它配置内容。

    基于标签的告警路由

    在Alertmanager的配置中会定义一个基于标签匹配规则的告警路由树,以确定在接收到告警后Alertmanager需要如何对其进行处理:
      route: <route>
      其中route中则主要定义了告警的路由匹配规则,以及Alertmanager需要将匹配到的告警发送给哪一个receiver,一个最简单的route定义如下所示:
        route:
        group_by: ['alertname']
        receiver: 'web.hook'
        receivers:
        - name: 'web.hook'
        webhook_configs:
        - url: 'http://127.0.0.1:5001/'
        如上所示:在Alertmanager配置文件中,我们只定义了一个路由,那就意味着所有由Prometheus产生的告警在发送到Alertmanager之后都会通过名为web.hook 的receiver接收。这里的web.hook定义为一个webhook地址。当然实际场景下,告警处理可不是这么简单的一件事情,对于不同级别的告警,我们可能会不完全不同的处理方式,因此在route中,我们还可以定义更多的子Route,这些Route通过标签匹配告警的处理方式,route的完整定义如下:
          [ receiver: <string> ]
          [ group_by: '[' <labelname>, ... ']' ]
          [ continue: <boolean> | default = false ]
          match:
          [ <labelname>: <labelvalue>, ... ]
          match_re:
          [ <labelname>: <regex>, ... ]
          [ group_wait: <duration> | default = 30s ]
          [ group_interval: <duration> | default = 5m ]
          [ repeat_interval: <duration> | default = 4h ]
          routes:
          [ - <route> ... ]

          01

          路由匹配

          每一个告警都会从配置文件中顶级的route进入路由树,需要注意的是顶级的route必须匹配所有告警(即不能有任何的匹配设置match和match_re),每一个路由都可以定义自己的接受人以及匹配规则。默认情况下,告警进入到顶级route后会遍历所有的子节点,直到找到最深的匹配route,并将告警发送到该route定义的receiver中。但如果route中设置continue的值为false,那么告警在匹配到第一个子节点之后就直接停止。如果continue为true,报警则会继续进行后续子节点的匹配。如果当前告警匹配不到任何的子节点,那该告警将会基于当前路由节点的接收器配置方式进行处理。

          其中告警的匹配有两种方式可以选择。
          第一种方式:基于字符串验证,通过设置match规则判断当前告警中是否存在标签labelname并且其值等于labelvalue。
          第二种方式:则基于正则表达式,通过设置match_re验证当前告警标签的值是否满足正则表达式的内容。
          如果警报已经成功发送通知, 如果想设置发送告警通知之前要等待时间,则可以通过repeat_interval参数进行设置。

          02

          告警分组

          在之前的部分有讲过,Alertmanager可以对告警通知进行分组,将多条告警合合并为一个通知。这里我们可以使用group_by来定义分组规则。基于告警中包含的标签,如果满足group_by中定义标签名称,那么这些告警将会合并为一个通知发送给接收器。
          有的时候为了能够一次性收集和发送更多的相关信息时,可以通过group_wait参数设置等待时间,如果在等待时间内当前group接收到了新的告警,这些告警将会合并为一个通知向receiver发送。
          而group_interval配置,则用于定义相同的Group之间发送告警通知的时间间隔。
          例如,当使用Prometheus监控多个集群以及部署在集群中的应用和数据库服务,并且定义以下的告警处理路由规则来对集群中的异常进行通知。
            route:
            receiver: 'default-receiver'
            group_wait: 30s
            group_interval: 5m
            repeat_interval: 4h
            group_by: [cluster, alertname]
            routes:
            - receiver: 'database-pager'
            group_wait: 10s
            match_re:
            service: mysql|cassandra
            - receiver: 'frontend-pager'
            group_by: [product, environment]
            match:
            team: frontend

            默认情况下所有的告警都会发送给集群管理员default-receiver,因此在Alertmanager的配置文件的根路由中,对告警信息按照集群以及告警的名称对告警进行分组。
            如果告警时来源于数据库服务如MySQL或者Cassandra,此时则需要将告警发送给相应的数据库管理员(database-pager)。这里定义了一个单独子路由,如果告警中包含service标签,并且service为MySQL或者Cassandra,则向database-pager发送告警通知,由于这里没有定义group_by等属性,这些属性的配置信息将从上级路由继承,database-pager将会接收到按cluster和alertname进行分组的告警通知。
            而某些告警规则来源可能来源于开发团队的定义,这些告警中通过添加标签team来标示这些告警的创建者。在Alertmanager配置文件的告警路由下,定义单独子路由用于处理这一类的告警通知,如果匹配到告警中包含标签team,并且team的值为frontend,Alertmanager将会按照标签product和
            environment对告警进行分组。此时如果应用出现异常,开发团队就能清楚的知道哪一个环境(environment)中的哪一个应用程序出现了问题,可以快速对应用进行问题定位。

            往/期/回/顾



            Prometheus(普罗米修斯)核心组件


            Prometheus(普罗米修斯)自定义查询语言PromQL


            Prometheus(普罗米修斯)之PromQL完全解释


            Prometheus(普罗米修斯)PromQL查询语言之操作符


            PromQL查询语言之聚合操作&内置函数


            Prometheus 在HTTP API中使用PromQL


            Prometheus监控4个黄金指标和USE方法


            Prometheus告警及告警规则


            Prometheus部署Alertmanager

            -End-

            「有用就扩散」

            「有用就点在看」

            更多课程咨询或免费资料领取,扫下方二维码即可!

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

            评论