GrafanaからSlackへ通知する

f:id:fclout:20200615000657p:plain
今回はメトリクス可視化ツールのGrafanaからSlackチャンネルへ通知を送る方法です。

Grafanaとは

Grafanaとはオープンソースダッシュボードツールです。
いわゆるメトリクス可視化ツールです。

Grafanaは、マルチプラットフォームオープンソース分析およびインタラクティブな視覚化Webアプリケーションです。サポートされているデータソースに接続すると、チャート、グラフ、アラートがWebに提供されます。プラグインシステムを介して拡張可能です。


AWSでいうところのCloud Watch Logs Insightsに似たようなツールで
メトリクスをグラフ等で可視化してくれます。
Kubernetes基盤で監視運用をする際に役立つツールでPrometheusとも相性が良いです。

グラフによる可視化がメインですが、
収集したメトリクスに対して独自にカスタマイズしたクエリを発行することも可能です。
またクエリで得た結果に対して閾値を設定してアラートを上げることもできます。

今回はカスタムクエリを発行して取得した結果に対してアラートを設定しSlackに通知してみます。
ツールとしてはメトリクス収集にPrometheus、可視化・通知にGrafana、通知先としてSlackを使用します。
PrometheusとGrafanaはKubernetes基盤にデプロイしたものを使用します。


Kubernetes基盤(オンプレ)の構築については以下のREADMEを参考にしてください。

github.com



PrometheusとGrafanaのデプロイについては以下のREADMEを参考にしてください。
Djangoの勉強用に作ったプログのコンフィグリポジトリ

github.com

Grafanaログイン

Grafanaにログインします。

f:id:fclout:20200616004239p:plain

ユーザ名、パスワードを入力して「Login」をクリック。
※上記手順でGrafanaを入れた方はadmin/passwordで入れます。




データソースの設定

グラフを作成するためのデータソースを設定します。
今回はデータソースに同じkubernetes基盤にデプロイしたPrometheusを使用します。


f:id:fclout:20200616004805p:plain

画面左のサイドバーの設定アイコン→「Data Sources」をクリック。



f:id:fclout:20200616005141p:plain

上記手順で作成するとすでにデフォルトのデータソースとして「Prometheus」がありますが
今回は気にせず右上の「Add data source」をクリック



f:id:fclout:20200616005426p:plain

するとデータソース候補一覧が出てくるので、
一番上にある「Prometheus」の「Select」ボタンをクリック。



f:id:fclout:20200616005849p:plain

画面右上に「Datasource added」と表示されます。

次にデータ取得先となるURLを入力するのですが、
今回は同じ基盤にあるPrometheusuを使用するためPrometheusサービスのClusterIPを指定してみます。
上記手順でデプロイした方は以下のコマンドをクラスタで実行します。

# kubectl get svc -o wide -n myblog-system | grep myprometheus

myprometheus-alertmanager         ClusterIP      10.104.159.212   <none>        80/TCP              5d8h   app=prometheus,component=alertmanager,release=myprometheus
myprometheus-kube-state-metrics   ClusterIP      10.101.22.225    <none>        8080/TCP            5d8h   app.kubernetes.io/instance=myprometheus,app.kubernetes.io/name=kube-state-metrics
myprometheus-node-exporter        ClusterIP      None             <none>        9100/TCP            5d8h   app=prometheus,component=node-exporter,release=myprometheus
myprometheus-server               ClusterIP      10.105.225.16    <none>        80/TCP              5d8h   app=prometheus,component=server,release=myprometheus

一番下にある「myprometheus-server」のIPアドレスがそれです。
URLに「http://10.105.225.16」と指定します。
(Podの9090にフォワードされるのでURLは80番ポートで問題ありません)



f:id:fclout:20200616010928p:plain

URLを設定したら画面下部の「Save & Test」をクリックします。
その後、「Data source is working」と表示されればPrometheusと問題なく通信できていることがわかります。


これでデータソースの設定は完了です。



Notification channelsの設定

slackへ通知するためのチャネルを設定します。

f:id:fclout:20200620085558p:plain

サイドメニューの「通知アイコン(Alerting)」 -> 「Notification channels」をクリック。


f:id:fclout:20200620085846p:plain

「New Channel」をクリック。


f:id:fclout:20200620090003p:plain

以下の項目を入力する

  • Name:適当な通知設定名
  • Type:プルダウンの中からSlackを選択
  • Url:通知先となるslackチャネルのwebhookURLを入力*1

 
 
f:id:fclout:20200620090841p:plain

入力が終わったら「Send Test」をクリック。
画面右上に「Test notification sent」が表示されれば問題なくSlackへの通知ができています。
「Save」をクリックして設定を保存。


通知が来ているか確認してみましょう。



f:id:fclout:20200620091048p:plain

確かに「[Alerting] Test nofication」が届いています。



カスタムダッシュボードの作成

最後にカスタムダッシュボードを作成して、
実際のメトリクスに対しアラート設定をします。


f:id:fclout:20200616004535p:plain

サイドメニューの追加アイコンから「Dashboard」をクリック。


f:id:fclout:20200620141406p:plain


「Add new panel」をクリック



f:id:fclout:20200620141431p:plain

画面下部の「Query」タブから、設定したデータソースを選択


f:id:fclout:20200620141603p:plain

データソースを選択すると、収集しているメトリクスが選択できるようになるので
今回はkubernetesワーカーノードのメモリ使用率を選択してみます。
画面上部のチャート画面に現在のメトリクス情報が描画されます。

クエリの設定は以上です。


f:id:fclout:20200620141712p:plain

次に「Alert」タブ->「Create Alert」をクリック。


f:id:fclout:20200620141918p:plain

「Alert」タブ内の「Conditions」 -> 「IS ABOVE」に閾値を設定。
今回はアラート通知を確認したいので、閾値を現在のメトリクス値よりも小さい値に設定します。
(すでにアラート状態になるようします)


f:id:fclout:20200620142139p:plain

最後に

  • 「Notifications」 -> 「Send to」に作成した通知設定を選択しアラート設定。
  • 「Notifications」 -> 「Message」に通知したいメッセージを記載(今回は「メモリ使用率が閾値を超えました」)

これでカスタムダッシュボードが作成され、指定したメトリクスに対してアラート設定がされました。

早速Slackで確認してみましょう。


f:id:fclout:20200620142704p:plain


ちゃんと通知されています!
これでGrafanaからSlackへメトリクスアラートを通知することができました!
Slackの他にもいろんな通知先が設定できるみたいなので、
運用に合った設定を選びましょう。

*1:webhookURLについてはhttps://slack.com/services/new/incoming-webhookから取得する