通話ログにクエリを実行する

概要とアクセス

Communications Services のログに対して Log Analytics を利用する前に、まず、診断設定でのログの有効化に関するページで説明されている手順に従う必要があります。 ログと Log Analytics ワークスペースを有効にすると、ログから取得できるデータ (以下で説明) をすばやく視覚化して理解するために役立つ、さまざまな既定のクエリ パックにアクセスできるようになります。 Log Analytics を利用すると、Azure Monitor ブックを介し Communications Services のより多くの分析情報にアクセスしたり、独自のクエリやブックを作成したり、任意のクエリに対して Log Analytics API の概要を使用したりできます。

アクセス

クエリにアクセスするには、まず、Communications Services のリソース ページで、左側のナビゲーションにある [監視] セクション内の [ログ] をクリックします。

Log Analytics navigation

そこから、Communications Services で使用できるすべての既定のクエリ パックがモーダル画面に表示されます。左側の一覧から、使用できるクエリ パックを選択できます。

log analytics queries modal

モーダル画面を閉じた後でも、診断設定で有効にしたログとメトリックのスキーマに応じて、さまざまなクエリ パックにアクセスしたり、テーブル形式のデータに直接アクセスしたりできます。 ここでは、KQL (Kusto) を使用してデータから独自のクエリを作成できます。 クエリの使用、編集、作成の詳細については、Log Analytics クエリに関するページを参照してください。

Log Analytics queries in resource

Log Analytics tables in resource

通話概要ログと通話診断ログ用の既定のクエリ パック

通話概要ログと通話診断ログ用の既定のクエリ パックに含まれる個々のクエリについて、コード サンプルと、使用可能な各クエリの出力例を含めて、以下で説明します。

通話概要クエリ

通話あたりの参加者数

// Count number of calls and participants,
// and print average participants per call
ACSCallSummary
| distinct CorrelationId, ParticipantId, EndpointId
| summarize num_participants=count(), num_calls=dcount(CorrelationId)
| extend avg_participants = todecimal(num_participants) / todecimal(num_calls)

サンプル出力:

call overview query

グループ通話あたりの参加者数

// Count number of participants per group call
ACSCallSummary
| where CallType == 'Group'
| distinct CorrelationId, ParticipantId
| summarize num_participants=count() by CorrelationId
| summarize participant_counts=count() by num_participants
| order by num_participants asc 
| render columnchart with  (xcolumn = num_participants, title="Number of participants per group call")

サンプル出力:

participants per group call query

通話の種類の比率

// Ratio of call types
ACSCallSummary
| summarize call_types=dcount(CorrelationId) by CallType
| render piechart title="Call Type Ratio"

サンプル出力:

ratio of call type query

通話時間の分布

// Call duration histogram
ACSCallSummary
| distinct CorrelationId, CallDuration
|summarize duration_counts=count() by CallDuration
| order by CallDuration asc
| render columnchart with (xcolumn = CallDuration, title="Call duration histogram")

サンプル出力:

call duration query

通話時間パーセンタイル

// Call duration percentiles
ACSCallSummary
| distinct CorrelationId, CallDuration
| summarize avg(CallDuration), percentiles(CallDuration, 50, 90, 99)

サンプル出力:

call duration percentile query

エンドポイント情報クエリ

通話あたりのエンドポイント数

// Count number of calls and endpoints,
// and print average endpoints per call
ACSCallSummary
| distinct CorrelationId, EndpointId
| summarize num_endpoints=count(), num_calls=dcount(CorrelationId)
| extend avg_endpoints = todecimal(num_endpoints) / todecimal(num_calls)

サンプル出力:

endpoints per call query

SDK バージョンの比率

// Ratio of SDK Versions
ACSCallSummary
| distinct CorrelationId, ParticipantId, EndpointId, SdkVersion
| summarize sdk_counts=count() by SdkVersion
| order by SdkVersion asc
| render piechart title="SDK Version Ratio"

サンプル出力:

Pie chart showing the ratio of SDK Versions.Table showing SDK Versions

OS バージョンの比率 (簡略化した OS 名)

// Ratio of OS Versions (simplified OS name)
ACSCallSummary
| distinct CorrelationId, ParticipantId, EndpointId, OsVersion
| extend simple_os = case(  indexof(OsVersion, "Android") != -1, tostring(split(OsVersion, ";")[0]),
                            indexof(OsVersion, "Darwin") != -1, tostring(split(OsVersion, ":")[0]),
                            indexof(OsVersion, "Windows") != -1, tostring(split(OsVersion, ".")[0]),
                            OsVersion
                        )
| summarize os_counts=count() by simple_os
| order by simple_os asc
| render piechart title="OS Version Ratio"

サンプル出力:

Pie chart showing operating system ratiosTable showing OS Versions

メディア ストリーム クエリ

通話あたりのストリーム数

// Count number of calls and streams,
// and print average streams per call
ACSCallDiagnostics
| summarize num_streams=count(), num_calls=dcount(CorrelationId)
| extend avg_streams = todecimal(num_streams) / todecimal(num_calls)

サンプル出力:

streams per call query

通話あたりのストリーム数ヒストグラム

