Azure Functionsのお勉強メモ(12)Azure Functionsのモニター機能の小ネタ

最近、Azure Functionsのお勉強をチマチマと始めました。色々と分からないことが多かったのでお勉強メモをまとめて記します。

どこまで続くかわからないお勉強メモ。今日は12回目です。今回はAzure Functionsのモニター機能について小ネタ。過去のものは以下を参照。

あれ?回数がおかしい?

前回のブログ記事を書いていたとき、ふとAzure Functionsにある「モニター」を見ていると、表示されている回数がおかしいことに気がつきました。Queueには300件ほどのメッセージを入れたはずなのにそれよりも少ない数字が出ている(スクリーンショット取り忘れ)...

最初は下のスクリーンショットのように「結果は、最大で5分遅れる可能性があります」ということであまり気にも留めていませんでした。

f:id:miyohide:20210606155454p:plain

しかしながら、だんだんと気になったので簡単な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回以上は記録されませんでした。

f:id:miyohide:20210606160042p:plain

上記問題の回避

何か対策はないかなと探してみると、マイクロソフトのドキュメントに以下の記述がありました。

ログ サンプリングが原因で、一部の実行が Application Insights の [モニター] ブレードに表示されない場合があります。 ログ サンプリングを回避するには、excludedTypes: "Request" を samplingSettings 値に追加します。

docs.microsoft.com

なるほど、デフォルトではログサンプリングが行われているようです。ここではドキュメントに記載の通りに設定してみます。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回のリクエストが出てくれることを期待します。

f:id:miyohide:20210606160626p:plain

期待通り、3,001回という数字が出ていました。