一、Prometheus 指标收集

下图是 Prometheus WebUI 界面,里面展示了 Targets 和 Endpoint,说明了当前哪些目标服务是可以被 Prometheus 抓取的。

prometheus 监控 Java metrics prometheus 监控指标_prometheus

  • Endpoint:端点,可以抓取的指标来源。
  • Target:目标,包含了端点地址,端口的状态等信息

 下面是 Prometheus 抓取目标的配置:

- job_name: mysqld
    static_configs:
      - targets: ['192.168.0.100:9104']
        labels:
          instance: mysql-exporter
  • Job:代表了一组相同角色或功能的目标。
  • Instance:在当前主机上运行的 exporter 监控程序被称为一个实例。

抓取到目标的指标数据后,会生成时间序列数据,然后存储在 Prometheus 服务器本地,也可以设置从服务器发送数据到外部存储器或其他时间序列数据库。

二、 Prometheus定义告警规则

groups:
- name: mysql_exporter
  rules:
  - alert: MySQL Down
    expr: mysql_up==0
    for: 1m
    labels:
      job: "{{$labels.job}}"
      group: "{{$labels.group}}"
      project: "{{$labels.project}}"
      env: "{{$labels.env}}"
      instance: "{{$labels.instance}}"
      hostIp: "{{$labels.hostIp}}"
      target: "{{$labels.target}}"
      level: 4
      threshold_duration: "1分钟"
    annotations:
      role: "{{$labels.role}}"


  - alert: MySQL服务已重启
    expr: mysql_global_status_uptime < 60
    labels:
      job: "{{$labels.job}}"
      group: "{{$labels.group}}"
      project: "{{$labels.project}}"
      env: "{{$labels.env}}"
      instance: "{{$labels.instance}}"
      hostIp: "{{$labels.hostIp}}"
      target: "{{$labels.target}}"
      level: 3
    annotations:
      role: "{{$labels.role}}"

在告警规则文件中,我们可以将一组相关的规则设置定义在一个group下。在每一个group中我们可以定义多个告警规则(rule)。一条告警规则主要由以下几部分组成:

  • alert:告警规则的名称。
  • expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。
  • for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警,在等待期间新产生告警的状态为pending。
  • labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。
  • annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。

三、抑制规则 

在 Prometheus 的 Alertmanager 中,抑制规则用于控制告警的抑制行为。抑制规则可以在配置文件中使用 `inhibit_rules`(或 `inhibitRules`)字段来定义。抑制规则有几个参数,用于指定抑制条件和行为。以下是抑制规则的主要参数:

  1. `source_match`(可选):用于匹配源告警的标签、注释或源名称。它可以是一个标签名称的列表,也可以使用正则表达式来匹配。当与源告警匹配时,抑制规则会起作用。
  2. `target_match`(可选):用于匹配目标告警的标签、注释或源名称。它可以是一个标签名称的列表,也可以使用正则表达式来匹配。当与目标告警匹配时,抑制规则会起作用。
  3. `equal`(可选):当源告警与目标告警具有相同的指定标签值时,抑制规则会起作用。它是一个标签名称的列表。
  4. `inhibit_until`(可选):指定一个时间段,在该时间段内,目标告警会被抑制。可以使用标准的持续时间格式,例如 "1h30m" 表示1小时30分钟。
  5. `inhibit_if_suppressed`(可选):当设置为 `true` 时,如果源告警处于抑制状态,目标告警会被抑制。这是一种状态抑制规则。

请注意,抑制规则是可选的,并且可以根据需求选择性地使用这些参数。您可以根据实际情况使用不同的参数组合来定义复杂的抑制策略。在配置抑制规则时,请确保仔细检查告警的标签和注释,并根据需要设置正确的匹配条件和时间段,以实现准确和有效的告警抑制。

1、直接抑制规则(直接抑制)

假设有两个告警,一个是 `high_cpu_usage` 告警,另一个是 `service_unavailable` 告警。我们希望在这两个告警的标签 `instance` 相同的情况下,抑制 `service_unavailable` 告警。这可以通过以下配置实现:  

inhibit_rules:
- source_match:
    alertname: 'service_unavailable'
  target_match:
    alertname: 'high_cpu_usage'
  equal: ['instance']

 在上述配置中,我们使用 `source_match` 来匹配 `service_unavailable` 告警,使用 `target_match` 来匹配 `high_cpu_usage` 告警,并使用 `equal` 来指定匹配标签 `instance`。

2. 相对抑制规则(inhibit_until)

假设我们有一个告警 `disk_space_low`,并且希望在该告警触发后的5分钟内抑制相同告警的重复通知。可以使用以下配置:

inhibit_rules:
- target_match:
    alertname: 'disk_space_low'
  inhibit_until: 5m

在上述配置中,我们使用 `target_match` 来匹配 `disk_space_low` 告警,并使用 `inhibit_until` 来指定抑制的时间为5分钟。

 

3. 状态抑制规则(inhibit_if_suppressed)

假设我们有两个告警,一个是 `service_down` 告警,另一个是 `service_critical` 告警。我们希望在 `service_down` 告警处于抑制状态时,抑制 `service_critical` 告警。可以使用以下配置:

inhibit_rules:
- source_match:
    alertname: 'service_critical'
  inhibit_if_suppressed: true

在上述配置中,我们使用 `source_match` 来匹配 `service_critical` 告警,并将 `inhibit_if_suppressed` 设置为 `true`,表示在 `service_down` 告警处于抑制状态时,抑制 `service_critical` 告警。

这些只是简单的示例,实际的抑制规则可能更加复杂,取决于您的具体需求和告警情况。在配置抑制规则时,请确保仔细理解告警的标签、注释和触发条件,并根据实际情况调整抑制规则的配置,以实现准确和有效的告警抑制。