Consulta de registros de llamadas
Introducción y acceso
Para poder aprovechar las ventajas de usar Log Analytics con los registros de Communications Services, primero debe seguir los pasos descritos en Habilitación del registro en Configuración de diagnóstico. Cuando haya habilitado los registros y un área de trabajo de Log Analytics, tendrá acceso a muchos paquetes de consulta predeterminados útiles que le ayudarán a visualizar y comprender rápidamente los datos disponibles en los registros, que se describen a continuación. A través de Log Analytics, también obtendrá acceso a más información de Communications Services a través de libros de Azure Monitor, la capacidad de crear nuestras propias consultas y libros, información general de las API de Log Analytics en cualquier consulta.
Access
Para acceder a las consultas, comience en la página del recurso Communications Services y, luego, haga clic en "Registros" en el panel de navegación izquierdo dentro de la sección Supervisión:
Desde allí, se muestra una pantalla modal que contiene todos los paquetes de consulta predeterminados disponibles para Communication Services, con la lista de los paquetes de consulta disponibles por los que puede navegar, a la izquierda.
Aunque cierre la pantalla modal, podrá navegar a los distintos paquetes de consulta y acceder directamente a los datos en forma de tablas en función del esquema de los registros y las métricas que ha habilitado en la configuración de diagnóstico. Aquí, puede crear sus propias consultas a partir de los datos mediante KQL (Kusto). Puede encontrar más información sobre el uso, la edición y la creación de consultas en Consultas de Log Analytics.
Paquetes de consulta predeterminados para los registros de resumen de llamadas y diagnóstico de llamadas
A continuación, se muestran descripciones de cada consulta del paquete de consulta predeterminado para los registros de resumen de llamadas y diagnóstico de llamadas, junto con ejemplos de código y salidas de ejemplo para cada consulta disponible:
Consultas de información general de llamadas
Número de participantes por llamada
// 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)
Salida del ejemplo:
Número de participantes por llamada de grupo
// 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")
Salida del ejemplo:
Proporción de tipos de llamada
// Ratio of call types
ACSCallSummary
| summarize call_types=dcount(CorrelationId) by CallType
| render piechart title="Call Type Ratio"
Salida del ejemplo:
Distribución de duración de llamada
// 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")
Salida del ejemplo:
Percentiles de duración de llamada
// Call duration percentiles
ACSCallSummary
| distinct CorrelationId, CallDuration
| summarize avg(CallDuration), percentiles(CallDuration, 50, 90, 99)
Salida del ejemplo:
Consultas de información del punto de conexión
Número de puntos de conexión por llamada
// 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)
Salida del ejemplo:
Proporción de versiones del 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"
Salida del ejemplo:
Proporción de versiones del sistema operativo (nombre simplificado del sistema operativo)
// 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"
Salida del ejemplo:
Consultas de secuencias multimedia
Secuencias por llamada
// 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)
Salida del ejemplo:
Histograma de secuencias por llamada
// 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"
Proporción de tipos de elementos multimedia
// Ratio of media types by call
ACSCallDiagnostics
| summarize media_types=count() by MediaType
| render piechart title="Media Type Ratio"
Consultas de métricas de calidad
Promedio de valores de telemetría
// 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)
Histograma 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")
Histograma 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")
Histograma 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")
Histograma 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")
Histograma 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")
Histograma 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")
Baja calidad de vibración
// 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"
Calidad 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"
Calidad 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"
Consultas parametrizables
Llamadas diarias en la última semana
// 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"
Llamadas por hora en el último día
// 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"