Grafana ダッシュボードを構築する

## 概要

この記事では、Grafana でダッシュボードを構築し、監視を行うまでの方法について記載します。

## ダッシュボード利用シナリオと Grafana の変数

### ダッシュボード利用シナリオ

- **ユーザー入力に基づくビューの更新**: ユーザーが入力した値に基づき、ダッシュボードの表示内容が変更される
- **シナリオ**: 特定の国からの怪しいログイン試行を検出する

※Grafana 上の変数(Variables)を使用することで、ユーザーがクエリやパネルを動的に変更できるようになり、より柔軟なダッシュボードにすることができます。  
※データソース接続上の設定は済ませた前提で記載しています。[Azure Monitor data source](https://grafana.com/docs/grafana/latest/datasources/azure-monitor/)参照。

### Grafana の変数

ダッシュボード利用シナリオにおける「ユーザーが入力した値」を格納し、ユーザーが入力できる UI も自動でダッシュボードに追加されます。  
※分かりやすい記事があり、[Grafana で Variables を使う](https://qiita.com/siwa/items/f83bfb97ca92514dcb9a)を引用させてもらいます。

#### 主な変数の種類

- **クエリ変数**: データソースから直接値を取得し、それに基づいてダッシュボードが動的に更新されます。
- **定数変数**: ユーザーが定義した固定値。設定や表示オプションのカスタマイズに利用されます。

※本記事では**定数変数**を入力値として想定します。

## ダッシュボード利用シナリオ実践例

それぞれ分かりやすい関連情報がありましたので、引用で進めさせていただきます。

1. Grafana ダッシュボード・パネルの追加とデータソース指定  
   [Azure Monitor のデータを Grafana で可視化する](https://qiita.com/whata/items/4be2eefdf983aa7fb0ab)

1. Grafana の変数追加  
   [Grafana で Variables を使う](https://qiita.com/siwa/items/f83bfb97ca92514dcb9a)

1. Grafana ダッシュボード・パネルを編集し、Kusto Query Language（KQL）を記述  
   [Query Azure Monitor Logs](https://grafana.com/docs/grafana/latest/datasources/azure-monitor/query-editor/#query-azure-monitor-logs)

1. シナリオを満たす例
   Azure Active Directory のログインログ（SigninLogs）を分析して、怪しいログイン試行を検出する。

   - KQL を使用したクエリ例
     変数`country_name`を使用して特定の国からの怪しいログイン試行を検出するクエリ例です。  
      変数`country_name`の設定は、プルダウン形式のリストでも、テキストボックスからの入力でも対応可能です。  
      このクエリでは、選択された国からのログイン試行で失敗したもの（通常と異なる失敗コードを含む）を時間別に集計し、原因ごとに表示します。

     ```kusto
     SigninLogs
     | where Location == '${country_name}'
     | where ResultType !in ("0", "50125", "50140")
     | extend Reason = case(
         ResultType == "50053", "Expired Password",
         ResultType == "50126", "Invalid Username or Password",
         ResultType == "51000", "Prevented by Conditional Access Policy",
         "Other"
     )
     | summarize Count = count() by Reason, bin(TimeGenerated, 1h)
     | render timechart
     ```

   - アラートをあげるなら

   分かりやすい関連情報がありましたので、引用させていただきます。

   1. アラートの作成  
      [アラートの作成](https://qiita.com/frozencatpisces/items/c4b601084250a7ce7091#2-%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)

   1. アラートルール設定  
      条件設定では、どのような状況をアラートとするかを定義します。  
      例として、選択された国からのログイン試行で失敗したもの（通常と異なる失敗コードを含む）について、一定数を超えた場合にアラートを発する設定です。  
      この条件は、「過去 15 分間に特定の国からの失敗ログイン試行が 5 回以上あった場合にアラートを発する」というものです。

      ```plaintext
      WHEN count() OF query(A, 15m, now) IS ABOVE 5
      ```

   1. 通知の設定  
      アラートがトリガされた際にどこに通知するかを設定します。Grafana は Email, Slack, Webhook など多くの通知チャンネルをサポートしています。以下は Email に通知を送る設定の例です。

   - **通知チャンネルの設定**  
      Grafana の「Alerting」メニューから「Notification channels」を選択し、「Add channel」をクリックします。
   - **チャンネルタイプと設定**  
      「Type」で「Email」を選択し、必要な情報（SMTP サーバーアドレス、ポート番号、認証情報など）を入力します。

   - **アラートルールに通知を追加**  
      作成したアラートルールに戻り、通知セクションで先ほど作成した Email チャンネルを選択します。
     ```yaml
     # アラートルール設定例
     name: "Failed Login Attempts Alert"
     conditions:
     [
         {
         evaluator: { "type": "lt", "params": [5] },
         operator: { "type": "and" },
         query: { "params": ["A", "15m", "now"] },
         reducer: { "type": "count" },
         },
     ]
     notifications: [{ uid: "email-channel-1" }]
     ```

## Grafana ダッシュボードのパフォーマンス改善

Grafana のダッシュボードは、データ可視化やモニタリングにおいて非常に重要ですが、大量のデータや複雑なクエリを扱う場合にはパフォーマンスの問題が発生することがあります。  
ここでは、Grafana ダッシュボードのパフォーマンスを向上させるための対策について紹介します。  
Grafana ダッシュボードに閉じた対策としては、１～３の中からの選択が初動となります。

1. クエリの最適化

   - **不要なクエリの削除:** ダッシュボードに表示するために必要なデータだけを取得するようにクエリを最適化する。
   - **クエリの間引き:** 適切な間引きを行うことで、表示するデータ量を減らしパフォーマンスを向上させる。

1. キャッシュの活用

   - **クエリ結果のキャッシュ:** クエリ結果をキャッシュすることで、再計算を回避しパフォーマンスを向上させる。
   - **ブラウザキャッシュの活用:** グラフやパネルが頻繁に変更されない場合、ブラウザキャッシュを有効にすることで表示速度を向上させる。

1. ダッシュボードの最適化

   - **不要なパネルの削除:** 表示する必要がないパネルは削除することで、表示速度を向上させる。
   - **データのサマリー表示:** ダッシュボードに表示するデータをサマリー表示することで、表示するデータ量を減らしパフォーマンスを向上させる。

1. サーバー側の最適化
   - **データベースの最適化:** Grafana が利用するデータベースを最適化することで、クエリのパフォーマンスを向上させる。
   - **サーバーのリソース拡張:** サーバーのリソースを拡張することで、ダッシュボードのパフォーマンスを向上させる。

## 参考記事

- [Azure Monitor のデータを Grafana で可視化する](https://qiita.com/whata/items/4be2eefdf983aa7fb0ab)
- [Grafana で Variables を使う](https://qiita.com/siwa/items/f83bfb97ca92514dcb9a)
- [Query Azure Monitor Logs](https://grafana.com/docs/grafana/latest/datasources/azure-monitor/query-editor/#query-azure-monitor-logs)
- [Grafana: Prometheus で取り込んだデータを監視して LINE にアラートメッセージを出してみた](https://qiita.com/frozencatpisces/items/c4b601084250a7ce7091)