Bagikan melalui


Menggunakan OpenTelemetry dengan Azure Functions

Artikel ini memperlihatkan kepada Anda cara mengonfigurasi aplikasi fungsi untuk mengekspor data log dan pelacakan dalam format OpenTelemetry. Azure Functions menghasilkan data telemetri pada eksekusi fungsi Anda dari proses host Functions dan proses pekerja khusus bahasa tempat kode fungsi Anda berjalan. Secara default, data telemetri ini dikirim ke Application Insights dengan menggunakan Application Insights SDK. Namun, Anda dapat memilih untuk mengekspor data ini dengan menggunakan semantik OpenTelemetry. Meskipun Anda masih dapat menggunakan format OpenTelemetry untuk mengirim data Anda ke Application Insights, Anda sekarang juga dapat mengekspor data yang sama ke titik akhir yang mematuhi OpenTelemetry lainnya.

Anda dapat memperoleh manfaat ini dengan mengaktifkan OpenTelemetry di aplikasi fungsi Anda:

  • Menghubungkan data di seluruh jejak dan log yang dihasilkan baik di host maupun dalam kode aplikasi Anda.
  • Memungkinkan pembuatan data telemetri yang konsisten dan berbasis standar yang dapat diekspor.
  • Terintegrasi dengan penyedia lain yang dapat menggunakan data yang mematuhi OpenTelemetry.

Ingatlah pertimbangan ini saat menggunakan artikel ini:

  • Coba tutorial OpenTelemetry, yang dirancang untuk membantu Anda memulai dengan cepat dengan OpenTelemetry dan Azure Functions. Artikel ini menggunakan Azure Developer CLI (azd) untuk membuat dan menyebarkan aplikasi fungsi yang menggunakan integrasi OpenTelemetry untuk pelacakan terdistribusi.

  • Karena artikel ini ditargetkan pada bahasa pengembangan pilihan Anda, ingatlah untuk memilih bahasa yang benar di bagian atas artikel.

  • OpenTelemetry diaktifkan di tingkat aplikasi fungsi, baik dalam konfigurasi host (host.json) maupun di proyek kode Anda. Functions juga memberikan pengalaman yang dioptimalkan klien untuk mengekspor data OpenTelemetry dari kode fungsi Anda yang berjalan dalam proses pekerja khusus bahasa.

Mengaktifkan OpenTelemetry di host Functions

Saat Anda mengaktifkan output OpenTelemetry dalam file host.json aplikasi fungsi Anda, host Anda mengekspor output OpenTelemetry tanpa memandang tumpukan bahasa yang digunakan oleh aplikasi Anda.

Untuk mengaktifkan output OpenTelemetry dari host Functions, perbarui file host.json di proyek kode Anda untuk menambahkan "telemetryMode": "OpenTelemetry" elemen ke koleksi akar. Dengan OpenTelemetry diaktifkan, file host.json Anda mungkin terlihat seperti ini:

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

Mengonfigurasi pengaturan aplikasi

Saat Anda mengaktifkan OpenTelemetry dalam host.json file, variabel lingkungan aplikasi menentukan titik akhir untuk mengirim data berdasarkan pengaturan aplikasi yang didukung OpenTelemetry yang tersedia.

Buat pengaturan aplikasi tertentu di aplikasi fungsi Anda berdasarkan tujuan output OpenTelemetry. Saat Anda menyediakan pengaturan koneksi untuk pengekspor Application Insights dan protokol OpenTelemetry (OTLP), data OpenTelemetry dikirim ke kedua titik akhir.

APPLICATIONINSIGHTS_CONNECTION_STRING: string koneksi untuk ruang kerja Application Insights. Ketika pengaturan ini ada, data OpenTelemetry dikirim ke ruang kerja tersebut. Gunakan pengaturan yang sama untuk menyambungkan ke Application Insights tanpa OpenTelemetry diaktifkan. Jika aplikasi Anda belum memiliki pengaturan ini, Anda mungkin perlu Mengaktifkan integrasi Application Insights.

JAVA_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: diatur ke true sehingga host Functions memungkinkan proses pekerja Java untuk mengalirkan log OpenTelemetry secara langsung, yang mencegah entri tingkat host duplikat.

PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: diatur ke true sehingga host Functions memungkinkan proses pekerja Python untuk mengalirkan log OpenTelemetry secara langsung, yang mencegah entri tingkat host duplikat.

Mengaktifkan OpenTelemetry di aplikasi Anda

Setelah Anda mengonfigurasi host Functions untuk menggunakan OpenTelemetry, perbarui kode aplikasi Anda untuk menghasilkan data OpenTelemetry. Ketika Anda mengaktifkan OpenTelemetry di host dan kode aplikasi Anda, Anda mendapatkan korelasi yang lebih baik antara jejak dan log yang dipancarkan proses host Functions dan proses pekerja bahasa Anda.

Cara Anda mengintegrasikan aplikasi Anda untuk menggunakan OpenTelemetry tergantung pada endpoint OpenTelemetry yang menjadi target Anda.

Contoh dalam artikel ini mengasumsikan bahwa aplikasi Anda menggunakan IHostApplicationBuilder yang tersedia di versi 2.x dan versi yang lebih baru dari Microsoft.Azure.Functions.Worker. Untuk informasi selengkapnya, lihat Versi 2.x di panduan model pekerja terisolasi C#.

  1. Jalankan perintah ini untuk menginstal rakitan yang diperlukan di aplikasi Anda:

    dotnet add package Microsoft.Azure.Functions.Worker.OpenTelemetry
    dotnet add package OpenTelemetry.Extensions.Hosting 
    dotnet add package Azure.Monitor.OpenTelemetry.Exporter  
    
  2. Dalam file proyek Program.cs Anda, tambahkan pernyataan ini using :

    using Azure.Monitor.OpenTelemetry.Exporter; 
    
  3. Konfigurasikan OpenTelemetry berdasarkan apakah startup proyek Anda menggunakan IHostBuilder atau IHostApplicationBuilder. Yang terakhir diperkenalkan di v2.x dari ekstensi model pekerja terisolasi .NET.

    Di program.cs, tambahkan baris kode ini setelah ConfigureFunctionsWebApplication:

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

    Anda dapat mengekspor ke kedua titik akhir OpenTelemetry dari aplikasi yang sama.

  1. Tambahkan pustaka yang diperlukan ke aplikasi Anda. Cara Anda menambahkan pustaka tergantung pada apakah Anda menyebarkan menggunakan Maven atau Kotlin dan jika Anda ingin juga mengirim data ke 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>
    
  2. (Opsional) Tambahkan kode ini untuk membuat rentang kustom:

    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. Instal paket npm ini di proyek Anda:

    npm install @opentelemetry/api 
    npm install @opentelemetry/auto-instrumentations-node 
    npm install @azure/monitor-opentelemetry-exporter 
    npm install @azure/functions-opentelemetry-instrumentation
    
  1. Buat file kode di proyek Anda, salin dan tempel kode berikut dalam file baru ini, dan simpan file sebagai 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 Perbarui bidang dalam file package.json Anda untuk menyertakan file barusrc/index.js. Contohnya:

    "main": "src/{index.js,functions/*.js}"
    
  1. Buat file kode di proyek Anda, salin dan tempel kode berikut dalam file baru ini, dan simpan file sebagai 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 Perbarui bidang dalam file package.json Anda untuk menyertakan output file baru src/index.ts ini, yang mungkin terlihat seperti ini:

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

Penting

Output OpenTelemetry ke Application Insights dari pekerja bahasa saat ini tidak didukung untuk aplikasi PowerShell. Anda mungkin ingin menggunakan titik akhir pengekspor OTLP. Saat Anda mengonfigurasi host untuk output OpenTelemetry ke Application Insights, log yang dihasilkan oleh proses kerja PowerShell masih diteruskan, tetapi penelusuran terdistribusi tidak didukung saat ini.

