2020年8月5日水曜日

Gitlab のアラート管理機能を使ってみた

概要

Gitlab のアラート機能を使ってみました
簡単に言うと Gitlab 側でインシデントを管理できる機能です
Generics と Prometheus 連携できるアラートがあるのでどちらも試してみました

環境

  • GitLab Enterprise Edition 13.2.2-ee
  • Prometheus 2.20.0
    • AlertManager 0.21.0
    • node_exporter 1.0.1

アラートを有効にする

まずは Gitlab 側でアラート管理機能を有効にする必要があります
アラート管理機能は各プロジェクトごとに有効にする必要があります
左メニューの「Settings」->「Operations」と進みます

そして「Alerts」の項目を Expand すると「Active」というトグルスイッチがあるのでこれをオンにします
そして下にある「Save Changes」を選択します

すると Webhook URL と Authorization key が発行されるのでこれを使ってインシデントを情報を Gitlab に送信することができるようになります

テスト送信してみる

試してに仮想インシデント情報として適当なペイロードを送信してみます
「Alert test payload」に適当な JSON を入力し「Test alert payload」を選択します 

これで Webhook URL に対してペイロードが送信され Gitlab 上にインシデント情報が貯まっていきます

curl でテスト送信してみる

先程 UI で行ったことを curl でも行ってみます
リクエストは単純な Webhook リクエストなので POST で送信すれば OK です

curl -XPOST 'https://your.gitlab.url/root/test/alerts/notify.json' \
-H "Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d @- << EOF
{
  "key": "value from curl"
}
EOF

これで同様に curl からのインシデント情報も Gitlab に登録されました

プロジェクトに届いたアラートを確認する

プロジェクトに貯まったアラート情報を確認するには左メニューから「Operations」->「Alerts」と進みます
すると以下のようにテストで送信された 2 つのアラート情報が登録されているのが確認できると思います

UI と curl で送信したカスタムペイロードは各アラートをクリックすると詳細を確認できます

Prometheus からアラート情報を飛ばしてみる

先程は UI と curl からアラート情報を飛ばしましたが今度は Prometheus から飛ばしてみたいと思います
Prometheus には Webhook を飛ばせる機能がすでにあるのでそれを使って Gitlab 上にアラート情報を飛ばします

External Prometheus を有効にする

次にアラート管理機能の External Prometheus を有効にします
Active をオンにして Save Changes しましょう
API URL がブランクだと怒られるので Prometheus を構築した URL を入れましょう
ただローカル IP だと登録できないので適当な URL を指定したら OK だったので今回は適当な URL を指定しました
Authorization key が発行されない場合は「Reset key」を選択して再発行しましょう

Prometheus 側の設定と構築

Prometheus の構築はこちらを御覧ください
今回はローカルの Mac 上に Prometheus を構築しました
ポイントは alertmanager.yml でここに Gitlab で払い出された Webhook URL と Authorization key を指定します

prometheus.yml と alerts.rule は Prometheus サーバを起動するマシンに配置しましょう
alertmanager.yml は AlertManager を起動するマシンに配置しましょう

  • vim prometheus.yml
global:
  scrape_interval:     15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - '192.168.100.1:9093'

rule_files:
  - 'alerts.rule'

scrape_configs:
  - job_name: 'worker'
    static_configs:
    - targets: ['192.168.100.10:9100']
  • vim alerts.rule
groups:
  - name: 'Check active memory bytes'
    rules:
    - alert: 'Worker memory usage alert'
      expr: node_memory_Active_bytes{instance="192.168.100.10:9100",job="worker"} > 800000000
      for: 5s
      annotations:
        summary: 'Worker memory usage is over 800MB'
  • vim alertmanager.yml
route:
  receiver: 'default_receiver'
receivers:
- name: 'default_receiver'
  webhook_configs:
    - http_config:
        bearer_token: xxxxxxxxxxxxxxxxxxxxxxxxxxx
      send_resolved: true
      url: https://your.gitlab.url/root/test/alerts/notify.json

監視対象の exporter の起動します (192.168.100.10)

  • docker run -d --net="host" --pid="host" quay.io/prometheus/node-exporter

アラートマネージャを起動します (192.168.100.10)

  • docker run -d -p 9093:9093 --name alertmanager -v $(pwd):/alertmanager prom/alertmanager --config.file=/alertmanager/alertmanager.yml

最後に Prometheus を起動します (192.168.100.1)

  • docker run -d -p 9090:9090 -v $(pwd):/prometheus-data prom/prometheus --config.file=/prometheus-data/prometheus.yml

動作確認

今回の条件はメモリの使用量を 800MB にすれば alertmanager が検知し Webhook を送信してくれる想定です

  • stress --vm 1 --vm-keep

--vm-keep を入れておかないとすぐにアラートが解消してしまい AlertManager が検知しないので --vm-keep を設定します
しばらくすると AlertManager 側にアラートが上がるのが確認できると思います (192.168.100.10:9093)

そして Gitlab 側のアラートの一覧を見るとちゃんと Webhook が送信されて一覧に登録されているのが確認できると思います

最後に

Gitlab のアラート管理機能を使ってみました
ユースケースとしてはプロジェクトのソースコードがデプロイされている環境で何かあったら Webhook を飛ばしてリソースのアラート管理やエラーのトレースなどを行う感じかなと思います
使いようによっては Google の StackDriver や iOS の Crashlytics のように使うこともできるかなと思います

参考サイト

0 件のコメント:

コメントを投稿