Delen via


OpenTelemetry gebruiken met Azure Functions

Belangrijk

Ondersteuning voor OpenTelemetry voor Azure Functions is momenteel beschikbaar als preview-versie. Zie de aanvullende gebruiksvoorwaarden voor Microsoft Azure Previews voor juridische voorwaarden die van toepassing zijn op Azure-functies die nog niet algemeen beschikbaar zijn.

In dit artikel leest u hoe u uw functie-app configureert voor het exporteren van logboek- en traceringsgegevens in een OpenTelemetry-indeling. Azure Functions genereert telemetriegegevens over de uitvoering van uw functie vanuit zowel het Functions-hostproces als het taalspecifieke werkproces waarin uw functiecode wordt uitgevoerd. Deze telemetriegegevens worden standaard verzonden naar Application Insights met behulp van de Application Insights SDK. U kunt er echter voor kiezen om deze gegevens te exporteren met behulp van semantiek van OpenTelemetry. Hoewel u nog steeds een OpenTelemetry-indeling kunt gebruiken om uw gegevens naar Application Insights te verzenden, kunt u nu ook dezelfde gegevens exporteren naar elk ander openTelemetry-compatibel eindpunt.

Aanbeveling

Omdat dit artikel is gericht op uw ontwikkeltaal van keuze, moet u de juiste taal bovenaan het artikel kiezen.

OpenTelemetry wordt momenteel niet ondersteund voor in-process C#-apps.

U kunt deze voordelen verkrijgen door OpenTelemetry in te schakelen in uw functie-app:

  • Correleert gegevens over traceringen en logboeken die zowel op de host als in uw toepassingscode worden gegenereerd.
  • Maakt consistente, op standaarden gebaseerde generatie van exportbare telemetriegegevens mogelijk.
  • Integreert met andere providers die openTelemetry-compatibele gegevens kunnen gebruiken.

OpenTelemetry is ingeschakeld op het niveau van de functie-app, zowel in de hostconfiguratie (host.json) als in uw codeproject. Functions biedt ook een door de client geoptimaliseerde ervaring voor het exporteren van OpenTelemetry-gegevens uit uw functiecode die wordt uitgevoerd in een taalspecifiek werkproces.

OpenTelemetry inschakelen in de Functions-host

Wanneer u OpenTelemetry-uitvoer inschakelt in het host.json-bestand van de functie-app, exporteert de host OpenTelemetry-uitvoer, ongeacht de taalstack die door uw app wordt gebruikt.

Als u OpenTelemetry-uitvoer van de Functions-host wilt inschakelen, werkt u het host.json-bestand in uw codeproject bij om een "telemetryMode": "OpenTelemetry" element toe te voegen aan de hoofdverzameling. Als OpenTelemetry is ingeschakeld, ziet uw host.json bestand er als volgt uit:

{
    "version": "2.0",
    "telemetryMode": "OpenTelemetry",
    ...
}

Toepassingsinstellingen configureren

Wanneer OpenTelemetry is ingeschakeld in het host.json bestand, worden de eindpunten waarnaar gegevens worden verzonden bepaald op basis van welke openTelemetry-ondersteunde toepassingsinstellingen beschikbaar zijn in de omgevingsvariabelen van uw app.

Maak specifieke toepassingsinstellingen in uw functie-app op basis van de doeluitvoer van OpenTelemetry. Wanneer verbindingsinstellingen worden opgegeven voor zowel Application Insights als een OTLP-exporteur (OpenTelemetry Protocol), worden OpenTelemetry-gegevens naar beide eindpunten verzonden.

APPLICATIONINSIGHTS_CONNECTION_STRING: de verbindingsreeks voor een Application Insights-werkruimte. Wanneer deze instelling bestaat, worden OpenTelemetry-gegevens naar die werkruimte verzonden. Deze instelling is dezelfde die wordt gebruikt om verbinding te maken met Application Insights zonder OpenTelemetry ingeschakeld. Als uw app deze instelling nog niet heeft, moet u mogelijk Application Insights-integratie inschakelen.

