Azure Functions와 함께 OpenTelemetry 사용

Important

Azure Functions에 대한 OpenTelemetry 지원은 현재 미리 보기 상태이며, OpenTelemetry를 사용하려면 앱이 Flex 사용량 플랜에서 호스트되어야 합니다.

이 문서에서는 로그 및 추적 데이터를 OpenTelemetry 형식으로 내보내도록 함수 앱을 구성하는 방법을 보여 줍니다. Azure Functions는 Functions 호스트 프로세스와 Functions 코드가 실행되는 언어별 작업자 프로세스 모두에서 Functions 실행에 대한 원격 분석 데이터를 생성합니다. 기본적으로 이 원격 분석 데이터는 Application Insights SDK를 사용하여 Application Insights로 전송됩니다. 그러나 OpenTelemetry 의미 체계를 사용하여 이 데이터를 내보내도록 선택할 수 있습니다. 여전히 OpenTelemetry 형식을 사용하여 데이터를 Application Insights로 보낼 수 있지만 이제 동일한 데이터를 다른 OpenTelemetry 호환 엔드포인트로 내보낼 수도 있습니다.

이 문서는 사용자가 선택한 개발 언어를 대상으로 하므로 문서 상단에서 올바른 언어를 선택해야 합니다.

현재 Java 앱에 대한 클라이언트 최적화 OpenTelemetry 지원은 없습니다.

OpenTelemetry는 현재 C# In Process 앱에 지원되지 않습니다.

함수 앱에서 OpenTelemetry를 사용하도록 설정하면 다음과 같은 이점을 가져올 수 있습니다.

  • 호스트와 애플리케이션 코드 모두에서 생성되는 추적 및 로그 간의 상관 관계입니다.
  • 내보낼 수 있는 원격 분석 데이터를 일관되게 표준 기반으로 생성합니다.
  • OpenTeleletry 호환 데이터를 사용할 수 있는 다른 공급자와 통합됩니다.

OpenTelemetry는 호스트 구성(host.json)과 코드 프로젝트 모두에서 함수 앱 수준에서 사용하도록 설정됩니다. 또한 Functions는 언어별 작업자 프로세스에서 실행되는 Functions 코드에서 OpenTelemetry 데이터를 내보내기 위한 클라이언트 최적화 환경을 제공합니다.

1. Functions 호스트에서 OpenTelemetry 사용

함수 앱의 host.json 파일에서 OpenTelemetry 출력을 사용하도록 설정하면 호스트는 앱에서 사용하는 언어 스택에 관계없이 OpenTelemetry 출력을 내보냅니다.

Functions 호스트에서 OpenTelemetry 출력을 사용하도록 설정하려면 코드 프로젝트에서 host.json 파일을 업데이트하여 루트 컬렉션에 "telemetryMode": "openTelemetry" 요소를 추가합니다. OpenTelemetry가 사용하도록 설정되면 host.json 파일은 다음과 같을 수 있습니다.

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

2. 애플리케이션 설정 구성

host.json 파일에서 OpenTelemetry가 사용하도록 설정되면 데이터가 전송되는 엔드포인트는 앱의 환경 변수에서 사용할 수 있는 OpenTelemetry 지원 애플리케이션 설정에 따라 결정됩니다.

OpenTelemetry 출력 대상을 기반으로 함수 앱에서 특정 애플리케이션 설정을 만듭니다. Application Insights와 OTLP(OpenTelemetry 프로토콜) 내보내기 도구 모두에 대한 연결 설정이 제공되면 OpenTelemetry 데이터가 두 엔드포인트 모두로 전송됩니다.

APPLICATIONINSIGHTS_CONNECTION_STRING: Application Insights 작업 영역에 대한 연결 문자열입니다. 이 설정이 있으면 OpenTelemetry 데이터가 해당 작업 영역으로 전송됩니다. 이 설정은 OpenTelemetry를 사용하지 않고 Application Insights에 연결하는 데 사용되는 설정과 동일합니다. 앱에 아직 이 설정이 없으면 Application Insights 통합을 사용하도록 설정해야 할 수도 있습니다.

3. 앱에서 OpenTelemetry 사용

OpenTelemetry를 사용하도록 구성된 Functions 호스트를 사용하면 OpenTelemetry 데이터를 출력하도록 애플리케이션 코드도 업데이트해야 합니다. 호스트와 애플리케이션 코드 모두에서 OpenTelemetry를 사용하도록 설정하면 Functions 호스트 프로세스와 언어 작업자 프로세스에서 내보낸 추적과 로그 간의 상관 관계가 향상됩니다.

