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

## はじめに

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

https://grafana.com/docs/grafana/latest/whatsnew/whats-new-in-v8-0/

## tl;dr

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

```toml
[feature_toggles]
enable = ngalert
```

## やりたいこと

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

![](https://datadog-docs.imgix.net/images/monitors/monitor_types/log/top_10_breaching_values.7d27085023d7dab4f54bc6cf07f04084.png?fit=max&auto=format)

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

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

```bash:grafanaを起動
git clone --depth=1 https://github.com/grafana/grafana
cd grafana
go run ./pkg/cmd/grafana-server
```
`go run` するだけだと思ったけど嘘でした。Grafanaはwebサーバなので、yarnも必要です。

```bash:grafanaのwebビルド
yarn
yarn start
```
再度 `grafana` を起動

```bash: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` に変えておく。

```bash
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
```


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

```toml:conf/defaults.ini
[feature_toggles]
enable = ngalert
```

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

![Screen Shot 2021-08-24 at 10.11.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250075/5f37657a-c750-e8fb-1950-3b9cd381ec8a.png)

## ログを確認

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

```bash
echo HelloWorld > /tmp/log/helloworld.log
```

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

![Screen Shot 2021-08-24 at 10.21.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250075/d2440fc9-4237-7aa6-8a34-4aacfc52a8d5.png)


## アラート作成

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

中身は↓こんな感じ。フォルダがなければ、ダッシュボードのフォルダと同じなので、そっちから作れる。
`logfmt` でラベル化できる。ログがjsonの場合は、`json`を使うと良い。
![Screen Shot 2021-08-24 at 10.25.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250075/71d28235-cf8a-2d40-04bb-126f94125ed4.png)

条件は以下。最小が10秒なので、そうしとくと感度が上がる。すげえ通知くるのでうるさくなったら調整する。
![Screen Shot 2021-08-24 at 10.26.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250075/68299c78-aa80-d223-fc55-38bc90b19fd4.png)

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

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

http://localhost:3000/alerting/notifications

![Screen Shot 2021-08-24 at 10.44.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250075/41367140-4d76-68b7-455f-1e89fbc7dc19.png)

## Slackにアラートを送信

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

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

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

![Screen Shot 2021-08-24 at 10.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250075/cc0cf5f7-d55c-7e4b-daba-2678b7285745.png)

以上！