Supervisión de Event Hubs y Azure Functions

Azure Event Hubs
Azure Functions
Azure Monitor

La supervisión proporciona información sobre el comportamiento y el estado de los sistemas, y ayuda a crear una vista holística del entorno y las tendencias históricas, a correlacionar diversos factores y a medir los cambios en el rendimiento, el consumo o la tasa de errores.

Azure Functions ofrece integración incorporada en Application Insights. En Application Insights, puede obtener información como el número de instancias de aplicación de funciones o la telemetría de solicitud y dependencia de una función. Al trabajar con Event Hubs y Functions, Application Insights también puede realizar un seguimiento de las telemetrías de dependencia salientes al centro de eventos, calcular el tiempo empleado en la cola y mostrar el flujo de un extremo a otro del sistema conectado a través de Event Hubs.

En esta sección se presentan características e información útiles que puede obtener de Application Insights para la solución de Event Hubs más Functions.

Mapa de aplicación

El mapa de aplicación muestra cómo interactúan entre sí los componentes de un sistema. Debido a la telemetría de dependencia que proporciona Application Insights, asigna el flujo de eventos entre Event Hubs y Azure Functions, incluido el promedio de ejecución de cada función y la duración media de un evento en Event Hubs, y muestra en rojo las transacciones que contienen errores.

Después de enviar la carga esperada al sistema, puede ir a Application Insights en Azure Portal y, en la barra lateral, elegir Mapa de aplicación. A continuación se muestra un mapa con tres funciones, tres centros de eventos y errores evidentes al escribir en una base de datos de nivel inferior:

Mapa de aplicación

Detalles de la transacción completa

Los detalles de la transacción de un extremo a otro muestran cómo interactúan entre sí los componentes del sistema, en orden cronológico. Esta vista también muestra cuánto tiempo ha pasado un evento en la cola. También puede profundizar en la telemetría de cada componente desde esta vista, lo que facilita la solución de problemas entre los componentes dentro de la misma solicitud cuando se ha producido un problema.

Transacción de un extremo a otro

Métricas y telemetría de la plataforma

Las métricas generadas por la plataforma en Azure Monitor para Event Hubs y Azure Functions se pueden usar para la supervisión general del comportamiento y el estado de la solución:

Azure Functions se integra con Application Insights para proporcionar telemetría e información avanzadas y detalladas sobre las ejecuciones de funciones y host de Functions. Para obtener más información, consulte Análisis de la telemetría de Azure Functions en Application Insights. Al usar Application Insights para supervisar una topología, hay varias configuraciones disponibles. Para más información, consulte Configuración de la supervisión para Azure Functions.

A continuación se muestra un ejemplo de telemetría adicional para funciones desencadenadas de Event Hubs generadas en la tabla de seguimientos:

Trigger Details: PartionId: 6, Offset: 3985758552064-3985758624640, EnqueueTimeUtc: 2022-10-31T12:51:58.1750000+00:00-2022-10-31T12:52:03.8160000+00:00, SequenceNumber: 3712266-3712275, Count: 10

Esta información requiere el uso de la extensión de Event Hubs 4.2.0 o una versión posterior. Estos datos son muy útiles, ya que contienen información sobre el mensaje que desencadenó la ejecución de la función y se pueden usar para realizar consultas y obtener información. Incluyen los datos siguientes para cada vez que se desencadena la función:

  • El id. de partición (6)
  • El rango de desplazamiento de la partición (3985758552064-3985758624640)
  • Intervalo de tiempo de puesta en cola en UTC (2022-10-31T12:51:58.1750000+00:00-2022-10-31T12:52:03.8160000+00:00)
  • El rango del número de secuencia 3712266-3712275
  • Y el recuento de mensajes (10)

Consulte la sección Ejemplo de consultas de Application Insights para ver ejemplos sobre cómo usar esta telemetría.

