如何在ASP.NET 4.7.1中报告Prometheus-net指标

时间:2019-02-19 16:38:33

标签: c# asp.net asp.net-mvc prometheus-net

如何在常规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:'访问被拒绝'

3 个答案:

答案 0 :(得分:1)

还有另一种方法可以做到这一点。除了在启动时创建新的$userdata = array( 'responsavel_cpf' => Input::get('email'), 'responsavel_senha' => Input::get('password') ); if (Auth::guard('igrejas')->attempt($userdata)) { return Redirect::to('dashboard_paroquia'); } else { return Redirect::to('login'); } 并调用它之外,您还可以自己调用MetricServer来收集指标。

只需创建一个看起来像这样的WebApi控制器:

CollectAndExportAsTextAsync

或者您也可以只使用我的NuGet软件包,该软件包也为您提供HTTP指标和一些SQL指标-https://www.nuget.org/packages/prometheus-net.AspNet/

答案 1 :(得分:0)

如果您的用户无权在指定端口上打开Web服务器,则

MetricServer.Start()在Windows上可能会引发拒绝访问异常。您可以使用netsh命令向自己授予所需的权限:

netsh http add urlacl url=http://+:7777/metrics user=DOMAIN\user

答案 2 :(得分:0)

借助 ASP.NET Framework,您还可以创建一个独立的 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 的回答。