Исходящая трассировка AWS XRay для ASP.NET WebAPI - PullRequest
0 голосов
/ 11 июня 2019

Окружающая среда

  • ASP.NET WebAPI вызывает внешние клиентские службы.
  • Входящая трассировка XRay, примененная в Global.asax через

    AWSXRayASPNET.RegisterXRay(this, "CustomerAPI");
    
  • Экземпляр HttpClient, скрытый как закрытый член в служебном классе, совместно используемый в отдельном проекте с несколькими WebAPI

  • HttpClient, имеющий делегирующий обработчик для Xray, включается следующим образом: - (Ссылка: .NET HttpClient для исходящего XRay )

    bool isXrayEnabled = false;                    
    bool.TryParse(Config["XRayEnable"], out isXrayEnabled);
    
    if (isXrayEnabled)
    {
         Logger.Info("Enabling XRay tracing with Http calls");
         httpClient = new HttpClient(new HttpClientXRayTracingHandler(new HttpClientHandler()));
    }
    else
    {
         httpClient = new HttpClient();
         Logger.Info("Disabling XRay tracing with Http calls");
    }
    

Выпуск Хотя все API показывают входящую трассировку XRay, исходящая трассировка вообще не отображается. Incoming trace

Вместо этого в журналах XRay отображается следующая ошибка

   Exception type: EntityNotAvailableException

    Exception message: Entity doesn't exist in HTTPContext
   at Amazon.XRay.Recorder.Core.Internal.Context.HybridContextContainer.InjectEntityInTraceContext()
   at Amazon.XRay.Recorder.Core.AWSXRayRecorderImpl.AddHttpInformation(String key, Object value)
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Amazon.XRay.Recorder.Core.AWSXRayRecorderImpl.AddHttpInformation(String key, Object value)
   at Amazon.XRay.Recorder.Handlers.AspNet.AWSXRayASPNET.ProcessHTTPResponse(Object sender, EventArgs e)
   at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   at System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step)
   at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

1 Ответ

0 голосов
/ 12 июня 2019

Из стека ошибок похоже, что здесь происходит исключение: https://github.com/aws/aws-xray-sdk-dotnet/blob/master/sdk/src/Handlers/AspNet/AWSXRayASPNET.cs#L209. Ответ, полученный в этом событии, не имеет сегмента, запущенного промежуточным программным обеспечением в BeginRequest: https://github.com/aws/aws-xray-sdk-dotnet/blob/master/sdk/src/Handlers/AspNet/AWSXRayASPNET.cs#L141 и, следовательно, не может хранить информацию HTTP.

Можете ли вы ответить на следующие вопросы:

  1. Как выглядит поток для данного входящего запроса: request-> WEBAPI-> HTTPClient? Являются ли HTTPClient-вызовы асинхронными?
  2. Если у вас есть связующее ПО ASP.NET и вы не включили инструментарий HTTPClient X-Ray, вы все еще получаете ошибку выше? Или эта ошибка является результатом включения инструментария HTTPClient. Причина сужения, поскольку стек ошибок исходит от промежуточного программного обеспечения X-Ray, а не от клиента HTTP.
  3. HttpClientXRayTracingHandler создает для вас подсегмент. Этот прибор ожидает, что Сегмент уже присутствует в TraceContext, который в этом случае создается AWSXRayASPNET. Согласно вашему утверждению «Экземпляр HttpClient, скрытый как частный член в служебном классе, совместно используемый в отдельном проекте с несколькими WebAPI», вы можете проверить, присутствует ли сегмент в TraceContext непосредственно перед выполнением сетевого вызова с помощью AWSXRayRecorder.Instance.GetEntity (). , Это должно вернуть сегмент, запущенный промежуточным программным обеспечением или подсегментом, если вы создали его вручную до этого вызова.
  4. Есть ли у вас какая-либо конфигурация, связанная с пулом потоков, ведущая к тому, что TraceContext неправильно распространяется между потоками?

В приведенном выше фрагменте кода вам не нужно выполнять проверку "isXrayEnabled ()". По умолчанию вы можете настроить HTTPClient с помощью X-Ray, и промежуточное программное обеспечение выполняет эту проверку за вас: https://github.com/aws/aws-xray-sdk-dotnet/blob/master/sdk/src/Handlers/System.Net/Utils/RequestUtil.cs#L59

Спасибо, Йог

...