Grafana8 でアラートが大幅なアップデート! - LokiからSlackにログ付きでアラートを出す!


はじめに

Grafana は、v8.0でアラート機能周りにアップデートが入り、メッセージ内容に変数を入れることができるようになった。
本記事では、Prometeusのログ版であるLokiのログを、Slackに送信するというのをやる。

tl;dr

  • v8から使える。ただし、設定ファイルに以下のオプションを追加する必要がある。
  • アラート条件の設定、テンプレートメッセージや通知の停止(Silence)などできることが大幅に増えた。
[feature_toggles]
enable = ngalert

やりたいこと

Datadogのログアラートには、↓のようにそのエラー箇所のログが送信される。これによって、Slackを見るだけである程度エラー内容が把握できる。意外とこれが、今までの Grafana 、GCPの Cloud Logging ではできなくって困っていた。

※ 画像は Datadog公式ドキュメントを引用
https://docs.datadoghq.com/ja/monitors/monitor_types/log/

インストール

GrafanaとLokiを用意する。すでにある人は飛ばしてください。
個人的には学習用だとソースコードからビルドするのがおすすめ。LokiもGrafanaもGoで書かれているので、cmdフォルダを見つけて go run するだけ。(本当はMakefileを見た方がいい)

grafanaを起動
git clone --depth=1 https://github.com/grafana/grafana
cd grafana
go run ./pkg/cmd/grafana-server

go run するだけだと思ったけど嘘でした。Grafanaはwebサーバなので、yarnも必要です。

grafanaのwebビルド
yarn
yarn start

再度 grafana を起動

lokiを起動
git clone --depth=1 https://github.com/grafana/loki
cd loki
go run ./cmd/loki --config.file ./cmd/loki/loki-local-config.yaml

prometheus同様に、exporter が必要。
loki のリポジトリに promtail というのがあり、それがその役割なので起動する。
ログを収集するデフォルトのパスは、/var/log/*log
設定から変えられる。/tmp/log/*log に変えておく。

sed s%/var/log%/tmp/log%g ./clients/cmd/promtail/promtail-local-config.yaml > ./clients/cmd/promtail/promtail-local-config.yaml.new
mv ./clients/cmd/promtail/promtail-local-config.yaml.new ./clients/cmd/promtail/promtail-local-config.yaml

go run ./clients/cmd/promtail -config.file ./clients/cmd/promtail/promtail-local-config.yaml

アラート新機能の有効化

アラートはデフォルトではレガシーが有効になっている。
設定ファイルに、以下を追加すると新機能が使える。

conf/defaults.ini
[feature_toggles]
enable = ngalert

データソースの追加

Grafanaを起動したら、http://localhost:3000/datasourcesから、以下のようにLokiのデータソースを設定する。

ログを確認

まずは、ログを書き込む。

echo HelloWorld > /tmp/log/helloworld.log

GrafanaのExploreで確認する。クエリを打ってもいいですし、おすすめはLog browserと書かれた部分からぽちぽちでクエリ書ける。
http://localhost:3000/explore

アラート作成

アラートのページへ行く。前まではパネルの一部としてアラートが作れたが、今は専用のページから作る。
http://localhost:3000/alerting

中身は↓こんな感じ。フォルダがなければ、ダッシュボードのフォルダと同じなので、そっちから作れる。
logfmt でラベル化できる。ログがjsonの場合は、jsonを使うと良い。

条件は以下。最小が10秒なので、そうしとくと感度が上がる。すげえ通知くるのでうるさくなったら調整する。

メッセージテンプレートの作成

ContactPointsから、Slackの設定をする。Text Bodyには、{{ template "message" . }}を入力し、上部のMessageTemplateにテンプレートを定義する。テンプレートは、Goのテンプレートパッケージを使ってるらしい。https://pkg.go.dev/text/template

Slackにアラートを送信

設定したら、logfmt形式で再度ログを書き込み。

echo "msg=helloworld" > /tmp/log/helloworld.log

ラベルに msg=helloworld が確認できる。

以上!