Supervisión del procesamiento de eventos sin servidor

En este artículo, se proporcionan instrucciones sobre la supervisión de arquitecturas sin servidor controladas por eventos.

La supervisión proporciona información sobre el comportamiento y el estado de los sistemas. Le ayuda a crear una vista holística del entorno, recuperar tendencias históricas, correlacionar diversos factores y medir los cambios en el rendimiento, el consumo o la tasa de errores. Puede usar la supervisión para definir alertas cuando se produzcan condiciones que puedan afectar a la calidad del servicio o cuando surjan condiciones de especial interés para su entorno específico.

En este artículo, se muestra el uso de Azure Monitor para supervisar una aplicación sin servidor creada con Event Hubs y Azure Functions. Describe métricas útiles para la supervisión y cómo realizar la integración con Application Insights y capturar métricas personalizadas, y proporciona ejemplos de código.

Supuestos

En este artículo, se supone que tiene una arquitectura como la descrita en la arquitectura de referencia para el procesamiento de eventos sin servidor. Básicamente:

  • Los eventos llegan a Azure Event Hubs.
  • Se desencadena una aplicación de funciones para controlar el evento.
  • Azure Monitor está disponible para su uso con la arquitectura.

Métricas de Azure Monitor

En primer lugar, es necesario decidir qué métricas se necesitarán antes de empezar a formular información útil sobre la arquitectura. Cada recurso realiza tareas diferentes y, a su vez, genera métricas diferentes.

Estas métricas de Event Hub serán de interés para capturar información útil:

  • Solicitudes entrantes
  • Solicitudes salientes
  • solicitudes limitadas
  • Solicitudes correctas
  • Mensajes entrantes
  • Mensajes salientes
  • Mensajes capturados
  • Bytes de entrada
  • Bytes de salida
  • Bytes capturados
  • Errores de usuario

De forma similar, estas métricas de Azure Functions serán de interés para capturar información útil:

  • Recuento de ejecución de funciones
  • Conexiones
  • Datos de
  • Salida de datos
  • Errores de servidor HTTP
  • Requests
  • Solicitudes en la cola de la aplicación
  • Tiempo de respuesta

Uso del registro de diagnóstico para capturar información

Cuando se analizan conjuntamente, las métricas anteriores se pueden usar para formular y capturar la siguiente información:

  • Tasa de solicitudes procesadas por Event Hubs
  • Tasa de solicitudes procesadas por Azure Functions
  • Rendimiento total del centro de eventos
  • Errores de usuario
  • Duración de Azure Functions
  • Latencia de un extremo a otro
  • Latencia en cada fase
  • Número de mensajes perdidos
  • Número de mensajes procesados más de una vez

Para asegurarse de que Event Hubs captura las métricas necesarias, primero debemos habilitar los registros de diagnóstico (que están deshabilitados de manera predeterminada). A continuación, debemos seleccionar qué registros se desean y configurar el área de trabajo correcta de Log Analytics como destino para ellos.

Las categorías de registros y métricas que nos interesan son:

  • OperationalLogs
  • AutoScaleLogs
  • KafkaCoordinatorLogs (para cargas de trabajo de Apache Kafka)
  • KafkaUserErrorLogs (para cargas de trabajo de Apache Kafka)
  • EventHubVNetConnectionEvent
  • AllMetrics

En la documentación de Azure, se proporcionan instrucciones sobre cómo configurar los registros de diagnóstico para un centro de eventos de Azure. En la captura de pantalla siguiente se muestra un panel de configuración de diagnóstico de ejemplo con las categorías de métricas y de registro correctas seleccionadas, y un área de trabajo de Log Analytics establecida como destino. (Si se usa un sistema externo para analizar los registros, se puede usar la opción Transmitir a un centro de eventos en su lugar).

Captura de pantalla de un panel de configuración de diagnóstico de Event Hubs que muestra las categorías de métricas y de registro correctas seleccionadas, y un área de trabajo de Log Analytics establecida como destino.

Nota

Para usar los diagnósticos de registro para capturar información, debe crear centros de eventos en distintos espacios de nombres. Esto se debe a una restricción en Azure.

El centro de eventos establecido en un espacio de nombres de Event Hubs determinado se representa en las métricas de Azure Monitor en una dimensión llamada EntityName. En Azure Portal, los datos de un centro de eventos específico normalmente se pueden ver en esa instancia de Azure Monitor. Pero cuando los datos de métricas se enrutan a los diagnósticos de registro, actualmente no hay ninguna manera de ver los datos por centro de eventos mediante el filtrado de la dimensión EntityName.