Instruksi ini hanya berlaku untuk pengekspor OTLP:

  1. Tambahkan pengaturan aplikasi bernama OTEL_FUNCTIONS_WORKER_ENABLED dengan nilai True.

  2. Buat Modules tingkat aplikasi di akar aplikasi Anda dan jalankan perintah berikut:

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

    Perintah ini menginstal modul yang diperlukan AzureFunctions.PowerShell.OpenTelemetry.SDK langsung di aplikasi Anda. Anda tidak dapat menggunakan requirements.psd1 file untuk menginstal dependensi ini secara otomatis karena dependensi terkelola saat ini tidak didukung dalam pratinjau paket Konsumsi Flex.

  3. Tambahkan kode ini ke file profile.ps1 Anda:

    Import-Module AzureFunctions.PowerShell.OpenTelemetry.SDK -Force -ErrorAction Stop 
    Initialize-FunctionsOpenTelemetry 
    
  1. Pastikan pustaka ini ada di file Anda requirements.txt , baik dari membatalkan komentar atau menambahkan diri Anda:

    azure-monitor-opentelemetry
    
  2. Tambahkan kode ini ke file titik masuk utama Anda function_app.py :

    Jika Anda sudah menambahkan PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY=true di pengaturan aplikasi, Anda dapat melewati langkah ini. Untuk mengaktifkan koleksi Application Insights secara manual tanpa instrumentasi otomatis, tambahkan kode ini ke aplikasi Anda:

    from azure.monitor.opentelemetry import configure_azure_monitor 
    configure_azure_monitor() 
    
  3. Tinjau dokumentasi penggunaan Azure monitor Distro untuk opsi tentang cara mengonfigurasi SDK lebih lanjut.

Pertimbangan untuk OpenTelemetry

Saat Anda mengekspor data dengan menggunakan OpenTelemetry, ingatlah pertimbangan ini.

  • Portal Microsoft Azure mendukung Recent function invocation jejak hanya jika telemetri dikirim ke Azure Monitor.

  • Saat Anda mengonfigurasi host untuk menggunakan OpenTelemetry, portal Microsoft Azure tidak mendukung streaming log.

  • Jika Anda mengatur telemetryMode ke OpenTelemetry, konfigurasi di bagian logging.applicationInsights host.json tidak berlaku.

  • Rentang kustom secara otomatis menyertakan semua atribut sumber daya dan menggunakan eksportir yang dikonfigurasi di aplikasi Anda.

  • Saat aplikasi Anda berjalan di luar Azure, termasuk selama pengembangan lokal, detektor sumber daya mengatur service.name atribut ke java-function-app secara default.

  • Gunakan bendera Java Virtual Machine (JVM) ini untuk membungkam telemetri saat berjalan secara lokal selama pengujian unit:

    • -Dotel.traces.exporter=none
    • -Dotel.metrics.exporter=none
    • -Dotel.logs.exporter=none
  • Anda tidak perlu mendaftarkan middleware secara manual; pekerja Java secara otomatis mendeteksi OpenTelemetryInvocationMiddleware.

Troubleshooting

Saat Anda mengekspor data dengan menggunakan OpenTelemetry, ingatlah masalah dan solusi umum ini.

Pemfilteran log

Untuk mengonfigurasi pemfilteran log dengan benar di aplikasi fungsi, Anda perlu memahami perbedaan antara proses host dan proses pekerja.

Proses host adalah runtime Azure Functions yang mengelola pemicu, penskalaan, dan memancarkan telemetri tingkat sistem seperti log inisialisasi, jejak permintaan, dan informasi kesehatan runtime.

Proses pekerja (worker process) tergantung pada bahasa, menjalankan kode fungsi Anda, dan menghasilkan log aplikasi serta telemetri secara mandiri.

Penting

Filter yang ditentukan dalam host.json hanya berlaku untuk log yang dihasilkan oleh proses host. Anda harus menggunakan pengaturan OpenTelemetry berbasis bahasa pemrograman untuk memfilter log dari proses kerja.

Contoh: Memfilter log host untuk semua penyedia di host.json

Gunakan pendekatan ini untuk mengatur tingkat log global di semua penyedia yang dikelola oleh host:

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

Contoh: Memfilter log hanya untuk penyedia pencatat OpenTelemetry

Gunakan pendekatan ini untuk menargetkan hanya penyedia pencatat OpenTelemetry sambil membiarkan penyedia lain (seperti konsol atau pengelogan file) tidak terpengaruh:

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

Pengelogan konsol

