1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.hadoop.hbase.regionserver.metrics;
21
22 import java.util.Map;
23 import java.util.Map.Entry;
24 import java.util.concurrent.ConcurrentHashMap;
25 import java.util.concurrent.ConcurrentMap;
26 import java.util.concurrent.atomic.AtomicInteger;
27 import java.util.concurrent.atomic.AtomicLong;
28
29 import org.apache.hadoop.hbase.util.Pair;
30
31
32
33
34
35
36
37 public class RegionMetricsStorage {
38
39
40 private static final ConcurrentMap<String, AtomicLong> numericMetrics =
41 new ConcurrentHashMap<String, AtomicLong>();
42
43
44
45 private static final ConcurrentMap<String, AtomicLong> numericPersistentMetrics =
46 new ConcurrentHashMap<String, AtomicLong>();
47
48
49
50
51
52 private static final ConcurrentMap<String, Pair<AtomicLong, AtomicInteger>> timeVaryingMetrics =
53 new ConcurrentHashMap<String, Pair<AtomicLong, AtomicInteger>>();
54
55 public static Map<String, AtomicLong> getNumericMetrics() {
56 return numericMetrics;
57 }
58
59 public static Map<String, AtomicLong> getNumericPersistentMetrics() {
60 return numericPersistentMetrics;
61 }
62
63 public static Map<String, Pair<AtomicLong, AtomicInteger>> getTimeVaryingMetrics() {
64 return timeVaryingMetrics;
65 }
66
67 public static void incrNumericMetric(String key, long amount) {
68 AtomicLong oldVal = numericMetrics.get(key);
69 if (oldVal == null) {
70 oldVal = numericMetrics.putIfAbsent(key, new AtomicLong(amount));
71 if (oldVal == null)
72 return;
73 }
74 oldVal.addAndGet(amount);
75 }
76
77 public static void incrTimeVaryingMetric(String key, long amount) {
78 Pair<AtomicLong, AtomicInteger> oldVal = timeVaryingMetrics.get(key);
79 if (oldVal == null) {
80 oldVal =
81 timeVaryingMetrics.putIfAbsent(key,
82 new Pair<AtomicLong, AtomicInteger>(
83 new AtomicLong(amount),
84 new AtomicInteger(1)));
85 if (oldVal == null)
86 return;
87 }
88 oldVal.getFirst().addAndGet(amount);
89 oldVal.getSecond().incrementAndGet();
90 }
91
92 public static void setNumericPersistentMetric(String key, long amount) {
93 numericPersistentMetrics.put(key, new AtomicLong(amount));
94 }
95 public static void incrNumericPersistentMetric(String key, long amount) {
96 AtomicLong oldVal = numericPersistentMetrics.get(key);
97 if (oldVal == null) {
98 oldVal = numericPersistentMetrics.putIfAbsent(key, new AtomicLong(amount));
99 if (oldVal == null)
100 return;
101 }
102 oldVal.addAndGet(amount);
103 }
104
105 public static void setNumericMetric(String key, long amount) {
106 numericMetrics.put(key, new AtomicLong(amount));
107 }
108
109 public static long getNumericMetric(String key) {
110 AtomicLong m = numericMetrics.get(key);
111 if (m == null)
112 return 0;
113 return m.get();
114 }
115
116 public static Pair<Long, Integer> getTimeVaryingMetric(String key) {
117 Pair<AtomicLong, AtomicInteger> pair = timeVaryingMetrics.get(key);
118 if (pair == null) {
119 return new Pair<Long, Integer>(0L, 0);
120 }
121
122 return new Pair<Long, Integer>(pair.getFirst().get(), pair.getSecond().get());
123 }
124
125 public static long getNumericPersistentMetric(String key) {
126 AtomicLong m = numericPersistentMetrics.get(key);
127 if (m == null)
128 return 0;
129 return m.get();
130 }
131
132
133
134
135
136 public static void clear(String regionEncodedName) {
137 timeVaryingMetrics.clear();
138 numericMetrics.clear();
139 for (Entry<String, AtomicLong> entry : RegionMetricsStorage.getNumericPersistentMetrics().entrySet()) {
140 if (entry.getKey().contains(regionEncodedName))
141 {
142 String keyName = entry.getKey();
143 numericPersistentMetrics.remove(keyName);
144 }
145 }
146 }
147 }