public static IApplicationBuilder UsePrometheusRequestDurations(this IApplicationBuilder app, Action <HttpRequestDurationsOptions> setupAction)
        {
            var options = new HttpRequestDurationsOptions();

            setupAction?.Invoke(options);
            return(app.UseMiddleware <HttpRequestDurationsMiddleware>(options));
        }
        public HttpRequestDurationsMiddleware(RequestDelegate next, HttpRequestDurationsOptions options)
        {
            _next    = next;
            _options = options;

            var labels = new List <string>();

            if (_options.IncludeStatusCode)
            {
                labels.Add("status_code");
            }

            if (_options.IncludeMethod)
            {
                labels.Add("method");
            }

            if (_options.IncludePath)
            {
                labels.Add("path");
            }

            _metricHelpText += string.Join(", ", labels);
            _histogram       = _options.CollectorRegistry == null
                ? Metrics.CreateHistogram(options.MetricName, _metricHelpText, labels.ToArray())
                : Metrics.WithCustomRegistry(options.CollectorRegistry).CreateHistogram(options.MetricName, _metricHelpText, labels.ToArray());
        }
        /// <summary>
        ///     Metrics logging of request durations
        /// </summary>
        /// <param name="app">IApplicationBuilder</param>
        /// <param name="setupOptions">Setup Options</param>
        public static IApplicationBuilder UsePrometheusRequestDurations(this IApplicationBuilder app, Action <HttpRequestDurationsOptions> setupOptions)
        {
            var options = new HttpRequestDurationsOptions();

            setupOptions?.Invoke(options);

            options.CollectorRegistry
            ??= (ICollectorRegistry)app.ApplicationServices.GetService(typeof(ICollectorRegistry))
            ?? Metrics.DefaultCollectorRegistry;

            return(app.UseMiddleware <HttpRequestDurationsMiddleware>(options));
        }
        public HttpRequestDurationsMiddleware(RequestDelegate next, HttpRequestDurationsOptions options)
        {
            _next    = next;
            _options = options;
            var metricFactory = new MetricFactory(options.CollectorRegistry);

            var labels = new List <string>();

            if (_options.IncludeStatusCode)
            {
                labels.Add("status_code");
            }

            if (_options.IncludeMethod)
            {
                labels.Add("method");
            }

#if HasRoutes
            if (_options.IncludeController)
            {
                labels.Add("controller");
            }

            if (_options.IncludeAction)
            {
                labels.Add("action");
            }
#endif

            if (_options.IncludePath)
            {
                labels.Add("path");
            }

            if (_options.IncludeCustomLabels)
            {
                labels.AddRange(_options.CustomLabels.Select(customLabel => customLabel.Key));
            }

            _metricHelpText += string.Join(", ", labels);
            _histogram       = metricFactory.CreateHistogram(options.MetricName, _metricHelpText, options.IncludeTimestamp, options.Buckets, labels.ToArray());
        }