Eseguire query sui log delle chiamate

Panoramica e accesso

Prima di poter sfruttare i vantaggi di Log Analytics per i log di Servizi di comunicazione, è necessario seguire i passaggi descritti in Abilitare la registrazione in Impostazioni di diagnostica. Dopo aver abilitato i log e un'area di lavoro Log Analytics, si avrà accesso a molti query pack utili predefiniti che consentiranno di visualizzare e comprendere rapidamente i dati disponibili nei log, descritti di seguito. Tramite Log Analytics è anche possibile accedere ad altre informazioni dettagliate di Servizi di comunicazione tramite cartelle di lavoro di Monitoraggio di Azure, che consente di creare query e cartelle di lavoro personalizzate, una panoramica delle API di Log Analytics per qualsiasi query.

Accesso

È possibile accedere alle query iniziando dalla pagina delle risorse di Servizi comunicazioni e quindi facendo clic su "Log" nel riquadro di spostamento a sinistra all'interno della sezione Monitoraggio:

Navigazione in Log Analytics

Da qui viene visualizzata una schermata modale che contiene tutti i pacchetti di query predefiniti disponibili per Servizi di comunicazione, con l'elenco di Query Pack disponibili per passare a sinistra.

Query di Log Analytics modale

Se si chiude la schermata modale, è comunque possibile passare ai vari query pack, accedere direttamente ai dati sotto forma di tabelle in base allo schema dei log e alle metriche abilitati nell'impostazione di diagnostica. In questo caso, è possibile creare query personalizzate dai dati usando KQL (Kusto). Per altre informazioni sull'uso, la modifica e la creazione di query, leggere altre informazioni su: Query di Log Analytics

Query di Log Analytics nella risorsa

Tabelle di Log Analytics nella risorsa

Query Pack predefiniti per il riepilogo delle chiamate e i log di diagnostica delle chiamate

Di seguito sono riportate le descrizioni di ogni query nel pacchetto di query predefinito, per i log di riepilogo delle chiamate e di diagnostica delle chiamate, inclusi esempi di codice e output di esempio per ogni query disponibile:

Query di panoramica delle chiamate

Numero di partecipanti per chiamata

// 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)

Output di esempio:

query di panoramica delle chiamate

Numero di partecipanti per chiamata di gruppo

// 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")

Output di esempio:

partecipanti per ogni query di chiamata di gruppo

Rapporto tra tipi di chiamata

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

Output di esempio:

rapporto di query tra tipi di chiamata

Distribuzione della durata della chiamata

// 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")

Output di esempio:

query durata chiamata

Percentili della durata della chiamata

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

Output di esempio:

query percentile della durata della chiamata

Query sulle informazioni sugli endpoint

Numero di endpoint per cluster

// 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)

Output di esempio:

endpoint per ogni query di chiamata

Rapporto delle versioni dell'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"

Output di esempio:

Grafico a torta che mostra il rapporto delle versioni dell'SDK.Tabella che mostra le versioni dell'SDK

Rapporto delle versioni del sistema operativo (nome del sistema operativo semplificato)

// 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"

Output di esempio:

Grafico a torta che mostra le proporzioni del sistema operativoTabella che mostra le versioni del sistema operativo

Query di flusso multimediale

Flussi per chiamata

// 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)

Output di esempio:

flussi per query di chiamata

Flussi per ogni istogramma di chiamata

// 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"

flussi per ogni istogramma di chiamata

Rapporto tra tipi di supporti

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

grafico a torta che mostra i rapporti tra i tipi di supporti

Query sulle metriche di qualità

Valori di telemetria medi

// 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)

valori di telemetria medi

Istogramma 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")

istogramma medio jitter

Istogramma 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")

istogramma max jitter

istogramma 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")

istogramma medio della perdita di pacchetti

istogramma 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")

istogramma massimo perdita di pacchetti

Istogramma 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")

Istogramma medio RTT

Istogramma 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")

Istogramma massimo RTT

Scarsa qualità di jitter

// 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"

qualità del jitter

Qualità 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"

qualità della frequenza di perdita dei pacchetti

Qualità 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"

Qualità RTT

Query parametrizzabili

Chiamate giornaliere nell'ultima settimana

// 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"

chiamate giornaliere la settimana scorsa

Chiamate all'ora nell'ultimo giorno

// 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"

chiamate all'ora dell'ultimo giorno