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ązanych z niepowodzeniem przetwarzania żądań na zwrotnym serwerze proxy i drugim kanale zawierającym pełne zdarzenia z wpisami dla żądań zakończonych powodzeniem i niepowodzeniem.

Zapoznaj się z artykułem 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 (zwrotny adres URL serwera proxy), do którego wysłano żądanie.

    • zlecenie: czasownik HTTP.

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

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

    • 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. Wpisy ładunku, które cię interesują, są następujące:

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

    • 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ć 404 Nie znaleziono, jest: Parametr konfiguracji ApplicationGateway\Http SecureOnlyMode jest ustawiony na wartość true z odwrotnym serwerem proxy nasłuchujący na protokole HTTPS, jednak wszystkie punkty końcowe repliki są niezabezpieczone (nasłuchiwanie przy użyciu protokołu 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ązania i przesyłania dalej. Ostatnie zdarzenie z 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ślnie 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 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