Udostępnij za pośrednictwem


Używanie biblioteki OpenTelemetry z usługą Azure Functions

Ważne

Obsługa funkcji OpenTelemetry dla usługi Azure Functions jest obecnie dostępna w wersji zapoznawczej.

W tym artykule pokazano, jak skonfigurować aplikację funkcji do eksportowania danych dziennika i śledzenia w formacie OpenTelemetry. Usługa Azure Functions generuje dane telemetryczne dotyczące wykonań funkcji zarówno z procesu hosta usługi Functions, jak i procesu roboczego specyficznego dla języka, w którym jest uruchamiany kod funkcji. Domyślnie te dane telemetryczne są wysyłane do usługi Application Insights przy użyciu zestawu SDK usługi Application Insights. Można jednak wyeksportować te dane przy użyciu semantyki OpenTelemetry. Mimo że nadal można użyć formatu OpenTelemetry do wysyłania danych do usługi Application Insights, możesz teraz również wyeksportować te same dane do dowolnego innego punktu końcowego zgodnego z biblioteką OpenTelemetry.

Napiwek

Ponieważ ten artykuł jest przeznaczony dla wybranego języka programowania, pamiętaj, aby wybrać poprawny język w górnej części artykułu.

Obecnie nie ma zoptymalizowanej pod kątem klienta obsługi technologii OpenTelemetry dla aplikacji Java.

Funkcja OpenTelemetry nie jest obecnie obsługiwana w przypadku aplikacji przetwarzania w języku C#.

Te korzyści można uzyskać, włączając funkcję OpenTelemetry w aplikacji funkcji:

  • Korelacja między śladami i dziennikami generowanymi zarówno na hoście, jak i w kodzie aplikacji.
  • Spójne, oparte na standardach generowanie eksportowalnych danych telemetrycznych.
  • Integruje się z innymi dostawcami, którzy mogą korzystać z danych zgodnych ze standardem OpenTelemetry.

Funkcja OpenTelemetry jest włączona na poziomie aplikacji funkcji zarówno w konfiguracji hosta (host.json), jak i w projekcie kodu. Usługa Functions zapewnia również zoptymalizowane pod kątem klienta środowisko eksportowania danych OpenTelemetry z kodu funkcji działającego w procesie roboczym specyficznym dla języka.

1. Włączanie funkcji OpenTelemetry na hoście usługi Functions

Po włączeniu danych wyjściowych openTelemetry w pliku host.json aplikacji funkcji host eksportuje dane wyjściowe openTelemetry niezależnie od stosu języka używanego przez aplikację.

Aby włączyć dane wyjściowe openTelemetry z hosta usługi Functions, zaktualizuj plik host.json w projekcie kodu, aby dodać "telemetryMode": "openTelemetry" element do kolekcji głównej. Po włączeniu funkcji OpenTelemetry plik host.json może wyglądać następująco:

{
    "version": "2.0",
    "logging": {
        "applicationInsights": {
            "samplingSettings": {
                "isEnabled": true,
                "excludedTypes": "Request"
            },
            "enableLiveMetricsFilters": true
        }
    },
    "telemetryMode": "openTelemetry"
}

2. Konfigurowanie ustawień aplikacji

Po włączeniu funkcji OpenTelemetry w pliku host.json punkty końcowe, do których są wysyłane dane, są określane na podstawie ustawień aplikacji obsługiwanych przez bibliotekę OpenTelemetry są dostępne w zmiennych środowiskowych aplikacji.

Utwórz określone ustawienia aplikacji w aplikacji funkcji na podstawie miejsca docelowego danych wyjściowych OpenTelemetry. Gdy ustawienia połączenia są udostępniane zarówno dla usługi Application Insights, jak i eksportera protokołu OpenTelemetry (OTLP), dane OpenTelemetry są wysyłane do obu punktów końcowych.

APPLICATIONINSIGHTS_CONNECTION_STRING: parametry połączenia obszaru roboczego usługi Application Insights. Jeśli to ustawienie istnieje, dane OpenTelemetry są wysyłane do tego obszaru roboczego. To ustawienie jest takie samo, jak używane do nawiązywania połączenia z usługą Application Insights bez włączonej funkcji OpenTelemetry. Jeśli aplikacja nie ma jeszcze tego ustawienia, może być konieczne włączenie integracji usługi Application Insights.

3. Włączanie funkcji OpenTelemetry w aplikacji

Po skonfigurowaniu hosta usługi Functions do używania funkcji OpenTelemetry należy również zaktualizować kod aplikacji w celu wyprowadzenia danych openTelemetrii. Włączenie biblioteki OpenTelemetry zarówno na hoście, jak i kodzie aplikacji umożliwia lepszą korelację między śladami i dziennikami emitowanych zarówno przez proces hosta usługi Functions, jak i z procesu roboczego języka.

