Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo mostra como configurar seu aplicativo de função para exportar dados de log e rastreamento em um formato OpenTelemetry . O Funções do Azure gera dados de telemetria sobre as execuções das suas funções tanto a partir do processo anfitrião das Funções como do processo de trabalho específico da linguagem onde o seu código de função executa. De forma predefinida, estes dados de telemetria são enviados para o Application Insights através do respetivo SDK. No entanto, pode optar por exportar estes dados usando a semântica do 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 ativando o OpenTelemetry em seu aplicativo de função:
- Correlaciona dados entre rastreamentos e logs gerados tanto no host como no código da aplicação.
- Permite a geração consistente e baseada em padrões de dados de telemetria exportáveis.
- Integra-se com outros provedores que podem consumir dados compatíveis com OpenTelemetry.
Tenha estas considerações em mente ao utilizar este artigo:
Experimenta o tutorial OpenTelemetry, que foi concebido para te ajudar a começar rapidamente com OpenTelemetry e Funções do Azure. Este artigo utiliza a Azure Developer CLI (
azd) para criar e implementar uma aplicação de funções que utiliza integração com OpenTelemetry para rastreamento distribuído.Como este artigo é direcionado para a linguagem de desenvolvimento de sua escolha, lembre-se de escolher a linguagem correta na parte superior do artigo.
- Atualmente, o OpenTelemetry não é suportado para aplicativos em processo em C#.
- O OpenTelemetry é habilitado no nível do aplicativo de função, tanto na configuração do host (
host.json) quanto no seu projeto de código. Functions também fornece uma experiência otimizada para o cliente ao exportar dados OpenTelemetry do seu código de função executado num processo de trabalho específico para o idioma.
Ativar OpenTelemetry no anfitrião das Funções
Quando ativar a saída OpenTelemetry no ficheiro host.json da aplicação de funcionalidades, o servidor exporta a saída OpenTelemetry independentemente da pilha de linguagem utilizada pela aplicação.
Para habilitar a saída OpenTelemetry do host Functions, atualize o arquivo host.json em seu projeto de código para adicionar um "telemetryMode": "OpenTelemetry" elemento à coleção raiz. Com o OpenTelemetry ativado, seu arquivo host.json pode ter esta aparência:
{
"version": "2.0",
"telemetryMode": "OpenTelemetry",
...
}
Definir configurações do aplicativo
Quando ativa o OpenTelemetry no ficheiro host.json, as variáveis de ambiente da aplicação determinam os pontos finais para o envio de dados, baseando-se nas definições de aplicação suportadas pelo OpenTelemetry que estão disponíveis.
Crie configurações específicas da aplicação na sua aplicação de função com base no destino de saída do OpenTelemetry. Quando fornece definições de ligação tanto para o Application Insights como para um exportador do protocolo OpenTelemetry (OTLP), os dados do OpenTelemetry são enviados para ambos os endpoints.
APPLICATIONINSIGHTS_CONNECTION_STRING: a cadeia de ligação para um espaço de trabalho do Application Insights. Quando essa configuração existe, os dados do OpenTelemetry são enviados para esse espaço de trabalho. Use a mesma definição para se ligar ao Application Insights sem o OpenTelemetry ativado. Se seu aplicativo ainda não tiver essa configuração, talvez seja necessário habilitar a integração do Application Insights.
JAVA_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: define para true para que o host de Funções permita ao processo de trabalho Java transmitir diretamente os registos do OpenTelemetry, o que impede entradas duplicadas ao nível do host.
PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: definido como true para que o host da Functions permita ao processo de execução do Python transmitir diretamente os registos de OpenTelemetry, o que impede entradas duplicadas ao nível do host.
Habilitar o OpenTelemetry em seu aplicativo
Depois de configurar o host de Funções para usar OpenTelemetry, atualize o código da sua aplicação para gerar dados do OpenTelemetry. Quando ativas o OpenTelemetry tanto no anfitrião como no código da tua aplicação, obtém-se melhor correlação entre os traços e registos que o processo anfitrião das Funções e o processo worker da tua linguagem emitem.
A forma como instrumenta a sua aplicação para usar OpenTelemetry depende do seu endpoint OpenTelemetry alvo:
Exemplos neste artigo assumem que a sua aplicação usa IHostApplicationBuilder, que está disponível na versão 2.x e versão posterior de Microsoft.Azure. Functions.Worker. Para obter mais informações, consulte Versão 2.x no guia de modelo de trabalho isolado em C#.
Execute estes comandos para instalar os assemblies necessários em seu aplicativo:
Observação
A partir da versão 3.0, o pacote
Microsoft.ApplicationInsights.WorkerServiceaproveita Azure Monitor Exporter. Pode usar este pacote para manter os comportamentos de configuração existentes do Application Insights enquanto utiliza internamente o pipeline do Azure Monitor, incluindo o exportador OpenTelemetry. Pode usar o pacoteMicrosoft.ApplicationInsights.WorkerService(v3.0 ou posterior) em vez do pacoteAzure.Monitor.OpenTelemetry.Exporter, que é mostrado no exemplo seguinte.dotnet add package Microsoft.Azure.Functions.Worker.OpenTelemetry dotnet add package OpenTelemetry.Extensions.Hosting dotnet add package Azure.Monitor.OpenTelemetry.ExporterNo seu arquivo de projeto Program.cs, adicione esta
usinginstrução:using Azure.Monitor.OpenTelemetry.Exporter;Configure o OpenTelemetry com base se o início do seu projeto utiliza
IHostBuilderouIHostApplicationBuilder. Este último foi introduzido na versão 2.x da extensão do modelo trabalhador isolado .NET.No program.cs, adicione esta linha de código após
ConfigureFunctionsWebApplication:builder.Services.AddOpenTelemetry() .UseFunctionsWorkerDefaults() .UseAzureMonitorExporter();Você pode exportar para ambos os endpoints OpenTelemetry da mesma aplicação.
Adicione as bibliotecas necessárias ao seu aplicativo. A maneira como você adiciona bibliotecas depende se você implanta usando Maven ou 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 spans 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 seu ficheiro de package.json para incluir o novosrc/index.jsficheiro. 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
maincampo no arquivo package.json para incluir a saída desse novosrc/index.tsarquivo, que pode ter esta aparência:"main": "dist/src/{index.js,functions/*.js}"
Importante
A saída OpenTelemetry para o Application Insights do operador de idiomas não é suportada atualmente para aplicativos PowerShell. Em vez disso, você pode querer usar um ponto de extremidade de exportador OTLP. Quando configura o seu host para saída de OpenTelemetry nos Application Insights, os registos gerados pelo processo de trabalho PowerShell continuam a ser encaminhados, mas o rastreamento distribuído não é atualmente suportado.
Estas instruções aplicam-se apenas a um exportador OTLP:
Adicione uma configuração de aplicativo nomeada
OTEL_FUNCTIONS_WORKER_ENABLEDcom o valor deTrue.Crie uma pasta ao nível da aplicação na raiz da sua aplicação e execute o seguinte comando:
Save-Module -Name AzureFunctions.PowerShell.OpenTelemetry.SDKEste comando instala o módulo necessário
AzureFunctions.PowerShell.OpenTelemetry.SDKdiretamente na sua aplicação. Não é possível usar orequirements.psd1ficheiro para instalar automaticamente essa dependência porque dependências geridas não são suportadas atualmente na visualização do Flex Consumption plan.Adicione este código ao seu ficheiro profile.ps1:
Import-Module AzureFunctions.PowerShell.OpenTelemetry.SDK -Force -ErrorAction Stop Initialize-FunctionsOpenTelemetry
Certifique-se de que estas bibliotecas estão no seu
requirements.txtficheiro, seja por descomentar ou adicionar manualmente:azure-monitor-opentelemetryAdicione este código ao seu
function_app.pyarquivo de ponto de entrada principal:Se já adicionou
PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY=truenas definições da aplicação, pode ignorar este passo. Para habilitar manualmente a coleta 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()Consulte a documentação do Azure Monitor Distro para opções sobre como configurar o SDK com mais detalhe.
Considerações para OpenTelemetry
Ao exportar os seus dados usando OpenTelemetry, tenha estas considerações em mente.
O portal Azure suporta traços
Recent function invocationapenas se a telemetria for enviada para Azure Monitor.Quando configuras o host para usar OpenTelemetry, o portal do Azure não suporta streaming de logs.
Se definires
telemetryModeparaOpenTelemetry, a configuração nalogging.applicationInsightssecção de host.json não se aplica.
As extensões personalizadas incluem automaticamente todos os atributos de recursos e usam os exportadores configurados em seu aplicativo.
Quando a sua aplicação corre fora do Azure, incluindo durante o desenvolvimento local, o detector de recursos define o atributo
service.nameparajava-function-apppor defeito.Use estes flags da Java Virtual Machine (JVM) para silenciar a telemetria ao correr localmente durante testes unitários:
-Dotel.traces.exporter=none-Dotel.metrics.exporter=none-Dotel.logs.exporter=none
- Não precisas de registar manualmente o middleware; O trabalhador Java descobre automaticamente
OpenTelemetryInvocationMiddleware.
Detetores de recursos e convenções semânticas
No Funções do Azure, os atributos de recurso descrevem o processo da function app e o seu ambiente. Atributos span descrevem uma única invocação.
Comportamento padrão (sem necessidade de ação)
No App Service do Funções do Azure, os detectores de recursos normalmente preenchem automaticamente atributos comuns, incluindo:
-
service.name(por padrão, o nome da aplicação de função) - Atributos de nuvem Azure como
cloud.provider,cloud.regionecloud.resource_id
Na maioria dos casos, estes padrões são suficientes para o agrupamento correto do Application Map e o contexto do Azure.
Quando substituir service.name (Nome da Função da Cloud)
Override apenas se precisares de um nome de nó diferente e estável no Application Insights (agrupamento de mapas de aplicações), por exemplo, para normalizar a nomeação entre slots ou ambientes.
Definir OTEL_SERVICE_NAME para sobrepor o valor detetado:
export OTEL_SERVICE_NAME="my-function-app"
Atributos de invocação de abrangência (normalmente automáticos)
Não vais precisar de os definir manualmente, a menos que estejas a criar um intervalo de invocação personalizado.
-
faas.name(nome da função) -
faas.trigger(por exemplohttp,servicebus,eventhubs) -
faas.execution(identificador de invocação/execução)
Importante
As aplicações de funções podem alojar várias funções num só processo. Não coloque valores específicos de função no recurso. Aplique a identidade por invocação nos segmentos.
Observação
Quando a correr localmente (Ferramentas Centrais de Funções) ou em ambientes containerizados/auto-hospedados onde os metadados do Azure não estão disponíveis, service.name pode predefinir para um valor genérico. Defina OTEL_SERVICE_NAME localmente para corresponder à nomenclatura da produção.
Solução de problemas
Ao exportar os seus dados usando OpenTelemetry, tenha em mente estas questões e soluções comuns.
Filtragem de logs
Para configurar corretamente o filtro de logs na sua aplicação de funções, é necessário compreender a diferença entre o processo anfitrião e o processo de trabalho.
O host process é o runtime do Funções do Azure que gere os disparadores, a escalabilidade e que emite telemetria a nível do sistema, como registos de inicialização, rastreios de pedidos e informações sobre o estado do sistema em tempo de execução.
O processo de trabalho é específico da linguagem, executa o código da função e produz independentemente registos e telemetria de aplicações.
Importante
Os filtros definidos em host.json se aplicam somente aos logs gerados pelo processo do host. Deve usar definições específicas da linguagem no OpenTelemetry para filtrar logs do processo de trabalho.
Exemplo: filtrar os registos do host para todos os fornecedores no host.json
Use esta 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 OpenTelemetry
Use esta abordagem para direcionar apenas o provedor de logger OpenTelemetry enquanto deixa outros provedores (como console ou log de arquivos) inalterados:
{
"version": "2.0",
"telemetryMode": "OpenTelemetry",
"logging": {
"OpenTelemetry": {
"logLevel": {
"default": "Warning"
}
}
}
}
Registo da consola
O host do sistema Functions captura automaticamente tudo o que é escrito em stdout ou stderr e 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 duplicadas de telemetria, não adicione o ConsoleExporter nem escreva na consola em código de produção.
Autenticação Microsoft Entra
Quando utiliza autenticação Microsoft Entra com OpenTelemetry, deve configurar a autenticação separadamente tanto para o processo anfitrião como para o processo de trabalho.
Para configurar a autenticação do processo anfitrião, veja Exigir autenticação Microsoft Entra.
Para configurar a autenticação do processo de trabalho, consulte Enable Microsoft Entra autentication.
Suporte a atributos de recursos
O suporte a atributos de recursos no Azure Monitor está atualmente em pré-visualização. Para habilitar esse recurso, defina a OTEL_DOTNET_AZURE_MONITOR_ENABLE_RESOURCE_METRICS variável de ambiente como true. Essa configuração ingere atributos de recursos na tabela de métricas personalizada.
Telemetria de solicitação duplicada
O processo de host emite automaticamente telemetria de solicitação. Se o processo worker também estiver instrumentado com bibliotecas de rastreamento de requisições (por exemplo, AspNetCoreInstrumentation em .NET), a mesma requisição é relatada duas vezes.
Observação
Como a distribuição do Azure Monitor normalmente já inclui o AspNetCoreInstrumentation em .NET e instrumentação semelhante noutras linguagens, evite usar a distribuição do Azure Monitor no processo de trabalho para evitar telemetria duplicada.
Escopos de registro nã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 seguinte mostra como ativar escopos no .NET Isolated:
builder.Logging.AddOpenTelemetry(b => b.IncludeScopes = true);
Telemetria de solicitação ausente
Gatilhos como HTTP, Service Bus e Event Hubs dependem da propagação do contexto para rastreio distribuído. Com amostragem hierárquica como comportamento predefinido, a telemetria de requisição não é gerada quando a requisição ou mensagem de entrada não é amostrada.
ID de operação duplicado
Em Funções do Azure, o OperationId usado para correlacionar telemetria provém diretamente do valor traceparent no pedido ou mensagem recebida. Se várias chamadas reutilizarem o mesmo traceparent valor, todas recebem o mesmo OperationId.
Configurar OpenTelemetry com variáveis de ambiente
Pode configurar o comportamento do OpenTelemetry usando as suas variáveis padrão de ambiente. Estas variáveis fornecem uma forma consistente de controlar o comportamento entre diferentes linguagens e runtimes. Pode ajustar estratégias de amostragem, definições do exportador e atributos de recursos. Para obter mais informações sobre variáveis de ambiente suportadas, consulte a documentação do OpenTelemetry .
Usar diagnósticos para solucionar problemas de monitoramento
Funções do Azure diagnostics no portal Azure é um recurso útil para detetar e diagnosticar potenciais problemas relacionados com monitorização.
Para acessar o diagnóstico em seu aplicativo:
No portal Azure, vai ao recurso da tua app de funções.
No painel esquerdo, selecione Diagnosticar e resolver problemas e procure o fluxo de trabalho Function App sem telemetria, Application Insights ou OpenTelemetry.
Selecione este fluxo de trabalho, escolha seu método de ingestão e selecione Avançar.
Reveja as diretrizes e quaisquer recomendações fornecidas pela ferramenta de resolução de problemas.
Próximos passos
Saiba mais sobre OpenTelemetry e monitorização do Funções do Azure: