Azure Bot Serviceで作成したボットのテレメトリをApplication Insightsで収集できるようにする

こんばんは。この記事では、Azure Bot Serviceで作成したボットのテレメトリをApplication Insightsで収集する方法についての記事です。

それではまいります。

前提

  • 今回のBotはAzure Cognitive Service – Languageのカスタム質問応答(QnA Makerの後継)でナレッジベースを公開した流れで作成したものになります。
  • その際、Application Insightsを有効化して作成している
  • 言語はC#
  • コードエディタにはVisual Studio 2022を利用

規定の動きの確認

まず、この状態でどんな情報が収集できるようになっているのか確認しておきます。

Azure Bot Serviceのチャットウィンドウから適当な会話を流して、Application Insightsにどう反映されるか確認してみます。

お、規定でもなんか記録されてる。

レコードをクリックするEnd to Endトランザクションの詳細が確認できる。

リクエスト発生日時やチャネルといった基本的な情報だけみれるようでした。

念のため他のログも漁ってみましたが、このCustom Eventログだけが出力されているようでした。

なんでこのログだけが出力されてるんだ・・?

同じことで悩んでいる人の相談が・・・笑

https://stackoverflow.com/questions/55683850/how-to-stop-customevent-activity-being-logged-in-appinsights-enterprise-bot

調べてみたら公式ドキュメントに言及がありました。どうやら想定された動作のようです。

既定では、 は TelemetryInitializerMiddleware 、 を使用 TelemetryLoggerMiddleware して、ボットがアクティビティを送信/受信するときにテレメトリをログに記録します。アクティビティ ログでは、Application インサイト リソースにカスタム イベント ログが作成されます。

https://docs.microsoft.com/ja-jp/azure/bot-service/bot-builder-telemetry?view=azure-bot-service-4.0&tabs=csharp#enable-or-disable-activity-event-and-personal-information-logging

テレメトリを追加する

Microsoft.Bot.Builder.Integration.ApplicationInsights.Coreパッケージのインストール

最初にMicrosoft.Bot.Builder.Integration.ApplicationInsights.Core NuGetパッケージをインストールする必要があります。

なお、このとき、併せて「更新プログラム」で通知されているパッケージMicrosoft.Bot.Builder.DialogsとMicrosoft.Bot.Builder.Integration.AspNet.Coreのバージョンも更新しておかないと互換性のエラーが出てしまうので注意です。(もしくは、Microsoft.Bot.Builder.Integration.ApplicationInsights.Coreのバージョンを下げてインストールする)

Startup.csのコード変更

startup.csに以下のコードを追加します。

using Microsoft.ApplicationInsights.Extensibility;
using Microsoft.Bot.Builder.ApplicationInsights;
using Microsoft.Bot.Builder.Integration.ApplicationInsights.Core;
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
    ...
    // Create the Bot Framework Adapter with error handling enabled.
    services.AddSingleton<IBotFrameworkHttpAdapter, AdapterWithErrorHandler>();

    // Add Application Insights services into service collection
    services.AddApplicationInsightsTelemetry();

    // Add the standard telemetry client
    services.AddSingleton<IBotTelemetryClient, BotTelemetryClient>();

    // Create the telemetry middleware to track conversation events
    services.AddSingleton<TelemetryLoggerMiddleware>();

    // Add the telemetry initializer middleware
    services.AddSingleton<IMiddleware, TelemetryInitializerMiddleware>();

    // Add telemetry initializer that will set the correlation context for all telemetry items
    services.AddSingleton<ITelemetryInitializer, OperationCorrelationTelemetryInitializer>();

    // Add telemetry initializer that sets the user ID and session ID (in addition to other bot-specific properties, such as activity ID)
    services.AddSingleton<ITelemetryInitializer, TelemetryBotIdInitializer>();
    ...
}

AdapterWithErrorHandler.csのコード変更

公式ドキュメントの通り、コードを追加します。

public AdapterWithErrorHandler(ICredentialProvider credentialProvider, ILogger<BotFrameworkHttpAdapter> logger, IMiddleware middleware, ConversationState conversationState = null)
        : base(credentialProvider)
{
    ...

    Use(middleware);
}

ローカルでテストする

それでは、ローカルでテストしてみます。ローカルでのテスト用に、appsettings.jsonに必要な情報を設定して、デバッグを開始します。

appsettings.json

上に設定する情報は、BotをデプロイしているApp Serviceのアプリケーション設定から確認できます。

App Serviceのアプリケーション設定

Application InsightsのInstrument KeyはApplication Insightsリソースの概要ブレードから確認できます。

デバッグを開始した後、Bot Emulatorを開いて、エンドポイントURLと、App Id & Passwordを設定して接続します。

するとBotに接続できてチャットのやりとりができるようになります。

この状態で、Application Insightsリソースを確認してみると・・・

!ちゃんとログが流れてくるようになってる!

ログもREQUESTやDependencyなどのログが流れてきてます。

公式ドキュメントには以下のように書いていますので、この段階では”一般的な”実行情報が取得できるようになっているようです。

ボット Emulator を使用してボットをローカルで実行し、Application インサイト に移動して、応答時間、全体的なアプリの正常性、一般的な実行情報など、ログに記録されているデータを確認できます。

https://docs.microsoft.com/ja-jp/azure/bot-service/bot-builder-telemetry-qnamaker?view=azure-bot-service-4.0#add-telemetry-code-to-your-qna-maker-bot

また1点、その代わりに最初にデフォルトで出ていたカスタムイベントログがでなくなっているようでした。何かコードを消したわけではないけどなぜだろう・・・このあたりの動作がよくわからないですが、分かったらまた更新します。

QnA Maker/Language固有のテレメトリを収集する [ うまくいかず]

先ほどまでの手順では、基本的な実行情報の収集ができるようになった状態ですが、ここからはQnA MakerまたはAzure Cognitve Service – Languageのカスタム質問応答固有のテレメトリも収集できるようにしていけるようですのでやってみます。

と、以下のステップがなぜかうまくいかずに躓く。

https://docs.microsoft.com/ja-jp/azure/bot-service/bot-builder-telemetry-qnamaker?view=azure-bot-service-4.0#enable-default-qna-logging

ステップ2で以下のコードを拡張するとき、ステップ3のコードを追加したとき、CS0246, CS0103エラーが出た・・

public QnABot(IConfiguration configuration, ILogger<QnABot> logger, IHttpClientFactory httpClientFactory, IBotTelemetryClient telemetryClient)
{
    ...
    _telemetryClient = telemetryClient;
}

がんばったらなんとかできるかもしれないですが、公式Doc通りに進めてできないのはおかしい(今回QnA MakerではなくLanguageを使ってるからかな・・?)のと、C#のコーディングの知見がほとんどなかったので、公式ドキュメントにフィードバックを出して見解を待つことにしました・・

またUpdateあれば更新します。

https://github.com/MicrosoftDocs/bot-docs/issues/2193

Application Insights、C#ともに詳しくないと苦しいですね、、、笑 まあ、少しだけ前進したので今日はよしとしよう・・

最後までご覧いただきありがとうございました。

それではまた

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。

ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。