Sposób instrumentowania aplikacji do używania metody OpenTelemetry zależy od docelowego punktu końcowego openTelemetry:

  1. Uruchom następujące polecenia, aby zainstalować wymagane zestawy w aplikacji:

    dotnet add package Microsoft.Azure.Functions.Worker.OpenTelemetry --version 1.0.0-preview1 
    dotnet add package OpenTelemetry.Extensions.Hosting 
    dotnet add package Azure.Monitor.OpenTelemetry.AspNetCore  
    
  2. W pliku projektu Program.cs dodaj następującą using instrukcję:

    using Azure.Monitor.OpenTelemetry.AspNetCore; 
    
  3. W delegacie ConfigureServices dodaj tę konfigurację usługi:

    services.AddOpenTelemetry()
    .UseFunctionsWorkerDefaults()
    .UseAzureMonitor();
    

    Aby wyeksportować do obu punktów końcowych OpenTelemetry, wywołaj metodę i UseAzureMonitor UseOtlpExporter.

Optymalizacje procesów roboczych Języka Java nie są jeszcze dostępne dla biblioteki OpenTelemetry, więc nie ma nic do skonfigurowania w kodzie Java.

  1. Zainstaluj następujące pakiety npm w projekcie:

    npm install @opentelemetry/api 
    npm install @opentelemetry/auto-instrumentations-node 
    npm install @azure/monitor-opentelemetry-exporter 
    npm install @azure/functions-opentelemetry-instrumentation
    
  1. Utwórz plik kodu w projekcie, skopiuj i wklej następujący kod w tym nowym pliku, a następnie zapisz plik jako 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()],
    });
    
  2. main Zaktualizuj pole w pliku package.json, aby uwzględnić ten nowy src/index.js plik, co może wyglądać następująco:

    "main": "src/{index.js,functions/*.js}"
    
  1. Utwórz plik kodu w projekcie, skopiuj i wklej następujący kod w tym nowym pliku, a następnie zapisz plik jako 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()],
    });
    
  2. main Zaktualizuj pole w pliku package.json, aby uwzględnić dane wyjściowe tego nowego src/index.ts pliku, co może wyglądać następująco:

    "main": "dist/src/{index.js,functions/*.js}"
    

Ważne

Dane wyjściowe openTelemetry do usługi Application Insights z procesu roboczego języka nie są obecnie obsługiwane w przypadku aplikacji programu PowerShell. Zamiast tego warto użyć punktu końcowego eksportera OTLP. Po skonfigurowaniu hosta dla danych wyjściowych usługi OpenTelemetry do usługi Application Insights dzienniki generowane przez proces roboczy programu PowerShell są nadal przekazywane, ale śledzenie rozproszone nie jest obecnie obsługiwane.

Te instrukcje dotyczą tylko eksportera OTLP:

  1. Dodaj ustawienie aplikacji o nazwie OTEL_FUNCTIONS_WORKER_ENABLED z wartością True.

  2. Utwórz folder na poziomie Modules aplikacji w katalogu głównym aplikacji i uruchom następujące polecenie:

    Save-Module -Name AzureFunctions.PowerShell.OpenTelemetry.SDK
    

    Spowoduje to zainstalowanie wymaganego AzureFunctions.PowerShell.OpenTelemetry.SDK modułu bezpośrednio w aplikacji. Nie można użyć requirements.psd1 pliku do automatycznego zainstalowania tej zależności, ponieważ zależności zarządzane nie są obecnie obsługiwane w wersji zapoznawczej planu Flex Consumption.

  3. Dodaj ten kod do pliku profile.ps1:

    Import-Module AzureFunctions.PowerShell.OpenTelemetry.SDK -Force -ErrorAction Stop 
    Initialize-FunctionsOpenTelemetry 
    
  1. Dodaj ten wpis w requirements.txt pliku:

    azure.monitor.opentelemetry
    
  2. Dodaj ten kod do function_app.py głównego pliku punktu wejścia:

    from azure.monitor.opentelemetry import configure_azure_monitor 
    configure_azure_monitor() 
    

Zagadnienia dotyczące platformy OpenTelemetry

Podczas eksportowania danych przy użyciu biblioteki OpenTelemetry należy pamiętać o tych bieżących kwestiach.

  • Gdy host jest skonfigurowany do używania funkcji OpenTelemetry, eksportowane są tylko dzienniki i ślady. Metryki hosta nie są obecnie eksportowane.

  • Obecnie nie można uruchomić projektu aplikacji lokalnie przy użyciu narzędzi Core Tools, jeśli na hoście jest włączona funkcja OpenTelemetry. Obecnie musisz wdrożyć kod na platformie Azure, aby zweryfikować aktualizacje związane z biblioteką OpenTelemetry.

  • Obecnie tylko wyzwalacze HTTP i wyzwalacze oparte na zestawie AZURE SDK są obsługiwane z danymi wyjściowymi biblioteki OpenTelemetry.

Monitorowanie planu Flex Consumption usługi Azure Functions