Ejemplo n.º 1
0
 private static ITimer RequestTimer(this IMetrics metrics, BucketTimerOptions bucketTimerOptions)
 {
     if (bucketTimerOptions != null)
     {
         return(metrics.Provider.BucketTimer.Instance(bucketTimerOptions));
     }
     return(metrics.Provider.Timer.Instance(HttpRequestMetricsRegistry.Timers.RequestTransactionDuration));
 }
Ejemplo n.º 2
0
 /// <summary>
 ///     Records the time taken to execute an API's endpoint in nanoseconds. Tags metrics by OAuth2 client id (if it exists)
 ///     and the endpoints route template.
 /// </summary>
 /// <param name="metrics">The metrics.</param>
 /// <param name="bucketTimerOptions">The bucket timer options.</param>
 /// <param name="clientId">The OAuth2 client identifier, with track min/max durations by clientid.</param>
 /// <param name="routeTemplate">The route template of the endpoint.</param>
 /// <param name="elapsed">The time elapsed in executing the endpoints request.</param>
 public static void RecordEndpointsRequestTime(this IMetrics metrics, BucketTimerOptions bucketTimerOptions, string clientId, string routeTemplate, long elapsed)
 {
     metrics.EndpointRequestTimer(routeTemplate, bucketTimerOptions).
     Record(
         elapsed,
         TimeUnit.Nanoseconds,
         clientId.IsPresent() ? clientId : null);
 }
Ejemplo n.º 3
0
        private static void RecordOverallPercentageOfErrorRequests(IMetrics metrics, BucketTimerOptions bucketTimerOptions)
        {
            var totalErrorRate = metrics.Provider.Meter.Instance(HttpRequestMetricsRegistry.Meters.ErrorRequestRate);
            var overallRequestTransactionTime = metrics.RequestTimer(bucketTimerOptions);

            metrics.Measure.Gauge.SetValue(
                HttpRequestMetricsRegistry.Gauges.OneMinErrorPercentageRate,
                () => new HitPercentageGauge(totalErrorRate, overallRequestTransactionTime, m => m.OneMinuteRate));
        }
Ejemplo n.º 4
0
        static MeasureBucketTimerBenchmark()
        {
            Metrics = new BucketTimerOptions[NumberOfMetrics];

            for (var i = 0; i < NumberOfMetrics; i++)
            {
                Metrics[i] = new BucketTimerOptions
                {
                    Name    = $"metric_{i:D4}",
                    Buckets = new[] { .005, .01, .025, .05, .075, .1, .25, .5, .75, 1, 2.5, 5, 7.5, 10 }
                }
            }
            ;
        }
Ejemplo n.º 5
0
        /// <inheritdoc />
        public ITimer BucketTimer <T>(BucketTimerOptions options, MetricTags tags, Func <T> builder)
            where T : IBucketTimerMetric
        {
            if (_nullMetricsRegistry.IsValueCreated)
            {
                _nullMetricsRegistry.Value.BucketTimer(options, tags, builder);
            }

            EnsureContextLabel(options);

            var contextRegistry = _contexts.GetOrAdd(options.Context, _newContextRegistry);

            return(contextRegistry.BucketTimer(options, tags, builder));
        }
Ejemplo n.º 6
0
        /// <summary>
        ///     Records metrics about an HTTP request error, counts the total number of errors for each status code, measures the
        ///     rate and percentage of HTTP error requests tagging by client id (if it exists) the endpoints route template and
        ///     HTTP status code.
        /// </summary>
        /// <param name="metrics">The metrics.</param>
        /// <param name="routeTemplate">The route template of the endpoint.</param>
        /// <param name="httpStatusCode">The HTTP status code.</param>
        /// <param name="bucketTimerOptions">The Bucket Timer options.</param>
        public static void RecordHttpRequestError(
            this IMetrics metrics,
            string routeTemplate,
            int httpStatusCode,
            BucketTimerOptions bucketTimerOptions)
        {
            CountOverallErrorRequestsByHttpStatusCode(metrics, httpStatusCode);

            metrics.Measure.Meter.Mark(HttpRequestMetricsRegistry.Meters.ErrorRequestRate);

            RecordEndpointsHttpRequestErrors(metrics, routeTemplate, httpStatusCode);
            RecordOverallPercentageOfErrorRequests(metrics, bucketTimerOptions);
            RecordEndpointsPercentageOfErrorRequests(metrics, routeTemplate, bucketTimerOptions);
        }
 public PerRequestTimerMiddleware(
     RequestDelegate next,
     IOptions <MetricsWebTrackingOptions> trackingMiddlwareOptionsAccessor,
     ILogger <PerRequestTimerMiddleware> logger,
     IMetrics metrics)
 {
     _next    = next ?? throw new ArgumentNullException(nameof(next));
     _logger  = logger;
     _metrics = metrics;
     _ignoredHttpStatusCodes = trackingMiddlwareOptionsAccessor.Value.IgnoredHttpStatusCodes;
     if (trackingMiddlwareOptionsAccessor.Value.UseBucketHistograms)
     {
         _useBucketTimer     = true;
         _bucketTimerOptions = HttpRequestMetricsRegistry.BucketTimers.EndpointRequestTransactionDuration(trackingMiddlwareOptionsAccessor.Value.RequestTimeHistogramBuckets);
     }
 }
Ejemplo n.º 8
0
        public void Can_register_timer_with_custom_histogram()
        {
            var histogram    = new CustomBucketHistogramMetric();
            var timerOptions = new BucketTimerOptions
            {
                Name            = "custom",
                MeasurementUnit = Unit.Calls,
                DurationUnit    = TimeUnit.Nanoseconds
            };

            var timer = _fixture.Metrics.Provider.BucketTimer.WithHistogram(timerOptions, () => histogram);

            timer.Record(10L, TimeUnit.Nanoseconds);

            histogram.Size.Should().Be(1);
            histogram.Values.Single().Should().Be(10L);
        }
        /// <inheritdoc />
        public ITimer BucketTimer <T>(BucketTimerOptions options, MetricTags tags, Func <T> builder)
            where T : IBucketTimerMetric
        {
            var allTags    = AllTags(MetricTags.Concat(options.Tags, tags));
            var metricName = allTags.AsMetricName(options.Name);

            return(_bucketTimers.GetOrAdd(
                       metricName,
                       () =>
            {
                Logger.Trace("Adding Timer {Name} - {@Options} {MesurementUnit} {DurationUnit} {RateUnit} {@Tags}", metricName, options, options.MeasurementUnit.ToString(), options.DurationUnit, options.RateUnit, allTags.ToDictionary());

                var timer = builder();
                var valueSource = new BucketTimerValueSource(
                    metricName,
                    timer,
                    options.MeasurementUnit,
                    options.RateUnit,
                    options.DurationUnit,
                    allTags);
                return Tuple.Create((ITimer)timer, valueSource);
            }));
        }
Ejemplo n.º 10
0
 /// <inheritdoc />
 public ITimer BucketTimer <T>(BucketTimerOptions options, MetricTags tags, Func <T> builder)
     where T : IBucketTimerMetric
 {
     return(_bucketTimerInstance);
 }
Ejemplo n.º 11
0
        private static void RecordEndpointsPercentageOfErrorRequests(IMetrics metrics, string routeTemplate, BucketTimerOptions bucketTimerOptions)
        {
            var tags = new MetricTags(MiddlewareConstants.DefaultTagKeys.Route, routeTemplate);

            var endpointsErrorRate = metrics.Provider.Meter.Instance(HttpRequestMetricsRegistry.Meters.EndpointErrorRequestRate, tags);
            var endpointsRequestTransactionTime = metrics.EndpointRequestTimer(routeTemplate, bucketTimerOptions);

            metrics.Measure.Gauge.SetValue(
                HttpRequestMetricsRegistry.Gauges.EndpointOneMinuteErrorPercentageRate,
                tags,
                () => new HitPercentageGauge(endpointsErrorRate, endpointsRequestTransactionTime, m => m.OneMinuteRate));
        }
Ejemplo n.º 12
0
        private static ITimer EndpointRequestTimer(this IMetrics metrics, string routeTemplate, BucketTimerOptions bucketTimerOptions)
        {
            var tags = new MetricTags(MiddlewareConstants.DefaultTagKeys.Route, routeTemplate);

            if (bucketTimerOptions != null)
            {
                return(metrics.Provider.BucketTimer.Instance(bucketTimerOptions, tags));
            }
            return(metrics.Provider.Timer.Instance(HttpRequestMetricsRegistry.Timers.EndpointRequestTransactionDuration, tags));
        }