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
20
21
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 }