ボットのテレメトリ データを分析するAnalyze your bot's telemetry data

適用対象: SDK v4APPLIES TO: SDK v4

ボットの動作の分析Analyzing Bot behavior

次のクエリ集は、ボットの動作を分析するために使用できます。The following collection of queries can be used to analyze bot behavior. これらを使うと、Azure Monitor Log Analytics でカスタム クエリを作成できるほか、監視ダッシュボードと Power BI の視覚化ダッシュボードを作成できます。You can use the collection to author custom queries in Azure Monitor Log Analytics and to create monitoring and PowerBI visualization dashboards.

前提条件Prerequisites

次の概念に関する基礎知識を持っていると役に立ちます。It is helpful to have a basic understanding of the following concepts:

ヒント

Power Virtual AgentsComposerなどのツールを使用してボットを作成する場合は、使用可能な場合は、各クエリのアダプティブ ダイアログ バージョンを使用する必要があります。If your create your bot using tools such as Power Virtual Agents or Composer, you will want to use the Adaptive Dialog version of each query when available.

ダッシュボードDashboards

Azure ダッシュボードには、お客様のクエリから生成された情報を表示および共有する優れた方法が用意されています。Azure Dashboards offer a great way to view and share the information generated from your queries. カスタム ダッシュボードを構築し、自分がダッシュボードに追加するタイルにクエリを関連付けることで、ボットのアクティビティを監視しやすくなります。You can build custom dashboards to help monitor your bots activity by associating your queries with the tiles that you add to your dashboard. ダッシュボードの詳細と、クエリを関連付ける方法については、「Log Analytics データのダッシュボードを作成して共有する」を参照してください。For more information on dashboards and how to associate your queries with them, see Create and share dashboards of Log Analytics data. この記事の残りの部分では、ボットの動作の監視に役立つクエリ サンプルをいくつか紹介します。The remainder of this article shows examples of some of the queries that you may find useful in monitoring your bots behavior.

Kusto クエリのサンプルExample Kusto queries

注意

この記事のすべてのクエリについて、期間、チャネル、ロケールなどのさまざまなディメンションをピボットすることをお勧めします。It is recommended to pivot on different dimensions such as period, channel, and locale for all queries in this article.

期間あたりのユーザー数Number of users per period

このサンプルでは、過去 14 日間において、ボットと対話した個別のユーザー数を日別に示す折れ線グラフが得られます。This example results in a line chart that shows how many distinct users communicated with your bot per day for the past 14 days. 期間は、queryStartDatequeryEndDateinterval の各変数に異なる値を割り当てることで簡単に変更できます。The time period can be easily changed by assigning different values to the queryStartDate, queryEndDate and interval variables.

重要

このクエリで一意のユーザーの数が正確に得られるのは、各ユーザーが認証を受けている場合のみです。また、チャネル機能によって結果が異なることがあります。You will only get a correct count of unique users in this query if they are authenticated users, and the results may also depend on the channel capabilities.

// number of users per period
let queryStartDate = ago(14d);
let queryEndDate = now();
let groupByInterval = 1d;
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| summarize uc=dcount(user_Id) by bin(timestamp, groupByInterval)
| render timechart

ヒント

Kusto の summarize 演算子は、入力テーブルの内容を集計したテーブルを生成するために使用されます。The Kusto summarize operator is used to produce a table that aggregates the content of the input table.

bin 関数は Kusto のスカラー関数であり、summarize operator と組み合わせて使用すると、クエリ結果が指定値でグループ分けされます。The Bin function is a Kusto scalar function that when used in conjunction with the summarize operator will group the query results into the specified value. 上のサンプルでは日によってグループ分けしていますが、Kusto では h (時間)、m (分)、s (秒)、ms (ミリ秒)、microsecond (マイクロ秒) を使用することも可能です。In the above example, this is grouped by day, Kusto also will accept h=hours, m=minutes, s=seconds, ms=milliseconds, microsecond=microseconds.

render 演算子を使用すると、さまざまなグラフを簡単にレンダリングできます。たとえば、x 軸に日時をとり、y 軸に任意の数値列を使用できる折れ線グラフである timechart などがあります。The render operator enables you to easily render charts, such as the timechart, a line chart where the x-axis is a datetime and any other numeric column can be used for the y-axis. 自分のデータに指定期間の一部が含まれていない場合でも、x 軸上の間隔は自動的に適切に調整されます。It automatically keeps the x-axis spaced nicely even if your data doesn't have every time specified. render ステートメントを使用しない場合の既定値は table です。If no render statement is used, it defaults to table.

期間ごとのユーザー数のクエリ結果のサンプルSample number-of-users-per-period query results

期間あたりのユーザー数

期間あたりのアクティビティActivity per period

このサンプルでは、会話、ダイアログ、またはメッセージの件数という目的のディメンション別に、過去 14 日間における 1 日あたりのアクティビティ量を測定する方法を示します。This example illustrates how to measure the volume of activity per desired dimension, whether that be a count of the number of conversations, dialogs, or messages per day for the past 14 days. 期間は、querystartdatequeryEndDateinterval の各変数に異なる値を割り当てることで簡単に変更できます。The time period can be easily changed by assigning different values to the querystartdate, queryEndDate and interval variables. 目的のディメンションは、次の例の 句によって定義されます。 は extend metric 、InstanceId、DialogId、 または activityId設定できますThe desired dimension is defined by the extend clause in the following example, metric can be set to either InstanceId, DialogId or activityId.

metric に、表示したいディメンションを設定します。Assign metric to the dimension that you want to display:

// Measures the number of activity's (conversations, dialogs, messages) per period.
let queryStartDate = ago(14d);
let queryEndDate = now();
let groupByInterval = 1d;
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend InstanceId = tostring(customDimensions['InstanceId'])
| extend DialogId = tostring(customDimensions['DialogId'])
| extend ActivityId = tostring(customDimensions['activityId'])
| where DialogId != '' and  InstanceId != '' and user_Id != ''
| extend metric = InstanceId // DialogId or ActivityId
| summarize Count=dcount(metric) by  bin(timestamp, groupByInterval)
| order by Count desc nulls last
| render timechart

ヒント

Kusto の extend 演算子は、計算列を作成してそれらを結果セットに追加するために使用されます。The Kusto extend operator is used to create calculated columns and append them to the result set.

期間ごとのアクティビティのクエリ結果のサンプルSample activity-per-period query results

期間あたりのアクティビティ

期間あたりのユーザーごとのアクティビティActivity per user per period

このサンプルでは、一定期間におけるユーザーごとのアクティビティ数をカウントする方法を示します。This example demonstrates how to count the number of activities per user per period. ここでは、"期間あたりのアクティビティ" クエリをドリルダウンして、一定期間におけるユーザーごとのアクティビティに焦点を絞ります。This demonstrates drilling down in the activity per period query to focus on the activity per user per period. アクティビティには、ダイアログ、会話、メッセージがあります。The activities include dialogs, conversations or messages. これは、ユーザーとボットのやり取りを測定するのに役立つほか、次のような潜在的な問題を特定するのに役立つ場合があります。This helps to measure user interaction with your bot and can help in determining potential problems, for example:

  • ある期間に単一ユーザーのアクティビティが非常に多い場合、攻撃かテストの可能性がありますDays with lots of activity by a single user may mean attack or test
  • ある期間にやり取りがほとんどない場合、サービスの正常性に問題がある可能性がありますDays with little interaction may indicate service health issues

ヒント

by user_Id を削除すると、全般的なボット アクティビティの量を取得し、時間とダイアログ、メッセージ、または会話でピボットできます。You can remove by user_Id to get the general bot activity volume which can be pivoted on time and dialogs, messages, or conversations.

// number of users per period per dialogs
let queryStartDate = ago(14d);
let queryEndDate = now();
let interval = 6h;
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend InstanceId = tostring(customDimensions['InstanceId'])
| extend DialogId = tostring(customDimensions['DialogId'])
| extend ActivityId = tostring(customDimensions['activityId'])
| where DialogId != '' and InstanceId != '' and user_Id != ''
| extend metric = ActivityId // InstanceId // DialogId // or InstanceId for conversation count
| summarize Count=dcount(metric) by user_Id, bin(timestamp, groupByInterval)
| order by Count desc nulls last

期間ごとのユーザーごとのアクティビティのサンプル クエリ結果Sample activity-per-user-per-period query results

user_Iduser_Id timestamptimestamp CountCount
User-8107ffd2User-8107ffd2 2019-09-03T00:00:00Z2019-09-03T00:00:00Z 1414
User-75f2cc8fUser-75f2cc8f 2019-08-30T00:00:00Z2019-08-30T00:00:00Z 1313
User-75f2cc8dUser-75f2cc8d 2019-09-03T00:00:00Z2019-09-03T00:00:00Z 1313
User-3060aadaUser-3060aada 2019-09-03T00:00:00Z2019-09-03T00:00:00Z 1010

完了したダイアログDialog completion

