C# .net核心监视器与prometheus的nats请求
我有一个与NAT集成的NETCore3.1WebAPI应用程序 我需要捕获我的应用程序的所有流量,并将它们发送给Prometheus,以监视应用程序的活动 在本例中,我使用了本文,但它描述了一种捕获Http请求而不是NAT的方法 有人遇到过这样的问题吗?我终于明白了! 如果有人有同样的问题,这里是我的解决方案:C# .net核心监视器与prometheus的nats请求,c#,.net-core,prometheus,nats.io,C#,.net Core,Prometheus,Nats.io,我有一个与NAT集成的NETCore3.1WebAPI应用程序 我需要捕获我的应用程序的所有流量,并将它们发送给Prometheus,以监视应用程序的活动 在本例中,我使用了本文,但它描述了一种捕获Http请求而不是NAT的方法 有人遇到过这样的问题吗?我终于明白了! 如果有人有同样的问题,这里是我的解决方案: { private readonly ITracer _tracer; public TraceMiddleware(ITracer trace
{
private readonly ITracer _tracer;
public TraceMiddleware(ITracer tracer)
{
_tracer = tracer;
}
public async Task ExecuteAsync(NatsContext context, PipelineDelegate next)
{
var operationName = $"{context.Request.Address.Service}:{context.Request.Address.Method}";
var builder = _tracer.BuildSpan(operationName);
#region [Context TraceId]
builder.WithTag("internalRequestId", context["requestId"].ToString());
context.Tracer.AddTracer(context.Request.Address.ToNatsSubject(), context["requestId"].ToString());
builder.WithTag("TraceId", context.Tracer.TraceId);
#endregion
using (var scope = builder.StartActive(false))
{
var span = scope.Span;
span.SetTag("flow", context.Tracer.ToString());
span.SetTag("request-route", context.Request.Address.ToNatsSubject());
span.Log(DateTimeOffset.UtcNow, "request-started");
#region [Prometheus]
var counter = Metrics.CreateCounter("app_request_total", "Nats Requests Total",
new CounterConfiguration
{
LabelNames = new[] {"path", "method", "statusCode"}
});
var path = context.Request.Address.Service;
var method = context.Request.Address.Method;
int statusCode;
try
{
await next();
}
catch (Exception)
{
statusCode = 500;
counter.Labels(path, method, statusCode.ToString()).Inc();
throw;
}
statusCode = (int) context.Response.Status;
counter.Labels(path, method, statusCode.ToString()).Inc();
#endregion
span.Log(DateTimeOffset.UtcNow, "request-finished");
var logData = new List<KeyValuePair<string, object>>
{
new KeyValuePair<string, object>("status-code", context.Response.Status),
new KeyValuePair<string, object>("has-exception", context.Response.Error != null)
};
span.Log(logData);
span.Finish();
}
}
}```
{
专用只读ITracer\u跟踪器;
公共跟踪软件(ITracer tracer)
{
_示踪剂=示踪剂;
}
公共异步任务ExecuteAsync(NatsContext上下文,PipelineDelegate下一步)
{
var operationName=$“{context.Request.Address.Service}:{context.Request.Address.Method}”;
var builder=_tracer.BuildSpan(operationName);
#区域[上下文跟踪ID]
WithTag(“internalRequestId”,context[“requestId”].ToString());
context.Tracer.AddTracer(context.Request.Address.tonatssObject(),context[“requestId”].ToString());
builder.WithTag(“TraceId”,context.Tracer.TraceId);
#端区
使用(var scope=builder.StartActive(false))
{
var span=scope.span;
SetTag(“flow”,context.Tracer.ToString());
SetTag(“请求路由”,context.request.Address.tonatssObject());
Log(DateTimeOffset.UtcNow,“请求已启动”);
#地区[普罗米修斯]
var counter=Metrics.CreateCounter(“应用程序请求总数”、“Nats请求总数”,
新的反配置
{
LabelNames=new[]{“路径”、“方法”、“状态码”}
});
var path=context.Request.Address.Service;
var method=context.Request.Address.method;
int状态码;
尝试
{
等待下一个();
}
捕获(例外)
{
状态代码=500;
counter.Labels(路径、方法、状态码.ToString()).Inc();
投掷;
}
statusCode=(int)context.Response.Status;
counter.Labels(路径、方法、状态码.ToString()).Inc();
#端区
Log(DateTimeOffset.UtcNow,“请求完成”);
var logData=新列表
{
新的KeyValuePair(“状态代码”,context.Response.status),
新的KeyValuePair(“有异常”,context.Response.Error!=null)
};
span.Log(logData);
span.Finish();
}
}
}```