最近、Azure Functionsのお勉強をチマチマと始めました。色々と分からないことが多かったのでお勉強メモをまとめて記します。
どこまで続くかわからないお勉強メモ。今日は12回目です。今回はAzure Functionsのモニター機能について小ネタ。過去のものは以下を参照。
- Azure Functionsのお勉強メモ(1)TypeScriptでチュートリアルを実施する - miyohide's blog
- Azure Functionsのお勉強メモ(2)Spring Cloud FunctionでHTTP Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(3)Spring Cloud FunctionでTimer Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(4)RubyでHTTP Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(5)カスタムハンドラーを使ってRubyでTimer Triggerを実装する - miyohide's blog
- Azure Functionsのお勉強メモ(6)Blob Storage出力バインドを使ってBlobにファイルを出力する - miyohide's blog
- Azure Functionsのお勉強メモ(7)Blob Storage出力バインドを使ってBlobにファイルを出力する その2 - miyohide's blog
- Azure Functionsのお勉強メモ(8)Blob Storage出力バインドを使ってBlobにファイルを出力する その3 - miyohide's blog
- Azure Functionsのお勉強メモ(9)Blob Storageにファイルが登録された時に処理を実行する(未完成) - miyohide's blog
- Azure Functionsのお勉強メモ(10)Blob Storageにファイルが登録された時に処理を実行する(Queue利用編) - miyohide's blog
- Azure Functionsのお勉強メモ(11)Queue Trigger利用の深掘り(一部未解決) - miyohide's blog
あれ?回数がおかしい?
前回のブログ記事を書いていたとき、ふとAzure Functionsにある「モニター」を見ていると、表示されている回数がおかしいことに気がつきました。Queueには300件ほどのメッセージを入れたはずなのにそれよりも少ない数字が出ている(スクリーンショット取り忘れ)...
最初は下のスクリーンショットのように「結果は、最大で5分遅れる可能性があります」ということであまり気にも留めていませんでした。
しかしながら、だんだんと気になったので簡単なhttpトリガーのアプリを作って試してみました。
検証
アプリはJavaで作り、Consumption PlanでLinux環境で動かしました。アプリのコードは以下のようなものですが、今回はこれは本質ではないです。
package com.github.miyohide; import com.microsoft.azure.functions.*; import com.microsoft.azure.functions.annotation.AuthorizationLevel; import com.microsoft.azure.functions.annotation.FunctionName; import com.microsoft.azure.functions.annotation.HttpTrigger; import org.springframework.cloud.function.adapter.azure.FunctionInvoker; public class HttpHandler extends FunctionInvoker<String, String> { @FunctionName("hello") public HttpResponseMessage hello( @HttpTrigger( name = "req", methods = {HttpMethod.GET}, authLevel = AuthorizationLevel.FUNCTION )HttpRequestMessage<String> req, ExecutionContext context ) { String msg = req.getQueryParameters().getOrDefault("msg", "Hello World"); return req.createResponseBuilder(HttpStatus.OK) .body(msg) .header("Content-Type", "application/json") .build(); } }
このアプリをAzure上にデプロイし、abコマンドで1,000回のリクエスト・同時接続数100で実行することを3回行いました。動作確認用に1回リクエストを流したので、3,001回の成功回数が出てくれるはずですが、私の今回の場合は2,045回以上は記録されませんでした。
上記問題の回避
何か対策はないかなと探してみると、マイクロソフトのドキュメントに以下の記述がありました。
ログ サンプリングが原因で、一部の実行が Application Insights の [モニター] ブレードに表示されない場合があります。 ログ サンプリングを回避するには、excludedTypes: "Request" を samplingSettings 値に追加します。
なるほど、デフォルトではログサンプリングが行われているようです。ここではドキュメントに記載の通りに設定してみます。host.jsonを以下のように記述してデプロイします。
{ "version": "2.0", "extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle", "version": "[1.*, 2.0.0)" }, "logging": { "applicationInsights": { "samplingSettings": { "excludedTypes": "Request" } } } }
再検証
再度Azure上にデプロイし、abコマンドで1,000回のリクエスト・同時接続数100で実行することを3回しました。動作確認用に1回リクエストを飛ばしたので、合計で3,001回のリクエストが出てくれることを期待します。
期待通り、3,001回という数字が出ていました。