美文网首页
Asp.net core 监控程序中所有中间件耗时

Asp.net core 监控程序中所有中间件耗时

作者: antcore | 来源:发表于2022-01-06 15:18 被阅读0次
/// <summary>
///
/// </summary>
/// <param name="services"></param>
public void ConfigureServices(IServiceCollection services)
{
  services.AddMiddlewareAnalysis();
}
/// <summary>
        ///
        /// </summary>
        /// <param name="app"></param>
        /// <param name="env"></param>
        /// <param name="httpContextAccessor"></param>
        public void Configure(
            IApplicationBuilder app,
            IWebHostEnvironment env,
            IHostApplicationLifetime appLifetime,
            IHttpContextAccessor httpContextAccessor)
        {
           DiagnosticListener.AllListeners.Subscribe(new MiddlewareObserver());
        }

    /// <summary>
    /// 统计中间件耗时
    /// </summary>
    public class MiddlewareObserver : IObserver<DiagnosticListener>, IObserver<KeyValuePair<string, object>>
    {
        private readonly AsyncLocal<Stopwatch> _stopwatch = new AsyncLocal<Stopwatch>();
        private readonly List<IDisposable> disposables = new List<IDisposable>();

        public void OnCompleted()
        {
        }

        public void OnError(Exception error)
        {
        }

        public void OnNext(DiagnosticListener value)
        {
            var subscription = value.Subscribe(this);
            disposables.Add(subscription);
        }

        public void OnNext(KeyValuePair<string, object> dic)
        {
            if (dic.Key == "Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareStarting")
            {
                _stopwatch.Value = Stopwatch.StartNew();
                return;
            }
            if (dic.Key == "Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareFinished")
            {
                var stopwatch = _stopwatch.Value;
                stopwatch.Stop();

                var mResultType = dic.Value.GetType().GetTypeInfo();

                string name = mResultType.GetDeclaredProperty("name")?.GetValue(dic.Value) as string;
                long? duration = mResultType.GetDeclaredProperty("duration")?.GetValue(dic.Value) as long?;
                long? timestamp = mResultType.GetDeclaredProperty("timestamp")?.GetValue(dic.Value) as long?;

                // timestamp:{  TimeSpan.FromTicks(timestamp.Value).TotalMilliseconds}
                if (duration.HasValue)
                {
                    Console.WriteLine($@"=>:{name}
duration:{  TimeSpan.FromTicks(duration.Value).TotalMilliseconds}
Elapsed: { stopwatch.ElapsedMilliseconds} ===  {stopwatch.Elapsed.ToString()}
=================================================================== ");
                }
            }
        }
    }

相关文章

网友评论

      本文标题:Asp.net core 监控程序中所有中间件耗时

      本文链接:https://www.haomeiwen.com/subject/hfcrcrtx.html