演習 - ポータルでログ記録を追加し、Azure 関数を監視する

完了

前のユニットでは、Application Insights を関数アプリケーションに組み込むことのいくつかの利点について学習しました。 また、開発者チームが利用できる他のいくつかのログ機能についても学習しました。

プロジェクト調査のこの段階では、Maven を使って関数アプリケーションを Azure にデプロイし、関数アプリケーションを運用環境でテストしました。 次のタスクでは、追跡機能とログ機能をアプリケーションに追加します。

この演習では、ログ ストリーミングと Application Insights の両方をサポートするように関数プロジェクト構成ファイルを更新します。 また、カスタムの追跡と Application Insights イベント トリガーをプロジェクト コードに追加する方法についても学習します。

リアルタイムでログをストリームする

現在、関数アプリは Azure にデプロイされて実行されており、簡単な Azure CLI コマンドを使ってアプリからリアルタイムのログ ストリーミングを取得して、トラブルシューティングを行うことができます。

  1. Azure portal で、HttpExample 関数の [概要] ページに移動します。 [クリップボードにコピー] アイコンを使って、[リソース グループ][関数アプリ] の値をコピーします。

  2. Azure Cloud Shell ウィンドウで、az webapp log tail -n <functionAppName> -g <resourceGroup> コマンドを入力してログをストリーミングします。 <functionAppName><resourceGroup> を、前のステップで保存した値に置き換えます。 次に例を示します。

    az webapp log tail -n event-reporting-20240125192009873 -g learn-f0af729c-0493-4b45-a5b8-d6b4783b03da
    
    
  3. 次のメッセージのような出力が表示されます。

    2024-01-25T20:44:58  Welcome, you are now connected to log-streaming service. The default timeout is 2 hours. Change the timeout with the App Setting SCM_LOGSTREAM_TIMEOUT (in seconds). 
    2024-01-25T20:45:58  No new trace in the past 1 min(s).
    
  4. Web ブラウザーで新しいタブを開き、前の演習で作成した完全な URL を貼り付けて関数アプリにアクセスし、ログをいくつか生成します。

  5. テストが済んだら、Cloud Shell で Ctrl + C キーを押して、ログ ストリームを閉じます。

Application Insights の Java プロジェクトへのインストルメンテーションの追加

これで、アプリケーションに対して Application Insights が有効になったので、次のタスクはアプリケーションでそれを有効にすることです。 アプリケーション ログと Application Insights を有効にするには、構成ファイルを変更して、必要なライブラリと他の依存関係を含める必要があります。

pom.xmlhost.json の 2 つの構成ファイルを更新する必要があります。

pom.xml ファイルの変更

  1. Azure Cloud Shell を使用して、ディレクトリをプロジェクトのルートに変更します。

    cd ~/event-reporting
    
  2. Cloud Shell のコード エディターを使用して、pom.xml ファイルを開きます。

    code pom.xml
    
  3. 次の要素をスタンドアロンの <dependencies> セクションに追加し、アプリケーションに対して Application Insights を有効にします。

    <dependency>
        <groupId>com.microsoft.azure</groupId>
        <artifactId>applicationinsights-web-auto</artifactId>
        <version>2.6.0</version>
    </dependency>
    

    Note

    Application Insights の <dependency> は、<dependencyManagement> 要素内に含まれている <dependencies> コレクションではなく、必ずスタンドアロンの <dependencies> コレクションに追加してください。

  4. Ctrl + S キーを押して pom.xml ファイルを保存してから、Ctrl + Q キーを押してコード エディターを閉じます。

host.json ファイルの変更

  1. Cloud Shell のコード エディターを使用して、host.json ファイルを開きます。

    code host.json
    
  2. 既存の JSON コードを削除し、次の設定に置き換えます。

    {
        "version": "2.0",
        "extensionBundle": {
            "id": "Microsoft.Azure.Functions.ExtensionBundle",
            "version": "[1.*, 2.0.0)"
        },
        "logging": {
            "fileLoggingMode": "always",
            "logLevel": {
                "default": "Information"
            }
        },
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "maxTelemetryItemsPerSecond" : 5
            }
        }
    }
    

    extensionBundle の設定は既に定義されていますが、それらの機能の多様な設定は、loggingapplicationInsights によって定義されます。

  3. Ctrl + S キーを押して host.json ファイルを保存してから、Ctrl + Q キーを押してコード エディターを閉じます。

プロジェクト コードへのログ記録と Application Insights 追跡の追加

ログ ファイルに記録される Application Insights によって収集されたデータの有用性を高めるには、アプリケーション コードにいくつかのデータ ログ コマンドを追加する必要があります。

Function.java ファイルへのログ記録の追加

関数に一般的なログを追加するには、次の例のようなコードをアプリケーション コードの重要なポイントに追加できます。ここで、文字列 [LOG MESSAGE] は、アプリケーションのログ ファイルに記録するメッセージに置き換えます。

context.getLogger().info("[LOG MESSAGE]");

アプリケーションにログを追加するには、次の手順を使用します。

  1. Cloud Shell エディターでアプリケーションの Function.java ファイルを開きます。

    code ~/event-reporting/src/main/java/com/contoso/functions/Function.java
    

    既存のコードを調べると、context.getLogger() コマンドが既にあることがわかります。これは、run() 関数の定義の後にある最初の命令です。

  2. 空の GET クエリ文字列または空の POST 要求をテストする、次のコード セクションを探します。

    if (name == null) {
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
    } else {
        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
    
  3. このコード セクションを変更して、関数の状態をログ システムに出力する 2 つの context.getLogger() コマンドを含めます。

    if (name == null) {
        context.getLogger().info("Execution failure - Incorrect or missing parameter used.");
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
    } else {
        context.getLogger().info("Execution success - name parameter = " + name);
        return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
    }
    
  4. Ctrl + S キーを押して Function.java ファイルを保存します。ただし、この演習の次のセクションでアプリケーションにコードを追加するので、エディターは閉じないでください。

お使いの Function.java ファイルに Application Insights の進捗管理を追加する

  1. 次の import ステートメントを既存のインポートのセットに追加します。このステートメントにより、Application Insights の次のテレメトリ ライブラリがインポートされます。

    import com.microsoft.applicationinsights.TelemetryClient;
    
  2. 次の定義をお使いのアプリケーションの Function() クラスに追加します。このステートメントにより、TelemetryClient オブジェクトがインスタンス化されます。

    private TelemetryClient telemetry = new TelemetryClient();
    
  3. context.getLogger() ステートメントをコピーしてコードを変更して、繰り返しの各エントリで context.getLogger() ではなく telemetry.trackEvent() が呼び出されるようにします。

    . . .
    context.getLogger().info("Java HTTP trigger processed a request.");
    telemetry.trackEvent("Java HTTP trigger processed a request.");
    
    // Parse query parameter
    String query = request.getQueryParameters().get("name");
    String name = request.getBody().orElse(query);
    
    if (name == null) {
        context.getLogger().info("Execution failure - Incorrect or missing parameter used.");
        telemetry.trackEvent("Execution failure - Incorrect or missing parameter used.");
        return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
    } else {
        context.getLogger().info("Execution success - name parameter = " + name);
        telemetry.trackEvent("Execution success - name parameter = " + name);
        return request.createResponseBuilder(HttpStatus.OK).body("Hi, " + name).build();
    }
    . . .
    
  4. Ctrl + S キーを押して Function.java ファイルを保存してから、Ctrl + Q キーを押してコード エディターを閉じます。

  5. 最後に、ご自分の関数アプリケーションをビルドし、パッケージして、再デプロイします。

    cd ~/event-reporting
    mvn clean package azure-functions:deploy
    

これで、ログと Application Insights のデータ収集が、関数に追加されました。

Application Insights を使用してお使いの Azure Function を監視する

お使いのアプリケーションが更新され、システム ロガーと Application Insights の両方で、ログが詳細に記録できるようになりました。

  1. サンプルの HTTP トラフィックをいくつか生成するには、前の演習でアプリケーションのテストに使った URL を Web ブラウザーにコピーします。 その URL と cURL を使って、Azure Cloud Shell でループを作成します。次はその例です。

    while :; do curl https://event-reporting-20200102030405006.azurewebsites.net/api/HttpExample?name=Bob; sleep 1; done
    
  2. サンドボックスのアクティブ化に使ったのと同じアカウントを使って、Azure portal にサインインします。

  3. 左側のメニューから [すべてのリソース] を選択します。

  4. リソースの一覧から関数を選択します。この演習で、ご自分の関数名は event-reporting で始まります。 たとえば、event-reporting-20200102030405006 です。

  5. ご自分の [ログ ストリーミング] アクティビティを参照します。

    1. [関数アプリ] メニューで [ログ ストリーム] を選びます。

    2. [App Insights ログ] ドロップダウンを開いて、[Filesystem ログ] を選びます。

      Image showing where to find Log Streaming.

    3. サンプル トラフィックによって一連のログ エントリが生成されることに注意してください。

      Image showing Log Streaming.

  6. [Live Metrics] アクティビティを参照します。

    1. [Filesystem ログ] ドロップダウンを選んで、[App Insights ログ] を選びます。

    2. [Live Metrics で開く] を選びます。 これで、サンプル トラフィックによって Application Insights と Live Metrics の結果が生成されることがわかります。

      Image showing Application Insights and Live Metrics highlights.

お疲れさまでした。詳細なログが記録されるように、Azure 関数を正しく構成しました。

続行する前に、Cloud Shell に戻り、Ctrl + C キーを押してコマンド ループを閉じます。