La telemetría personalizada también es posible para distintos lenguajes (biblioteca de clases de C#, Aislado de C#, Script de C#, JavaScript, Java, PowerShell y Python). Este registro se muestra en la tabla de seguimientos de Application Insights. Puede crear sus propias entradas en Application Insights y agregar dimensiones personalizadas que se pueden usar para consultar datos y crear paneles personalizados.

Por último, cuando la aplicación de funciones se conecta a un centro de eventos mediante un enlace de salida, las entradas también se escriben en la tabla Dependencias de Application Insights.

Tabla de dependencias

Para Event Hubs, la correlación se inserta en la carga del evento y se ve una propiedad Diagnostic-Id en los eventos:

Propiedad Id. de diagnóstico

Esto sigue el formato de contexto de seguimiento de W3C que también se usa como identificador de operación y vínculos de operación en la telemetría creada por Functions, lo que permite a Application Insights construir la correlación entre los eventos de Event Hubs y las ejecuciones de funciones, incluso cuando están distribuidas.

Correlación de eventos por lotes

Ejemplo de consultas de Application Insights

A continuación se muestra una lista de consultas de Application Insights útiles al supervisar Event Hubs con Azure Functions. Esta consulta muestra información detallada para la función desencadenada por el centro de eventos mediante la telemetría emitida por la extensión de Event Hubs 4.2.0 y versiones posteriores.

Cuando se habilita el muestreo en Application Insights, puede haber espacios en los datos.

Información detallada del procesamiento de eventos

Los datos solo se emiten en el formato correcto cuando se usa el envío por lotes. El envío por lotes significa que la función acepta varios eventos para cada ejecución, lo que se recomienda para el rendimiento. Tenga en cuenta las siguientes consideraciones:

  • El valor dispatchTimeMilliseconds es una aproximación de la longitud de tiempo entre el momento en que el evento se escribió en el centro de eventos y el momento en que la aplicación de funciones lo recogió para su procesamiento.
  • dispatchTimeMilliseconds puede ser negativo o inexacto debido al desfase del reloj entre el servidor del centro de eventos y la aplicación de funciones.
  • Las particiones de Event Hubs se procesan secuencialmente. No se enviará un mensaje al código de la función para su procesamiento hasta que se hayan procesado todos los mensajes anteriores. Supervise el tiempo de ejecución de las funciones, ya que los tiempos de ejecución más largos provocarán retrasos en el envío.
  • El cálculo usa el valor enqueueTime del primer mensaje del lote. Los tiempos de envío pueden ser menores para otros mensajes del lote.
  • dispatchTimeMilliseconds se basa en el momento dado.
  • Los números de secuencia son por partición y se puede producir un procesamiento duplicado porque Event Hubs no garantiza la entrega de mensajes exactamente una vez.
traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| project timestamp, cloud_RoleInstance, operation_Name, processId =
customDimensions.ProcessId, partitionId, messageCount, sequenceNumberStart,
sequenceNumberEnd, enqueueTimeStart, enqueueTimeEnd, dispatchTimeMilliseconds

Procesamiento de eventos detallado

Visualización de la latencia de envío

Esta consulta visualiza la latencia de envío de eventos de percentil 50 y 90 para una determinada función desencadenada por el centro de eventos. Vea la consulta anterior para obtener más detalles y notas.

traces
| where operation_Name == "<ENTER THE NAME OF YOUR FUNCTION HERE>"
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| summarize percentiles(dispatchTimeMilliseconds, 50, 90) by bin(timestamp, 5m)
| render timechart

Visualización de la latencia de envío

Resumen de la latencia de envío

Esta consulta es similar a la anterior, pero muestra una vista de resumen.

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| extend dispatchTimeMilliseconds = (timestamp - enqueueTimeStart) / 1ms
| summarize messageCount = sum(messageCount),
percentiles(dispatchTimeMilliseconds, 50, 90, 99, 99.9, 99.99) by operation_Name

Resumen de la latencia de envío

Distribución de mensajes entre particiones

Esta consulta muestra cómo visualizar la distribución de mensajes entre particiones.

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| summarize messageCount = sum(messageCount) by cloud_RoleInstance,
bin(timestamp, 5m)
| render areachart kind=stacked

Distribución de mensajes entre particiones

Distribución de mensajes entre instancias

Esta consulta muestra cómo visualizar la distribución de mensajes entre instancias.

traces
| where message startswith "Trigger Details: Parti"
| parse message with * "tionId: " partitionId:string ", Offset: "
offsetStart:string "-" offsetEnd:string", EnqueueTimeUtc: "
enqueueTimeStart:datetime "+00:00-" enqueueTimeEnd:datetime "+00:00, SequenceNumber: "
sequenceNumberStart:string "-" sequenceNumberEnd:string ", Count: "
messageCount:int
| summarize messageCount = sum(messageCount) by cloud_RoleInstance,
bin(timestamp, 5m)
| render areachart kind=stacked

Distribución de mensajes entre instancias

Instancias en ejecución e instancias asignadas

Esta consulta muestra cómo visualizar el número de instancias de Azure Functions que están procesando eventos de Event Hubs y el número total de instancias (en procesamiento y en espera de concesión). La mayoría de las veces deben ser iguales.

traces
| where message startswith "Trigger Details: Parti"
| summarize type = "Executing Instances", Count = dcount(cloud_RoleInstance) by
bin(timestamp, 60s)
| union (
    traces
    | summarize type = "Allocated Instances", Count = dcount(cloud_RoleInstance) by
bin(timestamp, 60s)
)
| project timestamp, type, Count
| render timechart

Instancias en ejecución e instancias asignadas

Toda la telemetría de una ejecución de función específica

El campo operation_Id se puede usar en las distintas tablas de Application Insights. Para instancias de Azure Functions desencadenadas por Event Hubs, la consulta siguiente, por ejemplo, dará como resultado la información del desencadenador, la telemetría de los registros dentro del código de la función y las dependencias y excepciones:

union isfuzzy=true requests, exceptions, traces, dependencies
| where * has "<ENTER THE OPERATION_ID OF YOUR FUNCTION EXECUTION HERE>"
| order by timestamp asc

Toda la telemetría de una ejecución de función específica

Latencia de un extremo a otro de un evento

Dado que la propiedad enqueueTimeUtc del seguimiento detallado del desencadenador muestra el tiempo de puesta en cola solo del primer evento de cada lote que procesó la función, se puede usar una consulta más avanzada para calcular la latencia de un extremo a otro de los eventos entre dos funciones con instancias de Event Hubs entre ellas. Esta consulta expandirá los vínculos de la operación (si los hubiera) en la solicitud de la segunda función y asignará su hora de finalización al mismo identificador de operación correspondiente de la hora de inicio de la primera función.

let start = view(){
requests
| where operation_Name == "FirstFunction"
| project start_t = timestamp, first_operation_Id = operation_Id
};
let link = view(){
requests
| where operation_Name == "SecondFunction"
| mv-expand ex = parse_json(tostring(customDimensions["_MS.links"]))
| extend parent = case(isnotempty(ex.operation_Id), ex.operation_Id, operation_Id )
| project first_operation_Id = parent, second_operation_Id = operation_Id
};
let finish = view(){
traces
| where customDimensions["EventName"] == "FunctionCompleted" and operation_Name
== "SecondFunction"
| project end_t = timestamp, second_operation_Id = operation_Id
};
start
| join kind=inner (
link
| join kind=inner finish on second_operation_Id
) on first_operation_Id
| project start_t, end_t, first_operation_Id, second_operation_Id
| summarize avg(datetime_diff('second', end_t, start_t))

Latencia de un extremo a otro de un evento

Colaboradores

Microsoft mantiene este artículo. Originalmente lo escribieron los siguientes colaboradores.

Autor principal:

Para ver los perfiles no públicos de LinkedIn, inicie sesión en LinkedIn.

Pasos siguientes

Para obtener más información, considere la posibilidad de revisar estos artículos relacionados: