مراقبة وتشخيص معالجة الطلبات باستخدام الوكيل العكسي

بدءا من الإصدار 5.7 من "تصميم الخدمة"، تتوفر أحداث الوكيل العكسي للجمع. تتوفر الأحداث في قناتين، واحدة مع أحداث الخطأ فقط المتعلقة بفشل معالجة الطلب في الوكيل العكسي والقناة الثانية التي تحتوي على أحداث مطولة مع إدخالات لكل من الطلبات الناجحة والفاشلة.

بالرجوع إلى تجميع أحداث الوكيل العكسي لتمكين تجميع الأحداث من هذه القنوات في مجموعات Azure Service Fabric المحلية.

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

فيما يلي بعض الأمثلة المتعلقة بكيفية تفسير سجلات الفشل الشائعة التي يمكن للمرء أن يواجهها:

  1. يقوم الوكيل العكسي بإرجاع رمز حالة الاستجابة 504 (المهلة).

    قد يرجع أحد الأسباب إلى عدم رد الخدمة خلال فترة مهلة الطلب. يقوم الحدث الأول أدناه بتسجيل تفاصيل الطلب المستلم في الوكيل العكسي. يوضح الحدث الثاني إلى فشل الطلب أثناء إعادة التوجيه إلى الخدمة، بسبب "خطأ داخلي = ERROR_WINHTTP_TIMEOUT"

    وتشمل الحمولة ما يلي:

    • traceId: يمكن استخدام المعرف الفريد العمومي هذا لربط جميع الأحداث المماثلة لطلب واحد. في الحدثين أدناه ، فإن traceId = 2f87b722-e254-4ac2-a802-fd315c1a0271، مما يوضح أنها تنتمي إلى نفس الطلب.

    • requestUrl: عنوان URL (عنوان URL الخاص بـ الوكيل العكسي) الذي تم إرسال الطلب إليه.

    • الفعل: HTTP الفعل.

    • العنوان البعيد: عنوان العميل الذي يرسل الطلب.

    • solveServiceUrl: عنوان URL الخاص بنقطة تقديم الخدمة الذي تم حل الطلب الوارد بها.

    • errorDetails: معلومات إضافية حول الفشل.

      {
      "Timestamp": "2017-07-20T15:57:59.9871163-07:00",
      "ProviderName": "Microsoft-ServiceFabric",
      "Id": 51477,
      "Message": "2f87b722-e254-4ac2-a802-fd315c1a0271 Request url = https://localhost:19081/LocationApp/LocationFEService?zipcode=98052, verb = GET, remote (client) address = ::1, resolved service url = Https://localhost:8491/LocationApp/?zipcode=98052, request processing start time =     15:58:00.074114 (745,608.196 MSec) ",
      "ProcessId": 57696,
      "Level": "Informational",
      "Keywords": "0x1000000000000021",
      "EventName": "ReverseProxy",
      "ActivityID": null,
      "RelatedActivityID": null,
      "Payload": {
      "traceId": "2f87b722-e254-4ac2-a802-fd315c1a0271",
      "requestUrl": "https://localhost:19081/LocationApp/LocationFEService?zipcode=98052",
      "verb": "GET",
      "remoteAddress": "::1",
      "resolvedServiceUrl": "Https://localhost:8491/LocationApp/?zipcode=98052",
      "requestStartTime": "2017-07-20T15:58:00.0741142-07:00"
      }
      }
      
      {
      "Timestamp": "2017-07-20T16:00:01.3173605-07:00",
      ...
      "Message": "2f87b722-e254-4ac2-a802-fd315c1a0271 Error while forwarding request to service: response status code = 504, description = Reverse proxy Timeout, phase = FinishSendRequest, internal error = ERROR_WINHTTP_TIMEOUT ",
      ...
      "Payload": {
      "traceId": "2f87b722-e254-4ac2-a802-fd315c1a0271",
      "statusCode": 504,
      "description": "Reverse Proxy Timeout",
      "sendRequestPhase": "FinishSendRequest",
      "errorDetails": "internal error = ERROR_WINHTTP_TIMEOUT"
      }
      }
      
  2. يعمل الوكيل العكسي على إرجاع تعليمة برمجية الخاصة بحالة الاستجابة 404 (غير موجود).

    فيما يلي مثال على حدث حيث يقوم الوكيل العكسي بإرجاع 404 نظرا لأنه فشل في العثور على نقطة تقديم الخدمة المطابقة. فيما يلي إدخالات البيانات الأساسية التي تهمك:

    • processRequestPhase: يشير إلى المرحلة أثناء معالجة الطلب عند حدوث الفشل ، TryGetEndpoint أي أثناء محاولة الحصول على نقطة تقديم الخدمة لإعادة توجيهها.

    • errorDetails: قوائم معايير البحث في نقطة النهاية. هنا يمكنك أن ترى أن اسم المستمع المحدد = FrontEndListener بينما تحتوي قائمة نقطة النهاية المماثلة فقط على مستمع يحمل الاسم OldListener .

      {
      ...
      "Message": "c1cca3b7-f85d-4fef-a162-88af23604343 Error while processing request, cannot forward to service: request url = https://localhost:19081/LocationApp/LocationFEService?ListenerName=FrontEndListener&zipcode=98052, verb = GET, remote (client) address = ::1, request processing start time = 16:43:02.686271 (3,448,220.353 MSec), error = FABRIC_E_ENDPOINT_NOT_FOUND, message = , phase = TryGetEndoint, SecureOnlyMode = false, gateway protocol = https, listenerName = FrontEndListener, replica endpoint = {\"Endpoints\":{\"\":\"Https:\/\/localhost:8491\/LocationApp\/\"}} ",
      "ProcessId": 57696,
      "Level": "Warning",
      "EventName": "ReverseProxy",
      "Payload": {
      "traceId": "c1cca3b7-f85d-4fef-a162-88af23604343",
      "requestUrl": "https://localhost:19081/LocationApp/LocationFEService?ListenerName=NewListener&zipcode=98052",
      ...
      "processRequestPhase": "TryGetEndoint",
      "errorDetails": "SecureOnlyMode = false, gateway protocol = https, listenerName = FrontEndListener, replica endpoint = {\"Endpoints\":{\"OldListener\":\"Https:\/\/localhost:8491\/LocationApp\/\"}}"
      }
      }
      

      مثال آخر حيث يمكن للخادم الوكيل العكسي إرجاع 404 Not Found هو: تم تعيين معلمة تكوين ApplicationGateway \ Http SecureOnlyMode على true مع الاستماع العكسي للخادم الوكيل على HTTPS ، ومع ذلك ، فإن جميع نقاط نهاية النسخة المماثلة غير آمنة (الاستماع على HTTP). يقوم الوكيل العكسي بإرجاع 404 لأنه لا يمكنه العثور على نقطة نهاية الاستماع إلى HTTPS لإعادة توجيه الطلب. يساعد تحليل المعلمات في حمولة الحدث على تضييق نطاق الخاص بالمشكلة:

      "errorDetails": "SecureOnlyMode = true, gateway protocol = https, listenerName = NewListener, replica endpoint = {\"Endpoints\":{\"OldListener\":\"Http:\/\/localhost:8491\/LocationApp\/\", \"NewListener\":\"Http:\/\/localhost:8492\/LocationApp\/\"}}"
      
  3. بسبب خطأ في المهلة أدى إلى فشل طلب الوكيل العكسي. تشمل سجلات الأحداث على حدث يحتوي على تفاصيل الطلب المستلم (غير معروضة هنا). يوضح الحدث التالي أن الخدمة استجابت باستخدام تعليمة برمجية للحالة 404 ويبدأ الوكيل العكسي في الحل.

    {
      ...
      "Message": "7ac6212c-c8c4-4c98-9cf7-c187a94f141e Request to service returned: status code = 404, status description = , Reresolving ",
      "Payload": {
        "traceId": "7ac6212c-c8c4-4c98-9cf7-c187a94f141e",
        "statusCode": 404,
        "statusDescription": ""
      }
    }
    {
      ...
      "Message": "7ac6212c-c8c4-4c98-9cf7-c187a94f141e Re-resolved service url = Https://localhost:8491/LocationApp/?zipcode=98052 ",
      "Payload": {
        "traceId": "7ac6212c-c8c4-4c98-9cf7-c187a94f141e",
        "requestUrl": "Https://localhost:8491/LocationApp/?zipcode=98052"
      }
    }
    

    عند تجميع جميع الأحداث، سترى مجموعة من الأحداث تظهر كل حل ومحاولة من أجل إعادة التوجيه. يظهر الحدث الأخير في السلسلة فشل معالجة الطلب مع مهلة، مع عدد محاولات الحل الناجحة.

    ملاحظة

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

    {
      ...
      "Message": "7ac6212c-c8c4-4c98-9cf7-c187a94f141e Error while processing request: number of successful resolve attempts = 12, error = FABRIC_E_TIMEOUT, message = , phase = ResolveServicePartition,  ",
      "EventName": "ReverseProxy",
      ...
      "Payload": {
        "traceId": "7ac6212c-c8c4-4c98-9cf7-c187a94f141e",
        "resolveCount": 12,
        "errorval": -2147017729,
        "errorMessage": "",
        "processRequestPhase": "ResolveServicePartition",
        "errorDetails": ""
      }
    }
    

    في حالة تمكين التجميع للأحداث الحرجة/الأخطاء فقط، فسترى حدث واحدا يحتوي على تفاصيل حول المهلة وعدد محاولات الحل.

    يجب على الخدمات التي تنوي إرسال تعليمة برمجية للحالة 404 مرة أخرى إلى المستخدم إضافة رأس "X-ServiceFabric" في الاستجابة. بعد إضافة الرأس إلى الاستجابة، يقوم الوكيل العكسي بإعادة توجيه التعليمة البرمجية الخاصة بالحالة مرة أخرى إلى العميل.

  4. الحالات التي قام فيها العميل بقطع اتصال الطلب.

    يتم تسجيل الحدث التالي عندما يقوم الوكيل العكسي بإعادة توجيه الاستجابة إلى العميل ولكن العميل يقطع الاتصال:

    {
      ...
      "Message": "6e2571a3-14a8-4fc7-93bb-c202c23b50b8 Unable to send response to client: phase = SendResponseHeaders, error = -805306367, internal error = ERROR_SUCCESS ",
      "ProcessId": 57696,
      "Level": "Warning",
      ...
      "EventName": "ReverseProxy",
      "Payload": {
        "traceId": "6e2571a3-14a8-4fc7-93bb-c202c23b50b8",
        "sendResponsePhase": "SendResponseHeaders",
        "errorval": -805306367,
        "winHttpError": "ERROR_SUCCESS"
      }
    }
    
  5. إرجاع الوكيل العكسي 404 FABRIC_E_SERVICE_DOES_NOT_EXIST

    يتم إرجاع FABRIC_E_SERVICE_DOES_NOT_EXIST الخطأ إذا لم يتم تحديد نظام URI لنقطة تقديم الخدمة في بيان الخدمة.

    <Endpoint Name="ServiceEndpointHttp" Port="80" Protocol="http" Type="Input"/>
    

    لحل المشكلة، يجب تحديد مخطط URI في البيان.

    <Endpoint Name="ServiceEndpointHttp" UriScheme="http" Port="80" Protocol="http" Type="Input"/>
    

ملاحظة

حالياً لا تتوفر إمكانية تسجيل الأحداث المتعلقة بمعالجة طلب websocket. سيتم تضمين هذا في الإصدار التالي.

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