مشاركة عبر


استخدام OpenTelemetry مع Azure Functions

توضح هذه المقالة كيفية تكوين تطبيق الوظائف لتصدير بيانات السجل والتتبع بتنسيق OpenTelemetry. تنشئ Azure Functions بيانات تتبع الاستخدام على عمليات تنفيذ الوظائف من كل من عملية مضيف الوظائف وعملية العامل الخاصة باللغة التي يتم فيها تشغيل التعليمات البرمجية للدالة. افتراضيا، يتم إرسال بيانات التليمترية هذه إلى Application Insights باستخدام Application Insights SDK. ومع ذلك، يمكنك اختيار تصدير هذه البيانات باستخدام دلالات OpenTelemetry. بينما لا يزال بإمكانك استخدام تنسيق OpenTelemetry لإرسال بياناتك إلى Application Insights، يمكنك الآن أيضا تصدير نفس البيانات إلى أي نقطة نهاية أخرى متوافقة مع OpenTelemetry.

يمكنك الحصول على هذه الفوائد عن طريق تمكين OpenTelemetry في تطبيق الوظائف:

  • يربط البيانات عبر التتبعات والسجلات التي يتم إنشاؤها في كل من المضيف وفي التعليمات البرمجية للتطبيق الخاص بك.
  • يتيح الإنشاء المتسق المستند إلى المعايير لبيانات القياس عن بعد القابلة للتصدير.
  • يتكامل مع موفرين آخرين يمكنهم استهلاك بيانات متوافقة مع OpenTelemetry.

ضع هذه الاعتبارات في اعتبارك عند استخدام هذا المقال:

  • جرب درس OpenTelemetry، المصمم لمساعدتك على البدء بسرعة مع OpenTelemetry وAzure Functions. تستخدم هذه المقالة واجهة برمجة المطورين Azure (azd) لإنشاء ونشر تطبيق وظائف يستخدم تكامل OpenTelemetry للتتبع الموزع.

  • نظرا لأن هذه المقالة تستهدف لغة التطوير التي تختارها، تذكر اختيار اللغة الصحيحة في أعلى المقالة.

  • يتم تمكين OpenTelemetry على مستوى تطبيق الوظائف، سواء في تكوين المضيف (host.json) أو في مشروع التعليمات البرمجية. توفر الوظائف أيضا تجربة محسنة للعميل لتصدير بيانات OpenTelemetry من التعليمات البرمجية للدالة التي تعمل في عملية عامل خاصة باللغة.

تمكين OpenTelemetry في مضيف الوظائف

عند تفعيل إخراج OpenTelemetry في ملف تطبيق host.json الوظيفة، يقوم مضيفك بتصدير مخرجات OpenTelemetry بغض النظر عن مكدس اللغة المستخدم في تطبيقك.

لتمكين إخراج OpenTelemetry من مضيف الوظائف، قم بتحديث ملف host.json في مشروع التعليمات البرمجية لإضافة عنصر "telemetryMode": "OpenTelemetry" إلى مجموعة الجذر. مع تمكين OpenTelemetry، قد يبدو ملف host.json كما يلي:

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

تكوين إعدادات التطبيق

عند تفعيل OpenTelemetry في host.json الملف، تحدد متغيرات بيئة التطبيق نقاط النهاية لإرسال البيانات بناء على إعدادات التطبيقات المدعومة من OpenTelemetry المتاحة.

إنشاء إعدادات تطبيق محددة في تطبيق الوظائف استنادا إلى وجهة إخراج OpenTelemetry. عندما توفر إعدادات اتصال لكل من Application Insights ومصدر بروتوكول OpenTelemetry (OTLP)، يتم إرسال بيانات OpenTelemetry إلى كلا النقطتين.

APPLICATIONINSIGHTS_CONNECTION_STRING: سلسلة الاتصال لمساحة عمل Application Insights. عند وجود هذا الإعداد، يتم إرسال بيانات OpenTelemetry إلى مساحة العمل هذه. استخدم نفس الإعداد للاتصال ب Application Insights دون تفعيل OpenTelemetry. إذا لم يكن التطبيق الخاص بك يحتوي على هذا الإعداد بالفعل، فقد تحتاج إلى تمكين تكامل Application Insights.

