Esempio n. 1
0
        /// <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)));
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }