다음을 통해 공유


역방향 프로세스에서의 요청 처리 모니터링 및 진단

Service Fabric 5.7 릴리스부터 역방향 프록시 이벤트를 컬렉션에 사용할 수 있습니다. 이벤트는 역방향 프록시에서의 요청 처리 실패와 관련한 오류 이벤트만을 담은 한 채널과, 성공한 요청과 실패한 요청 모두에 대한 항목을 모두 포함하는 상세 이벤트가 담긴 두 번째 채널 등, 두 채널로 제공됩니다.

로컬 및 Azure Service Fabric 클러스터에서 이러한 채널로부터의 이벤트 수집을 활성화하려면 역방향 프록시 이벤트 수집을 참조하세요.

진단 로그를 사용한 문제 해결

다음은 발생할 수 있는 일반적인 실패 로그를 해석하는 방법에 대한 몇 가지 예입니다.

  1. 역방향 프록시에서 응답 상태 코드 504(시간 제한) 반환

    서비스가 요청 시간 제한 안에 응답하지 못하는 것이 한 원인이 될 수 있습니다. 아래의 첫 번째 이벤트는 역방향 프록시에서 수신한 요청의 상세 정보를 기록합니다. 두 번째 이벤트는 서비스로 전달하는 도중 "internal error = ERROR_WINHTTP_TIMEOUT"으로 인해 요청이 실패했음을 표시합니다.

    페이로드는 다음을 포함합니다.

    • traceId: 이 GUID를 사용하여 단일 요청에 해당하는 모든 이벤트를 상관 지을 수 있습니다. 아래 두 이벤트에서 traceId = 2f87b722-e254-4ac2-a802-fd315c1a0271은 이들이 같은 요청에 속함을 나타냅니다.

    • requestUrl: 요청이 전송된 UR (역방향 프록시 URL)입니다.

    • verb: HTTP 동사입니다.

    • remoteAddress: 요청을 보내는 클라이언트의 주소입니다.

    • resolvedServiceUrl: 수신 요청이 확인된 서비스 엔드포인트 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: 엔드포인트 검색 조건을 나열합니다. 여기서 listenerName specified = 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 configuration parameter SecureOnlyMode가 true로 설정되었고 역방향 프록시가 HTTPS에서 수신 대기하나 모든 복제본 엔드포인트가 보호되지 않는 경우(HTTP에서 응답)입니다. 요청을 전달하기 위해 HTTPS에서 수신 대기하는 엔드포인트를 찾을 수 없으므로 역방향 프록시가 404를 반환합니다. 이벤트 페이로드의 매개 변수를 분석하면 문제의 범위를 좁히는 데 도움이 됩니다.

      "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를 반환합니다.

    서비스 매니페스트에서 서비스 엔드포인트에 대해 URI 체계를 지정하지 않으면 FABRIC_E_SERVICE_DOES_NOT_EXIST 오류가 반환됩니다.

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

    이 문제를 해결하려면 매니페스트에 URI 체계를 지정합니다.

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

참고 항목

웹 소켓 요청 처리와 관련한 이벤트는 현재 기록되지 않습니다. 이것은 다음 릴리스에 추가될 것입니다.

다음 단계