JAVA_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: قم بالتعيين إلى true بحيث يسمح مضيف الوظائف لعملية عامل Java بدفق سجلات OpenTelemetry مباشرة، مما يمنع الإدخالات المكررة على مستوى المضيف.

PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY: قم بالتعيين بحيث true يسمح مضيف الوظائف لعملية عامل Python بدفق سجلات OpenTelemetry مباشرة، مما يمنع الإدخالات المكررة على مستوى المضيف.

تمكين OpenTelemetry في تطبيقك

بعد أن تقوم بتكوين مضيف الوظائف لاستخدام OpenTelemetry، قم بتحديث كود التطبيق لإخراج بيانات OpenTelemetry. عندما تفعل OpenTelemetry في كل من المضيف وكود التطبيق، تحصل على ارتباط أفضل بين الآثار والسجلات التي تصدرها عملية مضيف الدوال وعملية عامل اللغة الخاصة بك.

كيفية تجهيز تطبيقك لاستخدام OpenTelemetry تعتمد على نقطة نهاية OpenTelemetry المستهدفة:

أمثلة في هذه المقالة تفترض أن تطبيقك يستخدم IHostApplicationBuilder، وهو متوفر في الإصدار 2.x والإصدار الأحدث من Microsoft.Azure.Functions.Worker. لمزيد من المعلومات، راجع الإصدار 2.x في دليل نموذج العامل المعزول C#‎.

  1. قم بتشغيل هذه الأوامر لتثبيت التجميعات المطلوبة في تطبيقك:

    dotnet add package Microsoft.Azure.Functions.Worker.OpenTelemetry
    dotnet add package OpenTelemetry.Extensions.Hosting 
    dotnet add package Azure.Monitor.OpenTelemetry.Exporter  
    
  2. في ملف مشروع Program.cs، أضف هذه using العبارة:

    using Azure.Monitor.OpenTelemetry.Exporter; 
    
  3. قم بتكوين OpenTelemetry بناء على ما إذا كان مشروعك الناشئ يستخدم IHostBuilder أو IHostApplicationBuilder. تم تقديم الأخير في الإصدار 2.x من امتداد نموذج العمال المعزول .NET.

    في program.cs ، أضف هذا السطر من التعليمات البرمجية بعد ConfigureFunctionsWebApplication:

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

    يمكنك التصدير إلى كل من نقاط نهاية OpenTelemetry من نفس التطبيق.

  1. أضف المكتبات المطلوبة إلى تطبيقك. تعتمد طريقة إضافة المكتبات على ما إذا كنت تقوم بالنشر باستخدام Maven أو Kotlin وما إذا كنت تريد أيضا إرسال البيانات إلى 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. (اختياري) أضف هذا الكود لإنشاء امتدادات مخصصة:

    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. تثبيت حزم 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. قم بتحديث main الحقل في ملفك package.json ليشمل الملف الجديد 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. قم بتحديث الحقل في main ملف package.json لتضمين إخراج هذا الملف الجديد src/index.ts ، والذي قد يبدو كما يلي:

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

هام

إخراج OpenTelemetry إلى Application Insights من عامل اللغة غير مدعوم حاليا لتطبيقات PowerShell. قد تحتاج بدلا من ذلك إلى استخدام نقطة نهاية مصدر OTLP. عندما تقوم بتكوين مضيفك لإخراج OpenTelemetry إلى Application Insights، لا تزال السجلات التي تولدها عملية PowerShell Worker ترسل للحين، لكن التتبع الموزع غير مدعوم في الوقت الحالي.

