引入redis服务,支持自动化单元测试
大石头 编写于 2022-03-31 22:56:30
X
using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
using NewLife.Log;

namespace NewLife.Http
{
    /// <summary>支持APM跟踪的HttpClient处理器</summary>
    public class HttpTraceHandler : DelegatingHandler
    {
        #region 属性
        /// <summary>APM跟踪器</summary>
        public ITracer Tracer { get; set; }
        #endregion

        /// <summary>实例化一个支持APM的HttpClient处理器</summary>
        /// <param name="innerHandler"></param>
        public HttpTraceHandler(HttpMessageHandler innerHandler) : base(innerHandler) { }

        /// <summary>发送请求</summary>
        /// <param name="request"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var uri = request.RequestUri;

            // 如果父级已经做了ApiHelper.Invoke埋点,这里不需要再做一次
            var parent = DefaultSpan.Current;
            if (parent != null && parent.Tag == uri + "" || request.Headers.Contains("traceparent")) return await base.SendAsync(request, cancellationToken);

            using var span = Tracer?.NewSpan(request);
            try
            {
                return await base.SendAsync(request, cancellationToken);
            }
            catch (Exception ex)
            {
                span?.SetError(ex, request.Content?.ReadAsStringAsync().Result);

                throw;
            }
        }
    }
}