Supervisión de Azure Functions con Application Insights de Azure Monitor

Azure Functions ofrece integración incorporada con Application Insights para supervisar las funciones. En el caso de lenguajes distintos de .NET y .NET Core, se requieren otras extensiones o trabajos específicos del lenguaje para aprovechar todas las ventajas del seguimiento distribuido.

Application Insights recopila datos de registros, de rendimiento y de errores, y detecta automáticamente las anomalías en el rendimiento. Application Insights incluye herramientas de análisis eficaces que ayudan a diagnosticar problemas y comprender cómo se usan las funciones. Cuando tenga la visibilidad de los datos de su aplicación, puede mejorar continuamente el rendimiento y la facilidad de uso. Incluso puede usar Application Insights durante el desarrollo local de proyectos de aplicación de función.

La instrumentación de Application Insights necesaria está integrada en Azure Functions. Todo lo que necesita es una cadena de conexión válida para conectar la aplicación de funciones a un recurso de Application Insights. La cadena de conexión se debe agregar a la configuración de la aplicación cuando se cree el recurso de la aplicación de funciones en Azure. Si la aplicación de funciones aún no tiene esta cadena, puede establecerla de forma manual. Para más información, consulte Supervisión de ejecuciones en Azure Functions y Cadenas de conexión.

Nota

El 31 de marzo de 2025 finalizará la compatibilidad con la ingesta de claves de instrumentación. La ingesta de claves de instrumentación seguirá funcionando, pero la característica ya no recibirá actualizaciones ni soporte técnico. Transición a las cadenas de conexión para aprovechar las nuevas funcionalidades.

Para obtener una lista de escenarios de instrumentación automática compatibles, consulte Entornos, lenguajes y proveedores de recursos admitidos.

Seguimiento distribuido para aplicaciones Java

Nota

Esta característica solía tener una implicación de inicio en frío de 8 a 9 segundos, que se ha reducido a menos de 1 segundo. Si era un pionero de esta característica (por ejemplo, antes de febrero de 2023), revise la sección "Solución de problemas" para actualizar a la versión actual y beneficiarse del nuevo inicio más rápido.

Para ver más datos de las aplicaciones de Azure Functions basadas en Java de los que se recopilan de forma predeterminada, habilite el agente Java 3.x de Application Insights. Este agente permite a Application Insights recopilar y correlacionar automáticamente dependencias, registros y métricas de bibliotecas populares y los kit de desarrollo de software (SDK) de Azure. Esta telemetría se suma a la telemetría de solicitud ya capturada por Functions.

Al usar el mapa de aplicaciones y tener una vista más completa de las transacciones de un extremo a otro, puede diagnosticar mejor los problemas. Tiene una vista topológica de cómo interactúan los sistemas junto con los datos sobre rendimiento medio y tasas de errores. También tiene más datos para los diagnósticos de un extremo a otro. Puede usar el mapa de aplicaciones para encontrar fácilmente la causa principal de problemas de confiabilidad y cuellos de botella de rendimiento por solicitud.

Para casos de uso más avanzados, modifique la telemetría; para ello, agregue intervalos, actualice el estado del intervalo y agregue atributos del intervalo. También puede enviar telemetría personalizada mediante las API estándar.

Habilitación del seguimiento distribuido para las aplicaciones de funciones de Java

En el panel de la aplicación de funciones Información general, vaya a Application Insights. En Collection Level, seleccione Recommended.

Captura de pantalla que muestra cómo habilitar el agente de Java de AppInsights.

Solución de problemas

Las funciones de Java pueden tener tiempos de inicio lentos si ha adoptado esta característica antes de febrero de 2023. En el panel Información general de la aplicación de funciones, vaya a Configuración en el menú de navegación izquierdo. Luego, seleccione Configuración de la aplicación y siga los siguientes pasos para solucionar el problema.

Windows

  1. Compruebe si existen las siguientes opciones de configuración y quítelas:

    XDT_MicrosoftApplicationInsights_Java -> 1
    ApplicationInsightsAgent_EXTENSION_VERSION -> ~2
    
  2. Habilite la versión más reciente agregando este valor:

    APPLICATIONINSIGHTS_ENABLE_AGENT: true
    

Dedicado/Premium de Linux

  1. Compruebe si existen las siguientes opciones de configuración y quítelas:

    ApplicationInsightsAgent_EXTENSION_VERSION -> ~3
    
  2. Habilite la versión más reciente agregando este valor:

    APPLICATIONINSIGHTS_ENABLE_AGENT: true
    

Nota

Si la versión más reciente del agente de Java de Application Insights no está disponible en Azure Functions, cárguela manualmente siguiendo estas instrucciones.

Prueba de la conectividad entre el host de la aplicación y el servicio de ingesta

Los SDK y agentes de Application Insights envían telemetría para ingerirse como llamadas REST a nuestros puntos de conexión de ingesta. Puede probar la conectividad desde el servidor web o la máquina host de la aplicación a los puntos de conexión del servicio de ingesta mediante clientes REST sin procesar con comandos de PowerShell o curl. Consulte Solución de problemas de telemetría de aplicaciones que faltan en Azure Monitor Application Insights.

Registros duplicados

Si usa log4j o logback para el registro de la consola, el seguimiento distribuido para Java Functions creará registros duplicados. Estos registros duplicados se envían a Application Insights. Para evitar este comportamiento, use las siguientes soluciones alternativas.

Log4j

Agregue el siguiente filtro al log4j.xml:

<Filters>
  <ThresholdFilter level="ALL" onMatch="DENY" onMismatch="NEUTRAL"/>
</Filters>

Ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
      <Filters>
        <ThresholdFilter level="ALL" onMatch="DENY" onMismatch="NEUTRAL"/>
      </Filters>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="error">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>
Logback

Agregue el siguiente filtro al logback.xml:

<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
  <level>OFF</level>
</filter>  

Ejemplo:

<configuration debug="true">
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are  by default assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
      <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
        <level>OFF</level>
      </filter>  
    </encoder>
  </appender>
  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

Seguimiento distribuido para aplicaciones de funciones de Node.js

Para ver más datos de las aplicaciones de Azure Functions de Node que se recopilan de forma predeterminada, instrumente la función mediante la distribución OpenTelemetry de Azure Monitor.

Seguimiento distribuido para aplicaciones de funciones de Python

Para recopilar datos de telemetría de servicios como Requests, urllib3, httpx, PsycoPG2, etc., use la distribución de OpenTelemetry de Azure Monitor. Las solicitudes entrantes supervisadas que llegan a la aplicación de Python hospedada en Azure Functions no se correlacionarán automáticamente con los datos de telemetría de los que se realiza un seguimiento en dicha aplicación. Para lograr manualmente la correlación del seguimiento, extraiga el contexto de seguimiento (TraceContext) directamente como se muestra a continuación:

import azure.functions as func

from azure.monitor.opentelemetry import configure_azure_monitor
from opentelemetry import trace
from opentelemetry.propagate import extract

# Configure Azure monitor collection telemetry pipeline
configure_azure_monitor()

def main(req: func.HttpRequest, context) -> func.HttpResponse:
   ...
   # Store current TraceContext in dictionary format
   carrier = {
      "traceparent": context.trace_context.Traceparent,
      "tracestate": context.trace_context.Tracestate,
   }
   tracer = trace.get_tracer(__name__)
   # Start a span using the current context
   with tracer.start_as_current_span(
      "http_trigger_span",
      context=extract(carrier),
   ):
      ...

Pasos siguientes