View Javadoc

1   /**
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
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   *  A helper class that will allow tests to get into hadoop1's metrics2 values.
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     // In hadoop 1 there's no minicluster mode so there's nothing to do here.
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 }