تنطبق هذه التعليمات فقط على مصدر OTLP:

  1. أضف إعداد تطبيق باسم OTEL_FUNCTIONS_WORKER_ENABLED بقيمة True.

  2. Modules على مستوى التطبيق في جذر التطبيق وتشغيل الأمر التالي:

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

    هذا الأمر يثبت الوحدة المطلوبة AzureFunctions.PowerShell.OpenTelemetry.SDK مباشرة في تطبيقك. لا يمكنك استخدام الملف لتثبيت هذه التبعية requirements.psd1 تلقائيا لأن التبعيات المدارة غير مدعومة حاليا في معاينة خطة Flex Consumption.

  3. أضف هذه التعليمة البرمجية إلى ملف profile.ps1 الخاص بك:

    Import-Module AzureFunctions.PowerShell.OpenTelemetry.SDK -Force -ErrorAction Stop 
    Initialize-FunctionsOpenTelemetry 
    
  1. تأكد من وجود هذه المكتبات في ملفك requirements.txt ، سواء من إلغاء التعليق أو إضافة نفسك:

    azure-monitor-opentelemetry
    
  2. أضف هذه التعليمة البرمجية إلى function_app.py ملف نقطة الإدخال الرئيسي:

    إذا قمت بالفعل بإضافة PYTHON_APPLICATIONINSIGHTS_ENABLE_TELEMETRY=true إعدادات التطبيق الخاصة بك ، فيمكنك تخطي هذه الخطوة. لتمكين مجموعة Application Insights يدويا بدون الأجهزة التلقائية، أضف هذه التعليمات البرمجية إلى تطبيقك:

    from azure.monitor.opentelemetry import configure_azure_monitor 
    configure_azure_monitor() 
    
  3. راجع وثائق استخدام توزيعة مراقبة Azure للحصول على خيارات حول كيفية تكوين SDK بشكل أكبر.

اعتبارات القياس المفتوح

عند تصدير بياناتك باستخدام OpenTelemetry، ضع هذه الاعتبارات في اعتبارك.

  • يدعم Recent function invocation بوابة Azure التتبع فقط إذا تم إرسال التليمترية إلى Azure Monitor.

  • عندما تقوم بتكوين المضيف لاستخدام OpenTelemetry، فإن بوابة Azure لا تدعم بث السجلات.

  • إذا ضبطت telemetryMode على OpenTelemetry، فإن التكوين في logging.applicationInsights قسم host.json لا ينطبق.

  • تتضمن الامتدادات المخصصة تلقائيا جميع سمات الموارد وتستخدم المصدرين الذين تم تكوينهم في تطبيقك.

  • عندما يتم تشغيل تطبيقك خارج Azure، بما في ذلك أثناء التطوير المحلي، يقوم كاشف الموارد بتعيين السمة service.name إلى java-function-app افتراضيا.

  • استخدم علامات Java Virtual Machine (JVM) هذه لكتم بيانات تتبع الاستخدام عند التشغيل محليا أثناء اختبارات الوحدة:

    • -Dotel.traces.exporter=none
    • -Dotel.metrics.exporter=none
    • -Dotel.logs.exporter=none
  • لا تحتاج إلى تسجيل الوسيط يدويا؛ عامل جافا يكتشف OpenTelemetryInvocationMiddlewareتلقائيا .

Troubleshooting

عند تصدير بياناتك باستخدام OpenTelemetry، ضع هذه القضايا والحلول الشائعة في اعتبارك.

تصفية السجل

لتكوين تصفية السجلات بشكل صحيح في تطبيق الوظائف الخاص بك، تحتاج إلى فهم الفرق بين عملية المضيف وعملية العامل.

عملية المضيف هي وقت تشغيل Azure Functions الذي يدير المشغلات وتوسيع الحجم ويصدر بيانات تتبع الاستخدام على مستوى النظام مثل سجلات التهيئة وتتبع الطلبات ومعلومات سلامة وقت التشغيل.

عملية العامل خاصة باللغة، وتنفذ التعليمات البرمجية للوظيفة، وتنتج سجلات التطبيق والقياس عن بعد بشكل مستقل.

هام

تنطبق عوامل التصفية المحددة في host.json فقط على السجلات التي تم إنشاؤها بواسطة عملية المضيف. يجب عليك استخدام إعدادات OpenTelemetry الخاصة باللغة لتصفية السجلات من عملية العامل.

مثال: تصفية سجلات المضيف لجميع الموفرين في host.json

استخدم هذا الأسلوب لتعيين مستوى سجل عام عبر جميع الموفرين الذين يديرهم المضيف:

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

مثال: تصفية السجلات فقط لموفر مسجل OpenTelemetry

استخدم هذا الأسلوب لاستهداف موفر مسجل OpenTelemetry فقط مع ترك موفري الخدمة الآخرين (مثل وحدة التحكم أو تسجيل الملفات) غير متأثرين:

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

تسجيل وحدة التحكم

يلتقط مضيف الوظائف تلقائيا أي شيء مكتوب إلى stdout أو stderr ويعيد توجيهه إلى مسار القياس عن بعد. إذا كنت تستخدم أيضا ConsoleExporter أو تكتب مباشرة إلى وحدة التحكم في التعليمات البرمجية الخاصة بك، فقد تحدث سجلات مكررة في بيانات بيانات تتبع الاستخدام الخاصة بك.

‏‫ملاحظة‬

لتجنب تكرار مدخلات التليمترية، لا تضيف ConsoleExporter أو تكتب إلى الكونسول في كود الإنتاج.

مصادقة Microsoft Entra

عند استخدام مصادقة Microsoft Entra مع OpenTelemetry، يجب عليك تكوين المصادقة بشكل منفصل لكل من العملية المضيفة وعملية العامل.

لتكوين المصادقة لعملية المضيف، راجع طلب مصادقة Microsoft Entra.

لتكوين المصادقة لعملية العامل، راجع تمكين مصادقة Microsoft Entra.

دعم سمات الموارد

دعم سمات الموارد في Azure Monitor قيد المعاينة حاليا. لتمكين هذه الميزة، قم بتعيين OTEL_DOTNET_AZURE_MONITOR_ENABLE_RESOURCE_METRICS متغير البيئة إلى true. يستوعب هذا الإعداد سمات الموارد في جدول المقاييس المخصصة.

بيانات تتبع الاستخدام للطلب المكرر

تصدر عملية المضيف تلقائيا بيانات تتبع الاستخدام للطلب. إذا تم تجهيز عملية العامل أيضا بمكتبات تعقب الطلبات (على سبيل المثال، AspNetCoreInstrumentation في .NET)، يتم الإبلاغ عن نفس الطلب مرتين.

‏‫ملاحظة‬

نظرا لأن Azure Monitor Distroze تتضمن عادة AspNetCoreInstrumentation في .NET وأجهزة مماثلة بلغات أخرى، تجنب استخدام توزيعة Azure Monitor في عملية العامل لمنع بيانات تتبع الاستخدام المكررة.

نطاقات التسجيل غير مضمنة

بشكل افتراضي، لا تتضمن عملية العامل نطاقات في سجلاتها. لتمكين النطاقات، يجب تكوين هذا الإعداد بشكل صريح في العامل. يوضح المثال التالي كيفية تمكين النطاقات في .NET Isolated:

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

بيانات تتبع الاستخدام للطلب مفقودة

تعتمد المشغلات مثل HTTP وناقل خدمة Microsoft Azure وEvent Hubs على نشر السياق للتتبع الموزع. مع أخذ العينات المستندة إلى الأصل كسلوك افتراضي، لا يتم إنشاء بيانات تتبع الاستخدام للطلب عندما لا يتم أخذ عينات من الطلب أو الرسالة الواردة.

معرف التشغيل المكرر

في Azure Functions، يأتي القياس OperationId المرتبط مباشرة من traceparent القيمة الموجودة في الطلب أو الرسالة الواردة. إذا أعادت عدة مكالمات استخدام نفس traceparent القيمة، تحصل جميعها على نفس OperationIdالقيمة .

تكوين OpenTelemetry مع متغيرات البيئة

يمكنك تكوين سلوك OpenTelemetry باستخدام متغيرات البيئة القياسية الخاصة به. توفر هذه المتغيرات طريقة متسقة للتحكم في السلوك عبر لغات وأوقات تشغيل مختلفة. يمكنك تعديل استراتيجيات العينة، إعدادات المصدر، وخصائص الموارد. لمزيد من المعلومات حول متغيرات البيئة المدعومة، راجع وثائق OpenTelemetry.

استخدام التشخيصات لاستكشاف مشكلات المراقبة وإصلاحها

تعد تشخيصات Azure Functions في مدخل Microsoft Azure موردا مفيدا للكشف عن المشكلات المحتملة المتعلقة بالرصد وتشخيصها.

للوصول إلى التشخيصات في تطبيقك:

  1. في بوابة Azure، اذهب إلى مورد تطبيق الوظائف الخاص بك.

  2. في الجزء الأيمن، حدد تشخيص المشكلات وحلها وابحث عن سير عمل Application Insights أو OpenTelemetry المفقود لبيانات تتبع الاستخدام.

  3. حدد سير العمل هذا، واختر أسلوب الاستيعاب، وحدد التالي.

  4. راجع الإرشادات وأي توصيات يقدمها مستكشف الأخطاء ومصلحها.

الخطوات التالية

تعرف أكثر على OpenTelemetry ومراقبة وظائف Azure: