Grafanaのアラートを設定してみた

現在、多くの企業でGrafanaを使用して情報を可視化し、インフラストラクチャやデータ内で発生しているイベントについて通知を受けるようにしています。この記事では、Grafana アラートルールの作成と設定方法を紹介します。

まずは、[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20alerting)の[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20alerting)にログインして、メトリクスの送信やGrafanaダッシュボードの作成をプラットフォーム上で行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/6289efdd-c185-c847-e005-b387881fe087.png)


#監視環境を設定する
Grafana アラートの使用方法を説明していくためには、監視環境を設定する必要があります。

この記事では、MetricFireの[サービス化されたGrafana](https://www.metricfire.com/hosted-grafana)のデータソースとしてElasticsearchを使用します。オンプレミスでのインストールに関連した問題を引き起こすことなく、Grafanaを簡単にインストールして設定することができる便利な方法です。ElasticsearchでのGrafanaの使用方法について詳しく知りたい方は、[こちらのチュートリアル](https://qiita.com/TomoEndo/items/1ebc30c9613e2fb7a22d)をご覧ください。

また、MetricFireの無料トライアルでは、他のデータソースを使って簡単に設定することができます。最も一般的なデータソース（StatsD、Collected、AWS、New Relicなど）は製品内のアドオンとして利用できます。また、お使いのシステムからプラットフォームにメトリクスを引っ張ってくる[MetricFireエージェント](https://www.hostedgraphite.com/docs/agent/index.html?_gl=1*6ih3sg*_gcl_aw*R0NMLjE1ODk4OTA3NTMuRUFJYUlRb2JDaE1JNDh1c3lQU182UUlWUWxSZ0NoMGRPd0lZRUFBWUFTQUFFZ0wzSFBEX0J3RQ..&_ga=2.90392666.1704350210.1591577335-2038175526.1567400116&_gac=1.249760306.1589890752.EAIaIQobChMI48usyPS_6QIVQlRgCh0dOwIYEAAYASAAEgL3HPD_BwE)もダウンロードできます。Prometheusの場合は、APIキーを介してMetricFireがデータを読み込めるようにprometheus.ymlファイルを変更することができます。手順は[ドキュメント](https://www.hostedgraphite.com/docs/prometheus/prometheus.html?_gl=1*6ih3sg*_gcl_aw*R0NMLjE1ODk4OTA3NTMuRUFJYUlRb2JDaE1JNDh1c3lQU182UUlWUWxSZ0NoMGRPd0lZRUFBWUFTQUFFZ0wzSFBEX0J3RQ..&_ga=2.90392666.1704350210.1591577335-2038175526.1567400116&_gac=1.249760306.1589890752.EAIaIQobChMI48usyPS_6QIVQlRgCh0dOwIYEAAYASAAEgL3HPD_BwE)に記載されています。

Grafanaで何かを監視しようとするためには、単純なPythonスクリプト（producer）からランダムなデータを生成してElasticsearchのインデックスに送信する必要があります。インデックスにデータを配置するために、今回はLogstashツールを使用します。データはランダムであるにもかかわらず、特定の範囲を与ることもあれば、これと同時に、与えられた範囲から外れたデータを生成することもあります。これは、Grafanaアラートをトリガーする必要がある場合に発生します。

スクリプトは、parameter_1に対して、-5から34までの範囲のランダムな値を生成します。parameter_2では、100～209の範囲の乱数が生成されますが、20秒ごとに250～254の範囲の数値が生成されます。このスクリプトは1秒ごとに新しいデータをLogstashに送信します。これにより、Grafana アラートを作成し実行することに適したデータセットが得られるになります。

#アラートルールの作成と設定方法
アラートに関する通知を受信したい場合は、少なくとも1つの通知チャネルを定義する必要があります。これにより、トリガーされたアラートに関する情報が配信されるようになります。MetricFireでは、SlackやPagerDutyなど、いくつかの通知チャネルをアドオンとして利用することができます。ここでは、MetricFireの製品であるHosted Graphiteの通知チャネルとしてSlackを使用するためのチュートリアルを紹介します。（ただし、通知チャネルを使用することはアラートを出すための必須条件ではありません。）

ユーザーはダッシュボードパネルごとに独立してアラートルールを作成することができます。Elasticsearchのインデックスから3つのフィールド（parameter_1、parameter_2、parameter_3）を監視するダッシュボードを用意しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/757a7bf2-746c-7fdd-d8ee-19648f4aee85.png)

実際には、パネルの作成中にアラートルールを設定することができますが、すでにパネルを持っていて、そこにアラートルールを追加したい場合は、パネルをEditボタンをクリックして編集する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/c93517fe-c713-36f5-8d02-8c86edc29f1b.png)

そして、ベルのアイコンのAlertボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/0bf0d94b-1cb1-f1dd-c77c-06fd39010906.png)

