サービスでキューを使った非同期な処理を実行している場合があり、バッチサーバー側に何らかの障害が発生してキューが処理されていかないことがちょいちょい起きてしまい困ってます。なので、今日は簡単にキューに追加されたメッセージが処理されていっているのかを、確認する方法を試してみました。
ちなみに Azure Storage のキューに貯まっているメッセージ数を取得するためには、Storage Client Library を使えば以下のようなコードで取れます。
var storageAccount = CloudStorageAccount.Parse("STORAGE_KEY"); var client = storageAccount.CreateCloudQueueClient(); var queue = client.GetQueueReference("samplequeue"); queue.FetchAttributes(); var count = queue.ApproximateMessageCount ?? 0;
FetchAttributes メソッドを読んでから ApproximateMessageCount プロパティを参照すれば、おおよそのメッセージ数が取得できます。
まあ、コードでは取れて当たり前なんですが、これだと専用のサービスとかを作って監視する必要が出てきて、またちょっと面倒くさい感じがします。なので、Azure 管理ポータルの監視タブから確認できるように設定をしてみました。
必要な設定はキューの監視設定です。設定は詳細を選ばないと必要な情報が取れないです。
その後は監視タブからメトリックの追加を行いますが、残念ながらキューに残っているメッセージ数とかは取れないので、PutMessage と DeleteMessage の要求数合計をグラフに表示するようにします。
他にも GetMessage の要求数合計とかも取れますが、これはメッセージが空っぽの時も含まれるので数としては参考にならないです。
実際にこれで数時間待てば取得されたメトリックがグラフとして表示されるようになります。以下のグラフは実際のサービスで使っているキューのグラフです。
このグラフでは 14 時にはバッチ処理が停止してしまっていて、DeleteMessage の要求数が 0 になっていることがわかります。その後にバッチ処理を復活させたので、キューに貯まっていたメッセージを一気に処理したため 15 時には DeleteMessage 数 > PutMessage 数になっています。
その後はバッチが停止せずに処理が行われているため、DeleteMessage と PutMessage の要求数が同じになっていることがわかります。なので DeleteMessage 数でアラートを設定できればいいんですが、残念ながら今はアラート設定が出来ないみたいです。
詳細なメトリックが取れているので、アラートの条件として設定したいなと思ってます。