// Distribution of streams per call
ACSCallDiagnostics
| summarize streams_per_call=count() by CorrelationId
| summarize stream_counts=count() by streams_per_call
| order by streams_per_call asc
| render columnchart title="Streams per call histogram"

streams per call histogram

メディアの種類の比率

// Ratio of media types by call
ACSCallDiagnostics
| summarize media_types=count() by MediaType
| render piechart title="Media Type Ratio"

pie chart showing media type ratios

品質指標クエリ

平均テレメトリ値

// Average telemetry values over all streams
ACSCallDiagnostics
| summarize Avg_JitterAvg=avg(JitterAvg),
            Avg_JitterMax=avg(JitterMax),
            Avg_RoundTripTimeAvg=avg(RoundTripTimeAvg),
            Avg_RoundTripTimeMax=avg(RoundTripTimeMax),
            Avg_PacketLossRateAvg=avg(PacketLossRateAvg),
            Avg_PacketLossRateMax=avg(PacketLossRateMax)

average telemetry values

JitterAvg ヒストグラム

// Jitter Average Histogram
ACSCallDiagnostics
| where isnotnull(JitterAvg)
| summarize JitterAvg_counts=count() by JitterAvg
| order by JitterAvg asc
| render columnchart with (xcolumn = JitterAvg, title="JitterAvg histogram")

jitter average histogram

JitterMax ヒストグラム

// Jitter Max Histogram
ACSCallDiagnostics
| where isnotnull(JitterMax)
|summarize JitterMax_counts=count() by JitterMax
| order by JitterMax asc
| render columnchart with (xcolumn = JitterMax, title="JitterMax histogram")

jitter max histogram

PacketLossRateAvg ヒストグラム

// PacketLossRate Average Histogram
ACSCallDiagnostics
| where isnotnull(PacketLossRateAvg)
|summarize PacketLossRateAvg_counts=count() by bin(PacketLossRateAvg, 0.01)
| order by PacketLossRateAvg asc
| render columnchart with (xcolumn = PacketLossRateAvg, title="PacketLossRateAvg histogram")

packet loss average histogram

PacketLossRateMax ヒストグラム

// PacketLossRate Max Histogram
ACSCallDiagnostics
| where isnotnull(PacketLossRateMax)
|summarize PacketLossRateMax_counts=count() by bin(PacketLossRateMax, 0.01)
| order by PacketLossRateMax asc
| render columnchart with (xcolumn = PacketLossRateMax, title="PacketLossRateMax histogram")

packet loss max histogram

RoundTripTimeAvg ヒストグラム

// RoundTripTime Average Histogram
ACSCallDiagnostics
| where isnotnull(RoundTripTimeAvg)
|summarize RoundTripTimeAvg_counts=count() by RoundTripTimeAvg
| order by RoundTripTimeAvg asc
| render columnchart with (xcolumn = RoundTripTimeAvg, title="RoundTripTimeAvg histogram")

RTT average histogram

RoundTripTimeMax ヒストグラム

// RoundTripTime Max Histogram
ACSCallDiagnostics
| where isnotnull(RoundTripTimeMax)
|summarize RoundTripTimeMax_counts=count() by RoundTripTimeMax
| order by RoundTripTimeMax asc
| render columnchart with (xcolumn = RoundTripTimeMax, title="RoundTripTimeMax histogram")

RTT max histogram

ジッター低品質

// Get proportion of calls with poor quality jitter
// (defined as jitter being higher than 30ms)
ACSCallDiagnostics
| extend JitterQuality = iff(JitterAvg > 30, "Poor", "Good")
| summarize count() by JitterQuality
| render piechart title="Jitter Quality"

jitter quality

PacketLossRate 品質

// Get proportion of calls with poor quality packet loss
// rate (defined as packet loss being higher than 10%)
ACSCallDiagnostics
| extend PacketLossRateQuality = iff(PacketLossRateAvg > 0.1, "Poor", "Good")
| summarize count() by PacketLossRateQuality
| render piechart title="Packet Loss Rate Quality"

packet loss rate quality

RoundTripTime 品質

// Get proportion of calls with poor quality packet loss
// rate (defined as packet loss being higher than 10%)
ACSCallDiagnostics
| extend PacketLossRateQuality = iff(PacketLossRateAvg > 0.1, "Poor", "Good")
| summarize count() by PacketLossRateQuality
| render piechart title="Packet Loss Rate Quality"

RTT quality

パラメーター化可能クエリ

先週の 1 日あたり通話数

// Histogram of daily calls over the last week
ACSCallSummary
| where CallStartTime > now() - 7d
| distinct CorrelationId, CallStartTime
| extend hour  = floor(CallStartTime, 1d)
| summarize event_count=count() by day
| sort by day asc
| render columnchart title="Number of calls in last week"

daily calls last week

最終日の 1 時間あたり通話数

// Histogram of calls per hour in the last day
ACSCallSummary
| where CallStartTime > now() - 1d
| distinct CorrelationId, CallStartTime
| extend hour = floor(CallStartTime, 1h)
| summarize event_count=count() by hour
| sort by hour asc
| render columnchart title="Number of calls per hour in last day"

calls per hour last day