ダイアログのテレメトリ クライアントを設定すると、ダイアログ (とその子) から、"開始済み" や "完了済み" など、いくつかの既定のテレメトリ データが出力されるようになります。Once you set the telemetry client for a dialog, the dialog (and its children) will emit some default telemetry data, such as started and completed. このサンプルを使用すると、"完了済み" ダイアログを "開始済み" ダイアログと比較して測定できます。This example can be used to measure the completed dialogs relative to started dialogs. 開始済みダイアログの数が完了済みの数を上回っている場合、一部のユーザーがダイアログ フローを完了していません。If the number of dialogs started is greater than the number completed, some of your users are not completing the dialog flow. これは、潜在的なダイアログ ロジックを特定し、トラブルシューティングするときの出発点として使用できます。This can be used as a starting point in identifying and troubleshooting any potential dialog logic. また、使用頻度が高いダイアログや、使用頻度が低いダイアログの特定にも使用できます。It can also be used to identify the more popular and less frequented dialogs.

ヒント

Power Virtual Agents やComposerなどのツールを使用してボットを作成する場合は、各クエリのアダプティブ ダイアログ バージョンを使用する必要があります。If your create your bot using tools such as Power Virtual Agents or Composer, you will want to use the adaptive dialog version of each query.

ウォーターフォール ダイアログの完了Waterfall dialog completion

// % Completed Waterfall Dialog: shows completes relative to starts
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| where name=="WaterfallStart"
| extend DialogId = customDimensions['DialogId']
| extend InstanceId = tostring(customDimensions['InstanceId'])
| join kind=leftouter (
    customEvents
    | where name=="WaterfallComplete"
    | extend InstanceId = tostring(customDimensions['InstanceId'])
  ) on InstanceId
| summarize started=countif(name=='WaterfallStart'), completed=countif(name1=='WaterfallComplete') by tostring(DialogId)
| where started > 100  // filter for sample
// Show starts vs. completes
| project tostring(DialogId), started, completed
| order by started desc, completed asc  nulls last
| render barchart  with (kind=unstacked, xcolumn=DialogId, ycolumns=completed, started, ysplit=axes)

ヒント

Kusto の join 演算子を使用すると、各テーブルの指定の列で値を照合することで、2 つのテーブルの行をマージして新しいテーブルを形成できます。The Kusto join operator is used to merge the rows of two tables to form a new table by matching values of the specified column(s) from each table.

project 演算子は、自分の出力に表示したいフィールドを選択するために使用されます。The project operator is used to select the fields that you want to show up in your output. 新しいフィールドを追加する extend operator と同様に、project operator では、既存のフィールド セットから選択することも、新しいフィールドを追加することもできます。Similar to the extend operator that adds a new field, the project operator can either choose from the existing set of fields or add a new field.

アダプティブ ダイアログの開始と完了Adaptive dialogs started and completed

// % Completed adaptive dialog: shows completes relative to starts. This type is the default dialog type when using Power Virtual Agents or Composer. 
customEvents
| where name=="AdaptiveDialogStart" or name == "AdaptiveDialogComplete"
| extend DialogId = tostring(customDimensions['DialogId'])
| summarize started=countif(name=='AdaptiveDialogStart'), completed=countif(name=='AdaptiveDialogComplete') by DialogId
| project DialogId, started, completed
| order by started desc, completed asc nulls last
| render barchart with (kind=unstacked, xcolumn=DialogId, ycolumns=completed, started, ysplit=axes)

ダイアログ補完クエリの結果のサンプルSample dialog-completion query results

完了したダイアログ

未完了のダイアログDialog incompletion

このサンプルを使用すると、指定期間において、開始されたもののキャンセルまたは破棄されたために完了しなかったダイアログ フローの数をカウントできます。This example can be used to count the number of dialog flows that started but never completed due to cancellation or abandonment during the specified time period. これにより、未完了のダイアログを確認し、ユーザーが混乱したために自発的にキャンセルされたのか、それともユーザーの気が逸れたり関心がなくなったりしたために破棄されただけなのかを調べることができます。You can use it to review incomplete dialogs and examine whether they were actively cancelled due to user confusion or simply abandoned due to user distraction or loss of interest.

ウォーターフォール ダイアログが完了しないWaterfall dialogs not completed

// Show incomplete dialogs when using waterfall dialogs.
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents 
| where timestamp > queryStartDate 
| where timestamp < queryEndDate
| where name == "WaterfallStart" 
| extend DialogId = customDimensions['DialogId']
| extend instanceId = tostring(customDimensions['InstanceId'])
| join kind=leftanti (
  customEvents
  | where name == "WaterfallComplete" 
  | extend instanceId = tostring(customDimensions['InstanceId'])
  ) on instanceId
| summarize cnt=count() by  tostring(DialogId)
| order by cnt
| render barchart

アダプティブ ダイアログが完了しないAdaptive dialogs not completed

// Show incomplete dialogs for adaptive dialogs; this type is the default dialog type when using Power Virtual Agents or Composer.
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where name == "AdaptiveDialogStart"
| extend DialogId = tostring(customDimensions['DialogId'])
| join kind=rightanti (
customEvents
| where name == "AdaptiveDialogComplete"
| extend DialogId = tostring(customDimensions['DialogId'])
) on name, DialogId
| summarize cnt=count() by DialogId
| order by cnt
| render barchart

ヒント

Kusto の order 演算子 (sort operator と同じ) は、1 つ以上の列を基準にして入力テーブルの行を並べ替えるために使用されます。The Kusto order operator (Same as the sort operator) is used to sort the rows of the input table into order by one or more columns. 注:任意のクエリの結果から null 値を除外したい場合は、"and isnotnull(Timestamp)" を追加するなどして、where ステートメントでそれらをフィルタリングできます。また、先頭または末尾で null 値を返すには、order ステートメントの末尾に nulls first または nulls first を追加します。Note: If you want to exclude null values from the results of any query, you can filter them out in your where statement, for example you could add "and isnotnull(Timestamp)", or to return null values at the beginning or end, add the nulls first or nulls first to the end of the order statement.

サンプル ダイアログインコンプリート クエリの結果Sample dialog-incompletion query results

集計操作のサンプル クエリ結果

ダイアログ シーケンスのドリルダウンDialog Sequence Drill Down

会話中のウォーターフォール ダイアログの開始、ステップ、完了Waterfall start/step/complete for dialog in conversation

このサンプルでは、ダイアログ ステップのシーケンスを会話 (instanceId) 別にグループ分けして表示します。This example shows the sequence of dialog steps, grouped by conversation (instanceId). これは、どのステップがダイアログの中断の原因になっているのかを特定するときに役立ちます。This can be useful in determining which steps lead to dialog interruption.

このクエリを実行し、 の代に目的のの値 DialogId を入力します。 <SampleDialogId>The run this query, enter the value of the desired DialogId in place of <SampleDialogId>

// Drill down: Show waterfall start/step/complete for specific dialog
let queryStartDate = ago(14d);
let queryEndDate = now();
let DialogActivity=(dlgid:string) {
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend DialogId = customDimensions['DialogId']
| extend StepName = customDimensions['StepName']
| extend InstanceId = customDimensions['InstanceId']
| where DialogId == dlgid
| project timestamp, name, StepName, InstanceId
| order by tostring(InstanceId), timestamp asc
};
// For example see SampleDialogId behavior
DialogActivity("<SampleDialogId>")

ヒント

このクエリは、クエリ定義関数を使用して記述されています。これは、単一クエリのスコープ内で定義および使用されるユーザー定義関数であり、let ステートメントを通じて定義されます。This query was written using a query-defined function, which is a user-defined function that is defined and used within the scope of a single query, and is defined through a let statement. このクエリが query-defined function を使用せずに記述された場合:This query written without the use of the query-defined function:

let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend DialogId = customDimensions['DialogId']
| extend StepName = customDimensions['StepName']
| extend InstanceId = customDimensions['InstanceId']
| where DialogId == "<SampleDialogId>"
| project timestamp, name, StepName, InstanceId
| order by tostring(InstanceId), timestamp asc
サンプル クエリの結果Sample query results
timestamptimestamp namename StepNameStepName InstanceIdInstanceId
2019-08-23T20:04...2019-08-23T20:04... WaterfallStartWaterfallStart nullnull ...79c0f03d8701...79c0f03d8701
2019-08-23T20:04...2019-08-23T20:04... WaterfallStepWaterfallStep GetPointOfInterestLocationsGetPointOfInterestLocations ...79c0f03d8701...79c0f03d8701
2019-08-23T20:04...2019-08-23T20:04... WaterfallStepWaterfallStep ProcessPointOfInterestSelectionProcessPointOfInterestSelection ...79c0f03d8701...79c0f03d8701
2019-08-23T20:04...2019-08-23T20:04... WaterfallStepWaterfallStep GetRoutesToDestinationGetRoutesToDestination ...79c0f03d8701...79c0f03d8701
2019-08-23T20:05...2019-08-23T20:05... WaterfallStepWaterfallStep ResponseToStartRoutePromptResponseToStartRoutePrompt ...79c0f03d8701...79c0f03d8701
2019-08-23T20:05...2019-08-23T20:05... WaterfallComplete 1WaterfallComplete 1 nullnull ...79c0f03d8701...79c0f03d8701
2019-08-28T23:35...2019-08-28T23:35... WaterfallStartWaterfallStart nullnull ...6ac8b3211b99...6ac8b3211b99
2019-08-28T23:35...2019-08-28T23:35... WaterfallStep 2WaterfallStep 2 GetPointOfInterestLocationsGetPointOfInterestLocations ...6ac8b3211b99...6ac8b3211b99
2019-08-28T19:41...2019-08-28T19:41... WaterfallStartWaterfallStart nullnull ...8137d76a5cbb...8137d76a5cbb
2019-08-28T19:41...2019-08-28T19:41... WaterfallStep 2WaterfallStep 2 GetPointOfInterestLocationsGetPointOfInterestLocations ...8137d76a5cbb...8137d76a5cbb
2019-08-28T19:41...2019-08-28T19:41... WaterfallStartWaterfallStart nullnull ...8137d76a5cbb...8137d76a5cbb

1 完了1 Completed

2 破棄2 Abandoned

"解釈: ユーザーは GetPointOfInterestLocations ステップで会話を破棄しているようです。 "Interpretation: Users seem to abandon the conversation at the GetPointOfInterestLocations step.

注意

ウォーターフォール ダイアログではシーケンス (開始、複数のステップ、完了) が実行されます。Waterfall dialogs execute a sequence (start, multiple steps, complete). シーケンスが開始を示しているのに完了されていない場合、ユーザーによるダイアログの破棄またはキャンセルが原因でダイアログが中断されたことを意味します。If a sequence shows start with no complete, it means the dialog was interrupted either due to user abandoning or canceling the dialog. この詳細な分析では、このような動作が見られることがあります (完了ステップと破棄ステップを見比べてください)。In this detailed analysis, one can see this behavior (see completed vs. abandoned steps).

ウォーターフォールの開始、ステップ、完了、キャンセル ステップの集計値Waterfall start/step/complete/cancel steps aggregate totals

このサンプルでは、ダイアログ シーケンスが開始された合計回数の集計値、ウォーターフォール ステップの総数、正常に完了した件数、キャンセル数が表示され、WaterfallStart の数と WaterfallComplete および WaterfallCancel の総数との差から、破棄の総数がわかります。This example shows the aggregate totals of the total number of times that a dialog sequence was started, the combined total number of waterfall steps, how many were successfully completed, how many were canceled and the difference between WaterfallStart and the combined total of WaterfallComplete plus WaterfallCancel will give you the total number abandoned.

// Drill down: Aggregate view of waterfall start/step/complete/cancel steps totals for specific dialog
let queryStartDate = ago(14d);
let queryEndDate = now();
let DialogSteps=(dlgid:string) {
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend DialogId = customDimensions['DialogId']
| where DialogId == dlgid
| project name
| summarize count() by name
};
// For example see SampleDialogId behavior
DialogSteps("<SampleDialogId>")
ウォーターフォール集計クエリの結果のサンプルSample waterfall-aggregate query results
namename countcount
WaterfallStartWaterfallStart 2121
WaterfallStepWaterfallStep 4747
WaterfallCompleteWaterfallComplete 1111
WaterfallCancelWaterfallCancel 11

解釈:21 回のダイアログシーケンスの呼び出し、11回だけ完了、9が破棄され、ユーザーによって取り消されました。Interpretation: Of 21 invocations of dialog sequence, only 11 has completed, 9 were abandoned, and one was cancelled by the user.

ダイアログの平均時間Average duration in dialog

このサンプルでは、ユーザーが特定のダイアログに費やした時間の平均値を測定します。This example measures the average amount of time users spend in a given dialog. ダイアログにかかる時間が長い場合、簡素化を検討したほうがよい可能性があります。A long time spend in a dialog may suggest opportunities to simplify.

// Average dialog duration
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| where name=="WaterfallStart"
| extend DialogId = customDimensions['DialogId']
| extend instanceId = tostring(customDimensions['InstanceId'])
| join kind=leftouter (customEvents | where name=="WaterfallCancel" | extend instanceId = tostring(customDimensions['InstanceId'])) on instanceId
| join kind=leftouter (customEvents | where name=="WaterfallComplete" | extend instanceId = tostring(customDimensions['InstanceId'])) on instanceId
| extend duration = case(not(isnull(timestamp1)), timestamp1 - timestamp,
not(isnull(timestamp2)), timestamp2 - timestamp, 0s) // Abandoned are not counted. Alternate: now()-timestamp)
| extend seconds = round(duration / 1s)
| summarize AvgSeconds=avg(seconds) by tostring(DialogId)
| order by AvgSeconds desc nulls last
| render barchart with (title="Duration in Dialog")

平均実行時間クエリの結果のサンプルSample average-duration query results

ダイアログの実行時間のサンプルクエリ結果

ダイアログの平均ステップ数Average steps in dialog

