/// <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()}
=================================================================== ");
}
}
}
}
网友评论