如何在 ASP.NET 4.7.1 中报告 Prometheus-net 指标
How to report Prometheus-net metrics in ASP.NET 4.7.1
如何在常规 ASP.NET 4.7.1 应用程序中使用 prometheus-net?在 .Net Core 中非常简单,但我找不到在 4.7.1
中向 Grafana 报告指标的好方法
理想情况是在报告指标的地方设置 /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());
}
}
}
System.Net.HttpListenerException: 'Access is denied'
如果您的用户无权在指定端口上打开 Web 服务器,MetricServer.Start()
可能会在 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")
};
}
}
}
}
或者您可以只使用我的 NuGet 包,它也为您提供 HTTP 指标和一些 SQL 指标 - https://www.nuget.org/packages/prometheus-net.AspNet/
使用 ASP.NET 框架,您还可以创建一个独立的 HttpHandler
来提供您的指标端点。
首先创建处理程序(通常存储在 App_Code
目录中):
/// <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
{
}
}
}
}
}
然后在 web.config
中注册您的处理程序:
<system.webServer>
<handlers>
<add name="MetricsHandler" verb="*" path="metrics" type="<your-namespace>.MetricsHandler, <your-assembly-name>" resourceType="Unspecified" />
</handlers>
</system.webServer>
为了获得我的处理程序代码,我查看了 Prometheus MetricServer
实现,并结合了 Rocklan 的回答。
如何在常规 ASP.NET 4.7.1 应用程序中使用 prometheus-net?在 .Net Core 中非常简单,但我找不到在 4.7.1
中向 Grafana 报告指标的好方法理想情况是在报告指标的地方设置 /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());
}
}
}
System.Net.HttpListenerException: 'Access is denied'
MetricServer.Start()
可能会在 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")
};
}
}
}
}
或者您可以只使用我的 NuGet 包,它也为您提供 HTTP 指标和一些 SQL 指标 - https://www.nuget.org/packages/prometheus-net.AspNet/
使用 ASP.NET 框架,您还可以创建一个独立的 HttpHandler
来提供您的指标端点。
首先创建处理程序(通常存储在 App_Code
目录中):
/// <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
{
}
}
}
}
}
然后在 web.config
中注册您的处理程序:
<system.webServer>
<handlers>
<add name="MetricsHandler" verb="*" path="metrics" type="<your-namespace>.MetricsHandler, <your-assembly-name>" resourceType="Unspecified" />
</handlers>
</system.webServer>
为了获得我的处理程序代码,我查看了 Prometheus MetricServer
实现,并结合了 Rocklan 的回答。