Como solución alternativa, la creación de centros de eventos en distintos espacios de nombres ayuda a que sea posible localizar las métricas de un centro específico.

Uso de Application Insights

Puede habilitar Application Insights para capturar métricas y datos de telemetría personalizados desde Azure Functions. Esto le permite definir análisis que se adapten a sus propios propósitos, proporcionando otra manera de obtener información importante para el escenario de procesamiento de eventos sin servidor.

En esta captura de pantalla, se muestra una lista de ejemplo de métricas personalizadas y datos de telemetría dentro de Application Insights:

Captura de pantalla que muestra una lista de ejemplo de métricas personalizadas y datos de telemetría dentro de Application Insights.

Métricas personalizadas predeterminadas

En Application Insights, las métricas personalizadas de Azure Functions se almacenan en la tabla customMetrics. Incluye los siguientes valores, que se extienden en una escala de tiempo para diferentes instancias de funciones:

  • AvgDurationMs
  • MaxDurationMs
  • MinDurationMs
  • Successes
  • Failures
  • SuccessRate
  • Count

Estas métricas se pueden usar para calcular eficazmente los promedios agregados en las distintas instancias de funciones que se invocan en una ejecución.

En esta captura de pantalla, se muestra el aspecto de estas métricas personalizadas predeterminadas cuando se ven en Application Insights:

Captura de pantalla que muestra el aspecto de estas métricas personalizadas predeterminadas cuando se ven en Application Insights.

Mensajes personalizados

Los mensajes personalizados registrados en el código de la función de Azure (mediante ILogger) se obtienen de la tabla traces de Application Insights.

La tabla traces tiene las siguientes propiedades importantes (entre otras):

  • timestamp
  • cloud_RoleInstance
  • operation_Id
  • operation_Name
  • message

Este es un ejemplo del aspecto que podría tener un mensaje personalizado en la interfaz de Application Insights:

Captura de pantalla que muestra un ejemplo de un mensaje personalizado en la tabla de datos

Si el mensaje entrante del centro de eventos o EventData[] se registra como parte de este mensaje de ILogger personalizado, también estará disponible en Application Insights. Esto puede resultar muy útil.

En nuestro escenario de procesamiento de eventos sin servidor, registramos el cuerpo del mensaje serializado en formato JSON que se recibe del centro de eventos. Esto nos permite capturar la matriz de bytes sin procesar, junto con elementos de SystemProperties como x-opt-sequence-number, x-opt-offset y x-opt-enqueued-time. Para determinar cuándo se ha recibido cada mensaje en el centro de eventos, se usa la propiedad x-opt-enqueued-time.

Consulta de ejemplo:

traces
| where timestamp between(min_t .. max_t)
| where message contains "Body"
| extend m = parse_json(message))
| project timestamp = todatetime(m.SystemProperties.["x-opt-enqueued-time"])

La consulta de ejemplo devolvería un mensaje similar al siguiente resultado de ejemplo, que se registra de forma predeterminada en Application Insights. Las propiedades del elemento Trigger Details se pueden usar para buscar y capturar información adicional sobre los mensajes recibidos por cada PartitionId, Offset y SequenceNumber.

Resultado de ejemplo de la consulta de ejemplo:

"message": Trigger Details: PartitionId: 26, Offset: 17194119200, EnqueueTimeUtc: 2020-11-03T02:14:01.7740000Z, SequenceNumber: 843572, Count: 10,

Advertencia

La biblioteca para funciones de Java de Azure tiene actualmente un problema que impide el acceso a los elementos PartitionID y PartitionContext al usar EventHubTrigger. Más información en este informe de problemas de GitHub.

Seguimiento del flujo de mensajes mediante un identificador de transacción con Application Insights

En Application Insights, podemos ver todos los datos de telemetría relacionados con una transacción determinada mediante una consulta de búsqueda de transacciones con el valor de Operation Id de la transacción. Esto puede ser especialmente útil para capturar los valores de percentil de los tiempos medios de los mensajes a medida que la transacción se mueve en la canalización del flujo de eventos.

En la captura de pantalla siguiente, se muestra un ejemplo de búsqueda de transacciones en la interfaz de Application Insights. El valor deseado de Operation ID se introduce en el campo de consulta, identificado con un icono de lupa (y aquí se muestra resaltado en un recuadro rojo). En la parte inferior del panel principal, la pestaña Results (Resultados) muestra los eventos correspondientes en orden secuencial. En cada entrada de evento, el valor de Operation ID se resalta en color azul oscuro para facilitar la comprobación.

Captura de pantalla que muestra un ejemplo de búsqueda de transacciones en la interfaz de Application Insights.

