Superviser Azure Functions avec Application Insights d’Azure Monitor

La solution Azure Functions est intégrée à Application Insights pour superviser des fonctions. Pour les langages autres que .NET et .NETCore, d’autres rôles de travail/extensions spécifiques au langage sont nécessaires pour tirer pleinement parti du suivi distribué.

Application Insights collecte les données des journaux, des performances et des erreurs, et détecte automatiquement les anomalies de performances. Application Insights intègre de puissants outils d’analyse conçus pour aider à diagnostiquer les problèmes et à comprendre la manière dont vos fonctions sont utilisées. Lorsque vous avez la possibilité de visualiser les données de vos applications, vous pouvez améliorer en permanence les performances et la convivialité. Vous pouvez également utiliser Application Insights lors du développement d'un projet d'application de fonction local.

L’instrumentation Application Insights nécessaire est intégrée à Azure Functions. Tout ce dont vous avez besoin c’est d’une chaîne de connexion valide pour connecter votre application de fonction à une ressource Application Insights. La chaîne de connexion doit être ajoutée aux paramètres de votre application lorsque la ressource de votre application de fonction est créée dans Azure. Si votre application de fonction n’a pas encore de chaîne de connexion, vous pouvez la définir manuellement. Pour plus d’informations, consultez Superviser les exécutions dans Azure Functions et Chaînes de connexion.

Notes

Le support de l’ingestion de clé d’instrumentation prendra fin le 31 mars 2025. L’ingestion de clé d’instrumentation continuera de fonctionner, mais nous ne fournirons plus de mises à jour ni de support pour la fonctionnalité. Passez aux chaînes de connexion pour tirer parti des nouvelles fonctionnalités.

Si vous souhaitez obtenir la liste des scénarios d’instrumentation automatique pris en charge, consultez Environnements, langages et fournisseurs de ressources pris en charge.

Suivi distribué pour les applications Java

Notes

Auparavant, cette fonctionnalité avait une implication de démarrage à froid de 8 à 9 secondes, qui a été réduite à moins d’une seconde. Si vous avez été un utilisateur précoce de cette fonctionnalité (par exemple, avant février 2023), consultez la section « Résolution des problèmes » pour effectuer la mise à jour vers la version actuelle et bénéficier du nouveau démarrage plus rapide.

Pour afficher plus de données de vos applications Azure Functions s’appuyant sur Java que celles collectées par défaut, activez l’agent Application Insights pour Java 3.x. Cet agent permet à Application Insights de collecter et de mettre en corrélation automatiquement les dépendances, journaux et métriques à partir des bibliothèques populaires et des Kits de développement logiciel (SDK) Azure. Cette télémétrie s’ajoute à la télémétrie des requêtes déjà capturée par Functions.

En utilisant la cartographie d’application et en ayant une vue plus complète des transactions de bout en bout, vous parvenez à mieux diagnostiquer les problèmes. Vous bénéficiez d’une vue topologique sur la façon dont les systèmes interagissent avec les données sur les performances moyennes et les taux d’erreur. Vous disposez également de plus de données pour les diagnostics de bout en bout. Vous pouvez utiliser la cartographie d’application sur chaque requête pour trouver facilement la cause principale des problèmes de fiabilité et de goulots d’étranglement des performances.

Pour les cas d’usage plus élaborés, vous pouvez modifier la télémétrie en ajoutant des étendues, en mettant à jour l’état de l’étendue et en ajoutant des attributs d’étendue. Vous pouvez également envoyer une télémétrie personnalisée à l’aide d’API standard.

Activer le suivi distribué pour les applications de fonction Java

Dans le volet Vue d’ensemble de l’application de fonction, accédez à Application Insights. Sous Niveau de collection, sélectionnez Recommandé.

Capture d’écran montrant comment activer l’agent Java AppInsights.

Dépannage

Vos fonctions Java peuvent avoir des temps de démarrage lents si vous avez adopté cette fonctionnalité avant février 2023. Dans le volet Vue d’ensemble de l’application de fonction, accédez à Configuration dans le menu de navigation de gauche. Sélectionnez ensuite Paramètres d’application et utilisez les étapes suivantes pour corriger le problème.

Windows

  1. Vérifiez si les paramètres suivants existent et supprimez-les :

    XDT_MicrosoftApplicationInsights_Java -> 1
    ApplicationInsightsAgent_EXTENSION_VERSION -> ~2
    
  2. Activez la dernière version en ajoutant ce paramètre :

    APPLICATIONINSIGHTS_ENABLE_AGENT: true
    

Dedicated/Premium Linux

  1. Vérifiez si les paramètres suivants existent et supprimez-les :

    ApplicationInsightsAgent_EXTENSION_VERSION -> ~3
    
  2. Activez la dernière version en ajoutant ce paramètre :

    APPLICATIONINSIGHTS_ENABLE_AGENT: true
    

Notes

Si la dernière version de l’agent Application Insights pour Java n’est pas disponible dans Azure Functions, vous pouvez la charger manuellement en suivant ces instructions.

Tester la connectivité entre votre hôte d’application et le service d’ingestion

Les SDK et les agents Application Insights envoient de la télémétrie à ingérer en tant qu’appels REST à nos points de terminaison d’ingestion. Vous pouvez tester la connectivité de votre serveur web ou de votre machine hôte d’application vers les points de terminaison de service d’ingestion en utilisant des clients du Representational State Transfer (REST) bruts à partir de commandes PowerShell ou curl. Consultez Résoudre les problèmes de télémétrie d’application manquante dans Azure Monitor Application Insights.

Journaux en double

Si vous utilisez log4j ou logback pour la journalisation de la console, le suivi distribué pour Java Functions crée des journaux dupliqués. Ces journaux en double sont ensuite envoyés à Application Insights. Pour éviter ce comportement, utilisez les solutions de contournement suivantes.

Log4j

Ajoutez le filtre suivant à votre log4j.xml :

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

Exemple :

<?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

Ajoutez le filtre suivant à votre logback.xml :

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

Exemple :

<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>

Suivi distribué pour les applications de fonction Node.js

Pour voir plus de données de vos applications Node Azure Functions que celles collectées par défaut, instrumentez votre fonction avec la distribution OpenTelemetry d’Azure Monitor.

Suivi distribué pour les applications de fonction Python

Pour collecter des données de télémétrie à partir de services tels que Requests, urllib3, httpx, PsycoPG2, etc., utilisez la Azure Monitor OpenTelemetry Distro. Les requêtes entrantes suivies dans votre application Python hébergées dans Azure Functions ne sont pas automatiquement corrélées avec les données de télémétrie qui y sont suivies. Vous pouvez obtenir manuellement la corrélation de trace en extrayant le TraceContext directement comme indiqué ci-dessous :

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),
   ):
      ...

Étapes suivantes