0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AlertManagerの通知をjobごとに分ける(実例を交えながらやってみた)

Last updated at Posted at 2024-12-16

初めに

こんにちは.自分ごとですが,最近AlertManagerを触る機会が多かったのですが,その際にアラートをjobごとに分ける方法について学んだのでまとめておきます.他の記事を見ても実際に通知されたアラートを交えながら話している人少ないので,誰かの助けになるといいです!

Alertのjobごとに分けるとは?

今回はAlertを通知するための専用コンポーネントである,AlertManagerを用いてSlackのチャンネルに通知する場合で考えてみましょう.jogごとにアラートを分ける際にPrometheusのjobというタグを用いて通知されたアラートをまとめる設定のことを言います.これだけ聞くと何を言っているのかよくわからないと思いますので例を出して説明します.
image.png

例えば,監視対象としてAからDがあるとします.Blackbox exporterはAからDに対してICMPの疎通確認の監視を行います.PrometheusはBlackbox exporterから監視結果を取得します.監視対象AからDが何かしらの影響で疎通確認できない場合,Prometheusがアラートを出し,それをAlertManagerに通知するように依頼します. 

ここでAlertManagerの出番です.通知されたアラートをjobごとに分けない場合,1件の通知にまとまって通知されます.また,jobごとに分ける場合,監視対象AとB,監視対象CとDごとに分けることができます.

あとは実行例と設定をそれぞれ見てみましょう.

環境

今回は以下の構成で環境を作成します.監視対象と監視サーバを含めて合計6台です.


監視対象(Kubernetesクラスタ)

  • Master(1台)
    • CPU(4GB)
    • Memory(4GB)
    • Storage(30GB)
  • Worker(3台)
    • CPU(4GB)
    • Memory(4GB)
    • Storage(30GB)

監視サーバ(Kubernetesクラスタ)

  • Master(1台)
    • CPU(4GB)
    • Memory(4GB)
    • Storage(30GB)
  • Worker(1台)
    • CPU(4GB)
    • Memory(4GB)
    • Storage(30GB)

ソフトウェア

  • AlertManager
  • Prometheus
  • Blackbox-exporter

通知対象

  • Slack
    monitoring-alert-v2という名前のチャンネルに通知する.

設定

Slack
最初に通知先となるSlackの設定を行いましょう.
https://api.slack.com/messaging/webhooks

この記事を元にWebhook URLを取得しましょう.後で使います.

Prometheus
以下に設定項目は全て載せておきます.
https://github.com/cdsl-research/Prometheus-tmp-cdsl

まずはどの監視対象を監視するかの設定です.こちらはPrometheusの設定ファイル内でjobごとに分けます.jobごとに分けると後でPrometheusのブラウザ上でjobというタグを選択できるようになります.AlertManagerはアラートが通知された時にそのタグを用いてjobごとにアラートを分割します.
prometheus-configmap2.yaml

- job_name: 'ICMP-Black-box-test1'
  scrape_interval: 1m
  metrics_path: /probe
  params:
    module: [icmp]
  static_configs:
    - targets:
      - outside-prometheus-ml5 
      - outside-prometheus-wc1
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: monitoring-master-ml:30000

- job_name: 'ICMP-Black-box-test2'
  scrape_interval: 1m
  metrics_path: /probe
  params:
    module: [icmp]
  static_configs:
    - targets:
      - outside-prometheus-wc2
      - outside-prometheus-wc3
  relabel_configs:
    - source_labels: [__address__]
      target_label: __param_target
    - source_labels: [__param_target]
      target_label: instance
    - target_label: __address__
      replacement: monitoring-master-ml:30000

こんな感じで設定します.あとはPrometheusでアラートを出す設定です.
test-alert.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: test-alert-rule
  namespace: monitoring
data:
  test-alert.yml: |-
    groups:
    - name: Traffic-Check
      rules:
      ### ICMP
      - alert: ICMP-Check
        annotations:
          description: "Instance {{$labels.instance}}"
          runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerfailedreload
          summary: "ICMP not connect"
        expr: probe_success{job=~"ICMP-Black-box-test1|ICMP-Black-box-test2"}
        for: 3m
        labels:
          severity: critical

