View Javadoc

1   package com.atlassian.vcache.internal.core.metrics;
2   
3   import com.atlassian.marshalling.api.MarshallingPair;
4   import com.atlassian.vcache.DirectExternalCache;
5   import com.atlassian.vcache.JvmCache;
6   import com.atlassian.vcache.RequestCache;
7   import com.atlassian.vcache.StableReadExternalCache;
8   import com.atlassian.vcache.TransactionalExternalCache;
9   import com.atlassian.vcache.internal.MetricLabel;
10  import com.atlassian.vcache.internal.RequestContext;
11  import com.atlassian.vcache.internal.RequestMetrics;
12  import com.atlassian.vcache.internal.core.TransactionControl;
13  
14  import java.util.function.Supplier;
15  
16  import static java.util.Objects.requireNonNull;
17  
18  /**
19   * Implementation of {@link MetricsCollector}.
20   *
21   * @since 1.0.0
22   */
23  public class DefaultMetricsCollector implements MetricsCollector {
24  
25      private final Supplier<RequestContext> contextSupplier;
26  
27      public DefaultMetricsCollector(Supplier<RequestContext> contextSupplier) {
28          this.contextSupplier = requireNonNull(contextSupplier);
29      }
30  
31      @Override
32      public void record(String cacheName, CacheType cacheType, MetricLabel metricLabel, long sample) {
33          obtainMetrics(contextSupplier.get()).record(cacheName, cacheType, metricLabel, sample);
34      }
35  
36      @Override
37      public RequestMetrics obtainRequestMetrics(RequestContext context) {
38          return obtainMetrics(context);
39      }
40  
41      @Override
42      public TransactionControl wrap(TransactionControl control, String cacheName) {
43          return new TimedTransactionControl(control, this, cacheName);
44      }
45  
46      @Override
47      public <T> MarshallingPair<T> wrap(MarshallingPair<T> marshalling, String cacheName) {
48          return new MarshallingPair<>(
49                  new TimedMarshaller<>(marshalling.getMarshaller(), this, cacheName),
50                  new TimedUnmarshaller<>(marshalling.getUnmarshaller(), this, cacheName));
51      }
52  
53      @Override
54      public <K, V> JvmCache<K, V> wrap(JvmCache<K, V> cache) {
55          return new TimedJvmCache<>(cache, this);
56      }
57  
58      @Override
59      public <K, V> RequestCache<K, V> wrap(RequestCache<K, V> cache) {
60          return new TimedRequestCache<>(cache, this);
61      }
62  
63      @Override
64      public <V> DirectExternalCache<V> wrap(DirectExternalCache<V> cache) {
65          return new TimedDirectExternalCache<>(this, cache);
66      }
67  
68      @Override
69      public <V> StableReadExternalCache<V> wrap(StableReadExternalCache<V> cache) {
70          return new TimedStableReadExternalCache<>(this, cache);
71      }
72  
73      @Override
74      public <V> TransactionalExternalCache<V> wrap(TransactionalExternalCache<V> cache) {
75          return new TimedTransactionalExternalCache<>(this, cache);
76      }
77  
78      MutableRequestMetrics obtainMetrics(RequestContext context) {
79          return context.computeIfAbsent(this, DefaultRequestMetrics::new);
80      }
81  }