このサンプルでは、各実行済みダイアログの "長さ" の計算値を、平均値、最小値、最大値、標準偏差によって示します。This example shows each executed dialogs "length" as calculated by average, min, max and standard deviation. これは、ダイアログの質の分析に役立ちます。This can help analyze dialog quality. 次に例を示します。For example:

  • ステップが非常に多いダイアログは、簡素化できないかどうかを検討することをお勧めしますDialogs with a lot of steps should be evaluated for simplification opportunities
  • 最小値、最大値、平均値の差が大きいダイアログでは、ユーザーがタスクを完了しようとして行き詰まっている可能性があります。Dialogs with a wide gap between min/max/average could mean that users get stalled trying to complete the tasks. タスク完了までのパスを短縮できないか、またはダイアログの複雑さを軽減する方法がないかを検討することをお勧めします。You may need to evaluate the possibility of there being shorter paths to complete the tasks, or ways to reduce the dialog complexity.
  • 標準偏差が大きいダイアログでは、パスが複雑であるか、中断 (破棄またはキャンセル) が発生している可能性がありますDialogs with a large standard-deviation suggest complex paths or broken experience (abandon/cancel)
  • ステップがわずかなダイアログは完了されていないので、それらにも同様の可能性があります。Dialogs with very few steps may be so because they were never completed. こうした判断を行うには、完了と破棄の比率分析が有用です。Analyzing the completion/abandonment rates may help to make that determination.
// min/max/std/avg steps per dialog
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend DialogId = tostring(customDimensions['DialogId'])
| extend StepName = tostring(customDimensions['StepName'])
| extend InstanceId = tostring(customDimensions['InstanceId'])
| where name == "WaterfallStart" or  name == "WaterfallStep" or  name == "WaterfallComplete"
| order by InstanceId, timestamp asc
| project timestamp, DialogId, name, InstanceId, StepName
| summarize cnt=count() by InstanceId, DialogId
| summarize avg=avg(cnt), minsteps=min(cnt),maxsteps=max(cnt), std=stdev(cnt) by DialogId
| extend avgsteps = round(avg, 1)
| extend avgshortbysteps=maxsteps-avgsteps
| extend avgshortbypercent=round((1.0 - avgsteps/maxsteps)*100.0, 1)
| project DialogId, avgsteps, minsteps, maxsteps, std, avgshortbysteps, avgshortbypercent
| order by std desc nulls last

サンプルの平均ステップクエリ結果Sample average-steps query results

Dialog IdDialog Id avg stepsavg steps min stepsmin steps max stepsmax steps stdstd avg short by stepsavg short by steps avg short by percentavg short by percent
FindArticlesDialogFindArticlesDialog 6.26.2 22 77 2.042.04 0.80.8 11.4%11.4%
CreateTicketCreateTicket 4.34.3 22 55 1.51.5 0.70.7 14%14%
CheckForCurrentLocationCheckForCurrentLocation 3.93.9 22 55 1.411.41 1.11.1 22%22%
BaseAuthBaseAuth 3.33.3 22 44 1.031.03 0.70.7 17.5%17.5%
onboardingonboarding 2.72.7 22 44 0.940.94 1.31.3 32.5%32.5%

解釈: たとえば、FindArticlesDialog は最小値と最大値の差が大きいので、調査が必要であり、再設計と最適化を行わなければならない可能性があります。__Interpretation: For example, FindArticlesDialog has a wide spread between min/max and should be investigated and possibly redesigned & optimized.

アクティビティ メトリック別のチャネル アクティビティChannel activity by activity metric

このサンプルでは、指定期間においてボットが受信した、チャネルあたりのアクティビティの量を測定します。This example measures the amount of activity your bot receives per channel in the given period. これは、受信メッセージ、ユーザー、会話、ダイアログのいずれかのメトリックをカウントすることで実行されます。It does this by counting any one of the following metrics: incoming messages, users, conversations or dialogs. これは、サービスの正常性分析やチャネルの使用頻度の測定に役立ちます。This can be useful for service health analysis or to measure a channels popularity.

// number of metric: messages, users, conversations, dialogs by channel
let queryStartDate = ago(14d);
let queryEndDate = now();
let groupByInterval = 1d;
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| extend InstanceId = tostring(customDimensions['InstanceId'])
| extend DialogId = tostring(customDimensions['DialogId'])
| extend ActivityId = tostring(customDimensions['activityId'])
| extend ChannelId = tostring(customDimensions['channelId'])
| where DialogId != '' and  InstanceId != '' and user_Id != ''
| extend metric = user_Id // InstanceId or ActivityId or user_Id
| summarize Count=count(metric) by  ChannelId, bin(timestamp, groupByInterval)
| order by Count desc nulls last
| render barchart with (title="Users", kind=stacked) // or Incoming Messages or Conversations or Users

ヒント

これらのバリエーションを試すこともお勧めします。You may want to consider trying these variations:

  • タイムスタンプバケットを指定せずにクエリを実行し bin(timestamp, groupByInterval) ます。Run the query without the timestamp bucketing: bin(timestamp, groupByInterval).
  • 全ユーザー イベント アクティビティ用の count ではなく、個別ユーザー用の dcount を使用することもできます。You can also use dcount for distinct users vs count for all user event activities. これは、リピート ユーザーにも適しています。This also works for repeat users.

