Monitorování a diagnostika zpracování požadavků na reverzním proxy serveru

Počínaje verzí Service Fabric 5.7 jsou pro shromažďování k dispozici události reverzního proxy serveru. Události jsou k dispozici ve dvou kanálech, jeden s pouze chybovými událostmi souvisejícími se selháním zpracování požadavků na reverzním proxy serveru a druhým kanálem obsahujícím podrobné události s položkami pro úspěšné i neúspěšné požadavky.

Informace o povolení shromažďování událostí z těchto kanálů v místních clusterech a clusterech Azure Service Fabric najdete v tématu Shromažďování událostí reverzního proxy serveru.

Řešení potíží s využitím diagnostických protokolů

Tady je několik příkladů interpretace běžných protokolů selhání, se kterými se můžete setkat:

  1. Reverzní proxy server vrátí stavový kód odpovědi 504 (vypršení časového limitu).

    Jedním z důvodů může být to, že služba během časového limitu požadavku neodpoví. První následující událost zaznamená podrobnosti o požadavku přijatém na reverzním proxy serveru. Druhá událost značí, že požadavek při předávání do služby selhal kvůli vnitřní chybě = ERROR_WINHTTP_TIMEOUT.

    Datová část zahrnuje:

    • traceId: Tento identifikátor GUID se dá použít ke korelaci všech událostí odpovídajících jednomu požadavku. V následujících dvou událostech je traceId = 2f87b722-e254-4ac2-a802-fd315c1a0271, což znamená, že patří do stejné žádosti.

    • requestUrl: Adresa URL (adresa URL reverzního proxy serveru), na kterou byl požadavek odeslán.

    • sloveso: příkaz HTTP.

    • remoteAddress: Adresa klienta odesílajícího požadavek.

    • resolvedServiceUrl: Adresa URL koncového bodu služby, na který se přeložil příchozí požadavek.

    • errorDetails: Další informace o selhání.

      {
      "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. Reverzní proxy server vrátí stavový kód odpovědi 404 (Nenalezena).

    Tady je příklad události, kdy reverzní proxy server vrací chybu 404, protože se mu nepodařilo najít odpovídající koncový bod služby. Zde jsou zajímavé položky datové části:

    • processRequestPhase: Označuje fázi zpracování požadavku, kdy došlo k selhání, TryGetEndpoint , tj. při pokusu o načtení koncového bodu služby, do které se má předat.

    • errorDetails: Vypíše kritéria hledání koncových bodů. Tady vidíte, že název naslouchacího procesu zadal = FrontEndListener , zatímco seznam koncových bodů repliky obsahuje pouze naslouchací proces s názvem 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\/\"}}"
      }
      }
      

      Dalším příkladem, kdy reverzní proxy server může vrátit chybu 404 Nenalezený, je: Parametr konfigurace ApplicationGateway\Http SecureOnlyMode je nastavený na hodnotu true a reverzní proxy server naslouchá na https, ale všechny koncové body repliky jsou nezabezpečené (naslouchají na PROTOKOLU HTTP). Reverzní proxy server vrátí chybu 404, protože nemůže najít koncový bod, který naslouchá na protokolu HTTPS, aby požadavek přeposlal. Analýza parametrů v datové části události pomáhá problém zúžit:

      "errorDetails": "SecureOnlyMode = true, gateway protocol = https, listenerName = NewListener, replica endpoint = {\"Endpoints\":{\"OldListener\":\"Http:\/\/localhost:8491\/LocationApp\/\", \"NewListener\":\"Http:\/\/localhost:8492\/LocationApp\/\"}}"
      
  3. Požadavek na reverzní proxy server selže s chybou vypršení časového limitu. Protokoly událostí obsahují událost s podrobnostmi přijaté žádosti (nejsou zde uvedeny). Další událost ukazuje, že služba odpověděla stavovým kódem 404 a reverzní proxy server zahájil opětovné vyřešení.

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

    Při shromažďování všech událostí uvidíte řadu událostí, které ukazují všechny pokusy o vyřešení a předání. Poslední událost v řadě ukazuje, že zpracování požadavku selhalo s vypršením časového limitu, spolu s počtem úspěšných pokusů o vyřešení.

    Poznámka

    Doporučujeme ponechat shromažďování událostí ve podrobném kanálu ve výchozím nastavení zakázané a povolit ji pro řešení potíží podle potřeby.

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

    Pokud je shromažďování povolené pouze pro kritické nebo chybové události, zobrazí se jedna událost s podrobnostmi o vypršení časového limitu a počtu pokusů o vyřešení.

    Služby, které mají v úmyslu odeslat uživateli stavový kód 404, by měly do odpovědi přidat hlavičku X-ServiceFabric. Po přidání hlavičky do odpovědi reverzní proxy server předá stavový kód zpět klientovi.

  4. Případy, kdy klient žádost odpojil.

    Následující událost se zaznamená, když reverzní proxy server předává odpověď klientovi, ale klient se odpojí:

    {
      ...
      "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. Reverzní proxy vrátí 404 FABRIC_E_SERVICE_DOES_NOT_EXIST

    FABRIC_E_SERVICE_DOES_NOT_EXIST chyba se vrátí, pokud v manifestu služby není pro koncový bod služby zadané schéma identifikátoru URI.

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

    Pokud chcete tento problém vyřešit, zadejte v manifestu schéma identifikátoru URI.

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

Poznámka

Události související se zpracováním požadavků protokolu WebSocket se v současné době neprotokolují. Ta bude přidána v příští verzi.

Další kroky