Host Functions secara otomatis merekam semua yang ditulis ke stdout atau stderr dan meneruskannya ke alur telemetri. Jika Anda juga menggunakan ConsoleExporter atau menulis langsung ke konsol dalam kode Anda, log duplikat dapat terjadi di data telemetri Anda.

Nota

Untuk menghindari entri telemetri duplikat, jangan menambahkan ConsoleExporter atau menulis ke konsol pada kode produksi.

Microsoft Entra otentikasi

Saat Anda menggunakan autentikasi Microsoft Entra dengan OpenTelemetry, Anda harus mengonfigurasi autentikasi secara terpisah untuk proses host dan proses pekerja.

Untuk mengonfigurasi autentikasi untuk proses host, lihat Memerlukan autentikasi Microsoft Entra.

Untuk mengonfigurasi autentikasi untuk proses pekerja, lihat Mengaktifkan autentikasi Microsoft Entra.

Dukungan atribut sumber daya

Dukungan atribut sumber daya di Azure Monitor saat ini sedang dalam tahap uji coba. Untuk mengaktifkan fitur ini, atur OTEL_DOTNET_AZURE_MONITOR_ENABLE_RESOURCE_METRICS variabel lingkungan ke true. Pengaturan ini menyerap atribut sumber daya ke dalam tabel metrik kustom.

Telemetri permintaan duplikat

Proses host secara otomatis menghasilkan telemetri permintaan. Jika proses kerja juga menggunakan pustaka pelacakan permintaan (misalnya, AspNetCoreInstrumentation di .NET), permintaan yang sama dilaporkan dua kali.

Nota

Karena Distribusi Azure Monitor biasanya menyertakan AspNetCoreInstrumentation di .NET dan instrumentasi serupa dalam bahasa lain, hindari menggunakan distribusi Azure Monitor dalam proses kerja untuk mencegah telemetri duplikat.

Cakupan pencatatan log tidak termasuk

Secara default, proses pekerja tidak menyertakan cakupan dalam lognya. Untuk mengaktifkan skop, Anda harus mengonfigurasi pengaturan ini secara eksplisit pada pekerja. Contoh berikut menunjukkan cara mengaktifkan cakupan di .NET Isolated:

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

Data telemetri permintaan hilang

Pemicu seperti HTTP, Service Bus, dan Event Hubs bergantung pada penyebaran konteks untuk pelacakan terdistribusi. Dengan pengambilan sampel berbasis induk sebagai perilaku default, telemetri permintaan tidak dihasilkan saat permintaan atau pesan masuk tidak diambil sampelnya.

Duplikat OperationId

Di Azure Functions, OperationId yang digunakan untuk menghubungkan telemetri berasal langsung dari nilai traceparent dalam permintaan atau pesan masuk. Jika beberapa panggilan menggunakan kembali nilai yang sama pada traceparent, semuanya mendapatkan OperationId yang sama.

Mengonfigurasi OpenTelemetry dengan variabel lingkungan

Anda dapat mengonfigurasi perilaku OpenTelemetry dengan menggunakan variabel lingkungan standarnya. Variabel ini menyediakan cara yang konsisten untuk mengontrol fungsi di berbagai bahasa dan runtime. Anda dapat menyesuaikan strategi pengambilan sampel, pengaturan pengekspor, dan atribut sumber daya. Untuk informasi selengkapnya tentang variabel lingkungan yang didukung, lihat dokumentasi OpenTelemetry.

Menggunakan diagnostik untuk memecahkan masalah pemantauan

Diagnostik Azure Functions di portal Microsoft Azure adalah sumber daya yang berguna untuk mendeteksi dan mendiagnosis potensi masalah terkait pemantauan.

Untuk mengakses diagnostik di aplikasi Anda:

  1. Di portal Microsoft Azure, buka sumber daya aplikasi fungsi Anda.

  2. Di panel kiri, pilih Diagnosa dan selesaikan masalah dan cari alur kerja Aplikasi Fungsi yang hilang telemetri Application Insights atau OpenTelemetry.

  3. Pilih alur kerja ini, pilih metode penyerapan Anda, dan pilih Berikutnya.

  4. Tinjau panduan dan rekomendasi apa pun yang disediakan oleh pemecah masalah.

Langkah selanjutnya

Pelajari selengkapnya tentang OpenTelemetry dan pemantauan Azure Functions: