Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo mostra como configurar o seu aplicativo de funções para exportar dados de log e rastreamento em um formato OpenTelemetry. O Azure Functions gera dados de telemetria em suas execuções de função do processo de host do Functions e do processo de trabalho específico do idioma no qual o código de função é executado. Por padrão, esses dados de telemetria são enviados ao Application Insights usando o SDK do Application Insights. No entanto, você pode optar por exportar esses dados usando a semântica OpenTelemetry. Embora você ainda possa usar um formato OpenTelemetry para enviar seus dados para o Application Insights, agora você também pode exportar os mesmos dados para qualquer outro ponto de extremidade compatível com OpenTelemetry.
Você pode obter esses benefícios habilitando o OpenTelemetry em seu aplicativo de funções:
- Correlaciona dados entre rastreamentos e logs que estão sendo gerados no host e no código do aplicativo.
- Permite uma geração consistente baseada em padrões de dados de telemetria exportáveis.
- Integra-se a outros provedores que podem consumir dados compatíveis com OpenTelemetry.
Tenha estas considerações em mente ao usar este artigo:
Experimente o tutorial OpenTelemetry, que foi projetado para ajudá-lo a começar rapidamente com o OpenTelemetry e o Azure Functions. Este artigo usa a CLI do Desenvolvedor do Azure (
azd) para criar e implantar um aplicativo de funções que usa a integração do OpenTelemetry para rastreamento distribuído.Como este artigo é direcionado à linguagem de desenvolvimento escolhida, lembre-se de escolher o idioma correto na parte superior do artigo.
- Atualmente, o OpenTelemetry não tem suporte para aplicativos em processo em C#.
- O OpenTelemetry está habilitado no nível do aplicativo de funções, tanto na configuração do host (
host.json) quanto no projeto de código. O Functions também fornece uma experiência otimizada para o cliente para exportar dados do OpenTelemetry do seu código de função em execução em um processo de trabalho específico do idioma.
Habilitar o OpenTelemetry no host do Functions
Quando você habilita a saída do OpenTelemetry no arquivo host.json do aplicativo de funções, seu host exporta a saída do OpenTelemetry independentemente da pilha de linguagens usada pelo aplicativo.
Para habilitar a saída OpenTelemetry do host do Functions, atualize o arquivo host.json em seu projeto de código para adicionar um elemento "telemetryMode": "OpenTelemetry" à coleção raiz. Com o OpenTelemetry habilitado, o seu arquivo host.json pode ter esta aparência:
{
"version": "2.0",
"telemetryMode": "OpenTelemetry",
...
}
Definir as configurações do aplicativo
Quando você habilita OpenTelemetry no arquivo host.json, as variáveis de ambiente do aplicativo determinam os endpoints para enviar dados, conforme as configurações do aplicativo suportadas pelo OpenTelemetry que estão disponíveis.
Crie configurações de aplicativo específicas em seu aplicativo de funções com base no destino de saída do OpenTelemetry. Quando você fornece configurações de conexão para o Application Insights e um exportador de protocolo OpenTelemetry (OTLP), os dados do OpenTelemetry são enviados para ambos os pontos de extremidade.
APPLICATIONINSIGHTS_CONNECTION_STRING: a cadeia de conexão de um workspace do Application Insights. Quando esta configuração existe, os dados do OpenTelemetry são enviados para o workspace. Use a mesma configuração para se conectar ao Application Insights sem OpenTelemetry habilitado. Se o aplicativo ainda não tiver essa configuração, talvez seja necessário Habilitar a integração do Application Insights.
JAVA_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: defina como true que o host do Functions permita que o processo de trabalho do Java transmita logs do OpenTelemetry diretamente, o que impede entradas duplicadas no nível do host.
PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: defina como true que o host do Functions permita que o processo de trabalho do Python transmita logs do OpenTelemetry diretamente, o que impede entradas duplicadas no nível do host.
Habilitar o OpenTelemetry em seu aplicativo
Depois de configurar o host do Functions para usar o OpenTelemetry, atualize o código do aplicativo para gerar dados OpenTelemetry. Quando você habilita o OpenTelemetry no host e no código do aplicativo, obtém uma melhor correlação entre rastreamentos e logs emitidos pelo processo de host do Functions e pelo processo de trabalho da linguagem.
Como você configura seu aplicativo para usar o OpenTelemetry depende do endpoint OpenTelemetry de destino:
Exemplos neste artigo pressupõem que seu aplicativo usa IHostApplicationBuilder, que está disponível na versão 2.x e posterior do Microsoft.Azure.Functions.Worker. Para obter mais informações, consulte a Versão 2.x no guia do modelo de trabalho isolado em C#.
Execute estes comandos para instalar os assemblies necessários em seu aplicativo:
dotnet add package Microsoft.Azure.Functions.Worker.OpenTelemetry dotnet add package OpenTelemetry.Extensions.Hosting dotnet add package Azure.Monitor.OpenTelemetry.ExporterNo arquivo de projeto Program.cs, adicione esta instrução
using:using Azure.Monitor.OpenTelemetry.Exporter;Configure o OpenTelemetry com base em se a inicialização do projeto usa
IHostBuilderouIHostApplicationBuilder. Este último foi introduzido na v2.x da extensão do modelo de trabalho isolado do .NET.Em program.cs, adicione esta linha de código após
ConfigureFunctionsWebApplication:builder.Services.AddOpenTelemetry() .UseFunctionsWorkerDefaults() .UseAzureMonitorExporter();Você pode exportar para ambos os pontos de extremidade OpenTelemetry do mesmo aplicativo.
Adicione as bibliotecas necessárias ao seu aplicativo. A maneira como você adiciona bibliotecas depende se você implanta usando o Maven ou o Kotlin e se você também deseja enviar dados para o Application Insights.
<dependency> <groupId>com.microsoft.azure.functions</groupId> <artifactId>azure-functions-java-opentelemetry</artifactId> <version>1.0.0</version> </dependency> <dependency> <groupId>com.azure</groupId> <artifactId>azure-monitor-opentelemetry-autoconfigure</artifactId> <version>1.2.0</version> </dependency>(Opcional) Adicione este código para criar intervalos personalizados:
import com.microsoft.azure.functions.opentelemetry.FunctionsOpenTelemetry; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Scope; Span span = FunctionsOpenTelemetry.startSpan( "com.contoso.PaymentFunction", // tracer name "validateCharge", // span name null, // parent = current context SpanKind.INTERNAL); try (Scope ignored = span.makeCurrent()) { // business logic here } finally { span.end(); }
Instale estes pacotes npm em seu projeto:
npm install @opentelemetry/api npm install @opentelemetry/auto-instrumentations-node npm install @azure/monitor-opentelemetry-exporter npm install @azure/functions-opentelemetry-instrumentation
Crie um arquivo de código em seu projeto, copie e cole o seguinte código neste novo arquivo e salve o arquivo como
src/index.js:const { AzureFunctionsInstrumentation } = require('@azure/functions-opentelemetry-instrumentation'); const { AzureMonitorLogExporter, AzureMonitorTraceExporter } = require('@azure/monitor-opentelemetry-exporter'); const { getNodeAutoInstrumentations, getResourceDetectors } = require('@opentelemetry/auto-instrumentations-node'); const { registerInstrumentations } = require('@opentelemetry/instrumentation'); const { detectResourcesSync } = require('@opentelemetry/resources'); const { LoggerProvider, SimpleLogRecordProcessor } = require('@opentelemetry/sdk-logs'); const { NodeTracerProvider, SimpleSpanProcessor } = require('@opentelemetry/sdk-trace-node'); const resource = detectResourcesSync({ detectors: getResourceDetectors() }); const tracerProvider = new NodeTracerProvider({ resource }); tracerProvider.addSpanProcessor(new SimpleSpanProcessor(new AzureMonitorTraceExporter())); tracerProvider.register(); const loggerProvider = new LoggerProvider({ resource }); loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(new AzureMonitorLogExporter())); registerInstrumentations({ tracerProvider, loggerProvider, instrumentations: [getNodeAutoInstrumentations(), new AzureFunctionsInstrumentation()], });Atualize o
maincampo no arquivo package.json para incluir o novosrc/index.jsarquivo. Por exemplo:"main": "src/{index.js,functions/*.js}"
Crie um arquivo de código em seu projeto, copie e cole o seguinte código neste novo arquivo e salve o arquivo como
src/index.ts:import { AzureFunctionsInstrumentation } from '@azure/functions-opentelemetry-instrumentation'; import { AzureMonitorLogExporter, AzureMonitorTraceExporter } from '@azure/monitor-opentelemetry-exporter'; import { getNodeAutoInstrumentations, getResourceDetectors } from '@opentelemetry/auto-instrumentations-node'; import { registerInstrumentations } from '@opentelemetry/instrumentation'; import { detectResourcesSync } from '@opentelemetry/resources'; import { LoggerProvider, SimpleLogRecordProcessor } from '@opentelemetry/sdk-logs'; import { NodeTracerProvider, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node'; const resource = detectResourcesSync({ detectors: getResourceDetectors() }); const tracerProvider = new NodeTracerProvider({ resource }); tracerProvider.addSpanProcessor(new SimpleSpanProcessor(new AzureMonitorTraceExporter())); tracerProvider.register(); const loggerProvider = new LoggerProvider({ resource }); loggerProvider.addLogRecordProcessor(new SimpleLogRecordProcessor(new AzureMonitorLogExporter())); registerInstrumentations({ tracerProvider, loggerProvider, instrumentations: [getNodeAutoInstrumentations(), new AzureFunctionsInstrumentation()], });Atualize o campo
mainem seu arquivo package.json para incluir a saída deste novo arquivosrc/index.ts, que pode ter esta aparência:"main": "dist/src/{index.js,functions/*.js}"
Importante
A saída do OpenTelemetry para o Application Insights da função de trabalho de idioma não tem suporte atualmente para aplicativos do PowerShell. Em vez disso, você pode querer usar um ponto de extremidade do exportador OTLP. Quando você configura o host para a saída do OpenTelemetry para o Application Insights, os logs gerados pelo processo de trabalho do PowerShell ainda são encaminhados, mas não há suporte para rastreamento distribuído no momento.
Estas instruções se aplicam apenas a um exportador OTLP:
Adicione uma configuração de aplicativo nomeada
OTEL_FUNCTIONS_WORKER_ENABLEDcom o valor deTrue.Crie uma
Modulesno nível do aplicativo na raiz do aplicativo e execute o seguinte comando:Save-Module -Name AzureFunctions.PowerShell.OpenTelemetry.SDKEsse comando instala o módulo necessário
AzureFunctions.PowerShell.OpenTelemetry.SDKdiretamente em seu aplicativo. Não é possível usar o arquivorequirements.psd1para instalar automaticamente esta dependência porque as dependências gerenciadas não têm suporte no momento na versão prévia do plano de Consumo Flex.Adicione este código ao arquivo profile.ps1:
Import-Module AzureFunctions.PowerShell.OpenTelemetry.SDK -Force -ErrorAction Stop Initialize-FunctionsOpenTelemetry
Verifique se essas bibliotecas estão em seu arquivo
requirements.txt, seja de descompactação ou adição por conta própria:azure-monitor-opentelemetryAdicione este código ao arquivo de ponto de entrada principal do
function_app.py:Se você já tiver adicionado
PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY=trueàs configurações do aplicativo, ignore esta etapa. Para habilitar manualmente a coleção do Application Insights sem instrumentação automática, adicione este código ao seu aplicativo:from azure.monitor.opentelemetry import configure_azure_monitor configure_azure_monitor()Examine a documentação de uso do Distro do Azure Monitor para obter opções sobre como configurar ainda mais o SDK.
Considerações sobre o OpenTelemetry
Ao exportar seus dados usando o OpenTelemetry, tenha essas considerações em mente.
O portal do Azure oferece suporte a rastreamentos
Recent function invocationsomente caso a telemetria seja enviada para o Azure Monitor.Quando você configura o host para usar o OpenTelemetry, o portal do Azure não dá suporte ao streaming de log.
Se você definir
telemetryModecomoOpenTelemetry, alogging.applicationInsightsconfiguração na seção de host.json não se aplicará.
Os intervalos personalizados incluem automaticamente todos os atributos de recurso e usam os exportadores configurados em seu aplicativo.
Quando seu aplicativo é executado fora do Azure, inclusive durante o desenvolvimento local, o detector de recursos define o atributo
service.namecomojava-function-apppor padrão.Use esses sinalizadores de Máquina Virtual Java (JVM) para silenciar a telemetria ao executar localmente durante testes de unidade:
-Dotel.traces.exporter=none-Dotel.metrics.exporter=none-Dotel.logs.exporter=none
- Não é necessário registrar o middleware manualmente; o trabalhador Java descobre automaticamente
OpenTelemetryInvocationMiddleware.
Resolução de problemas
Ao exportar seus dados usando o OpenTelemetry, tenha em mente esses problemas e soluções comuns.
Filtragem de log
Para configurar corretamente a filtragem de logs em seu aplicativo de funções, você precisa entender a diferença entre o processo anfitrião e o processo de trabalho.
O processo de host é o runtime do Azure Functions que gerencia gatilhos, dimensionamento e emite telemetria no nível do sistema, como logs de inicialização, rastreamentos de solicitação e informações de integridade do runtime.
O processo de trabalho é específico da linguagem, executa seu código de função e produz logs de aplicativo e telemetria de forma independente.
Importante
Os filtros definidos em host.json se aplicam somente aos logs gerados pelo processo de host. Você deve usar as configurações do OpenTelemetry específicas da linguagem para filtrar logs do processo de trabalho.
Exemplo: Filtrar logs do host para todos os provedores no host.json
Use essa abordagem para definir um nível de log global em todos os provedores gerenciados pelo host:
{
"version": "2.0",
"telemetryMode": "OpenTelemetry",
"logging": {
"logLevel": {
"default": "Warning"
}
}
}
Exemplo: filtrar logs somente para o provedor de logger do OpenTelemetry
Use essa abordagem para direcionar apenas o provedor do logger do OpenTelemetry, deixando outros provedores (como console ou registro em arquivos) não afetados:
{
"version": "2.0",
"telemetryMode": "OpenTelemetry",
"logging": {
"OpenTelemetry": {
"logLevel": {
"default": "Warning"
}
}
}
}
Registro em log do console
O host do Functions captura automaticamente qualquer coisa gravada em stdout ou stderr e a encaminha para o pipeline de telemetria. Se você também usar um ConsoleExporter ou gravar diretamente no console em seu código, logs duplicados poderão ocorrer em seus dados de telemetria.
Observação
Para evitar entradas de telemetria duplicadas, não adicione ConsoleExporter ou escreva no console no código de produção.
autenticação do Microsoft Entra
Ao usar a autenticação do Microsoft Entra com o OpenTelemetry, você deve configurar a autenticação separadamente para o processo de host e o processo de trabalho.
Para configurar a autenticação para o processo de host, consulte Exigir autenticação do Microsoft Entra.
Para configurar a autenticação para o processo de trabalho, consulte Habilitar a autenticação do Microsoft Entra.
Suporte a atributos de recurso
O suporte a atributos de recurso no Azure Monitor está atualmente em versão prévia. Para habilitar esse recurso, defina a variável de OTEL_DOTNET_AZURE_MONITOR_ENABLE_RESOURCE_METRICS ambiente como true. Essa configuração ingere atributos de recurso na tabela de métricas personalizadas.
Telemetria de solicitação duplicada
O processo anfitrião emite automaticamente a telemetria de solicitação. Se o processo de trabalho também for instrumentado com bibliotecas de acompanhamento de solicitações (por exemplo, AspNetCoreInstrumentation no .NET), a mesma solicitação será relatada duas vezes.
Observação
Como a Distribuição do Azure Monitor normalmente inclui AspNetCoreInstrumentation no .NET e instrumentação semelhante em outras linguagens, evite usar a distribuição do Azure Monitor no processo de trabalho para evitar a telemetria duplicada.
Escopos de registro não estão incluídos
Por padrão, o processo de trabalho não inclui escopos em seus logs. Para habilitar escopos, você deve definir essa configuração explicitamente no trabalhador. O exemplo a seguir mostra como habilitar escopos no .NET Isolado:
builder.Logging.AddOpenTelemetry(b => b.IncludeScopes = true);
Telemetria de solicitação ausente
Gatilhos como HTTP, Barramento de Serviço e Hubs de Eventos dependem da propagação de contexto para rastreamento distribuído. Com a amostragem baseada no pai como o comportamento padrão, a telemetria de solicitação não é gerada quando a solicitação ou mensagem de entrada não é amostrada.
OperationId duplicado
No Azure Functions, o OperationId usado para correlacionar a telemetria vem diretamente do traceparent valor na solicitação ou mensagem de entrada. Se várias chamadas reutilizarem o mesmo traceparent valor, todas elas obterão o mesmo OperationId.
Configurar o OpenTelemetry com variáveis de ambiente
Você pode configurar o comportamento opentelemetry usando suas variáveis de ambiente padrão. Essas variáveis fornecem uma maneira consistente de controlar o comportamento em diferentes idiomas e runtimes. Você pode ajustar estratégias de amostragem, configurações do exportador e atributos de recurso. Para obter mais informações sobre variáveis de ambiente com suporte, consulte a documentação do OpenTelemetry.
Usar o diagnóstico para solucionar problemas de monitoramento
O diagnóstico do Azure Functions no portal do Azure é um recurso útil para detectar e diagnosticar possíveis problemas relacionados ao monitoramento.
Para acessar o diagnóstico em seu aplicativo:
No portal do Azure, acesse o recurso do aplicativo de funções.
No painel esquerdo, selecione Diagnosticar e resolver problemas e pesquisar o fluxo de trabalho Application Insights de telemetria ausente ou OpenTelemetry.
Selecione esse fluxo de trabalho, escolha o método de ingestão e selecione Avançar.
Examine as diretrizes e as recomendações fornecidas pela solução de problemas.
Próximas etapas
Saiba mais sobre o OpenTelemetry e o monitoramento do Azure Functions: