32. Prometheus警报-配置

Alertmanager通过命令行标志和配置文件进行配置。命令行标志配置不可变的系统参数,配置文件定义抑制规则、通知路由和通知接收者。

可视化编辑器可以帮助建立路由树。

要查看所有可用的命令行标志,请运行 alertmanager -h

Alertmanager可以在运行时重新加载其配置。如果新配置格式不正确,则更改将不会应用,并且会记录错误。(可以使用amtool工具测试alertmanager.yml的语法,该工具默认在alertmanager的源代码包已存在,用法:./amtool check-config alertmanager.yml )

通过发送SIGHUP信号到alertmanager进程或使用HTTP POST请求/-/reload endpoint来触发配置重载,例如:curl -XPOST localhost:9093/-/reload (alertmanager服务默认监听9093端口)。

配置文件

要指定加载的配置文件,请使用该--config.file标志。

./alertmanager --config.file=simple.yml

该文件以YAML格式写入,由以下所述的格式定义。括号表示参数是可选的。对于非列表参数,值设置为指定的默认值。

通用占位符定义如下:

  • :持续时间 ,匹配正则表达式[0-9]+(ms|[smhdwy])
  • :字符串,匹配正则表达式匹 [a-zA-Z_][a-zA-Z0-9_]*
  • :unicode字符串
  • :当前工作目录中的有效路径
  • :布尔值,truefalse
  • :常规字符串
  • :常规secret字符串,例如密码
  • :使用前已使用模板扩展的字符串
  • :使用前已使用模板扩展的secret字符串

其他占位符分别指定。

提供的有效示例文件 显示了上下文中的用法。

全局配置指定在所有其他配置上下文中有效的参数。它们还用作其他配置部分的默认设置。

global:
  # 默认的SMTP From标头字段。
  [ smtp_from:  ]
  #用于发送电子邮件的默认SMTP主机,包括端口号。端口号通常为25,对于基于TLS的SMTP(有时称为STARTTLS),端口号通常为587。
  #示例:smtp.example.org:587
  [ smtp_smarthost:  ]
  #标识SMTP服务器的默认主机名。
  [ smtp_hello:  | default = "localhost" ]
  #使用CRAM-MD5,LOGIN和PLAIN的SMTP身份验证。 如果为空,则Alertmanager不会对SMTP服务器进行身份验证。
  [ smtp_auth_username:  ]
  # 使用LOGIN和PLAIN的SMTP身份验证
  [ smtp_auth_password:  ]
  #使用PLAIN的SMTP身份验证。
  [ smtp_auth_identity:  ]
  # 使用CRAM-MD5的SMTP身份验证。
  [ smtp_auth_secret:  ]
  #默认的SMTP TLS要求。
  #请注意,Go不支持与远程SMTP端点的未加密连接。
  [ smtp_require_tls:  | default = true ]

  # 用于Slack通知的API URL。
  [ slack_api_url:  ]
  [ victorops_api_key:  ]
  [ victorops_api_url:  | default = "https://alert.victorops.com/integrations/generic/20131114/alert/" ]
  [ pagerduty_url:  | default = "https://events.pagerduty.com/v2/enqueue" ]
  [ opsgenie_api_key:  ]
  [ opsgenie_api_url:  | default = "https://api.opsgenie.com/" ]
  [ hipchat_api_url:  | default = "https://api.hipchat.com/" ]
  [ hipchat_auth_token:  ]
  [ wechat_api_url:  | default = "https://qyapi.weixin.qq.com/cgi-bin/" ]
  [ wechat_api_secret:  ]
  [ wechat_api_corp_id:  ]

  # 默认的HTTP客户端配置
  [ http_config:  ]

  #ResolveTimeout是警报管理器使用的默认值
  #不包括EndsAt,经过此时间后,如果尚未更新警报,则可以将警报声明为已解决。
  #这对Prometheus的警报没有影响,因为它们始终包含EndsAt。
  [ resolve_timeout:  | default = 5m ]

  #从中读取自定义通知模板定义的文件。
  #最后一个组件可以使用通配符匹配器,例如 '模板/*.tmpl'。
templates:
  [ -  ... ]

# 路由树的根节点。
route: 

# 通知接收者列表。
receivers:
  -  ...

# 抑制规则列表。
inhibit_rules:
  [ -  ... ]

配置文件中的路由配置部分(route:)定义了路由树中的节点及其子节点。如果未设置,则其可选配置参数将从其父节点继承。

每个警报都会在已配置的顶级route处进入路由树,该顶级路由树必须能匹配所有报警(即没有任何已配置的匹配器)。然后,它遍历子节点。如果continue设置为false,它将在第一个匹配的子项之后停止。如果continue在匹配的节点上为true,则警报将继续与后续的同级节点进行匹配。如果警报与节点的任何子节点都不匹配(不匹配的子节点或不存在子节点),则根据当前节点的配置参数来处理警报。

 

##################### 修正线

[ receiver:  ]
#根据group_by传入的标签对报警进行分组,例如,针对cluster=A和alertname=LatencyHigh的多个警报将被分为一个组。
#要按所有可能的标签进行聚合,请使用特殊值'...'作为唯一的标签名称,例如:group_by:['...']
#这样可以有效地完全禁用聚合,按原样传递所有警报。 除非您的警报量非常低或上游通知系统执行自己的分组,否则这不太可能是您想要的。
[ group_by: '[' , ... ']' ]

# 报警是否应继续匹配后续的同级节点。
[ continue:  | default = false ]

# 报警必须满足匹配某些标签才能匹配节点。
match:
  [ : , ... ]

# 报警必须满足标签匹配某些正则表达式才能匹配节点。
match_re:
  [ : , ... ]

#最初发送一组警报通知的等待时间。 允许等待禁止警报到达或为同一组收集更多初始警报。 (通常0秒到几分钟。)
[ group_wait:  | default = 30s ]

#在发送有关新报警的通知之前要等待多长时间,该通知已添加到已经发送了初始通知的一组警报中。 (通常5m或更多。)
[ group_interval:  | default = 5m ]

#如果已经成功发送报警通知,则等待多长时间才能再次发送通知。 (通常3h或更长时间)。
[ repeat_interval:  | default = 4h ]

# 零个或多个子路由。
routes:
  [ -  ... ]

# The root route with all parameters, which are inherited by the child
# routes if they are not overwritten.
route:
  receiver: 'default-receiver'
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  group_by: [cluster, alertname]
  #与以下子路由不匹配的所有报警将保留在根节点上,并分派给'default-receiver'。
  routes:
  #所有具有service=mysql或service=cassandra的报警将分派到database-pager。
  - receiver: 'database-pager'
    group_wait: 10s
    match_re:
      service: mysql|cassandra
  # 所有带有team=frontend标签的警报均与此子路由匹配。
  # 将它们按product和environment分组,而不是按cluster和altername分组。
  - receiver: 'frontend-pager'
    group_by: [product, environment]
    match:
      team: frontend

当存在与另一组匹配器匹配的报警(源)时,禁止规则会使与一组匹配器匹配的报警(目标)静默。目标报警和源报警的equal列表中的标签名称都必须具有相同的标签值。

从语义上说,缺少标签和带有空值的标签是同一件事。因此,如果equal源警报和目标警报都缺少列出的所有标签名称,则将应用禁止规则。

为了防止警报禁止自身,与规则的目标和源端匹配的警报不能被警报(包括其本身)为真来禁止。但是,我们建议选择目标匹配器和源匹配器,以使警报永远不会匹配双方。这很容易推理,并且不会触发这种特殊情况。

# Matchers that have to be fulfilled in the alerts to be muted.
target_match:
  [ : , ... ]
target_match_re:
  [ : , ... ]

# Matchers for which one or more alerts have to exist for the
# inhibition to take effect.
source_match:
  [ : , ... ]
source_match_re:
  [ : , ... ]

# Labels that must have an equal value in the source and target
# alert for the inhibition to take effect.
[ equal: '[' , ... ']' ]


例如,定义如下抑制规则(参考https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/alert/alert-manager-inhibit):

- source_match:
    alertname: NodeDown
    severity: critical
  target_match:
    severity: warning
  equal: ['node']

当集群中的某一个主机节点异常宕机导致告警NodeDown被触发,同时在告警规则中定义了告警级别severity=critical。由于主机异常宕机,该主机上部署的所有服务、中间件会不可用并触发报警。根据抑制规则的定义,如果有新的告警级别为severity=warning且告警规则中标签node的值与NodeDown这个告警规则中的标签node的值相同,则说明新的告警是由NodeDown导致的,则启动抑制机制停止向接收器发送通知。

 

