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