6

通常の 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: 'アクセスが拒否されました'

4

3 に答える 3

2

MetricServer.Start()ユーザーが指定されたポートで Web サーバーを開く権限を持っていない場合、Windows でアクセス拒否の例外がスローされることがあります。netsh コマンドを使用して、必要なアクセス許可を自分自身に付与できます。

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

于 2019-02-25T08:27:16.153 に答える
1

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 の回答と組み合わせました。

于 2021-03-25T10:38:13.273 に答える