Monitorar o Azure Functions com o Azure Monitor Application Insights

O Azure Functions oferece integração interna com o Application Insights para monitorar funções. Para idiomas diferentes do .NET e do .NET Core, outros trabalhadores/extensões específicos do idioma são necessários para obter todos os benefícios do rastreamento distribuído.

O Application Insights coleta dados de log, desempenho e erros e deteta automaticamente anomalias de desempenho. O Application Insights inclui poderosas ferramentas de análise para ajudá-lo a diagnosticar problemas e entender como suas funções são usadas. Quando você tem visibilidade dos dados do seu aplicativo, pode melhorar continuamente o desempenho e a usabilidade. Você pode até usar o Application Insights durante o desenvolvimento de projetos de aplicativos de função local.

A instrumentação necessária do Application Insights é incorporada ao Azure Functions. Tudo o que você precisa é de uma cadeia de conexão válida para conectar seu aplicativo de função 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ção é criado no Azure. Se o seu aplicativo de função ainda não tiver uma cadeia de conexão, você poderá defini-la manualmente. Para obter mais informações, consulte Monitorar execuções no Azure Functions e cadeias de conexão.

Nota

A 31 de março de 2025, o suporte da ingestão de chaves de instrumentação terminará. A ingestão de chaves de instrumentação continuará a funcionar, mas não forneceremos mais atualizações ou suporte para o recurso. Transição para cadeias de conexão para aproveitar os novos recursos.

Para obter uma lista de cenários de autoinstrumentação suportados, consulte Ambientes suportados, idiomas e provedores de recursos.

Rastreamento distribuído para aplicativos Java

Nota

Este 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), revise a seção "Solução de problemas" para 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 Kits) do Azure. Essa telemetria se soma à telemetria de solicitação já capturada pelo Functions.

Usando o mapa do aplicativo e tendo uma visã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 sobre o desempenho médio e as taxas de 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 spans, atualizando o status da extensão e adicionando atributos de span. Você também pode enviar telemetria personalizada usando APIs padrão.

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

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

Captura de tela que mostra como habilitar o AppInsights Java Agent.

Resolução de Problemas

Suas funções Java podem ter tempos de inicialização lentos se você adotou esse recurso antes de fevereiro de 2023. No painel Visão geral do aplicativo de função, vá para Configuração no menu de navegação do lado esquerdo. Em seguida, selecione Configurações do aplicativo e use as etapas a seguir para corrigir o problema.

Windows

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

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

    APPLICATIONINSIGHTS_ENABLE_AGENT: true
    

Linux Dedicado/Premium

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

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

    APPLICATIONINSIGHTS_ENABLE_AGENT: true
    

Nota

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

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 seu servidor Web ou máquina host de aplicativo para os pontos de extremidade do serviço de ingestão usando clientes REST brutos do PowerShell ou comandos curl. Consulte Solucionar problemas de telemetria de aplicativo ausente no Azure Monitor Application Insights.

Logs duplicados

Se você estiver usando log4j ou logback para registro em log do console, o rastreamento distribuído para Java Functions criará 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 seu 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>
Registo

Adicione o seguinte filtro ao seu 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ção Node.js

Para exibir mais dados de seus aplicativos do Node Azure Functions do que os coletados por padrão, instrumente sua Função usando a Distro OpenTelemetry do Azure Monitor.

Rastreamento distribuído para aplicativos de função Python

Para coletar telemetria de serviços como Solicitações, urllib3, httpx, PsycoPG2 e muito mais, use a Distro OpenTelemetry do Azure Monitor. As solicitações de entrada rastreadas que entram em seu aplicativo Python hospedado no Azure Functions não serão automaticamente correlacionadas com a telemetria sendo rastreada dentro dele. Você pode obter manualmente a correlação de rastreamento extraindo o TraceContext diretamente, conforme mostrado 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óximos passos