Udostępnij za pośrednictwem


Monitorowanie i diagnozowanie przetwarzania żądań na zwrotnym serwerze proxy

Począwszy od wersji 5.7 usługi Service Fabric, zdarzenia zwrotnego serwera proxy są dostępne dla kolekcji. Zdarzenia są dostępne w dwóch kanałach, jeden z tylko zdarzeniami błędów związanymi z niepowodzeniem przetwarzania żądań na zwrotnym serwerze proxy i drugim kanale zawierającym pełne zdarzenia z wpisami zarówno dla żądań zakończonych powodzeniem, jak i niepowodzeniem.

Zapoznaj się z tematem Zbieranie zdarzeń zwrotnego serwera proxy, aby włączyć zbieranie zdarzeń z tych kanałów w klastrach lokalnych i klastrach usługi Azure Service Fabric.

Rozwiązywanie problemów przy użyciu dzienników diagnostycznych

Poniżej przedstawiono kilka przykładów dotyczących interpretowania typowych dzienników błędów, które można napotkać:

  1. Zwrotny serwer proxy zwraca kod stanu odpowiedzi 504 (limit czasu).

    Jedną z przyczyn może być niepowodzenie odpowiedzi usługi w okresie przekroczenia limitu czasu żądania. Pierwsze zdarzenie poniżej rejestruje szczegóły żądania odebranego na zwrotnym serwerze proxy. Drugie zdarzenie wskazuje, że żądanie nie powiodło się podczas przekazywania do usługi z powodu "błędu wewnętrznego = ERROR_WINHTTP_TIMEOUT"

    Ładunek obejmuje:

    • traceId: ten identyfikator GUID może służyć do skorelowania wszystkich zdarzeń odpowiadających pojedynczemu żądaniu. W poniższych dwóch zdarzeniach traceId = 2f87b722-e254-4ac2-a802-fd315c1a0271, co oznacza, że należą do tego samego żądania.

    • requestUrl: adres URL (odwrotny adres URL serwera proxy), do którego wysłano żądanie.

    • czasownik: czasownik HTTP.

    • remoteAddress: adres klienta wysyłającego żądanie.

    • resolvedServiceUrl: adres URL punktu końcowego usługi, do którego rozwiązano przychodzące żądanie.

    • errorDetails: Dodatkowe informacje o błędzie.

      {
      "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. Zwrotny serwer proxy zwraca kod stanu odpowiedzi 404 (Nie znaleziono).

    Oto przykładowe zdarzenie, w którym zwrotny serwer proxy zwraca wartość 404, ponieważ nie można odnaleźć pasującego punktu końcowego usługi. Poniżej przedstawiono pozycje ładunku:

    • processRequestPhase: wskazuje fazę przetwarzania żądań, gdy wystąpił błąd, tryGetEndpoint , tj. podczas próby pobrania punktu końcowego usługi do przekazania dalej.

    • errorDetails: Wyświetla listę kryteriów wyszukiwania punktu końcowego. W tym miejscu widać, że parametr listenerName określony = FrontEndListener, natomiast lista punktów końcowych repliki zawiera tylko odbiornik o nazwie 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\/\"}}"
      }
      }
      

      Innym przykładem, w którym zwrotny serwer proxy może zwrócić błąd 404 Nie znaleziono, jest: Parametr konfiguracji ApplicationGateway\Http SecureOnlyMode jest ustawiony na wartość true z odwrotnym serwerem proxy nasłuchując przy użyciu protokołu HTTPS, jednak wszystkie punkty końcowe repliki są niezabezpieczone (nasłuchiwanie w protokole HTTP). Zwrotny serwer proxy zwraca wartość 404, ponieważ nie może odnaleźć punktu końcowego nasłuchiwania przy użyciu protokołu HTTPS w celu przekazania żądania. Analizowanie parametrów w ładunku zdarzenia pomaga zawęzić problem:

      "errorDetails": "SecureOnlyMode = true, gateway protocol = https, listenerName = NewListener, replica endpoint = {\"Endpoints\":{\"OldListener\":\"Http:\/\/localhost:8491\/LocationApp\/\", \"NewListener\":\"Http:\/\/localhost:8492\/LocationApp\/\"}}"
      
  3. Żądanie do zwrotnego serwera proxy kończy się niepowodzeniem z powodu błędu przekroczenia limitu czasu. Dzienniki zdarzeń zawierają zdarzenie ze szczegółami odebranego żądania (nie pokazano tutaj). Następne zdarzenie pokazuje, że usługa odpowiedziała kodem stanu 404, a zwrotny serwer proxy inicjuje ponowne rozwiązanie.

    {
      ...
      "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"
      }
    }
    

    Podczas zbierania wszystkich zdarzeń zobaczysz pociąg zdarzeń pokazujący każdą próbę rozwiązywania i przesyłania dalej. Ostatnie zdarzenie w serii pokazuje, że przetwarzanie żądań nie powiodło się z przekroczeniem limitu czasu wraz z liczbą pomyślnych prób rozwiązania.

    Uwaga

    Zalecane jest domyślne wyłączenie pełnego zbierania zdarzeń kanału i włączenie go do rozwiązywania problemów.

    {
      ...
      "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": ""
      }
    }
    

    Jeśli kolekcja jest włączona tylko dla zdarzeń krytycznych/błędów, zobaczysz jedno zdarzenie ze szczegółowymi informacjami o przekroczeniu limitu czasu i liczbie prób rozwiązania.

    Usługi, które zamierzają wysłać kod stanu 404 z powrotem do użytkownika, powinny dodać nagłówek "X-ServiceFabric" w odpowiedzi. Po dodaniu nagłówka do odpowiedzi zwrotny serwer proxy przekazuje kod stanu z powrotem do klienta.

  4. Przypadki rozłączenia żądania przez klienta.

    Następujące zdarzenie jest rejestrowane, gdy zwrotny serwer proxy przekazuje odpowiedź do klienta, ale klient rozłącza się:

    {
      ...
      "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. Zwrotny serwer proxy zwraca wartość 404 FABRIC_E_SERVICE_DOES_NOT_EXIST

    FABRIC_E_SERVICE_DOES_NOT_EXIST zwracany jest błąd, jeśli schemat identyfikatora URI nie został określony dla punktu końcowego usługi w manifeście usługi.

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

    Aby rozwiązać ten problem, określ schemat identyfikatora URI w manifeście.

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

Uwaga

Zdarzenia związane z przetwarzaniem żądań protokołu Websocket nie są obecnie rejestrowane. Zostanie to dodane w następnej wersji.

Następne kroki