JAVA_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: zo true ingesteld dat de Functions-host het Java-werkproces toestaat om OpenTelemetry-logboeken rechtstreeks te streamen, waardoor dubbele vermeldingen op hostniveau worden voorkomen.

PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: zo true ingesteld dat de Functions-host het Python-werkproces toestaat om OpenTelemetry-logboeken rechtstreeks te streamen, waardoor dubbele vermeldingen op hostniveau worden voorkomen.

OpenTelemetry inschakelen in uw app

Als de Functions-host is geconfigureerd voor het gebruik van OpenTelemetry, moet u ook uw toepassingscode bijwerken om OpenTelemetry-gegevens uit te voeren. Als u OpenTelemetry inschakelt in zowel de host als uw toepassingscode, kunt u beter correlatie tussen traceringen en logboeken die worden verzonden door het Functions-hostproces en vanuit uw taalwerkproces.

De manier waarop u uw toepassing instrumenteren voor het gebruik van OpenTelemetry, is afhankelijk van uw doeleindpunt voor OpenTelemetry:

In dit artikel wordt ervan uitgegaan dat uw app gebruikmaakt IHostApplicationBuildervan versie 2.x en hoger van Microsoft.Azure.Functions.Worker. Zie versie 2.x in de handleiding voor het geïsoleerde werkrolmodel van C# voor meer informatie.

  1. Voer deze opdrachten uit om de vereiste assembly's in uw app te installeren:

    dotnet add package Microsoft.Azure.Functions.Worker.OpenTelemetry --version  1.1.0-preview6
    dotnet add package OpenTelemetry.Extensions.Hosting 
    dotnet add package Azure.Monitor.OpenTelemetry.Exporter  
    
  2. Voeg in het Program.cs projectbestand deze using instructie toe:

    using Azure.Monitor.OpenTelemetry.Exporter; 
    
  3. De manier waarop u OpenTelemetry configureert, is afhankelijk van of het opstarten van uw project gebruikmaakt IHostBuilder van of IHostApplicationBuilder, dat is geïntroduceerd in v2.x van de extensie van het .NET-geïsoleerde werkrolmodel.

    Voeg in program.cs deze coderegel toe na ConfigureFunctionsWebApplication:

    builder.Services.AddOpenTelemetry()
        .UseFunctionsWorkerDefaults()
        .UseAzureMonitorExporter();
    

    U kunt vanuit dezelfde app exporteren naar beide OpenTelemetry-eindpunten.

  1. Voeg de vereiste bibliotheken toe aan uw app. De manier waarop u bibliotheken toevoegt, is afhankelijk van of u implementeert met Behulp van Maven of Kotlin en of u ook gegevens naar Application Insights wilt verzenden.

    <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>
    
  2. U kunt deze code desgewenst toevoegen om aangepaste spans te maken:

    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();
    }
    
  1. Installeer deze NPM-pakketten in uw project:

    npm install @opentelemetry/api 
    npm install @opentelemetry/auto-instrumentations-node 
    npm install @azure/monitor-opentelemetry-exporter 
    npm install @azure/functions-opentelemetry-instrumentation
    
  1. Maak een codebestand in uw project, kopieer en plak de volgende code in dit nieuwe bestand en sla het bestand op als 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. Werk het veld in het main package.json-bestand bij om dit nieuwe src/index.js bestand op te nemen. Dit kan er als volgt uitzien:

    "main": "src/{index.js,functions/*.js}"
    
  1. Maak een codebestand in uw project, kopieer en plak de volgende code in dit nieuwe bestand en sla het bestand op als 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. Werk het veld in het main package.json-bestand bij om de uitvoer van dit nieuwe src/index.ts bestand op te nemen. Dit kan er als volgt uitzien:

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

Belangrijk