OpenTelemetry를 사용하기 위해 애플리케이션을 계측하는 방법은 대상 OpenTelemetry 엔드포인트에 따라 다릅니다.

  1. 앱에 필요한 어셈블리를 설치하려면 다음 명령을 실행합니다.

    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. Program.cs 프로젝트 파일에 다음 using 문을 추가합니다.

    using Azure.Monitor.OpenTelemetry.AspNetCore; 
    
  3. ConfigureServices 대리자에서 다음 서비스 구성을 추가합니다.

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

    두 OpenTelemetry 엔드포인트 모두로 내보내려면 UseAzureMonitorUseOtlpExporter를 모두 호출합니다.

OpenTelemetry에서는 아직 Java 작업자 최적화를 사용할 수 없으므로 Java 코드에서 구성할 항목이 없습니다.

  1. 프로젝트에 다음 npm 패키지를 설치합니다.

    npm install @opentelemetry/api 
    npm install @opentelemetry/auto-instrumentations-node 
    npm install @azure/monitor-opentelemetry-exporter 
    npm install @azure/functions-opentelemetry-instrumentation
    
  1. 프로젝트에서 코드 파일을 만들고 다음 코드를 이 새 파일에 복사하여 붙여넣은 후 파일을 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. package.json 파일의 main 필드를 업데이트하여 다음과 같은 새로운 src/index.js 파일을 포함합니다.

    "main": "src/{index.js,functions/*.js}"
    
  1. 프로젝트에서 코드 파일을 만들고 다음 코드를 이 새 파일에 복사하여 붙여넣은 후 파일을 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. 이 새 src/index.ts 파일의 출력을 포함하도록 package.json 파일의 main 필드를 업데이트합니다. 이는 다음과 같습니다.

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

Important

언어 작업자에서 Application Insights로의 OpenTelemetry 출력은 현재 PowerShell 앱에서 지원되지 않습니다. 대신 OTLP 내보내기 도구 엔드포인트를 사용할 수도 있습니다. 호스트가 Application Insights에 대한 OpenTelemetry 출력을 위해 구성된 경우 PowerShell 작업자 프로세스에서 생성된 로그는 계속 전달되지만 현재 분산 추적은 지원되지 않습니다.

이 지침은 OTLP 내보내기 도구에만 적용됩니다.

  1. 값이 TrueOTEL_FUNCTIONS_WORKER_ENABLED라는 애플리케이션 설정을 추가합니다.

  2. 앱 루트에 앱 수준 Modules 폴더를 만들고 다음 명령을 실행합니다.

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

    그러면 필요한 AzureFunctions.PowerShell.OpenTelemetry.SDK 모듈이 앱에 직접 설치됩니다. 관리 종속성은 현재 Flex 사용량 플랜 미리 보기에서 지원되지 않으므로 requirements.psd1 파일을 사용하여 이 종속성을 자동으로 설치할 수 없습니다.

  3. profile.ps1 파일에 다음 코드를 추가합니다.

    Import-Module AzureFunctions.PowerShell.OpenTelemetry.SDK -Force -ErrorAction Stop 
    Initialize-FunctionsOpenTelemetry 
    
  1. requirements.txt 파일에 다음 항목을 추가합니다.

    azure.monitor.opentelemetry
    
  2. function_app.py 기본 진입점 파일에 다음 코드를 추가합니다.

    from azure.monitor.opentelemetry import configure_azure_monitor 
    configure_azure_monitor() 
    

OpenTelemetry에 대한 고려 사항

OpenTelemetry를 사용하여 데이터를 내보낼 때 현재 고려 사항을 염두에 둡니다.

  • 호스트가 OpenTelemetry를 사용하도록 구성된 경우 로그 및 추적만 내보냅니다. 호스트 메트릭은 현재 내보내지지 않습니다.

  • 현재 호스트에서 OpenTelemetry를 사용하도록 설정한 경우 Core Tools를 사용하여 앱 프로젝트를 로컬로 실행할 수 없습니다. 현재 OpenTelemetry 관련 업데이트의 유효성을 검사하려면 코드를 Azure에 배포해야 합니다.

  • 현재 OpenTelemetry 출력에서는 HTTP 트리거와 Azure SDK 기반 트리거만 지원됩니다.

Azure Functions 모니터링Flex 사용량 플랜