そして、最後にCreat Alertボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/c7ad773c-912c-1421-0226-3d1d332274df.png)

ここから、アラートを設定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/933517e9-1cee-7afa-b472-c3ba86976551.png)

次に、アラートの名前を付け、評価の頻度を設定し、アラート発生の具体的な条件を設定しています。今回のアラートでは、parameter_1の平均値が[-2 : 32]の範囲外になったときに通知されるようにしたいと思います。Pythonスクリプトは-5から34までの値を生成しているので、たまに[-2 : 32]の範囲外になってしまうことがあると思います。

条件の部分を見ると、query(A, 1s, now)の部分が見えてきます。これらのパラメータの意味を説明しましょう。"A "はメトリックを可視化するためのクエリです。このクエリが定義されている場所は、先ほどの画像の1つ（ベルのついたボタンをクリックする前）で確認できたと思います。私たちの場合は、過去1秒間のパラメータ_1の平均値です。パラメータ "1s "と "now "は、時間範囲を設定して表現します。"1秒前から今まで”を表しています。つまり、過去1秒間のデータを推定したいのです。Conditionsセクションの下では、データの欠落やエラーが発生したときのアラートの動作を設定することもできます。データの欠落も発生する可能性があるので、これは非常に重要です。

下のグラフでは、アラートの条件を便利に可視化しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/d086772a-9376-0a3f-d9de-3fbe587b5b8e.png)

ページを下にスクロールすると、通知チャネルを指定するセクションが表示されます。ここでは、以前に作成した「example email」というチャンネルを使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/945a863d-aaa6-9ced-9193-a2a484db2f96.png)

変更を適用するには、ダッシュボードを保存してください。Pythonスクリプトを実行してしばらく待つと、アラートに関する通知メールが届くようになります。以下はそのようなメールの例です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/78dfd0ee-3fcc-c35e-3934-83324e4d717b.png)

同様に、他のアラートルールを作成することもできます。下の図は、parameter_2のアラートの条件を示しています。この場合、過去10秒間に計算された最大値が253を超えたときに通知を受けたいと考えています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/06ee0a90-02fb-dfc9-c9a5-6f0d184cfd20.png)

範囲外」と「範囲外/範囲外」の条件の他に、3つ目の条件タイプである「値が見つからない」があります。以下にその設定方法を示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/41e70749-b3b4-d1f2-8508-e26c6b0a1148.png)

複数のブロックで構成される複雑な条件を作成することができることを覚えておいてください。これを行うには、最初の条件ブロックの下にある「プラス」ボタンをクリックします。条件ブロックは、「AND」または「OR」演算子を使用してスタックすることができます。結果として、以下のようなものが得られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/ba7b7bca-8cb1-982d-70ab-bddba62598c9.png)

評価には、count、sum、median、diff、min、maxなど、多くの異なる関数があることに注意してください。また、他のクエリを使ってアラートを設定することもできます（上記の例では "A "だけではなく）。

例えば、2つのクエリがあるとします。AとBです（下の画像を参照してください）。クエリ A は、指定した期間の parameter_1 の平均値を反映しています。クエリBは、指定された期間のparameter_2の値の合計を反映しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/17a59f77-a152-4da4-f835-1b683c419e75.png)

複数の異なるクエリがある場合は、それらに基づいてアラートを作成することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/487e5317-c46b-a72b-2992-c27f102db179.png)

#インフラやネットワークの監視に便利なアラート
インフラストラクチャやネットワークを監視する人にとって、便利なアラートにはいくつかの種類があります。インフラサイドでは、サーバーの負荷、リクエストの待ち時間、エラー率、メモリ使用量を監視することができます。アプリケーションのパフォーマンスを監視したいのであれば、監視すべきユースケース固有のメトリクスをさらに増やすことができます。例えば、短期間に大量の新規ユーザ登録があった場合、アラートを表示することができます。パネル・クエリ(例では "A "と名付けられています)では、データ・ソースへのカスタム・リクエストを含めることができることを覚えておいてください。これを行うには、Queryフィールドを使用します（下の画像を参照してください）。ElasticSearch ソースの場合、これは Lucene クエリにする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/7b3c2464-3402-d669-665f-97ae7c9ed6f8.png)

カスタムリクエストを作成することができるので、複雑なアラート条件も開発することができます。

#まとめ
今回の記事では、Grafanaのアラート条件の作成と設定に焦点を当てました。アラートに関する通知が必要な場合は、通知チャネルを設定する必要があります。

[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20alerting)がお客様のモニタリングニーズにどのように役立つかを知りたい場合は、[デモをご予約](https://calendly.com/metricfire-chatwithus/chat?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20alerting)の上、直接お問い合わせください。また、[14日間の無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20alerting)を利用して、数分で独自のGrafanaダッシュボードを作成することができます。是非、ご登録ください。

それでは、またの記事で！