/// <summary> /// Add PrometheusServer request execution pipeline. /// </summary> public static IApplicationBuilder UsePrometheusServer(this IApplicationBuilder app, Action <PrometheusOptions> setupOptions) { var options = new PrometheusOptions { CollectorRegistryInstance = (ICollectorRegistry)app.ApplicationServices.GetService(typeof(ICollectorRegistry)) ?? Metrics.DefaultCollectorRegistry }; setupOptions?.Invoke(options); if (app == null) { throw new ArgumentNullException(nameof(app)); } if (options == null) { throw new ArgumentNullException(nameof(options)); } if (!options.MapPath.StartsWith("/")) { throw new ArgumentException($"MapPath '{options.MapPath}' should start with '/'"); } if (options.UseDefaultCollectors) { options.CollectorRegistryInstance.UseDefaultCollectors(options.MetricPrefixName); } var contentType = "text/plain; version=0.0.4"; if (options.ResponseEncoding != null) { contentType += $"; charset={options.ResponseEncoding.BodyName}"; } void AddMetricsHandler(IApplicationBuilder coreapp) { coreapp.Run(async context => { var response = context.Response; response.ContentType = contentType; using var outputStream = response.Body; await ScrapeHandler.ProcessAsync(options.CollectorRegistryInstance, outputStream); }); } if (options.Port == null) { return(app.Map(options.MapPath, AddMetricsHandler)); } bool PortMatches(HttpContext context) => context.Connection.LocalPort == options.Port; return(app.Map(options.MapPath, cfg => cfg.MapWhen(PortMatches, AddMetricsHandler))); }
private static void RegisterCollectors(PrometheusOptions options) { if (options.UseDefaultCollectors) { var metricFactory = options.CollectorRegistryInstance == CollectorRegistry.Instance ? Metrics.DefaultFactory : new MetricFactory(options.CollectorRegistryInstance); options.Collectors.AddRange(DefaultCollectors.Get(metricFactory)); } options.CollectorRegistryInstance.RegisterOnDemandCollectors(options.Collectors); }
/// <summary> /// Add PrometheusServer request execution pipeline. /// </summary> public static IApplicationBuilder UsePrometheusServer(this IApplicationBuilder app, Action <PrometheusOptions> setupOptions) { var options = new PrometheusOptions(); setupOptions?.Invoke(options); if (app == null) { throw new ArgumentNullException(nameof(app)); } if (options == null) { throw new ArgumentNullException(nameof(options)); } if (!options.MapPath.StartsWith("/")) { throw new ArgumentException($"MapPath '{options.MapPath}' should start with '/'"); } RegisterCollectors(options); app.Map(options.MapPath, coreapp => { coreapp.Run(async context => { var req = context.Request; var response = context.Response; req.Headers.TryGetValue("Accept", out var acceptHeaders); var contentType = ScrapeHandler.GetContentType(acceptHeaders); response.ContentType = contentType; using (var outputStream = response.Body) { var collected = options.CollectorRegistryInstance.CollectAll(); ScrapeHandler.ProcessScrapeRequest(collected, contentType, outputStream); } await Task.FromResult(0).ConfigureAwait(false); }); }); return(app); }
/// <summary> /// Add PrometheusServer request execution pipeline. /// </summary> public static IApplicationBuilder UsePrometheusServer(this IApplicationBuilder app, Action <PrometheusOptions> setupOptions) { var options = new PrometheusOptions(); setupOptions?.Invoke(options); if (app == null) { throw new ArgumentNullException(nameof(app)); } if (options == null) { throw new ArgumentNullException(nameof(options)); } if (!options.MapPath.StartsWith("/")) { throw new ArgumentException($"MapPath '{options.MapPath}' should start with '/'"); } RegisterCollectors(options); app.Map(options.MapPath, coreapp => { coreapp.Run(async context => { var response = context.Response; response.ContentType = "text/plain; version=0.0.4"; using (var outputStream = response.Body) { ScrapeHandler.Process(options.CollectorRegistryInstance, outputStream); } await Task.FromResult(0).ConfigureAwait(false); }); }); return(app); }