OpenTelemetry-uitvoer naar Application Insights van de taalwerker wordt momenteel niet ondersteund voor PowerShell-apps. U kunt in plaats daarvan een OTLP-exporteur-eindpunt gebruiken. Wanneer uw host is geconfigureerd voor OpenTelemetry-uitvoer naar Application Insights, worden de logboeken die door het PowerShell-werkproces worden gegenereerd, nog steeds doorgestuurd, maar gedistribueerde tracering wordt op dit moment niet ondersteund.

Deze instructies zijn alleen van toepassing op een OTLP-exporteur:

  1. Voeg een toepassingsinstelling toe met de OTEL_FUNCTIONS_WORKER_ENABLED naam met de waarde van True.

  2. Maak een Modules op app-niveau in de hoofdmap van uw app en voer de volgende opdracht uit:

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

    Hiermee wordt de vereiste AzureFunctions.PowerShell.OpenTelemetry.SDK module rechtstreeks in uw app geïnstalleerd. U kunt het requirements.psd1 bestand niet gebruiken om deze afhankelijkheid automatisch te installeren, omdat beheerde afhankelijkheden momenteel niet worden ondersteund in de preview van het Flex Consumption-abonnement .

  3. Voeg deze code toe aan uw profiel.ps1-bestand:

    Import-Module AzureFunctions.PowerShell.OpenTelemetry.SDK -Force -ErrorAction Stop 
    Initialize-FunctionsOpenTelemetry 
    
  1. Zorg ervoor dat deze bibliotheken zich in uw requirements.txt bestand bevinden, ongeacht of u geen opmerkingen maakt of uzelf toevoegt:

    azure-monitor-opentelemetry
    
  2. Voeg deze code toe aan het function_app.py hoofdinvoerpuntbestand:

    Als u al aan uw toepassingsinstellingen hebt toegevoegd PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY=true , kunt u deze stap overslaan. Als u Application Insights-verzameling handmatig wilt inschakelen zonder automatische instrumentatie, voegt u deze code toe aan uw app:

    from azure.monitor.opentelemetry import configure_azure_monitor 
    configure_azure_monitor() 
    
  3. Raadpleeg de documentatie over het gebruik van Azure Monitor Distro voor opties voor het verder configureren van de SDK.

Overwegingen voor OpenTelemetry

Wanneer u uw gegevens exporteert met Behulp van OpenTelemetry, moet u rekening houden met deze huidige overwegingen.

  • Op dit moment worden alleen HTTP-, Service Bus- en Event Hubs-triggers ondersteund met OpenTelemetry-uitvoer.

  • Wanneer de host is geconfigureerd voor het gebruik van OpenTelemetry, biedt Azure Portal geen ondersteuning voor logboekstreaming of recente aanroepen van functies.

  • Aangepaste reeksen bevatten automatisch alle resourcekenmerken en gebruiken de exporteurs die in uw app zijn geconfigureerd.

  • Wanneer uw app buiten Azure wordt uitgevoerd, inclusief tijdens lokale ontwikkeling, stelt de resourcedetector het service.name kenmerk java-function-app standaard in.

  • Gebruik deze JVM-vlaggen (Java Virtual Machine) om telemetrie stil te leggen bij lokaal uitvoeren tijdens eenheidstests:

    • -Dotel.traces.exporter=none
    • -Dotel.metrics.exporter=none
    • -Dotel.logs.exporter=none
  • U hoeft middleware niet handmatig te registreren; de automatische detectie van OpenTelemetryInvocationMiddlewareJava-werkrollen.

Ga als volgende te werk om toegang te krijgen tot diagnostische gegevens in uw app:

  1. Navigeer in Azure Portal naar de resource van uw functie-app.

  2. Selecteer in het linkerdeelvenster Diagnose en los problemen op en zoek naar de ontbrekende telemetriewerkstroom van Application Insights of OpenTelemetry voor de functie-app .

  3. Selecteer deze werkstroom, kies uw opnamemethode en selecteer Volgende.

  4. Bekijk de richtlijnen en eventuele aanbevelingen van de probleemoplosser.

Azure FunctionsFlex Consumption-abonnement bewaken