あるあるなQueueの監視ですが、自前でやらなきゃいけないならServerlessにぺちって任せるのは楽ちんですよ、というのはよくあるパターンです。 実際にQueue Storageのモニタリングをしてみましょう。
概要
Azure Storage QueueやService Busなどのキューサービスは、疎結合な構成を組んだ時に中心を担うため、そのキュー長が想定よりたまっていないか、推移はどうなっているかなどが気になります。
この監視を、Azure FunctionsのTimer Triggerで行ってみましょう。
Disclaimer
Datadogや複数のモニタリングサービスは、AzureのAPIをたたいて自分でクラウドリソースのメトリクスを見に行ってくれます。もしそれらで済むならこの記事は不要です、すぐに閉じましょう。この記事は、自分でリソースの状態をポーリングするときの対応例です。
Consumption Planを前提に毎30秒監視しています。(2 * 60 * 24 * 30 = 86400run) 無料枠内ですが、料金がどうなっても私は責任を取りかねます。(免責事項)
なぜ AzureFunctions なのか
モニタリングはアプリケーションの内部リソースと、クラウドなどの外部リソースで分けて考えられます。
アプリがスケールしたときに個別のアプリのメトリクスが見たければ、アプリケーションで監視するのが妥当なことは多いです。一方で、アプリケーションの外にあるリソースは、アプリケーションからモニタリングする必然性はありません。おのずと次のような欲求が高まってきます。
- アプリケーション自身のリソースをモニタリングに消費したくない
- モニタリング自身がスケールして重複した値が取れてほしくない
- アプリケーション自身が、どのようなリソースに依存んして動いているのか関心がない
自前でメトリクスを見たいときは、どこかで実行します、がアプリケーションでは実行したくありません。監視対象を定義しておいて、メトリクスを取得するだけのシンプルな監視の場合、Serverlessでアプリケーションとは別個の存在として実行させるのが便利です。
Azure Storage Queueなら、Azure FunctionsのConsumption Plan + Timer Triggerが定時ポーリング監視になり、定性モニタリングとして負荷なく実行できるでしょう。
監視対象
Azureでキューといえば、Azure Storage QueueとService Busがありますが、さくっとStorage Queueで確認してみましょう。ここではmyqueueというキューを用意して監視することにします。
- myqueue : Storage Queue APIで通常投げつけるQueue。主にこの子が気になる
- myqueue-poison : WebJobsで失敗した時に自動的に作成されるQueueで
-posisonが末尾につく。手動でなんとかすることになる
なお、Storage QueueはDead Letter Queue (DLQ) に対応していないのでまぁほげもげ。
実行環境
- Function Runtime: v2
- Language: C# (.NET Core 2.1)
- Trigger: Timer Trigger (毎30秒)
- Metrics: Queue Length
- Monitoring: Application Insights
Azure Functions
Azure Functionsは、v2においても裏でApplication Insightsを使っています。
とはいえ、明示的にMicrosoft.ApplicationInsightsパッケージを取り込まないと、アプリからApplication Insightsをたたけないので入れておきます。
dotnet add package Microsoft.ApplicationInsights
メトリクスを送信するため、Azure FunctionsのApplication ConfigでApplication InsightsのInstrumentation Keyを設定します。もしAzure FunctionsのApplication Insightsにメトリクスを飛ばすのでいいならAPPINSIGHTS_INSTRUMENTATIONKEYでいいでしょう。
Queueに接続するため、QueueがあるStorage AccountのConnection Stringsを設定しておきます。ここでは、queue_storage_connection_stringとしました。
では実際に実行してみましょう。コードはこのような感じになります。
https://gist.github.com/guitarrapc/c39eeed2933ab8c8147e4243b1fd0aaa
これで毎10秒ごとにQueueの長さをモニタリングして、Application Insightsに投げられます。ローカルで実行した場合、コンソールにQueueの長さがでるでしょう。
Application Insights の確認
今回はAzure FunctionsのApplication Insights連携に乗っかているので見てみます。
ちょうどQueueを投げてなかったので0が継続して取れているのがわかります。

あとはAzure Monitorという名のApplication Insightsの閾値によるActionでWebhookなりを投げるといいでしょう。Bodyの調整できない子ですが。
Tips
Cloud Tableとか絡んでくると、いまだにMicrosoft.WindowsAzure.Storage パッケージが安定なので、AzureのNuGetパッケージつらい。
Ref
やろうとしたら、だいたいすでにやってるKloudさんつよい。v1ですが、だいたいやっていることは一緒です。
Monitoring Azure Storage Queues with Application Insights and Azure Monitor - Kloud Blog