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 Azure Functions y Event Hubs, Application Insights también puede realizar un seguimiento de telemetrías de dependencia salientes al centro de eventos, calculando el tiempo de procesamiento y mostrando el flujo de extremo a extremo 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 a su sistema, puede ir a Application Insights en el portal de Azure, 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:
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 en procesarse un evento. 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.
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:
Las métricas de Azure Event Hubs en Azure Monitor son interesantes para capturar información útil para Event Hubs (como agregados de solicitudes entrantes, solicitudes salientes, solicitudes limitadas, solicitudes correctas, mensajes entrantes, mensajes salientes, mensajes capturados, bytes entrantes, bytes salientes, bytes capturados y errores de usuario).
Las métricas de Azure Functions comparten muchas de las métricas de Azure App Service, con la adición del Recuento de la ejecución de la función y las Unidades de ejecución de la función que se pueden usar para comprender el uso y el costo del plan de consumo. Otras métricas de interés son Conexiones, Datos entrantes, Datos salientes, Espacio medio de trabajo de memoria, Número de subprocesos, Solicitudes y Tiempo de respuesta.
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.
Para Event Hubs, la correlación se inserta en la carga del evento y se ve una propiedad Diagnostic-Id en los eventos:
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.
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
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
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
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 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
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
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
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))
Colaboradores
Microsoft mantiene este artículo. Originalmente lo escribieron los siguientes colaboradores.
Autor principal:
- David Barkol | Especialista en soluciones principales GBB
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:
- Análisis de la telemetría de Azure Functions en Application Insights
- Configuración de la supervisión para Azure Functions
- Análisis de la telemetría de Azure Functions en Application Insights
- Métricas en Azure Monitor: Azure Event Hubs
- Lenguaje de consulta Kusto
- Procesamiento de eventos sin servidor es una arquitectura de referencia que detalla una arquitectura típica de este tipo, con ejemplos de código y análisis de las consideraciones importantes.