Monitorar o Azure Functions com o Application Insights do Azure Monitor

O Azure Functions oferece integração interna com o Application Insights para monitorar funções. Para linguagens diferentes de .NET e .NETCore, são necessárias extensões/funções de trabalho adicionais específicas à linguagem para obter todos os benefícios do rastreamento distribuído.

O Application Insights coleta dados de log, desempenho e erro e detecta automaticamente anomalias de desempenho. O Application Insights inclui ferramentas de análise poderosas para ajudar você a diagnosticar problemas e a entender como suas funções são usadas. Quando você tiver a visibilidade dos dados do aplicativo, poderá melhorar continuamente o desempenho e a usabilidade. Você pode até mesmo usar Application Insights durante o desenvolvimento do projeto de aplicativo de funções local.

A instrumentação do Application Insights necessária é incorporada ao Azure Functions. Tudo o que você precisa é de uma cadeia de conexão válida para conectar seu aplicativo de funções a um recurso do Application Insights. A cadeia de conexão deve ser adicionada às configurações do aplicativo quando o recurso do aplicativo de funções é criado no Azure. Se o seu aplicativo de funções ainda não tiver uma cadeia de conexão, você poderá defini-la manualmente. Para obter mais informações, confira Monitorar execuções no Azure Functions e Cadeias de conexão.

Observação

Em 31 de março de 31, 2025, o suporte à ingestão de chave de instrumentação será encerrado. A ingestão de chave de instrumentação continuará funcionando, mas não forneceremos mais atualizações ou suporte para o recurso. Transição para cadeias de conexão para aproveitar as novas funcionalidades.

Para ver a lista de cenários de instrumentação automática com suporte, confira Ambientes, linguagens e provedores de recursos com suporte.

Rastreamento distribuído para aplicativos Java

Observação

Esse recurso costumava ter uma implicação de inicialização a frio de 8 a 9 segundos, que foi reduzida para menos de 1 segundo. Se você foi um dos primeiros a adotar esse recurso (por exemplo, antes de fevereiro de 2023), examine a seção "Solução de problemas" a fim de atualizar para a versão atual e se beneficiar da nova inicialização mais rápida.

Para exibir mais dados de seus aplicativos do Azure Functions baseados em Java do que os coletados por padrão, habilite o agente Java 3.x do Application Insights. Esse agente permite que o Application Insights colete e correlacione automaticamente dependências, logs e métricas de bibliotecas populares e SDKs (Software Development Kit) do Azure. Essa telemetria se soma à telemetria de solicitação já capturada pelo Functions.

Usando o mapa do aplicativo e tendo uma exibição mais completa das transações de ponta a ponta, você pode diagnosticar melhor os problemas. Você tem uma visão topológica de como os sistemas interagem junto com os dados em taxas médias de desempenho e erro. Você também tem mais dados para diagnósticos de ponta a ponta. Você pode usar o mapa do aplicativo para encontrar facilmente a causa raiz de problemas de confiabilidade e gargalos de desempenho por solicitação.

Para casos de uso mais avançados, você pode modificar a telemetria adicionando intervalos, atualizando o status do intervalo e adicionando atributos de intervalo. Você também pode enviar telemetria personalizada usando APIs padrão.

Habilitar o rastreamento distribuído para aplicativos de funções Java

No painel de aplicativo de funções Visão Geral, vá para Application Insights. Em Nível de Coleção, selecione Recomendado.

Captura de tela que mostra como habilitar o Agente Java para AppInsights.

Solução de problemas

Suas funções Java podem demorar mais para inicializar se você tiver adotado esse recurso antes de fevereiro de 2023. No painel Visão geral do aplicativo de funções, acesse Configuração no menu de navegação do lado esquerdo. Em seguida, selecione Configurações do aplicativo e siga as etapas a seguir para corrigir o problema.

Windows

  1. Verifique se as seguintes configurações existem e as remova:

    XDT_MicrosoftApplicationInsights_Java -> 1
    ApplicationInsightsAgent_EXTENSION_VERSION -> ~2
    
  2. Habilite a versão mais recente adicionando essa configuração:

    APPLICATIONINSIGHTS_ENABLE_AGENT: true
    

Linux Dedicado/Premium

  1. Verifique se as seguintes configurações existem e as remova:

    ApplicationInsightsAgent_EXTENSION_VERSION -> ~3
    
  2. Habilite a versão mais recente adicionando essa configuração:

    APPLICATIONINSIGHTS_ENABLE_AGENT: true
    

Observação

Se a versão mais recente do agente Java do Application Insights não estiver disponível no Azure Functions, carregue-a manualmente seguindo estas instruções.

Testar a conectividade entre o host do aplicativo e o serviço de ingestão

Os SDKs e agentes do Application Insights enviam telemetria para serem ingeridos como chamadas REST para nossos pontos de extremidade de ingestão. Você pode testar a conectividade do servidor Web ou do computador host do aplicativo para os pontos de extremidade do serviço de ingestão usando clientes REST brutos do PowerShell ou comandos curl. Confira Solucionar problemas de telemetria de aplicativo ausente no Application Insights do Azure Monitor.

Logs duplicados

Se estiver usando log4j ou logback para registrar em log no console, o rastreamento distribuído para funções Java cria logs duplicados. Esses logs duplicados são enviados para o Application Insights. Para evitar esse comportamento, use as seguintes soluções alternativas.

Log4j

Adicione o seguinte filtro ao log4j.xml:

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

Exemplo:

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

Adicione o seguinte filtro ao logback.xml:

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

Exemplo:

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

Rastreamento distribuído para aplicativos de funções Node.js

Para exibir mais dados dos seus aplicativos Node do Azure Functions do que são coletados por padrão, instrumente sua função usando a Distribuição OpenTelemetry do Azure Monitor.

Rastreamento distribuído para aplicativos de funções Python

Para coletar telemetria de serviços, como Requests, urllib3, httpx, PsycoPG2 e muito mais, use o OpenTelemetry Distro do Azure Monitor. As solicitações de entrada rastreadas que chegam ao aplicativo Python hospedado no Azure Functions não serão correlacionadas automaticamente com a telemetria que está sendo rastreada dentro dele. Para obter manualmente a correlação de rastreamento, faça a extração direta do TraceContext, conforme aparece abaixo:

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

Próximas etapas