C# 如何在ASP.net 4.7.1中报告Prometheus net度量
如何在常规ASP.net 4.7.1应用程序中使用prometheus net?在.NETCore中非常简单,但我在4.7.1中找不到一种向Grafana报告指标的好方法 理想的情况是在报告度量的地方有路径C# 如何在ASP.net 4.7.1中报告Prometheus net度量,c#,asp.net,asp.net-mvc,prometheus-net,C#,Asp.net,Asp.net Mvc,Prometheus Net,如何在常规ASP.net 4.7.1应用程序中使用prometheus net?在.NETCore中非常简单,但我在4.7.1中找不到一种向Grafana报告指标的好方法 理想的情况是在报告度量的地方有路径/metrics 我试图创建一个粗略的测试控制器来运行MetricServer,但出现了一个错误 // horrible test code [RoutePrefix("metrics")] public class MetricsController : ApiController {
/metrics
我试图创建一个粗略的测试控制器来运行MetricServer
,但出现了一个错误
// horrible test code
[RoutePrefix("metrics")]
public class MetricsController : ApiController
{
static readonly MetricServer _server = new MetricServer(7777);
static MetricsController()
{
_server.Start();
}
[Route("")]
public async Task<IHttpActionResult> Get()
{
using (var client = new HttpClient())
{
var metrics = await client.GetAsync("http://localhost:7777/metrics");
return Content(HttpStatusCode.OK, await metrics.Content.ReadAsStringAsync(),null, metrics.Content.Headers.ContentType.ToString());
}
}
}
//可怕的测试代码
[RoutePrefix(“指标”)]
公共类MetricsController:ApicController
{
静态只读MetricServer_server=新MetricServer(7777);
静态度量控制器()
{
_server.Start();
}
[路线(“”)
公共异步任务Get()
{
使用(var client=new HttpClient())
{
var metrics=await client.GetAsync(“http://localhost:7777/metrics");
返回内容(HttpStatusCode.OK,wait metrics.Content.ReadAsStringAsync(),null,metrics.Content.Headers.ContentType.ToString());
}
}
}
System.Net.HttpListenerException:“访问被拒绝”
MetricServer.Start()
如果用户无权在指定端口打开web服务器,则可能在Windows上引发拒绝访问异常。您可以使用netsh命令授予自己所需的权限:
netsh http add urlacl url=http://+:7777/metrics user=DOMAIN\user
还有另一种方法可以做到这一点。您不必在启动时创建新的
MetricServer
并调用它,只需通过调用CollectAndExportAsTextAsync
自己收集度量值即可
只需创建一个如下所示的WebApi控制器:
public class MetricsController : ApiController
{
[Route("metrics")]
[HttpGet]
public async Task<HttpResponseMessage> AppMetrics()
{
using (MemoryStream ms = new MemoryStream())
{
await Metrics.DefaultRegistry.CollectAndExportAsTextAsync(ms);
ms.Position = 0;
using (StreamReader sr = new StreamReader(ms))
{
var allmetrics = await sr.ReadToEndAsync();
return new HttpResponseMessage()
{
Content = new StringContent(allmetrics, Encoding.UTF8, "text/plain")
};
}
}
}
}
公共类MetricsController:ApicController
{
[路线(“指标”)]
[HttpGet]
公共异步任务AppMetrics()
{
使用(MemoryStream ms=new MemoryStream())
{
wait Metrics.DefaultRegistry.CollectAndExportAsTextAsync(ms);
ms.Position=0;
使用(StreamReader sr=新StreamReader(ms))
{
var allmetrics=wait sr.ReadToEndAsync();
返回新的HttpResponseMessage()
{
内容=新的StringContent(allmetrics,Encoding.UTF8,“文本/普通”)
};
}
}
}
}
或者,您也可以使用my NuGet软件包,该软件包还提供HTTP指标和一些SQL指标-使用ASP.NET Framework,您还可以创建一个独立的
HttpHandler
来提供您的指标端点
首先创建处理程序(通常存储在App\u code
目录中):
为了获得我的处理程序代码,我查看了PrometheusMetricServer
实现,并结合Rocklan的答案
/// <summary>
/// Prometheus metrics scraping endpoint.
/// </summary>
public class MetricsHandler : HttpTaskAsyncHandler
{
public override async Task ProcessRequestAsync(HttpContext context)
{
// Uses pattern from Prometheus.MetricServer
var response = context.Response;
try
{
try
{
await Metrics.DefaultRegistry.CollectAndExportAsTextAsync(context.Response.OutputStream);
}
catch (ScrapeFailedException ex)
{
response.StatusCode = 503;
if (!string.IsNullOrWhiteSpace(ex.Message))
{
using (var streamWriter = new StreamWriter(response.OutputStream))
{
streamWriter.Write(ex.Message);
}
}
}
}
catch (Exception ex)
{
if (!(ex is OperationCanceledException))
{
try
{
response.StatusCode = 500;
}
catch
{
}
}
}
}
}
<system.webServer>
<handlers>
<add name="MetricsHandler" verb="*" path="metrics" type="<your-namespace>.MetricsHandler, <your-assembly-name>" resourceType="Unspecified" />
</handlers>
</system.webServer>