今回はテストでアラートを出すだけなので,exprの部分はprobe_successだけ入れて比較演算子入れません.このように演算子を使わない場合,監視対象のOSに対してICMPの接続応答ができている状態でもアラートを通知させることができます.

これで準備完了です.あとは,アラートを分割するだけです.

通知の仕方を変更してみる

AlertManager
AlertManagerの設定は以下のようにしておきましょう.
alertmanager-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: alertmanager
data:
  config.yml: |-
    global:
      resolve_timeout: 1m
      slack_api_url: https://hooks.slack.com/services/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

    inhibit_rules:
      - equal:
          - namespace
          - alertname
        source_matchers:
          - severity = critical
        target_matchers:
          - severity =~ warning|info|attention
      - equal:
          - namespace
          - alertname
        source_matchers:
          - severity = warning
        target_matchers:
          - severity = info
      - equal:
          - namespace
        source_matchers:
          - alertname = InfoInhibitor
        target_matchers:
          - severity = info
      - target_matchers:
          - alertname = InfoInhibitor

    receivers:
      - name: "null"
      - name: slack
        slack_configs:
          - channel: '#monitoring-alert-v2'  # 通知を送信するSlackのチャンネル
            send_resolved: true
            text: |-
              {{ range .Alerts }}
                *アラート:* {{ .Labels.alertname }} 
                *概要:* {{ if .Annotations.summary }}{{ .Annotations.summary }}{{ else }}概要なし{{ end }}
                *ランブック:* {{ if .Annotations.runbook_url }}{{ .Annotations.runbook_url }}{{ else }}https://github.com/prometheus-operator/runbooks/{{ end }}
                *重大度:* {{ .Labels.severity }}
                *詳細情報:*
                  • *alertname:* {{ .Labels.alertname }}
                  • *instance:* {{ if .Labels.instance }}{{ .Labels.instance }}{{ else }}N/A{{ end }}
                  • *job:* {{ if .Labels.job }}{{ .Labels.job }}{{ else }}N/A{{ end }}
                  • *description:* {{ if .Annotations.description }}{{ .Annotations.description }}{{ else }}説明なし{{ end }}
              {{ end }}
            title: '[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] 監視イベント通知'

    route:
      group_interval: 3m
      group_wait: 3m
      group_by:
        #- alertname  # 'alertname'でグループ化
        #- instance   # 'instance'でもグループ化
        #- severity
        #- job
      repeat_interval: 12h
      receiver: "slack"  # デフォルトレシーバを "slack" に設定
      routes:
        - match:
            alertname: DeadMansSwitch
          receiver: "null"
        - receiver: slack  # Slackへの通知
          continue: true  # Slackへ通知後も続行しない

ここで大事になるのがgroup_byの設定です.これを使うと何によってアラートを分割して通知するかを設定できます.
では,ここに何も入れない上記の設定では何が通知されるでしょう?

スクリーンショット 2024-12-16 21.53.52.png

答えはこうです.1件のアラート通知に全ての対象がまとめて入っています.

でもこれではみにくいですよね.ではこうしてみましょう.

group_by:
  #- alertname  # 'alertname'でグループ化
  #- instance   # 'instance'でもグループ化
  #- severity
  - job

jobごとにアラートの通知をするとどうなるでしょうか?

スクリーンショット 2024-12-16 22.04.46.png

Prometheus側のjobごとにAlertManagerがアラートの通知を分けていますね.
こんな感じでアラートが2つのjobに分かれて通知されています.これを使うとアラートを見やすくすることができますね.

最後に

アラートの通知は障害発生時に発生箇所を特定することの手助けになりますが,逆に多くなってしまうとどの対象からアラートが通知されているかわからない原因になってしまいます.それを避けるためにもこのようなグループ化の設定を入れて普段から分けておくといいと思います.勉強中なので今後も発信していきます.

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?