http_config允许接收方使用基于HTTP的API来配置HTTP客户端。

#注意`basic_auth`,`bearer_token`和`bearer_token_file`选项是互斥的。
#使用配置的用户名和密码设置“ Authorization”标头。
#password和password_file是互斥的。
basic_auth:
  [ username:  ]
  [ password:  ]
  [ password_file:  ]

# 使用配置的令牌设置“ Authorization”标头。
[ bearer_token:  ]

# 使用从配置文件中读取的令牌来设置“ Authorization”标头。
[ bearer_token_file:  ]

# 配置TLS的设置。
tls_config:
  [  ]

# 可选的代理URL。
[ proxy_url:  ]

 tls_config允许配置TLS连接。

# 用于验证服务器证书的CA证书。
[ ca_file:  ]

# 用于服务器的客户端证书身份验证的证书和密钥文件。
[ cert_file:  ]
[ key_file:  ]

# ServerName扩展名,指示服务器的名称。
# http://tools.ietf.org/html/rfc4366#section-3.1
[ server_name:  ]

# 禁用服务器证书的验证。
[ insecure_skip_verify:  | default = false]

接收器是一个或多个通知集成的命名配置。

我们不会积极添加新的接收器,建议通过webhook接收器实现自定义通知集成。

#接收者的唯一名称。
name: 

# 多个通知集成的配置。
email_configs:
  [ - , ... ]
hipchat_configs:
  [ - , ... ]
pagerduty_configs:
  [ - , ... ]
pushover_configs:
  [ - , ... ]
slack_configs:
  [ - , ... ]
opsgenie_configs:
  [ - , ... ]
webhook_configs:
  [ - , ... ]
victorops_configs:
  [ - , ... ]
wechat_configs:
  [ - , ... ]

# 是否通知已解决的警报。
[ send_resolved:  | default = false ]

# 发送通知的电子邮件地址。
to: 

# 发件人地址。
[ from:  | default = global.smtp_from ]

# 通过其发送电子邮件的SMTP主机。
[ smarthost:  | default = global.smtp_smarthost ]

# 标识到SMTP服务器的主机名。
[ hello:  | default = global.smtp_hello ]

# SMTP身份验证信息。
[ auth_username:  | default = global.smtp_auth_username ]
[ auth_password:  | default = global.smtp_auth_password ]
[ auth_secret:  | default = global.smtp_auth_secret ]
[ auth_identity:  | default = global.smtp_auth_identity ]

# SMTP TLS要求。
# 请注意,Go不支持与远程SMTP端点的未加密连接。
[ require_tls:  | default = global.smtp_require_tls ]

# TLS configuration.
tls_config:
  [  ]

# 电子邮件通知的HTML正文。
[ html:  | default = '{{ template "email.default.html" . }}' ]
# 电子邮件通知的文本正文。
[ text:  ]

# 进一步的标题电子邮件标题键/值对。 覆盖先前由通知实现设置的所有标头。
[ headers: { : , ... } ]

HipChat通知使用“ 自己构建”集成。

# Whether or not to notify about resolved alerts.
[ send_resolved:  | default = false ]

# The HipChat Room ID.
room_id: 
# The auth token.
[ auth_token:  | default = global.hipchat_auth_token ]
# The URL to send API requests to.
[ api_url:  | default = global.hipchat_api_url ]

# See https://www.hipchat.com/docs/apiv2/method/send_room_notification
# A label to be shown in addition to the sender's name.
[ from:   | default = '{{ template "hipchat.default.from" . }}' ]
# The message body.
[ message:   | default = '{{ template "hipchat.default.message" . }}' ]
# Whether this message should trigger a user notification.
[ notify:   | default = false ]
# Determines how the message is treated by the alertmanager and rendered inside HipChat. Valid values are 'text' and 'html'.
[ message_format:   | default = 'text' ]
# Background color for message.
[ color:   | default = '{{ if eq .Status "firing" }}red{{ else }}green{{ end }}' ]

# The HTTP client's configuration.
[ http_config:  | default = global.http_config ]

通过PagerDuty API发送PagerDuty通知。PagerDuty提供有关如何集成的文档。Alertmanager的v0.11与重要的区别在于对PagerDuty的Events API v2的更大支持。

# Whether or not to notify about resolved alerts.
[ send_resolved:  | default = true ]

# The following two options are mutually exclusive.
# The PagerDuty integration key (when using PagerDuty integration type `Events API v2`).
routing_key: 
# The PagerDuty integration key (when using PagerDuty integration type `Prometheus`).
service_key: 

# The URL to send API requests to
[ url:  | default = global.pagerduty_url ]

# The client identification of the Alertmanager.
[ client:   | default = '{{ template "pagerduty.default.client" . }}' ]
# A backlink to the sender of the notification.
[ client_url:   | default = '{{ template "pagerduty.default.clientURL" . }}' ]

# A description of the incident.
[ description:  | default = '{{ template "pagerduty.default.description" .}}' ]

# Severity of the incident.
[ severity:  | default = 'error' ]

# A set of arbitrary key/value pairs that provide further detail
# about the incident.
[ details: { : , ... } | default = {
  firing:       '{{ template "pagerduty.default.instances" .Alerts.Firing }}'
  resolved:     '{{ template "pagerduty.default.instances" .Alerts.Resolved }}'
  num_firing:   '{{ .Alerts.Firing | len }}'
  num_resolved: '{{ .Alerts.Resolved | len }}'
} ]

# Images to attach to the incident.
images:
  [  ... ]

# Links to attach to the incident.
links:
  [  ... ]

# The HTTP client's configuration.
[ http_config:  | default = global.http_config ]

这些字段记录在PagerDuty API文档中。

href: 
source: 
alt: 

这些字段记录在PagerDuty API文档中。

href: 
text: 

通过Pushover API发送Pushover通知。

# Whether or not to notify about resolved alerts.
[ send_resolved:  | default = true ]

# The recipient user’s user key.
user_key: 

# Your registered application’s API token, see https://pushover.net/apps
token: 

# Notification title.
[ title:  | default = '{{ template "pushover.default.title" . }}' ]

# Notification message.
[ message:  | default = '{{ template "pushover.default.message" . }}' ]

# A supplementary URL shown alongside the message.
[ url:  | default = '{{ template "pushover.default.url" . }}' ]

# Priority, see https://pushover.net/api#priority
[ priority:  | default = '{{ if eq .Status "firing" }}2{{ else }}0{{ end }}' ]

# How often the Pushover servers will send the same notification to the user.
# Must be at least 30 seconds.
[ retry:  | default = 1m ]

# How long your notification will continue to be retried for, unless the user
# acknowledges the notification.
[ expire:  | default = 1h ]

# The HTTP client's configuration.
[ http_config:  | default = global.http_config ]

Slack通知通过Slack webhooks发送。通知包含附件。

# Whether or not to notify about resolved alerts.
[ send_resolved:  | default = false ]

# The Slack webhook URL.
[ api_url:  | default = global.slack_api_url ]

# The channel or user to send notifications to.
channel: 

# API request data as defined by the Slack webhook API.
[ icon_emoji:  ]
[ icon_url:  ]
[ link_names:  | default = false ]
[ username:  | default = '{{ template "slack.default.username" . }}' ]
# The following parameters define the attachment.
actions:
  [  ... ]
[ callback_id:  | default = '{{ template "slack.default.callbackid" . }}' ]
[ color:  | default = '{{ if eq .Status "firing" }}danger{{ else }}good{{ end }}' ]
[ fallback:  | default = '{{ template "slack.default.fallback" . }}' ]
fields:
  [  ... ]
[ footer:  | default = '{{ template "slack.default.footer" . }}' ]
[ pretext:  | default = '{{ template "slack.default.pretext" . }}' ]
[ short_fields:  | default = false ]
[ text:  | default = '{{ template "slack.default.text" . }}' ]
[ title:  | default = '{{ template "slack.default.title" . }}' ]
[ title_link:  | default = '{{ template "slack.default.titlelink" . }}' ]
[ image_url:  ]
[ thumb_url:  ]

# The HTTP client's configuration.
[ http_config:  | default = global.http_config ]

这些字段记录在Slack API文档中,用于消息附件和交互式消息。

text: 
type: 
# Either url or name and value are mandatory.
[ url:  ]
[ name:  ]
[ value:  ]

[ confirm:  ]
[ style:  | default = '' ]

这些字段记录在Slack API文档中。

text: 
[ dismiss_text:  | default '' ]
[ ok_text:  | default '' ]
[ title:  | default '' ]

这些字段记录在Slack API文档中。

title: 
value: 
[ short:  | default = slack_config.short_fields ]

OpsGenie通知是通过OpsGenie API发送的。

# Whether or not to notify about resolved alerts.
[ send_resolved:  | default = true ]

# The API key to use when talking to the OpsGenie API.
[ api_key:  | default = global.opsgenie_api_key ]

# The host to send OpsGenie API requests to.
[ api_url:  | default = global.opsgenie_api_url ]

# Alert text limited to 130 characters.
[ message:  ]

# A description of the incident.
[ description:  | default = '{{ template "opsgenie.default.description" . }}' ]

# A backlink to the sender of the notification.
[ source:  | default = '{{ template "opsgenie.default.source" . }}' ]

# A set of arbitrary key/value pairs that provide further detail
# about the incident.
[ details: { : , ... } ]

# List of responders responsible for notifications.
responders:
  [ -  ... ]

# Comma separated list of tags attached to the notifications.
[ tags:  ]

# Additional alert note.
[ note:  ]

# Priority level of alert. Possible values are P1, P2, P3, P4, and P5.
[ priority:  ]

# The HTTP client's configuration.
[ http_config:  | default = global.http_config ]

# Exactly one of these fields should be defined.
[ id:  ]
[ name:  ]
[ username:  ]

# "team", "user", "escalation" or schedule".
type: 

VictorOps通知通过VictorOps API发送

# Whether or not to notify about resolved alerts.
[ send_resolved:  | default = true ]

# The API key to use when talking to the VictorOps API.
[ api_key:  | default = global.victorops_api_key ]

# The VictorOps API URL.
[ api_url:  | default = global.victorops_api_url ]

# A key used to map the alert to a team.
routing_key: 

# Describes the behavior of the alert (CRITICAL, WARNING, INFO).
[ message_type:  | default = 'CRITICAL' ]

# Contains summary of the alerted problem.
[ entity_display_name:  | default = '{{ template "victorops.default.entity_display_name" . }}' ]

# Contains long explanation of the alerted problem.
[ state_message:  | default = '{{ template "victorops.default.state_message" . }}' ]

# The monitoring tool the state message is from.
[ monitoring_tool:  | default = '{{ template "victorops.default.monitoring_tool" . }}' ]

# The HTTP client's configuration.
[ http_config:  | default = global.http_config ]

Webhook接收器允许配置通用接收器。

# Whether or not to notify about resolved alerts.
[ send_resolved:  | default = true ]

# The endpoint to send HTTP POST requests to.
url: 

# The HTTP client's configuration.
[ http_config:  | default = global.http_config ]

Alertmanager将以以下JSON格式向配置的端点发送HTTP POST请求:

{
  "version": "4",
  "groupKey": ,    // key identifying the group of alerts (e.g. to deduplicate)
  "status": "",
  "receiver": ,
  "groupLabels": ,
  "commonLabels": ,
  "commonAnnotations": ,
  "externalURL": ,  // backlink to the Alertmanager.
  "alerts": [
    {
      "status": "",
      "labels": ,
      "annotations": ,
      "startsAt": "",
      "endsAt": "",
      "generatorURL":  // identifies the entity that caused the alert
    },
    ...
  ]
}
 
  

有此功能的集成列表 。

微信通知通过WeChat API发送。

# Whether or not to notify about resolved alerts.
[ send_resolved:  | default = false ]

# The API key to use when talking to the WeChat API.
[ api_secret:  | default = global.wechat_api_secret ]

# The WeChat API URL.
[ api_url:  | default = global.wechat_api_url ]

# The corp id for authentication.
[ corp_id:  | default = global.wechat_api_corp_id ]

# API request data as defined by the WeChat API.
[ message:  | default = '{{ template "wechat.default.message" . }}' ]
[ agent_id:  | default = '{{ template "wechat.default.agent_id" . }}' ]
[ to_user:  | default = '{{ template "wechat.default.to_user" . }}' ]
[ to_party:  | default = '{{ template "wechat.default.to_party" . }}' ]
[ to_tag:  | default = '{{ template "wechat.default.to_tag" . }}' ]

你可能感兴趣的:(Prometheus)