はじめに
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を見た方がいい)
git clone --depth=1 https://github.com/grafana/grafana
cd grafana
go run ./pkg/cmd/grafana-server
go run
するだけだと思ったけど嘘でした。Grafanaはwebサーバなので、yarnも必要です。
yarn
yarn start
再度 grafana
を起動
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
アラート新機能の有効化
アラートはデフォルトではレガシーが有効になっている。
設定ファイルに、以下を追加すると新機能が使える。
[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
が確認できる。
以上!