Aracılığıyla paylaş


Azure İşlevleri ile OpenTelemetry kullanma

Bu makalede, işlev uygulamanızı günlük ve izleme verilerini OpenTelemetry biçiminde dışarı aktaracak şekilde yapılandırma işlemi gösterilmektedir. Azure İşlevleri hem İşlevler konak işleminden hem de işlev kodunuzun çalıştırıldığı dile özgü çalışan işleminden işlev yürütmelerinizle ilgili telemetri verileri oluşturur. Varsayılan olarak, bu telemetri verileri Application Insights SDK'sı kullanılarak Application Insights'a gönderilir. Ancak, OpenTelemetry semantiği kullanarak bu verileri dışarı aktarmayı seçebilirsiniz. Verilerinizi Application Insights'a göndermek için openTelemetry biçimini kullanmaya devam edebilirsiniz ancak artık aynı verileri diğer OpenTelemetry uyumlu uç noktalara da aktarabilirsiniz.

İşlev uygulamanızda OpenTelemetry'yi etkinleştirerek bu avantajları elde edebilirsiniz:

  • Hem konakta hem de uygulama kodunuzda oluşturulan izlemeler ve günlükler arasında veri bağıntısı oluşturur.
  • Dışarı aktarılabilir telemetri verilerinin tutarlı, standartlara dayalı bir şekilde oluşturulmasını sağlar.
  • OpenTelemetry uyumlu verileri kullanabilen diğer sağlayıcılarla tümleşir.

Bu makaleyi kullanırken şu noktaları göz önünde bulundurun:

  • OpenTelemetry ve Azure İşlevleri'ni hızlı bir şekilde kullanmaya başlamanıza yardımcı olmak için tasarlanan OpenTelemetry öğreticisini deneyin. Bu makalede, dağıtılmış izleme için OpenTelemetry tümleştirmesi kullanan bir işlev uygulaması oluşturmak ve dağıtmak için Azure Geliştirici CLI'sı (azd) kullanılmaktadır.

  • Bu makale seçtiğiniz geliştirme dilini hedeflediğinden, makalenin en üstünde doğru dili seçmeyi unutmayın.

  • OpenTelemetry, hem konak yapılandırmasında (host.json) hem de kod projenizde işlev uygulaması düzeyinde etkinleştirilir. İşlevler ayrıca dile özgü bir çalışan işleminde çalışan işlev kodunuzdan OpenTelemetry verilerini dışarı aktarmak için istemci için iyileştirilmiş bir deneyim sağlar.

İşlevler ana bilgisayarında OpenTelemetry'yi etkinleştirme

İşlev uygulamasının host.json dosyasında OpenTelemetry çıkışını etkinleştirdiğinizde, uygulamanız tarafından kullanılan dil yığınından bağımsız olarak ana bilgisayarınız OpenTelemetry çıkışını dışarı aktarır.

İşlevler konağından OpenTelemetry çıkışını etkinleştirmek için kod projenizdeki host.json dosyasını güncelleştirerek kök koleksiyona bir "telemetryMode": "OpenTelemetry" öğe ekleyin. OpenTelemetry etkinleştirildiğinde, host.json dosyanız aşağıdaki gibi görünebilir:

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

Uygulama ayarlarını yapılandır

Dosyada OpenTelemetry'yi host.json etkinleştirdiğinizde, uygulamanın ortam değişkenleri, OpenTelemetry tarafından desteklenen uygulama ayarlarının kullanılabilir olduğu verileri göndermek için uç noktaları belirler.

İşlev uygulamanızda OpenTelemetry çıkış hedefine göre belirli uygulama ayarları oluşturun. Hem Application Insights hem de OpenTelemetry protokolü (OTLP) verme işlemi için bağlantı ayarları sağladığınızda, OpenTelemetry verileri her iki uç noktaya da gönderilir.

APPLICATIONINSIGHTS_CONNECTION_STRING: Application Insights çalışma alanının bağlantı dizesi. Bu ayar mevcut olduğunda, OpenTelemetry verileri bu çalışma alanına gönderilir. OpenTelemetry etkinleştirilmeden Application Insights'a bağlanmak için aynı ayarı kullanın. Uygulamanızda bu ayar yoksa Application Insights tümleştirmesini etkinleştirmeniz gerekebilir.

JAVA_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: İşlevler ana bilgisayarının, Java çalışan işleminin OpenTelemetry günlüklerini doğrudan akışına izin vermesi için olarak ayarlanır true ve bu da yinelenen konak düzeyinde girişleri engeller.

PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: İşlevler ana bilgisayarının, Python çalışan işleminin OpenTelemetry günlüklerini doğrudan akışla aktarmasına izin vermesi için olarak ayarlanır true ve bu da yinelenen konak düzeyinde girişleri önler.

Uygulamanızda OpenTelemetry'yi etkinleştirme

İşlevler ana bilgisayarını OpenTelemetry kullanacak şekilde yapılandırdıktan sonra uygulama kodunuzu OpenTelemetry verilerinin çıktısını almak üzere güncelleştirin. Hem ana bilgisayarda hem de uygulama kodunuzda OpenTelemetry'yi etkinleştirdiğinizde, İşlevler ana bilgisayar süreci ile dil çalışma birimi süreci tarafından yayılmış olan izlemeler ve günlükler arasında daha iyi bir bağıntı elde edersiniz.

Uygulamanızın OpenTelemetry kullanımı için nasıl enstrüman edileceği, hedef OpenTelemetry uç noktanıza bağlıdır.

Uygulamanızın, Microsoft.Azure.Functions.Worker'ın 2.x ve sonraki sürümlerinde bulunan IHostApplicationBuilder kullandığı varsayılmaktadır. Daha fazla bilgi için C# yalıtılmış çalışan modeli kılavuzundaki Sürüm 2.x'e bakın.

  1. Uygulamanıza gerekli derlemeleri yüklemek için şu komutları çalıştırın:

    dotnet add package Microsoft.Azure.Functions.Worker.OpenTelemetry
    dotnet add package OpenTelemetry.Extensions.Hosting 
    dotnet add package Azure.Monitor.OpenTelemetry.Exporter  
    
  2. Program.cs proje dosyanıza şu using deyimi ekleyin:

    using Azure.Monitor.OpenTelemetry.Exporter; 
    
  3. Projenizin başlatılmasında IHostBuilder veya IHostApplicationBuilder kullanılıp kullanılmadığına bağlı olarak OpenTelemetry'yi yapılandırın. İkincisi, .NET yalıtılmış çalışan modeli uzantısının v2.x'inde tanıtıldı.

    program.cs'da, şu kod satırının arkasına ConfigureFunctionsWebApplicationekleyin:

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

    Aynı uygulamadan her iki OpenTelemetry uç noktasına da dışarı aktarabilirsiniz.

  1. Gerekli kitaplıkları uygulamanıza ekleyin. Kitaplık ekleme yönteminiz, Maven veya Kotlin kullanarak dağıtım yapıp yapmadığınıza ve Application Insights'a da veri göndermek isteyip istemediğinize bağlıdır.

    <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. (İsteğe bağlı) Özel yayılma alanları oluşturmak için bu kodu ekleyin:

    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. Projenize şu npm paketlerini yükleyin:

    npm install @opentelemetry/api 
    npm install @opentelemetry/auto-instrumentations-node 
    npm install @azure/monitor-opentelemetry-exporter 
    npm install @azure/functions-opentelemetry-instrumentation
    
  1. Projenizde bir kod dosyası oluşturun, aşağıdaki kodu kopyalayıp bu yeni dosyaya yapıştırın ve dosyayı olarak src/index.jskaydedin:

    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. mainpackage.json dosyanızdaki alanı yeni src/index.js dosyayı içerecek şekilde güncelleştirin. Örneğin:

    "main": "src/{index.js,functions/*.js}"
    
  1. Projenizde bir kod dosyası oluşturun, aşağıdaki kodu kopyalayıp bu yeni dosyaya yapıştırın ve dosyayı olarak src/index.tskaydedin:

    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 package.json dosyanızdaki alanı, bu yeni src/index.ts dosyanın çıktısını içerecek şekilde güncelleştirin; bu aşağıdaki gibi görünebilir:

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

Önemli

Dil çalışanından Application Insights'a openTelemetry çıkışı şu anda PowerShell uygulamaları için desteklenmemaktadır. Bunun yerine bir OTLP verme uç noktası kullanmak isteyebilirsiniz. Barındırma sunucunuzu OpenTelemetry için Application Insights'a yapılandırdığınızda, PowerShell çalışan işlemi tarafından üretilen günlükler hala iletilir, ancak şu anda dağıtılmış izleme özelliği desteklenmemektedir.

Bu yönergeler yalnızca OTLP ihracatçısı için geçerlidir:

  1. değerine OTEL_FUNCTIONS_WORKER_ENABLEDsahip adlı True bir uygulama ayarı ekleyin.

  2. Uygulamanızın kökünde uygulama düzeyinde Modules bir klasör oluşturun ve aşağıdaki komutu çalıştırın:

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

    Bu komut, gerekli AzureFunctions.PowerShell.OpenTelemetry.SDK modülü doğrudan uygulamanıza yükler. Yönetilen bağımlılıklar şu anda Esnek Tüketim planırequirements.psd1desteklenmediğinden, dosyayı bu bağımlılığı otomatik olarak yüklemek için kullanamazsınız.

  3. Bu kodu profile.ps1 dosyanıza ekleyin:

    Import-Module AzureFunctions.PowerShell.OpenTelemetry.SDK -Force -ErrorAction Stop 
    Initialize-FunctionsOpenTelemetry 
    
  1. Ayrıştırma veya kendinizi ekleme gibi durumlarda bu kitaplıkların dosyanızda requirements.txt olduğundan emin olun:

    azure-monitor-opentelemetry
    
  2. Bu kodu ana giriş noktası dosyanıza function_app.py ekleyin:

    Uygulama ayarlarınıza zaten eklediyseniz PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY=true bu adımı atlayabilirsiniz. Application Insights koleksiyonunu otomatik izleme olmadan el ile etkinleştirmek için bu kodu uygulamanıza ekleyin:

    from azure.monitor.opentelemetry import configure_azure_monitor 
    configure_azure_monitor() 
    
  3. SDK'nın nasıl daha fazla yapılandırılması hakkında seçenekler için Azure İzleyici Dağıtım kullanımı belgelerini gözden geçirin.

OpenTelemetry ile ilgili dikkat edilmesi gerekenler

OpenTelemetry kullanarak verilerinizi dışarı aktardığınızda, bu konuları göz önünde bulundurun.

  • Azure portalı yalnızca telemetri Azure Monitor'a gönderildiğinde izleri destekler Recent function invocation.

  • Konağı OpenTelemetry kullanacak şekilde yapılandırırken, Azure portalı log akışını desteklemez.

  • telemetryMode olarak ayarlarsanız, host.json bölümündeki logging.applicationInsights yapılandırması uygulanmaz.

  • Özel yayılma alanları otomatik olarak tüm kaynak özniteliklerini içerir ve uygulamanızda yapılandırılan dışarı aktarmaları kullanır.

  • Uygulamanız yerel geliştirme sırasında da dahil olmak üzere Azure dışında çalıştığında, kaynak algılayıcısı özniteliği varsayılan olarak olarak service.name olarak ayarlarjava-function-app.

  • Birim testleri sırasında yerel olarak çalışırken telemetriyi sessize almak için şu Java Sanal Makinesi (JVM) bayraklarını kullanın:

    • -Dotel.traces.exporter=none
    • -Dotel.metrics.exporter=none
    • -Dotel.logs.exporter=none
  • Ara yazılımı el ile kaydetmenize gerek yok; Java işleyici OpenTelemetryInvocationMiddleware otomatik olarak keşfeder.

Sorun giderme

OpenTelemetry kullanarak verilerinizi dışarı aktardığınızda, bu yaygın sorunları ve çözümleri göz önünde bulundurun.

Günlük filtreleme

İşlev uygulamanızda günlük filtrelemeyi doğru yapılandırmak için ana bilgisayar süreci ile çalışan süreci arasındaki farkı anlamanız gerekir.

Konak işlemi, tetikleyicileri ve ölçeklendirmeyi yöneten, başlatma günlükleri, istek izlemeleri ve çalışma zamanı sistem durumu bilgileri gibi sistem düzeyinde telemetriyi yayan Azure İşlevleri çalışma zamanı ortamıdır.

Çalışan işlemi dile özgüdür, işlev kodunuzu yürütür ve uygulama günlüklerini ve telemetri verilerini bağımsız olarak üretir.

Önemli

host.json'de tanımlanan filtreler yalnızca konak işlemi tarafından oluşturulan günlüklere uygulanır. Çalışan işleminden günlükleri filtrelemek için dile özgü OpenTelemetry ayarlarını kullanmanız gerekir.

Örnek: host.json'daki tüm sağlayıcılar için konak günlüklerini filtreleme

Ana bilgisayar tarafından yönetilen tüm sağlayıcılarda küresel günlük seviyesini ayarlamak için bu yaklaşımı kullanın.

{
  "version": "2.0",
  "telemetryMode": "OpenTelemetry",
  "logging": {
    "logLevel": {
      "default": "Warning"
    }
  }
}

Örnek: Günlükleri yalnızca OpenTelemetry günlükçü sağlayıcısı için filtreleyin

Diğer sağlayıcıları (konsol veya dosya günlüğü gibi) etkilenmeden bırakırken yalnızca OpenTelemetry günlükçü sağlayıcısını hedeflemek için bu yaklaşımı kullanın:

{
  "version": "2.0",
  "telemetryMode": "OpenTelemetry",
  "logging": {
    "OpenTelemetry": {
      "logLevel": {
        "default": "Warning"
      }
    }
  }
}

Konsol loglama

İşlevler konağı, stdout veya stderr'a yazılan her şeyi otomatik olarak yakalar ve telemetri işlem hattına iletir. ConsoleExporter da kullanıyorsanız veya kodunuzdaki konsola doğrudan yazıyorsanız telemetri verilerinizde yinelenen günlükler oluşabilir.

Uyarı

Yinelenen telemetri girdilerini önlemek için ConsoleExporter eklemeyin veya üretim kodunda konsola yazmayın.

Microsoft Entra kimlik doğrulama

OpenTelemetry ile Microsoft Entra kimlik doğrulamasını kullandığınızda, kimlik doğrulamasını hem konak işlemi hem de çalışan işlemi için ayrı olarak yapılandırmanız gerekir.

Konak işlemi için kimlik doğrulamasını yapılandırma hakkında daha fazla bilgi için, Microsoft Entra kimlik doğrulaması gerektirme sayfasına bakın.

Çalışan işlemi için kimlik doğrulamasını yapılandırmak için bkz. Microsoft Entra kimlik doğrulamasını etkinleştirme.

Kaynak öznitelikleri desteği

Azure İzleyici'deki kaynak öznitelikleri desteği şu anda önizleme aşamasındadır. Bu özelliği etkinleştirmek için ortam değişkenini OTEL_DOTNET_AZURE_MONITOR_ENABLE_RESOURCE_METRICS olarak trueayarlayın. Bu ayar kaynak özniteliklerini özel ölçümler tablosuna alır.

Yinelenen istek telemetrisi

Ana bilgisayar işlemi, istek telemetrisini otomatik olarak oluşturur. Çalışan süreç ayrıca istek izleme kütüphaneleriyle izleniyorsa (örneğin, .NET'te AspNetCoreInstrumentation), aynı istek iki kez raporlanır.

Uyarı

Azure İzleyici Dağıtımı genellikle .NET'te AspNetCoreInstrumentation ve diğer dillerde benzer izlemeler içerdiğinden, yinelenen telemetriyi önlemek için çalışan işleminde Azure İzleyici dağıtımı kullanmaktan kaçının.

Loglama kapsamları dahil değil

Varsayılan olarak, çalışan işlemi günlüklerine kapsam içermez. Kapsamları etkinleştirmek için bu ayarı çalışanda açıkça yapılandırmanız gerekir. Aşağıdaki örnekte, .NET Yalıtılmış'da kapsamların nasıl etkinleştirileceği gösterilmektedir:

builder.Logging.AddOpenTelemetry(b => b.IncludeScopes = true);

Eksik istek telemetrisi

HTTP, Service Bus ve Event Hubs gibi tetikleyiciler, dağıtılmış izlemeyi mümkün kılmak için bağlam yayılımına bağlıdır. Varsayılan davranış olarak üst tabanlı örnekleme kullanıldığında, gelen istek veya ileti örneklenmemişse istek telemetrisi oluşturulmaz.

Yinelenen OperationId

Azure İşlevleri'nde, telemetriyi ilişkilendirmek için kullanılan OperationId, doğrudan gelen istek veya iletideki traceparent değerinden gelir. Birden çok çağrı aynı traceparent değeri yeniden kullandığında, hepsi aynı OperationIdolur.

OpenTelemetry'yi ortam değişkenleriyle yapılandırma

OpenTelemetry davranışını, standart ortam değişkenlerini kullanarak yapılandırabilirsiniz. Bu değişkenler, farklı diller ve çalışma zamanlarında davranışı denetlemek için tutarlı bir yol sağlar. Örnekleme stratejilerini, dışarı aktarma ayarlarını ve kaynak özniteliklerini ayarlayabilirsiniz. Desteklenen ortam değişkenleri hakkında daha fazla bilgi için OpenTelemetry belgelerine bakın.

İzleme sorunlarını gidermek için tanılamayı kullanma

Azure portalındaki Azure İşlevleri tanılaması, izlemeyle ilgili olası sorunları algılamak ve tanılamak için kullanışlı bir kaynaktır.

Uygulamanızda tanılamaya erişmek için:

  1. Azure portalında işlev uygulaması kaynağınıza gidin.

  2. Sol bölmede Sorunları tanıla ve çöz seçeneğini seçin ve İşlev Uygulaması telemetrisinin eksik olduğu Application Insights veya OpenTelemetry iş akışını arayın.

  3. Bu iş akışını seçin, alma yönteminizi seçin ve İleri'yi seçin.

  4. Sorun giderici tarafından sağlanan yönergeleri ve önerileri gözden geçirin.

Sonraki Adımlar

OpenTelemetry ve Azure İşlevlerini izleme hakkında daha fazla bilgi edinin: