1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.test;
20
21 import org.apache.hadoop.hbase.metrics.BaseSource;
22 import org.apache.hadoop.hbase.metrics.BaseSourceImpl;
23 import org.apache.hadoop.metrics2.Metric;
24 import org.apache.hadoop.metrics2.MetricsBuilder;
25 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
26 import org.apache.hadoop.metrics2.MetricsSource;
27 import org.apache.hadoop.metrics2.MetricsTag;
28 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
29
30 import java.util.HashMap;
31 import java.util.Map;
32
33 import static org.junit.Assert.*;
34
35
36
37
38 public class MetricsAssertHelperImpl implements MetricsAssertHelper {
39
40 private Map<String, String> tags = new HashMap<String, String>();
41 private Map<String, Number> gauges = new HashMap<String, Number>();
42 private Map<String, Long> counters = new HashMap<String, Long>();
43
44 public class MockMetricsBuilder implements MetricsBuilder {
45
46 @Override
47 public MetricsRecordBuilder addRecord(String s) {
48 return new MockRecordBuilder();
49 }
50 }
51
52 public class MockRecordBuilder extends MetricsRecordBuilder {
53
54 @Override
55 public MetricsRecordBuilder tag(String s, String s1, String s2) {
56 tags.put(canonicalizeMetricName(s), s2);
57 return this;
58 }
59
60 @Override
61 public MetricsRecordBuilder add(MetricsTag metricsTag) {
62 tags.put(canonicalizeMetricName(metricsTag.name()), metricsTag.value());
63 return this;
64 }
65
66 @Override
67 public MetricsRecordBuilder setContext(String s) {
68 return this;
69 }
70
71 @Override
72 public MetricsRecordBuilder addCounter(String s, String s1, int i) {
73 counters.put(canonicalizeMetricName(s), Long.valueOf(i));
74 return this;
75 }
76
77 @Override
78 public MetricsRecordBuilder addCounter(String s, String s1, long l) {
79 counters.put(canonicalizeMetricName(s), Long.valueOf(l));
80 return this;
81 }
82
83 @Override
84 public MetricsRecordBuilder addGauge(String s, String s1, int i) {
85 gauges.put(canonicalizeMetricName(s), Long.valueOf(i));
86 return this;
87 }
88
89 @Override
90 public MetricsRecordBuilder addGauge(String s, String s1, long l) {
91 gauges.put(canonicalizeMetricName(s), Long.valueOf(l));
92 return this;
93 }
94
95 @Override
96 public MetricsRecordBuilder addGauge(String s, String s1, float v) {
97 gauges.put(canonicalizeMetricName(s), Double.valueOf(v));
98 return this;
99 }
100
101 @Override
102 public MetricsRecordBuilder addGauge(String s, String s1, double v) {
103 gauges.put(canonicalizeMetricName(s), Double.valueOf(v));
104 return this;
105 }
106
107 @Override
108 public MetricsRecordBuilder add(Metric metric) {
109 gauges.put(canonicalizeMetricName(metric.name()), metric.value());
110 return this;
111 }
112 }
113
114 @Override
115 public void init() {
116
117 }
118
119 @Override
120 public void assertTag(String name, String expected, BaseSource source) {
121 getMetrics(source);
122 String cName = canonicalizeMetricName(name);
123 assertEquals("Tags should be equal", expected, tags.get(cName));
124 }
125
126 @Override
127 public void assertGauge(String name, long expected, BaseSource source) {
128 long found = getGaugeLong(name, source);
129 assertEquals("Metrics Should be equal", (long) Long.valueOf(expected), found);
130 }
131
132 @Override
133 public void assertGaugeGt(String name, long expected, BaseSource source) {
134 double found = getGaugeDouble(name, source);
135 assertTrue(name + " (" + found + ") should be greater than " + expected, found > expected);
136 }
137
138 @Override
139 public void assertGaugeLt(String name, long expected, BaseSource source) {
140 double found = getGaugeDouble(name, source);
141 assertTrue(name + "(" + found + ") should be less than " + expected, found < expected);
142 }
143
144 @Override
145 public void assertGauge(String name, double expected, BaseSource source) {
146 double found = getGaugeDouble(name, source);
147 assertEquals("Metrics Should be equal", (double) Double.valueOf(expected), found, 0.01);
148 }
149
150 @Override
151 public void assertGaugeGt(String name, double expected, BaseSource source) {
152 double found = getGaugeDouble(name, source);
153 assertTrue(name + "(" + found + ") should be greater than " + expected, found > expected);
154 }
155
156 @Override
157 public void assertGaugeLt(String name, double expected, BaseSource source) {
158 double found = getGaugeDouble(name, source);
159 assertTrue(name + "(" + found + ") should be less than " + expected, found < expected);
160 }
161
162 @Override
163 public void assertCounter(String name, long expected, BaseSource source) {
164 long found = getCounter(name, source);
165 assertEquals("Metrics Counters should be equal", (long) Long.valueOf(expected), found);
166 }
167
168 @Override
169 public void assertCounterGt(String name, long expected, BaseSource source) {
170 long found = getCounter(name, source);
171 assertTrue(name + " (" + found + ") should be greater than " + expected, found > expected);
172 }
173
174 @Override
175 public void assertCounterLt(String name, long expected, BaseSource source) {
176 long found = getCounter(name, source);
177 assertTrue(name + "(" + found + ") should be less than " + expected, found < expected);
178 }
179
180 @Override
181 public long getCounter(String name, BaseSource source) {
182 getMetrics(source);
183 String cName = canonicalizeMetricName(name);
184 assertNotNull("Should get counter "+cName + " but did not",counters.get(cName));
185 return counters.get(cName).longValue();
186 }
187
188 @Override
189 public boolean checkCounterExists(String name, BaseSource source) {
190 getMetrics(source);
191 String cName = canonicalizeMetricName(name);
192 return (counters.get(cName) != null) ? true : false;
193 }
194
195 @Override
196 public double getGaugeDouble(String name, BaseSource source) {
197 getMetrics(source);
198 String cName = canonicalizeMetricName(name);
199 assertNotNull("Should get gauge "+cName + " but did not",gauges.get(cName));
200 return gauges.get(cName).doubleValue();
201 }
202
203 @Override
204 public long getGaugeLong(String name, BaseSource source) {
205 getMetrics(source);
206 String cName = canonicalizeMetricName(name);
207 assertNotNull("Should get gauge " + cName + " but did not", gauges.get(cName));
208 return gauges.get(cName).longValue();
209 }
210
211 private void reset() {
212 tags.clear();
213 gauges.clear();
214 counters.clear();
215 }
216
217 private void getMetrics(BaseSource source) {
218 reset();
219 if (!(source instanceof MetricsSource)) {
220 assertTrue("The Source passed must be a MetricsSource", false);
221 }
222 MetricsSource impl = (MetricsSource) source;
223
224 impl.getMetrics(new MockMetricsBuilder(), true);
225
226 }
227
228 private String canonicalizeMetricName(String in) {
229 return in.toLowerCase().replaceAll("[^A-Za-z0-9 ]", "");
230 }
231 }