private async Task StoreTimingAsync(TimeBucket timeBucket, AggregatedTimingMetric timing)
        {
            _logger.Trace(() => $"Storing timing name={timing.Key.Name} count={timing.Count} total={timing.TotalDuration} min={timing.MinDuration} max={timing.MaxDuration} time={timing.Key.StartTimeUtc}");

            string countKey = GetBucketKey(CacheMetricNames.Timing, timing.Key.Name, timing.Key.StartTimeUtc, timeBucket.Size, CacheMetricNames.Count);
            await _cache.IncrementAsync(countKey, timing.Count, timeBucket.Ttl).AnyContext();

            string totalDurationKey = GetBucketKey(CacheMetricNames.Timing, timing.Key.Name, timing.Key.StartTimeUtc, timeBucket.Size, CacheMetricNames.Total);
            await _cache.IncrementAsync(totalDurationKey, timing.TotalDuration, timeBucket.Ttl).AnyContext();

            string maxKey = GetBucketKey(CacheMetricNames.Timing, timing.Key.Name, timing.Key.StartTimeUtc, timeBucket.Size, CacheMetricNames.Max);
            await _cache.SetIfHigherAsync(maxKey, timing.MaxDuration, timeBucket.Ttl).AnyContext();

            string minKey = GetBucketKey(CacheMetricNames.Timing, timing.Key.Name, timing.Key.StartTimeUtc, timeBucket.Size, CacheMetricNames.Min);
            await _cache.SetIfLowerAsync(minKey, timing.MinDuration, timeBucket.Ttl).AnyContext();

            _logger.Trace(() => $"Done storing timing name={timing.Key.Name}");
        }
        private async Task StoreTimingAsync(TimeBucket timeBucket, AggregatedTimingMetric timing)
        {
            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("Storing timing name={Name} count={Count} total={TotalDuration} min={MinDuration} max={MaxDuration} time={StartTimeUtc}", timing.Key.Name, timing.Count, timing.TotalDuration, timing.MinDuration, timing.MaxDuration, timing.Key.StartTimeUtc);
            }

            string countKey         = GetBucketKey(CacheMetricNames.Timing, timing.Key.Name, timing.Key.StartTimeUtc, timeBucket.Size, CacheMetricNames.Count);
            string totalDurationKey = GetBucketKey(CacheMetricNames.Timing, timing.Key.Name, timing.Key.StartTimeUtc, timeBucket.Size, CacheMetricNames.Total);
            string maxKey           = GetBucketKey(CacheMetricNames.Timing, timing.Key.Name, timing.Key.StartTimeUtc, timeBucket.Size, CacheMetricNames.Max);
            string minKey           = GetBucketKey(CacheMetricNames.Timing, timing.Key.Name, timing.Key.StartTimeUtc, timeBucket.Size, CacheMetricNames.Min);

            await Task.WhenAll(
                _cache.IncrementAsync(countKey, timing.Count, timeBucket.Ttl),
                _cache.IncrementAsync(totalDurationKey, timing.TotalDuration, timeBucket.Ttl),
                _cache.SetIfHigherAsync(maxKey, timing.MaxDuration, timeBucket.Ttl),
                _cache.SetIfLowerAsync(minKey, timing.MinDuration, timeBucket.Ttl)
                ).AnyContext();

            if (_logger.IsEnabled(LogLevel.Trace))
            {
                _logger.LogTrace("Done storing timing name={Name}", timing.Key.Name);
            }
        }