1 package com.atlassian.vcache.internal.core.metrics;
2
3 import com.atlassian.vcache.internal.LongMetric;
4 import com.atlassian.vcache.internal.MetricLabel;
5 import com.atlassian.vcache.internal.RequestMetrics;
6
7 import java.util.Collections;
8 import java.util.EnumMap;
9 import java.util.HashMap;
10 import java.util.Map;
11 import java.util.concurrent.ConcurrentHashMap;
12
13
14
15
16
17
18 class DefaultRequestMetrics implements MutableRequestMetrics, RequestMetrics {
19 private final Map<CacheType, Map<String, Map<MetricLabel, DefaultLongMetric>>> allMetricsMap =
20 Collections.synchronizedMap(new EnumMap<>(CacheType.class));
21
22 @Override
23 public void record(String cacheName, CacheType cacheType, MetricLabel metricLabel, long sample) {
24 final Map<String, Map<MetricLabel, DefaultLongMetric>> cacheTypeMetricsMap =
25 allMetricsMap.computeIfAbsent(cacheType, k -> new ConcurrentHashMap<>());
26
27 final Map<MetricLabel, DefaultLongMetric> cacheMetricsMap =
28 cacheTypeMetricsMap.computeIfAbsent(cacheName, k -> Collections.synchronizedMap(new EnumMap<>(MetricLabel.class)));
29
30 final DefaultLongMetric metric = cacheMetricsMap.computeIfAbsent(metricLabel, k -> new DefaultLongMetric());
31 metric.record(sample);
32 }
33
34 @Override
35 @SuppressWarnings("unchecked")
36 public Map<String, Map<MetricLabel, ? extends LongMetric>> allJvmCacheLongMetrics() {
37 return new HashMap(allMetricsMap.computeIfAbsent(CacheType.JVM, k -> new ConcurrentHashMap<>()));
38 }
39
40 @Override
41 @SuppressWarnings("unchecked")
42 public Map<String, Map<MetricLabel, ? extends LongMetric>> allRequestCacheLongMetrics() {
43 return new HashMap(allMetricsMap.computeIfAbsent(CacheType.REQUEST, k -> new ConcurrentHashMap<>()));
44 }
45
46 @Override
47 @SuppressWarnings("unchecked")
48 public Map<String, Map<MetricLabel, ? extends LongMetric>> allExternalCacheLongMetrics() {
49 return new HashMap(allMetricsMap.computeIfAbsent(CacheType.EXTERNAL, k -> new ConcurrentHashMap<>()));
50 }
51 }