Una consulta generada para un identificador de operación específico tendrá un aspecto parecido al siguiente. Observe que el GUID Operation ID se especifica en la cláusula where * has de la tercera línea. En este ejemplo, se acota aún más la consulta entre dos elementos datetimes diferentes.

union isfuzzy=true availabilityResults, requests, exceptions, pageViews, traces, customEvents, dependencies
| where timestamp > datetime("2020-10-09T06:58:40.024Z") and timestamp < datetime("2020-11-11T06:58:40.024Z")
| where * has "1c8c9d7073a00e4bbdcc8f2e6570e46"
| order by timestamp desc
| take 100

Esta es una captura de pantalla del aspecto que podrían tener la consulta y sus resultados correspondientes en la interfaz de Application Insights:

Captura de pantalla que muestra parte de la interfaz de Application Insights con los resultados de una consulta generada para un identificador de operación específico. La consulta real está visible en el área superior y los resultados correspondientes se enumeran a continuación.

Captura de métricas personalizadas desde Azure Functions

Funciones de .NET

El registro estructurado se usa en las funciones de .NET de Azure para capturar dimensiones personalizadas en la tabla traces de Application Insights. Estas dimensiones personalizadas se pueden usar para consultar datos.

Por ejemplo, esta es la instrucción de registro de TransformingFunction de .NET:

log.LogInformation("TransformingFunction: Processed sensorDataJson={sensorDataJson}, " +
    "partitionId={partitionId}, offset={offset} at {enqueuedTimeUtc}, " +
    "inputEH_enqueuedTime={inputEH_enqueuedTime}, processedTime={processedTime}, " +
    "transformingLatencyInMs={transformingLatencyInMs}, processingLatencyInMs={processingLatencyInMs}",
    sensorDataJson,
    partitionId,
    offset,
    enqueuedTimeUtc,
    inputEH_enqueuedTime,
    processedTime,
    transformingLatency,
    processingLatency);

Los registros resultantes creados en Application Insights contienen los parámetros anteriores como dimensiones personalizadas, como se muestra en esta captura de pantalla:

Captura de pantalla que muestra los registros creados en Application Insights por el ejemplo de código C-sharp anterior.

Estos registros se pueden consultar de la siguiente manera:

traces
| where timestamp between(min_t .. max_t)
// Function name should be of the function consuming from the Event Hub of interest
| where operation_Name == "{Function_Name}"
| where message has "{Function_Name}: Processed"
| project timestamp = todatetime(customDimensions.prop__enqueuedTimeUtc)

Nota

Para asegurarnos de que no afectamos al rendimiento con estas pruebas, hemos activado la configuración de muestreo de los registros de la función de Azure para Application Insights mediante el archivo host.json, como se muestra a continuación. Esto significa que todas las estadísticas capturadas del registro se consideran valores medios y no recuentos reales.

Ejemplo de archivo host.json:

"logging": {
    "applicationInsights": {
        "samplingExcludedTypes": "Request",
        "samplingSettings": {
            "isEnabled": true
        }
    }
}

Funciones de Java

Actualmente, no se admite el registro estructurado en las funciones de Java de Azure para capturar dimensiones personalizadas en la tabla traces de Application Insights.

Por ejemplo, esta es la instrucción de registro de TransformingFunction de Java:

LoggingUtilities.logSuccessInfo(
    context.getLogger(), 
    "TransformingFunction", 
    "SuccessInfo", 
    offset, 
    processedTimeString, 
    dateformatter.format(enqueuedTime), 
    transformingLatency
);

Los registros resultantes creados en Application Insights contienen los parámetros anteriores en el mensaje, como se muestra a continuación:

Captura de pantalla que muestra los registros creados en Application Insights por el ejemplo de código Java anterior.

Estos registros se pueden consultar de la siguiente manera:

traces
| where timestamp between(min_t .. max_t)
// Function name should be of the function consuming from the Event Hub of interest
| where operation_Name in ("{Function name}") and message contains "SuccessInfo"
| project timestamp = todatetime(tostring(parse_json(message).enqueuedTime))

Nota

Para asegurarnos de que no afectamos al rendimiento con estas pruebas, hemos activado la configuración de muestreo de los registros de la función de Azure para Application Insights mediante el archivo host.json, como se muestra a continuación. Esto significa que todas las estadísticas capturadas del registro se consideran valores medios y no recuentos reales.

Ejemplo de archivo host.json:

"logging": {
    "applicationInsights": {
        "samplingExcludedTypes": "Request",
        "samplingSettings": {
            "isEnabled": true
        }
    }
}

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.