AKSのメトリクスをSlackに毎朝通知する
はじめに
Azure Kubernetes Serviceを使っていて、ノードのCPU使用率等のアラーム設定は可能なのですが、毎朝グラフとか見たいなぁと思ってました。
色々調べたんですが、結局力技で毎朝Slack通知するところまでできたので記録を残しておきます。
欲しいデータはAKS各ノードのCPUの使用率、メモリ使用率の過去3日くらいのグラフです。
手順
- APIでデータの取得
- データの整形
- chartjs-node-canvasを使ってグラフの作成
- グラフをstorageに保存
- Slackに通知
こんな感じです。1つずつ説明していきます。
処理は全てAzure Functionsで行っています。
APIでデータの取得
AKSでまずLog Analyticsを有効にしている前提で設定をしていきます。
Log AnalyticsはAPIを提供しています。(参考)
こちらのAPIではLog Analyticsでたたくクエリをそのまま使うことができるので、まずはLog Analyticsの使い方を勉強してください。(Log Analytics のチュートリアル)[https://docs.microsoft.com/ja-jp/azure/azure-monitor/logs/log-analytics-tutorial]
因みに私は勉強してません。調べながらなんとか欲しいデータとれたのでなんとかなりました。正直この独自クエリ言語普段あまり使わないのですが、欲しいデータの整形を考えなければそこまで難しくはないので生データをとって、自分で整形する方式にしました。
ちなみに、ノードごとのcpu使用量と割当量の取得はこんな感じです。
Perf
| where CounterName in ("cpuUsageNanoCores", "cpuAllocatableNanoCores")
| summarize AggregatedValue = avg(CounterValue) by bin(TimeGenerated, 60m), Computer, CounterName
メモリはmemoryRssBytes、memoryAllocatableBytesでできるはず
CounterNameはこれ参照しました。
あと、このAPI叩くのにはBearerトークンが必要です。
トークンの取得方法は、こちらの記事がわかりやすいです。
ざっくり説明すると、AADでアプリを作って、Log AnalyticsのAPIを叩く権限を与えて、そのアプリからアクセストークンを取得する感じです。
なので正確な流れとしては、トークンを取得するAPIを叩く=>取得したトークンを使ってLog AnalyticsのAPIを叩くといった感じです。
データの整形
これは個々人で頑張って下さい。
アルゴリズム苦手なんで、効率よく書けたかは分かりませんが、頑張ってなんとかしました。
chartjs-node-canvasを使ってグラフの作成
自分の環境(Node.js 14系)ではchartjs-node-canvasを使いました。
chart.jsは何回か使ったことあったので、自分の欲しいグラフを定義して整形したデータをぶちこみます。
ここは各々が使ってる言語で良いライブラリがあればそれを使って頂けると。
グラフをstorageに保存
公式のSDKを使って先程作ったグラフをアップロードします。
アップロードしたファイルはURLで誰でも見れるようにしておきます。
Slackに通知
あとは最後にWebhookを使って先程アップロードしたファイルURLを使って通知します。
自分はLogic Appを使って定期通知しました。
試したこと
試したけどダメだったことをスクラップに残しておきます。
これをうまくやればできるかもしれないのでもしやり方知っていたら教えてほしいです。
まとめ
この辺はもっと簡単に通知できる方法あればいいんだけどなぁ、、、
AWSでは割と簡単にCloudWatchの画像を定期アップロードできたんですけど、Azureは難しいです。高機能すぎてやりたいことは大体できそうだけど、簡単にこんなことできないかなぁっていうのはAWSの方が良さげなイメージですね。ドキュメント豊富ですし、、、
Discussion