AWS XRay исходящая трассировка для ASP.NET WebAPI

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

  • 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, исходящая трассировка не отображается вообще. Входящий след

Вместо этого в журналах 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)

person NitinSingh    schedule 11.06.2019    source источник


Ответы (1)


Из стека ошибок похоже, что здесь возникает исключение: 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/Обработчики/AspNet/AWSXRayASPNET.cs#L141 и, следовательно, не может хранить информацию HTTP.

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

  1. Как проходит поток для данного входящего запроса: запрос-> 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/Обработчики/System.Net/Utils/RequestUtil.cs#L59

Спасибо, Йоги

person Yogiraj Awati    schedule 12.06.2019
comment
1) Поток (внешний запрос) - ›WebAPI -› HttpClient - ›Другой WebAPI или внешний сервис. Все звонки асинхронные - person NitinSingh; 12.06.2019
comment
2) У нас нет промежуточного программного обеспечения уровня приложения, кроме AWS XRay, который настроен для входящих сообщений в Global.asax. Входящие трассировки работают правильно даже при текущей настройке. Мы никогда не проверяли журналы из-за отсутствия ошибок перед настройкой инструментария HttpClient. - person NitinSingh; 12.06.2019
comment
4) Никакой явной конфигурации, связанной с TraceContext или ThreadPool, кроме той, которая неявно задана .NET Framework. Проверка isXrayEnabled связана с тем, что содержащая утилита используется несколькими клиентами, и мы не можем включить XRay на всех из них. - person NitinSingh; 12.06.2019
comment
3) В примере приложения, выполняемого локально через демон XRay, когда мы размещаем вызов GetEntity непосредственно перед нажатием httpClient.GetAsync, мы получаем действительный экземпляр, свойство Aws содержит словарь со значениями [(sdk, Xray для .net), (sdk_version, 2.5.2)], имя сегмента отражается именем, указанным в вызове RegisterXray, свойство Http правильно ссылается на удаляемый URL-адрес. Однако даже для простого URL-адреса, такого как Google, мы не получаем ответа. - person NitinSingh; 12.06.2019
comment
Здравствуйте, спасибо за подробный ответ. Однако даже для простого URL-адреса, такого как Google, мы поражаемся получением ответа - ›Я думаю, вам нужно включить журналы отладки для X-Ray SDK, чтобы увидеть, сможем ли мы получить больше информации о том, что происходит: github.com/aws/aws-xray-sdk-dotnet/tree/master # logging-net - person Yogiraj Awati; 12.06.2019
comment
Перед запуском асинхронного вызова правильный сегмент присутствует в TraceContext. Каким-то образом для жизненного цикла запроса этот сегмент удаляется из TraceContext. Для промежуточного программного обеспечения ASP.NET мы храним сегмент / подсегмент в CallContext, а ссылку в HTTPContext: github.com/aws/aws-xray-sdk-dotnet/blob/master/sdk/src/Core/. Можно ли предоставить образец приложения (отредактировать конфиденциальную информацию), чтобы я мог провести дополнительный анализ. - person Yogiraj Awati; 12.06.2019
comment
Конечно, где я могу предоставить вам приложение. У нас есть пример приложения, которое запускается локально через службу демона. - person NitinSingh; 12.06.2019
comment
Пример исходного кода добавлен в тикет 6152616131 службы поддержки AWS. Сообщите мне, могу ли я также отправить его непосредственно вам. - person NitinSingh; 17.06.2019
comment
Здравствуйте, Нитин, мы будем вести дальнейшую переписку по тикету AWS Support, чтобы избежать дублирования. - person Yogiraj Awati; 18.06.2019