サンプルチャネル-アクティビティごとのクエリ結果Sample channel-activity-by-activity query results

チャネルの使用状況に関するクエリ結果のサンプル

"解釈: 以前はエミュレーター テストが最も使用されていましたが、DirectLineSpeech の稼働開始後は、これが最も使用頻度の高いチャネルとなっています。 "Interpretation: Emulator testing used to be most popular but once we went live, DirectLineSpeech, is the most popular channel.

人気別の合計インテントTotal Intents by popularity

このサンプルは LUIS 対応ボットに適用されます。This example applies to LUIS enabled bots. 使用頻度別の全意図の概要、および対応する意図検出の確実性スコアが示されます。It shows a summary of all intents by popularity, and corresponding intent detection certainty score.

  • 実際に使用するときは、ビューをメトリックごとに分割することをお勧めします。In practice, the view should separated for each metric.
  • 使用頻度の高い意図パスは、ユーザー エクスペリエンスのために最適化することをお勧めします。Popular intent paths should be optimized for user experience.
  • 平均スコアが低い場合、認識力が低く、実際のユーザーの意図を捉え損なっていると考えられます。Low average scores indicate poor recognition & possible missing actual user intent.
// show total intents
let queryStartDate = ago(14d);
let queryEndDate = now();
customEvents
| where timestamp > queryStartDate
| where timestamp < queryEndDate
| where name startswith "LuisResult"
| extend intentName = tostring(customDimensions['intent'])
| extend intentScore = todouble(customDimensions['intentScore'])
| summarize ic=count(), ac=avg(intentScore)*100 by intentName
| project intentName, ic, ac
| order by ic desc nulls last
| render barchart with (kind=unstacked, xcolumn=intentName, ycolumns=ic,ac, title="Intents Popularity")

サンプルインテントクエリの結果Sample intents-by-popularity query results

インテントの人気に関するクエリ結果のサンプル

"解釈: たとえば、最も使用頻度の高い意図について、確認は平均して 23% の信頼度でしか検出されていません。 "Interpretation: For example the most popular intent, confirm is detected only with 23% confidence on average.

ヒント

棒グラフは、Kusto クエリで使用できる十数個のオプションの 1 つにすぎません。Barcharts are one of over a dozen options available with Kusto queries. 他のオプションには、anomalychart、areachart、columnchart、linechart、scatterchart などがあります。Some other options include: anomalychart, areachart, columnchart, linechart, scatterchart. 詳細については、「render 演算子」トピックを参照してください。for more details see the render operator topic.

ボット分析のインストルメンテーションのスキーマSchema of Bot Analytics Instrumentation

次の表に、ボットのテレメトリ データが記録される最も一般的なフィールドを示します。The following tables show the most common fields that your bot will log telemetry data into.

一般的なエンベロープGeneral Envelope

Application Insights インストルメンテーションの一般的なログ分析フィールド。Common log analytics fields in Application Insights instrumentation.

フィールドField 説明Description サンプル値Sample Values
namename メッセージ型Message type BotMessageSend、BotMessageReceived、LuisResult、WaterfallStep、WaterfallStart、SkillWebSocketProcessRequestLatency、SkillWebSocketOpenCloseLatency、WaterfallComplete、QnaMessage、WaterfallCancel、SkillWebSocketTurnLatency、AuthPromptValidatorAsyncFailureBotMessageSend, BotMessageReceived, LuisResult, WaterfallStep, WaterfallStart, SkillWebSocketProcessRequestLatency, SkillWebSocketOpenCloseLatency, WaterfallComplete, QnaMessage, WaterfallCancel, SkillWebSocketTurnLatency, AuthPromptValidatorAsyncFailure
customDimensionscustomDimensions SDK のボット分析SDK Bot Analytics activityId = <id> 、activityType = message、channelId = emulator、fromId = <id> 、FromName = User、locale = En-us、recipientId =、 <id> name = Bot、text = コーヒーショップを見つけるactivityId=<id>, activityType=message, channelId=emulator, fromId=<id>, fromName=User, locale=en-us, recipientId=<id>, recipientName=Bot, text=find a coffee shop
timestamptimestamp イベントの日時Time of event 2019-09-05T18:32:45.287082Z2019-09-05T18:32:45.287082Z
instance_Idinstance_Id 会話 IDConversation Id f7b2c416-a680-4b2c-b4cc-79c0f03d8711f7b2c416-a680-4b2c-b4cc-79c0f03d8711
operation_Idoperation_Id ターン IDTurn Id 084b2856947e3844a5a18a8476d99aaa084b2856947e3844a5a18a8476d99aaa
user_Iduser_Id 一意のチャネル ユーザー IDUnique channel user id emulator7c259c8e-2f47...emulator7c259c8e-2f47...
client_IPclient_IP クライアント IP アドレスClient ip address 127.0.0.1 (プライバシー保護のため記録されないことがあります)127.0.0.1 (may be absent due to privacy block)
client_Cityclient_City クライアントの市区町村Client city レドモンド (検出された場合。記録されないことがあります)Redmond (if detected, may be absent)

カスタム ディメンションCustom Dimensions

ボット固有のアクティビティ データの大部分は、customDimensions フィールドに格納されます。Most of bot specific activity data is stored in customDimensions field.

フィールドField 説明Description サンプル値Sample Values
activityIdactivityId メッセージ IDMessage id <id>: 8da6d750d00b-11e0-80e0-c14234b3bc2a<id>: 8da6d750-d00b-11e9-80e0-c14234b3bc2a
activityTypeactivityType メッセージの種類Type of message message、conversationUpdate、event、invokemessage, conversationUpdate, event, invoke
channelIdchannelId チャネル IDChannel identifier emulator、directline、msteams、webchatemulator, directline, msteams, webchat
fromIdfromId 送信者 IDFrom Identifier <id>
fromNamefromName クライアントのユーザー名Username from client John Bonham、Keith Moon、Steve Smith、Steve GaddJohn Bonham, Keith Moon, Steve Smith, Steve Gadd
localelocale クライアントの配信元ロケールClient origin locale en-us、zh-cn、en-GB、de-de、zh-CNen-us, zh-cn, en-GB, de-de, zh-CN
recipientIdrecipientId 受信者 IDRecipient identifier <id>
recipientNamerecipientName 受信者名Recipient name John Bonham、Keith Moon、Steve Smith、Steve GaddJohn Bonham, Keith Moon, Steve Smith, Steve Gadd
texttext メッセージ内のテキストText in message コーヒー ショップを探してくださいfind a coffee shop

カスタム ディメンション: LUISCustom Dimensions: LUIS

LUIS インストルメンテーションでは、次のカスタム ディメンション フィールドにデータが格納されます。LUIS instrumentation stores its data in the following Custom Dimensions fields.

フィールドField 説明Description サンプル値Sample Values
intentintent LUIS で検出された意図LUIS detected intent pointOfInterestSkillpointOfInterestSkill
intentScoreintentScore LUIS 認識スコアLUIS recognition score 0.980.98
EntitiesEntities LUIS で検出されたエンティティLUIS detected entities FoodOfGrocery = [["コーヒー"]]、KEYWORD= ["コーヒー ショップ"]FoodOfGrocery = [["coffee"]], KEYWORD= ["coffee shop"]
QuestionQuestion LUIS で検出された質問LUIS detected question コーヒー ショップを探してくださいfind a coffee shop
sentimentLabelsentimentLabel LUIS で検出されたセンチメントLUIS detected sentiment ポジティブpositive

カスタム ディメンション: QnA MakerCustom Dimensions: QnAMaker

QnAMaker インストルメンテーションでは、次のカスタム ディメンション フィールドにデータが格納されます。QnAMaker instrumentation stores its data in the following Custom Dimensions fields.

ヒント

質問や回答などの個人情報のログ記録を有効にするには、 QnA Maker クラスのコンストラクターで [個人情報をログ に記録する] パラメーターを true に設定する必要があります。To enable logging of personal information like questions and answers, the log personal information parameter should be set to true in the constructor of the QnA Maker class.

フィールドField 説明Description サンプル値Sample Values
questionquestion QnA で検出された質問QnA detected question 何を実行できますか?what can you do?
answeranswer QnA の回答QnA answer 質問があるなら、お答えできるかもしれません。You have questions, I may have answers.
articleFoundarticleFound QnAQnA truetrue
questionIdquestionId QnA の質問 IDQnA question Id 488488
knowledgeBaseIdknowledgeBaseId QnA の KB IDQnA KB Id 2a4936f3-b2c8-44ff-b21f-67bc413b97272a4936f3-b2c8-44ff-b21f-67bc413b9727
matchedQuestionmatchedQuestion 一致した質問の配列Array of matched questions ["あなたのロールについて教えてください","あなたについて少し教えてください","あなたについて教えてください","手伝っていただけますか","えーと、何ができますか?","何ができますか","何をしてもらえますか?","何をしてくれますか?","それでは、私のプロジェクトでどのように活用すればいいですか?","機能について教えてください","どのような機能がありますか?",…["Can you explain to me what your role is?","Can you tell me a bit about yourself?","Can you tell me about you?","could you help me","hmmm so what can you do?","how can you help me","How can you help me?","How can you help?","so how can i use you in my projects?","Talk to me about your capability","What are you capable of?",…

参照See Also