View Javadoc

1   package com.atlassian.vcache.internal.core.metrics;
2   
3   import com.atlassian.vcache.internal.MetricLabel;
4   import com.atlassian.vcache.internal.RequestContext;
5   
6   import java.util.function.Predicate;
7   import java.util.function.Supplier;
8   
9   import static java.util.Objects.requireNonNull;
10  
11  /**
12   * Metrics collector that collects metrics only for specified requests.
13   *
14   * @since 1.4.0
15   */
16  public class SamplingMetricsCollector extends DefaultMetricsCollector {
17  
18      private static final NoOpRequestMetrics NOOP_REQUEST_METRICS = new NoOpRequestMetrics();
19  
20      private final Predicate<RequestContext> collectMetrics;
21  
22      public SamplingMetricsCollector(
23              Supplier<RequestContext> contextSupplier,
24              Predicate<RequestContext> collectMetrics) {
25          super(contextSupplier);
26          this.collectMetrics = requireNonNull(collectMetrics);
27      }
28  
29      @Override
30      protected MutableRequestMetrics obtainMetrics(RequestContext context) {
31          return context.computeIfAbsent(this, () ->
32                  collectMetrics.test(context) ? new DefaultRequestMetrics() : NOOP_REQUEST_METRICS);
33      }
34  
35      private static class NoOpRequestMetrics extends EmptyRequestMetrics implements MutableRequestMetrics {
36          @Override
37          public void record(String cacheName, CacheType cacheType, MetricLabel metricLabel, long sample) {
38              // do nothing
39          }
40      }
41  }