إشعار
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
توفر Durable Functions عدة أدوات تشخيصية لحل المشكلات في التنسيقات. تغطي هذه المقالة كيفية تكوين التتبع والتسجيل، وكتابة كود آمن لإعادة التشغيل، وفحص الآثار الموزعة، وتصحيح الأخطاء محليا.
في هذه المقالة، ستتعرف على كيفية:
- تكوين تتبع رؤى التطبيقات لأحداث دورة الحياة
- استعلام مثيلات التنسيق باستخدام Kusto
- تمكين تسجيل إطار المهام الدائم (DTFx) للتشخيصات منخفضة المستوى
- قم بإعداد تتبع موزع لتصور تدفقات التوزيع من طرف إلى طرف
- كتابة سجلات آمنة لإعادة التشغيل في وظائف الأوركستراتور
- أبلغ عن حالة التنسيق المخصص للعملاء الخارجيين
- تصحيح الأخطاء التنسيقية محليا باستخدام نقاط التوقف
تكوين تتبع رؤى التطبيقات
Application Insights هو الطريقة الموصى بها لمراقبة الوظائف المتينة. يصدر امتداد Durable أحداث تتبع تتيح لك تتبع التنفيذ الكامل للتوزيع الأوركسترالي. يمكنك العثور على هذه الأحداث والاستعلام عنها باستخدام أداة Application Insights Analytics في بوابة Azure.
تكوين مستوى السجل
قم بتكوين حجم بيانات تتبع البيانات المرسلة إلى Application Insights في ملف host.json الخاص بك:
{
"logging": {
"logLevel": {
"Host.Triggers.DurableTask": "Information",
},
}
}
بشكل افتراضي، يتم إصدار كافة أحداث تعقب غير مرتبطة بإعادة التشغيل. يمكنك تقليل حجم البيانات عن طريق ضبط Host.Triggers.DurableTask أو "Warning""Error"، مما يعني أن أحداث التتبع تصدر فقط في الحالات الاستثنائية. لتمكين إصدار أحداث إعادة التشغيل التنسيقية المفصلة، قم بضبطها logReplayEvents في true ملف التكوينhost.json .
ملحوظة
بشكل افتراضي، يقوم Azure Functions بأخذ عينات من بيانات Application Insights لتجنب إرسال البيانات بشكل متكرر. يمكن أن يتسبب أخذ العينات في فقدان معلومات التعقب عند حدوث العديد من أحداث دورة الحياة في فترة زمنية قصيرة. تشرح مقالة Azure Functions Monitoring كيفية تكوين هذا السلوك.
تسجيل الإدخال والإخراج
افتراضيا، لا يتم تسجيل مدخلات ومخرجات المنسق، والنشاط، ووظائف الكيان. يوصى بهذا النهج لأن تسجيل المدخلات والمخرجات قد يزيد من تكاليف Application Insights بشكل كبير. قد تحتوي حمولات مدخلات ومخرجات الوظيفة أيضاً على معلومات حساسة. بدلا من ذلك، يتم تسجيل عدد البايتات الخاصة بمدخلات ومخرجات الدوال. إذا كنت تريد من الامتداد Durable Functions تسجيل حمولة الإدخال والإخراج بالكامل، قم بتعيين خاصية traceInputsAndOutputs على true في ملف التكوين host.json.
استعلام حالات التوزيع الموسيقي
استخدم استعلامات Kusto التالية في Application Insights Analytics لفحص مثيلات التنسيق.
الاستعلام عن مثيل واحد
يظهر الاستعلام التالي بيانات التعقب التاريخية لمثيل واحد لتنسيق وظيفة تسلسل الترحيب. يقوم بتصفية تنفيذ إعادة التشغيل بحيث يتم عرض مسار التنفيذ المنطقي فقط. يمكنك ترتيب الأحداث حسب timestamp وكما sequenceNumber هو موضح في الاستعلام التالي:
let targetInstanceId = "ddd1aaa685034059b545eb004b15d4eb";
let start = datetime(2018-03-25T09:20:00);
traces
| where timestamp > start and timestamp < start + 30m
| where customDimensions.Category == "Host.Triggers.DurableTask"
| extend functionName = customDimensions["prop__functionName"]
| extend instanceId = customDimensions["prop__instanceId"]
| extend state = customDimensions["prop__state"]
| extend isReplay = tobool(tolower(customDimensions["prop__isReplay"]))
| extend sequenceNumber = tolong(customDimensions["prop__sequenceNumber"])
| where isReplay != true
| where instanceId == targetInstanceId
| sort by timestamp asc, sequenceNumber asc
| project timestamp, functionName, state, instanceId, sequenceNumber, appName = cloud_RoleName
والنتيجة هي قائمة من أحداث التعقب التي توضح مسار تنفيذ التنسيق، بما في ذلك أي وظائف نشاط تم ترتيبها بواسطة وقت التنفيذ بترتيب تصاعدي.
الاستعلام عن ملخص المثيل
يعرض الاستعلام التالي حالة كافة مثيلات التنسيق التي تم تشغيلها في نطاق زمني محدد.
let start = datetime(2017-09-30T04:30:00);
traces
| where timestamp > start and timestamp < start + 1h
| where customDimensions.Category == "Host.Triggers.DurableTask"
| extend functionName = tostring(customDimensions["prop__functionName"])
| extend instanceId = tostring(customDimensions["prop__instanceId"])
| extend state = tostring(customDimensions["prop__state"])
| extend isReplay = tobool(tolower(customDimensions["prop__isReplay"]))
| extend output = tostring(customDimensions["prop__output"])
| where isReplay != true
| summarize arg_max(timestamp, *) by instanceId
| project timestamp, instanceId, functionName, state, output, appName = cloud_RoleName
| order by timestamp asc
النتيجة هي قائمة معرفات المثيل وحالة وقت التشغيل الحالي.
مرجع بيانات التتبع
كل نسخة أوركسترامية تولد أحداث تتبع أثناء تقدمها في دورة حياتها. يحتوي كل حدث دورة حياة على حمولة مخصصة للأبعاد مع عدة حقول. يتم إلحاق أسماء الحقول كلها بـ prop__.
| اسم الحقل | الوصف |
|---|---|
hubName |
اسم مركز المهام الذي تعمل فيه التنسيقات الموسيقية الخاصة بك. |
appName |
اسم تطبيق الوظيفة. يفيد هذا الحقل عندما يكون لديك تطبيقات وظائف متعددة تشارك نفس مثيل Application Insights. |
slotName |
فتحة النشر التي يعمل فيها تطبيق الوظائف الحالي. يفيد هذا الحقل عند استخدام فتحات التوزيع لإصدار التنسيقات الخاصة بك. |
functionName |
اسم المنسق أو وظيفة النشاط. |
functionType |
نوع الوظيفة، مثل Orchestrator أو Activity. |
instanceId |
المعرف الفريد لمثيل التوزيع الأوركسترالي. |
state |
حالة تنفيذ دورة الحياة للمثيل. |
state.Scheduled |
تم جدولة الوظيفة للتنفيذ لكنها لم تبدأ العمل بعد. |
state.Started |
بدأت الوظيفة تعمل لكنها لم تنتظر أو تكتمل بعد. |
state.Awaited |
قام الموزع بجدولة بعض الأعمال وينتظر انتهائها. |
state.Listening |
يقوم المنسق بالاستماع لإشعار حدث خارجي. |
state.Completed |
تم تنفيذ الوظيفة بنجاح. |
state.Failed |
فشلت الدالة بسبب خطأ. |
reason |
بيانات إضافية مرتبطة بحدث التتبع. على سبيل المثال، إذا كان المثيل ينتظر إشعار حدث خارجي، فإن هذا الحقل يشير إلى اسم الحدث الذي ينتظره. إذا فشلت دالة، يحتوي هذا الحقل على تفاصيل الخطأ. |
isReplay |
القيمة المنطقية تشير إلى ما إذا كان حدث التتبع مخصصا لإعادة التنفيذ. |
extensionVersion |
نسخة من امتداد المهمة الدائمة. معلومات الإصدار هي بيانات هامة بشكل خاص عند الإبلاغ عن الأخطاء المحتملة في الملحق. قد تبلغ النسخات طويلة الأمد عن عدة إصدارات إذا حدث تحديث أثناء تشغيل الحالة. |
sequenceNumber |
رقم تسلسل التنفيذ لحدث. مع الطابع الزمني، يساعد ذلك في ترتيب الأحداث حسب وقت التنفيذ. لاحظ أن هذا الرقم يعيد التعيين إلى الصفر إذا تمت إعادة تشغيل المضيف أثناء تشغيل المثيل، لذلك من المهم دائما الفرز حسب الطابع الزمني أولا، ثم sequenceNumber. |
تسجيل إطار المهام الدائم (DTFx)
سجلات ملحق Durable مفيدة لفهم سلوك منطق التنسيق الخاص بك. ومع ذلك، لا تحتوي هذه السجلات دائماً على معلومات كافية لتتبع أخطاء مشكلات الأداء والموثوقية على مستوى إطار العمل. بدءاً من v2.3.0 لملحق Durable، السجلات التي تم إصدارها بواسطة Durable Task Framework الأساسي متوفرة أيضاً للمجموعة.
عند النظر إلى السجلات المنبعثة من DTFx، من المهم أن نفهم أن محرك DTFx يتكون من مكونين: محرك الإرسال الأساسي (DurableTask.Core) وواحد من العديد من مزودي التخزين المدعومين.
| المكون | الوصف |
|---|---|
DurableTask.Core |
تنفيذ التوزيع الأساسي وسجلات الجدولة منخفضة المستوى والقياس عن بعد. |
DurableTask.DurableTaskScheduler |
سجلات الخلفية الخاصة ببرنامج جدولة المهام الدائم. |
DurableTask.AzureStorage |
سجلات Backend الخاصة ب Azure Storage State provider. تتضمن هذه السجلات تفاعلات مفصلة مع قوائم الانتظار الداخلية والكائنات الثنائية كبيرة الحجم وجداول التخزين المستخدمة لتخزين حالة التنسيق الداخلية وجلبها. |
DurableTask.Netherite |
سجلات الخلفية الخاصة بمزود تخزين Netherite، إذا كانت مفعلة. |
DurableTask.SqlServer |
سجلات الواجهة الخلفية الخاصة بمزود تخزين Microsoft SQL (MSSQL)، إذا كانت مفعلة. |
يمكنك تمكين هذه السجلات عن طريق تحديث القسم logging/logLevel لملف تطبيق الوظائف الخاص بك host.json. يوضح المثال التالي كيفية تمكين سجلات التحذير والخطأ من كل من DurableTask.Core وDurableTask.AzureStorage:
{
"version": "2.0",
"logging": {
"logLevel": {
"DurableTask.AzureStorage": "Warning",
"DurableTask.Core": "Warning"
}
}
}
إذا كان لديك Application Insights ممكن، تتم إضافة هذه السجلات تلقائيا إلى trace المجموعة. يمكنك البحث فيها بنفس الطريقة التي تبحث بها عن سجلات أخرى trace باستخدام استفسارات Kusto.
ملحوظة
بالنسبة لتطبيقات الإنتاج، نوصي بتفعيل DurableTask.Core وتمكين مزود التخزين المناسب (على سبيل المثال) DurableTask.AzureStorageمن السجلات باستخدام الفلتر "Warning" . تعد عوامل تصفية الإسهاب الأعلى مثل "Information" مفيدة لتصحيح مشكلات الأداء. ومع ذلك، يمكن أن تكون أحداث السجل هذه ذات حجم كبير ويمكن أن تزيد بشكل ملحوظ من تكاليف تخزين البيانات لـ Application Insights.
يظهر الاستعلام Kusto التالي كيفية الاستعلام عن سجلات DTFx. الجزء الأهم في الاستعلام هو where customerDimensions.Category startswith "DurableTask" أنه يقوم بتصفية النتائج إلى سجلات في DurableTask.Core الفئات و DurableTask.AzureStorage .
traces
| where customDimensions.Category startswith "DurableTask"
| project
timestamp,
severityLevel,
Category = customDimensions.Category,
EventId = customDimensions.EventId,
message,
customDimensions
| order by timestamp asc
والنتيجة هي مجموعة من السجلات التي كتبها موفري سجل Durable Task Framework.
لمزيد من المعلومات حول أحداث السجلات المتاحة، راجع وثائق السجلات المنظمة لإطار العمل Durable Task Framework على GitHub.
التتبع الموزع
يتتبع التتبع الموزع الطلبات ويظهر كيف تتفاعل الخدمات المختلفة مع بعضها البعض. في Durable Functions، يربط التنسيق التنظيمي والكيانات والأنشطة معا. يظهر التتبع الموزع وقت التنفيذ لكل خطوة توزيع مقارنة بالتوزيع الموسيقي بأكمله ويحدد أماكن حدوث المشكلات أو الاستثناءات. هذه الميزة مدعومة في Application Insights لجميع اللغات وموفري التخزين.
المتطلبات المسبقه
يتطلب التتبع الموزع إصدارات تمديد حدية محددة:
- بالنسبة لتطبيقات .NET المعزولة، Microsoft.Azure.Functions.Worker.Extensions.DurableTask>= v1.4.0.
- بالنسبة للتطبيقات غير .NET، اتبع هذه التعليمات لتثبيت Microsoft.Azure يدويا. WebJobs.Extensions.DurableTask>= v3.2.0 في الوقت الحالي. سيكون التتبع الموزع متاحا في حزم التمديد >v4.24.x.
إعداد التتبع الموزع
لتكوين التتبع الموزع، قم بتحديث وإعداد host.json مورد Application Insights وأعده.
host.json
{
"extensions": {
"durableTask": {
"tracing": {
"distributedTracingEnabled": true,
"version": "V2"
}
}
}
}
Application Insights
قم بتكوين تطبيق الوظيفة الخاص بك باستخدام مورد Application Insights الخاص بك.
فحص التتبعات
في مورد Application Insights الخاص بك، انتقل إلى البحث عن المعاملات. في النتائج، ابحث عن RequestDependency أحداث تبدأ ببادئات خاصة ب Durable (مثل orchestration:، ، activity:، إلخ). اختيار أحد هذه الأحداث يفتح مخطط غانت الذي يوضح التتبع الموزع من طرف إلى طرف. يعرض المخطط كل خطوة توزيع كشريط أفقي، مع استدعاءات النشاط والتوزيع الفرعي تحت التوزيع الأصلي. طول القضيب يمثل مدة كل خطوة على طول ساعة الحائط، مما يسهل اكتشاف عنق الزجاجة أو الأنشطة البطيئة بشكل غير متوقع.
ملحوظة
هل لا ترى آثارك في Application Insight؟ انتظر حوالي خمس دقائق بعد تشغيل التطبيق لضمان انتقال جميع البيانات إلى مورد Application Insights الخاص بها.
تسجيل الدخول الآمن لإعادة التشغيل في وظائف الأوركستراتور
تعيد وظائف المنسق التشغيل في كل مرة يتم فيها استقبال إدخال جديد، مما يعني أن أي عبارة سجل في الأوركستراتور تعمل عدة مرات لتنفيذ منطقي واحد. على سبيل المثال، دالة بها ثلاث استدعاءات نشاط تنتج مخرجات لوغاريتمية مثل هذه أثناء إعادة التشغيل:
Calling F1.
Calling F1.
Calling F2.
Calling F1.
Calling F2.
Calling F3.
Calling F1.
Calling F2.
Calling F3.
Done!
لمنع تكرار خطوط السجل، تحقق من علامة "يعيد التشغيل" بحيث يتم تنفيذ السجلات فقط في أول تمريرة (غير إعادة تشغيل). تظهر الأمثلة التالية تسجيل تسجيل آمن لإعادة التشغيل في كل لغة.
بدءا من Durable Functions 2.0، استخدم CreateReplaySafeLogger تصفية عبارات السجل تلقائيا أثناء إعادة التشغيل:
[FunctionName("FunctionChain")]
public static async Task Run(
[OrchestrationTrigger] IDurableOrchestrationContext context,
ILogger log)
{
log = context.CreateReplaySafeLogger(log);
log.LogInformation("Calling F1.");
await context.CallActivityAsync("F1");
log.LogInformation("Calling F2.");
await context.CallActivityAsync("F2");
log.LogInformation("Calling F3");
await context.CallActivityAsync("F3");
log.LogInformation("Done!");
}
مع التسجيل الآمن لإعادة التشغيل، يكون مخرج السجل كما يلي:
Calling F1.
Calling F2.
Calling F3.
Done!
حالة التوزيع الموسيقي المخصص
استخدم حالة التنسيق المخصص للإبلاغ عن تقدم سير العمل إلى العملاء الخارجيين. تشمل الأنماط الشائعة نسب الإنجاز، ووصف الخطوات، وملخصات الأخطاء. يمكن للعملاء الخارجيين عرض الحالة المخصصة عبر واجهة HTTP الخاصة باستعلام الحالة أو استدعاءات API الخاصة باللغة.
يوضح الكود التالي كيفية تعيين قيمة حالة مخصصة في دالة الأوركستراتور:
[FunctionName("SetStatusTest")]
public static async Task SetStatusTest([OrchestrationTrigger] IDurableOrchestrationContext context)
{
// ...do work...
// update the status of the orchestration with some arbitrary data
var customStatus = new { completionPercentage = 90.0, status = "Updating database records" };
context.SetCustomStatus(customStatus);
// ...do more work...
}
ملحوظة
المثال السابق ل C# هو ل Durable Functions 2.x. بالنسبة ل Durable Functions 1.x، يجب استخدام DurableOrchestrationContext بدلا من IDurableOrchestrationContext. لمزيد من المعلومات حول الفروقات بين الإصدارات، راجع مقال Durable Functions versions.
في أثناء تشغيل التنسيق، يمكن للعملاء الخارجيين إحضار هذه الحالة المخصصة:
GET /runtime/webhooks/durabletask/instances/instance123?code=XYZ
يحصل العملاء على الاستجابة التالية:
{
"runtimeStatus": "Running",
"input": null,
"customStatus": { "completionPercentage": 90.0, "status": "Updating database records" },
"output": null,
"createdTime": "2017-10-06T18:30:24Z",
"lastUpdatedTime": "2017-10-06T19:40:30Z"
}
التحذير
حمولة الحالة المخصصة محدودة ب 16 كيلوبايت من نص JSON UTF-16 لأنها تحتاج إلى استيعاب عمود Azure Table Storage. يمكنك استخدام التخزين الخارجي إذا كنت بحاجة إلى حمولة أكبر.
Debugging
يدعم Azure Functions تصحيح كود الوظائف بشكل مباشر، وينطبق نفس الدعم على Durable Functions، سواء كان يعمل في Azure أو محليا. استخدم سير العمل التالي للحصول على أفضل تجربة تصحيح أخطاء:
ابدأ جلسة تصحيح جديدة بمركز مهام جديد أو قم بمسح محتويات مركز المهام بين الجلسات. الرسائل المتبقية من التشغيلات السابقة قد تسبب إعادة تنفيذ غير متوقعة.
حدد نقاط توقف في وظائف التنسيق أو النشاط الخاص بك. بالنسبة لوظائف الموزع، استخدم نقطة توقف مشروطة تنقطع فقط عندما تكون قيمة "يعيد التشغيل" لتجنب
falseضرب نفس نقطة التوقف عدة مرات أثناء إعادة التشغيل.اشرح كودك كالمعتاد. ضع في اعتبارك السلوكيات التالية:
الإعادة:
يعمل الأوركستراتور بإعادة التشغيل بانتظام عند استقبال مدخلات جديدة. تنفيذ منطقي واحد لدالة التنسيق يمكن أن يؤدي إلى الوصول إلى نفس نقطة التوقف عدة مرات، خاصة إذا تم ضبطها مبكرا في كود الدالة.انتظر:
عندما يتم العثور على وظيفةawaitمنسق، يعيد التحكم إلى مرسل إطار المهام الدائم. إذا كانت هذه هي المرة الأولى التي يتم فيها مواجهة مهمة معينةawait، فلا يتم استئناف المهمة المرتبطة بها أبدا . وبما أن المهمة لا تستأنف أبدا، فإن الانتقال over الانتظار (F10 في Visual Studio) غير ممكن. إن تخطي الانتظار يعمل فقط عند إعادة تشغيل مهمة.مهلة الرسائل الفاصلة:
تستخدم Durable Functions داخليا رسائل الطابور لدفع تنفيذ وظائف المنسق والنشاط والكيان. في بيئة متعددة الأجهزة الافتراضية، قد تؤدي جلسات التصحيح الممتدة إلى معالجة رسالة جهاز افتراضي آخر، مما يؤدي إلى تنفيذ متكرر. على الرغم من أن هذا السلوك موجود أيضا في دوال التوليد العادية لتشغيل الطابور، إلا أن هذا السياق مهم لتسليط الضوء عليه لأن الطوابير هي تفصيل تنفيذي.التوقف والبدء:
تستمر الرسائل في الوظائف المتمولة بين جلسات التصحيح. إذا توقفت عن تصحيح الأخطاء وأنهيت عملية المضيف المحلي أثناء تنفيذ دالة دائمة، فقد تعيد تنفيذ تلك الدالة تلقائيا في جلسة تصحيح مستقبلية.
أدوات إضافية
فحص حالة التخزين
بشكل افتراضي، يخزن Durable Functions الحالة في Azure Storage. يمكنك فحص حالة التنسيق والرسائل باستخدام أدوات مثل Microsoft Azure Storage Explorer.
التحذير
في حين أنه من المريح رؤية سجل التنفيذ في موقع تخزين الجدول، تجنب اتخاذ أي تبعية على هذا الجدول. قد يتغير مع تطور امتداد Durable Functions.
ملحوظة
يمكنك تكوين مزودي تخزين آخرين بدلا من مزود Azure Storage الافتراضي. اعتمادا على مزود التخزين الذي تم تعيينه لتطبيقك، قد تحتاج إلى استخدام أدوات مختلفة لفحص الحالة الأساسية.
مراقب الوظائف المتينة
Durable Functions Monitor هو أداة رسومية لمراقبة وإدارة وتصحيح الأخطاء في التنسيق وحالات الكيانات. يتوفر كإضافة Visual Studio Code أو كتطبيق مستقل. للحصول على تعليمات الإعداد وقائمة الميزات، راجع Durable Functions Monitor Wiki.
تشخيصات Azure portal
توفر بوابة Azure أدوات تشخيص مدمجة لتطبيقات الوظائف الخاصة بك.
تشخيص وحل المشكلات: تشخيصات تطبيقات Azure Function هي مورد مفيد لمراقبة وتشخيص المشكلات المحتملة في تطبيقك. كما يوفر اقتراحات للمساعدة في حل المشكلات بناء على التشخيص. لمزيد من المعلومات، راجع Azure تشخيصات تطبيقات الوظائف.
مسارات التوزيع الأوركسترالي: توفر بوابة Azure تفاصيل تتبع التنسيق لمساعدتك على فهم حالة كل حالة تنسيق وتتبع التنفيذ من الطرف إلى النهاية. عندما تعرض قائمة الوظائف داخل تطبيق Azure Functions الخاص بك، ترى عمودا Monitor يحتوي على روابط إلى المسارات. تحتاج إلى تفعيل Application Insights لتطبيقك للوصول إلى هذه المعلومات.
محلل Roslyn
محلل روزلين Durable Functions هو محلل شيفرة حي يوجه مطوري C# لاتباع Durable Functions القيود المحددة code . للحصول على تعليمات حول كيفية تفعيله في Visual Studio و Visual Studio Code، راجع Durable Functions Roslyn Analyzer.
استكشاف الأخطاء وإصلاحها
لحل المشكلات الشائعة مثل تعثر الآلات الموسيقية، أو عدم تشغيلها، أو التشغيل البطيء، راجع دليل استكشاف الأخطاء Durable Functions.