Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V tomto článku se dozvíte, jak nakonfigurovat aplikaci funkcí pro export dat protokolu a trasování ve formátu OpenTelemetry. Azure Functions generuje telemetrická data na spouštění funkcí z hostitelského procesu Functions i pracovního procesu specifického pro jazyk, ve kterém běží kód funkce. Ve výchozím nastavení se tato telemetrická data odesílají do Application Insights pomocí sady Application Insights SDK. Tato data však můžete exportovat pomocí sémantiky OpenTelemetry. I když stále můžete k odesílání dat do Application Insights použít formát OpenTelemetry, můžete teď také exportovat stejná data do jakéhokoli jiného koncového bodu kompatibilního s OpenTelemetry.
Tyto výhody můžete získat povolením OpenTelemetry ve vaší aplikaci funkcí:
- Koreluje data napříč trasováními a protokoly generovanými na hostiteli i v kódu vaší aplikace.
- Umožňuje konzistentní generování exportovatelných telemetrických dat založených na standardech.
- Integruje se s dalšími poskytovateli, kteří můžou využívat data kompatibilní s OpenTelemetry.
Při používání tohoto článku mějte na paměti tyto aspekty:
Vyzkoušejte kurz OpenTelemetry, který je navržený tak, aby vám pomohl rychle začít s OpenTelemetry a Azure Functions. Tento článek používá Azure Developer CLI (
azd) k vytvoření a nasazení aplikace funkcí, která používá integraci OpenTelemetry pro distribuované trasování.Vzhledem k tomu, že se tento článek zaměřuje na zvolený vývojový jazyk, nezapomeňte zvolit správný jazyk v horní části článku.
- OpenTelemetry se v současné době nepodporuje pro procesní aplikace jazyka C#.
- OpenTelemetry je povolená na úrovni aplikace funkcí v konfiguraci hostitele (
host.json) i v projektu kódu. Funkce také poskytují prostředí optimalizované pro klienta pro export dat OpenTelemetry z kódu funkce, který běží v pracovním procesu specifickém pro jazyk.
Povolení OpenTelemetry v hostiteli Functions
Když povolíte výstup OpenTelemetry v souboru funkční aplikace host.json, hostitel exportuje výstup OpenTelemetry bez ohledu na jazykový zásobník používaný vaší aplikací.
Pokud chcete povolit výstup OpenTelemetry z hostitele Functions, aktualizujte soubor host.json v projektu kódu a přidejte "telemetryMode": "OpenTelemetry" do kořenové kolekce prvek. Když je povolený OpenTelemetry, může váš soubor host.json vypadat takto:
{
"version": "2.0",
"telemetryMode": "OpenTelemetry",
...
}
Konfigurace nastavení aplikace
Když v host.json souboru povolíte OpenTelemetry, proměnné prostředí aplikace určují koncové body pro odesílání dat na základě toho, jaká nastavení aplikace podporuje OpenTelemetry.
Vytvořte v aplikaci funkcí konkrétní nastavení aplikace na základě cíle výstupu OpenTelemetry. Když zadáte nastavení připojení pro Application Insights a exportér protokolu OpenTelemetry (OTLP), data OpenTelemetry se odesílají do obou koncových bodů.
APPLICATIONINSIGHTS_CONNECTION_STRING: připojovací řetězec pro pracovní prostor Application Insights. Pokud toto nastavení existuje, data OpenTelemetry se odesílají do tohoto pracovního prostoru. Stejné nastavení použijte pro připojení k Application Insights bez povolení OpenTelemetry. Pokud vaše aplikace toto nastavení ještě nemá, budete možná muset povolit integraci Application Insights.
JAVA_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: nastavte na hodnotu true tak, aby hostitel functions umožnil pracovnímu procesu Javy přímo streamovat protokoly OpenTelemetry, což brání duplicitním položkám na úrovni hostitele.
PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: nastavte na hodnotu true tak, aby hostitel functions umožnil pracovnímu procesu Pythonu přímo streamovat protokoly OpenTelemetry, což brání duplicitním položkám na úrovni hostitele.
Povolení OpenTelemetry v aplikaci
Jakmile nakonfigurujete hostitele Functions tak, aby používal OpenTelemetry, aktualizujte kód aplikace na výstup dat OpenTelemetry. Když v hostiteli i kódu aplikace povolíte OpenTelemetry, získáte lepší korelaci mezi trasováními a protokoly, které hostitelský proces Functions a váš jazykový pracovní proces vygenerují.
Způsob instrumentace aplikace pro použití OpenTelemetry závisí na cílovém koncovém bodu OpenTelemetry:
Příklady v tomto článku předpokládají, že vaše aplikace používá IHostApplicationBuilder, která je k dispozici ve verzi 2.x a novější verzi Microsoft.Azure.Functions.Worker. Další informace najdete ve verzi 2.x v průvodci izolovaným pracovním modelem jazyka C#.
Spuštěním těchto příkazů nainstalujte požadovaná sestavení v aplikaci:
dotnet add package Microsoft.Azure.Functions.Worker.OpenTelemetry dotnet add package OpenTelemetry.Extensions.Hosting dotnet add package Azure.Monitor.OpenTelemetry.ExporterDo souboru projektu Program.cs přidejte tento
usingpříkaz:using Azure.Monitor.OpenTelemetry.Exporter;Nakonfigurujte OpenTelemetry podle toho, zda při spuštění projektu používáte
IHostBuilderneboIHostApplicationBuilder. Druhá verze byla zavedena v 2.x rozšíření izolovaného pracovního modelu .NET.Do program.cs přidejte tento řádek kódu za
ConfigureFunctionsWebApplication:builder.Services.AddOpenTelemetry() .UseFunctionsWorkerDefaults() .UseAzureMonitorExporter();Z jedné aplikace můžete exportovat do obou koncových bodů OpenTelemetry.
Přidejte do aplikace požadované knihovny. Způsob přidávání knihoven závisí na tom, jestli nasazujete pomocí Mavenu nebo Kotlinu a jestli chcete také odesílat data do 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>(Volitelné) Přidejte tento kód pro vytvoření vlastních rozsahů:
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(); }
Nainstalujte do projektu tyto balíčky npm:
npm install @opentelemetry/api npm install @opentelemetry/auto-instrumentations-node npm install @azure/monitor-opentelemetry-exporter npm install @azure/functions-opentelemetry-instrumentation
Vytvořte v projektu soubor kódu, zkopírujte a vložte do tohoto nového souboru následující kód a uložte ho takto
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()], });mainAktualizujte pole v souboru package.json tak, aby zahrnovalo novýsrc/index.jssoubor. Například:"main": "src/{index.js,functions/*.js}"
Vytvořte v projektu soubor kódu, zkopírujte a vložte do tohoto nového souboru následující kód a uložte ho takto
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()], });mainAktualizujte pole v souboru package.json tak, aby zahrnovalo výstup tohoto novéhosrc/index.tssouboru, který může vypadat takto:"main": "dist/src/{index.js,functions/*.js}"
Důležité
Výstup OpenTelemetry do Application Insights z pracovního procesu jazyka se v současné době nepodporuje pro aplikace PowerShellu. Místo toho můžete chtít použít koncový bod exportéru OTLP. Když nakonfigurujete hostitele pro generování výstupu OpenTelemetry do Application Insights, protokoly vygenerované procesem pracovníka PowerShellu se stále přeposílají, ale distribuované trasování není v tuto chvíli podporováno.
Tyto pokyny platí pouze pro vývozce OTLP:
Přidejte nastavení aplikace s názvem
OTEL_FUNCTIONS_WORKER_ENABLEDhodnotaTrue.V kořenovém adresáři aplikace vytvořte
Modulesna úrovni aplikace a spusťte následující příkaz:Save-Module -Name AzureFunctions.PowerShell.OpenTelemetry.SDKTento příkaz nainstaluje požadovaný
AzureFunctions.PowerShell.OpenTelemetry.SDKmodul přímo do vaší aplikace. Tento soubor nemůžete použítrequirements.psd1k automatické instalaci této závislosti, protože spravované závislosti nejsou v současné době podporovány v plánu Flex Consumption Ve verzi Preview.Přidejte tento kód do souboru profile.ps1:
Import-Module AzureFunctions.PowerShell.OpenTelemetry.SDK -Force -ErrorAction Stop Initialize-FunctionsOpenTelemetry
Ujistěte se, že se tyto knihovny nacházejí ve vašem
requirements.txtsouboru, ať už od odkomentování nebo přidávání sami:azure-monitor-opentelemetryPřidejte tento kód do
function_app.pyhlavního souboru vstupního bodu:Pokud jste už přidali
PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY=truedo nastavení aplikace, můžete tento krok přeskočit. Pokud chcete ručně povolit shromažďování Application Insights bez automatické instrumentace, přidejte do aplikace tento kód:from azure.monitor.opentelemetry import configure_azure_monitor configure_azure_monitor()Informace o další konfiguraci sady SDK najdete v dokumentaci k využití distro služby Azure Monitor .
Důležité informace o OpenTelemetry
Při exportu dat pomocí OpenTelemetry mějte na paměti tyto aspekty.
Azure Portal podporuje
Recent function invocationtrasování pouze v případě, že se telemetrie odesílá do služby Azure Monitor.Když nakonfigurujete hostitele tak, aby používal OpenTelemetry, Azure Portal nepodporuje streamování protokolů.
Pokud nastavíte
telemetryModenaOpenTelemetry, konfigurace v částilogging.applicationInsightssouboru host.json se nepoužije.
Vlastní rozsahy automaticky zahrnují všechny atributy prostředků a používají exportéry nakonfigurované ve vaší aplikaci.
Když vaše aplikace běží mimo Azure, včetně během místního vývoje, nastaví detektor
service.nameprostředků ve výchozím nastavení atributjava-function-app.Pomocí těchto příznaků prostředí Java Virtual Machine (JVM) můžete při místním spuštění během testů jednotek umlčet telemetrii:
-Dotel.traces.exporter=none-Dotel.metrics.exporter=none-Dotel.logs.exporter=none
- Nemusíte ručně registrovat middleware; pracovní proces Java automaticky rozpozná
OpenTelemetryInvocationMiddleware.
Řešení problémů
Při exportu dat pomocí OpenTelemetry mějte na paměti tyto běžné problémy a řešení.
Filtrování protokolů
Pokud chcete správně nakonfigurovat filtrování protokolů v aplikaci funkcí, musíte pochopit rozdíl mezi hostitelským procesem a pracovním procesem.
Hostitelský proces je Azure Functions runtime, který spravuje události, škálování a generuje telemetrii na úrovni systému, jako jsou inicializační protokoly, trasování požadavků a informace o stavu modulu runtime.
Pracovní proces je specifický pro jazyk, spouští kód funkce a vytváří protokoly aplikací a telemetrii nezávisle.
Důležité
Filtry definované v host.json se vztahují pouze na protokoly vygenerované hostitelským procesem. K filtrování protokolů z pracovního procesu musíte použít nastavení OpenTelemetry specifické pro jazyk.
Příklad: Filtrování protokolů hostitele pro všechny poskytovatele v host.json
Tento přístup použijte k nastavení globální úrovně protokolu napříč všemi poskytovateli spravovanými hostitelem:
{
"version": "2.0",
"telemetryMode": "OpenTelemetry",
"logging": {
"logLevel": {
"default": "Warning"
}
}
}
Příklad: Filtrování protokolů pouze pro zprostředkovatele protokolovacího nástroje OpenTelemetry
Tento přístup použijte k cílení pouze na poskytovatele loggeru OpenTelemetry, zatímco ostatní poskytovatelé (například konzolové nebo souborové protokolování) zůstávají neovlivněni.
{
"version": "2.0",
"telemetryMode": "OpenTelemetry",
"logging": {
"OpenTelemetry": {
"logLevel": {
"default": "Warning"
}
}
}
}
Protokolování konzoly
Hostitel Functions automaticky zachytí všechno, co je zapsáno do stdoutu nebo stderru, a předá ho do kanálu telemetrie. Pokud také použijete ConsoleExporter nebo zapisujete přímo do konzoly ve svém kódu, může dojít k duplicitním záznamům v telemetrických datech.
Poznámka:
Abyste se vyhnuli duplicitním položkám telemetrie, nepřidávejte ConsoleExporter ani nezapisujte do konzoly v produkčním kódu.
Ověřovací systém Microsoft Entra
Pokud používáte ověřování Microsoft Entra s OpenTelemetry, musíte nakonfigurovat ověřování samostatně pro hostitelský proces i pracovní proces.
Pokud chcete nakonfigurovat ověřování pro hostitelský proces, přečtěte si téma Vyžadovat ověřování Microsoft Entra.
Pokud chcete nakonfigurovat ověřování pro pracovní proces, přečtěte si téma Povolení ověřování Microsoft Entra.
Podpora atributů prostředků
Podpora atributů prostředků ve službě Azure Monitor je aktuálně ve verzi Preview. Chcete-li tuto funkci povolit, nastavte proměnnou OTEL_DOTNET_AZURE_MONITOR_ENABLE_RESOURCE_METRICS prostředí na truehodnotu . Toto nastavení ingestuje atributy prostředků do tabulky vlastních metrik.
Duplicitní telemetrie požadavků
Hostitelský proces automaticky generuje telemetrii požadavků. Pokud je pracovní proces instrumentován také pomocí knihoven pro sledování požadavků (například AspNetCoreInstrumentation v .NET), stejný požadavek se ohlásí dvakrát.
Poznámka:
Vzhledem k tomu, že distribuce služby Azure Monitor obvykle zahrnuje AspNetCoreInstrumentation v .NET a podobné instrumentaci v jiných jazycích, nepoužívejte v pracovním procesu distribuci služby Azure Monitor, abyste zabránili duplicitní telemetrii.
Nezahrnuté obory protokolování
Ve výchozím nastavení pracovní proces neobsahuje do svých protokolů obory. Pokud chcete povolit scopy, musíte toto nastavení explicitně nakonfigurovat ve workeru. Následující příklad ukazuje, jak povolit obory v izolovaném prostředí .NET:
builder.Logging.AddOpenTelemetry(b => b.IncludeScopes = true);
Chybějící telemetrie požadavků
Triggery, jako jsou HTTP, Service Bus a Event Hubs, závisí na šíření kontextu pro distribuované trasování. U vzorkování založeného na nadřazených objektech jako výchozího chování se telemetrie požadavků negeneruje, když se vzorek příchozího požadavku nebo zprávy nevygeneruje.
Duplicitní identifikátor operace
Ve službě Azure Functions, OperationId používaný pro korelaci telemetrie pochází přímo z hodnoty traceparent obsažené v příchozím požadavku nebo zprávě. Pokud více volání znovu použije stejnou traceparent hodnotu, všechny získají stejnou OperationIdhodnotu .
Konfigurace OpenTelemetry s proměnnými prostředí
Chování OpenTelemetry můžete nakonfigurovat pomocí standardních proměnných prostředí. Tyto proměnné poskytují konzistentní způsob řízení chování v různých jazycích a runtimes. Můžete upravit strategie vzorkování, nastavení vývozce a atributy prostředků. Další informace o podporovaných proměnných prostředí najdete v dokumentaci k OpenTelemetry.
Řešení potíží s monitorováním pomocí diagnostiky
Diagnostika azure Functions na webu Azure Portal je užitečným prostředkem pro zjišťování a diagnostiku potenciálních problémů souvisejících s monitorováním.
Přístup k diagnostice v aplikaci:
Na webu Azure Portal přejděte k prostředku vaší aplikace funkcí.
V levém podokně vyberte Diagnostikovat a řešit problémy a vyhledejte workflow Application Insights nebo OpenTelemetry pro aplikaci Function App chybějící telemetrii.
Vyberte tento pracovní postup, zvolte metodu příjmu dat a vyberte Další.
Projděte si pokyny a všechna doporučení poskytnutá poradcem při potížích.
Další kroky
Další informace o OpenTelemetry a monitorování Azure Functions: