001/**
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.regionserver;
019
020import static org.junit.Assert.assertEquals;
021import static org.junit.Assert.assertNotEquals;
022import static org.junit.Assert.assertNotNull;
023import static org.junit.Assert.assertTrue;
024
025import java.io.IOException;
026import java.util.ArrayList;
027import java.util.List;
028import org.apache.hadoop.conf.Configuration;
029import org.apache.hadoop.hbase.CompatibilityFactory;
030import org.apache.hadoop.hbase.HBaseClassTestRule;
031import org.apache.hadoop.hbase.HBaseTestingUtility;
032import org.apache.hadoop.hbase.HColumnDescriptor;
033import org.apache.hadoop.hbase.HConstants;
034import org.apache.hadoop.hbase.HRegionInfo;
035import org.apache.hadoop.hbase.HRegionLocation;
036import org.apache.hadoop.hbase.HTableDescriptor;
037import org.apache.hadoop.hbase.MiniHBaseCluster;
038import org.apache.hadoop.hbase.NamespaceDescriptor;
039import org.apache.hadoop.hbase.TableName;
040import org.apache.hadoop.hbase.client.Admin;
041import org.apache.hadoop.hbase.client.Append;
042import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
043import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
044import org.apache.hadoop.hbase.client.Connection;
045import org.apache.hadoop.hbase.client.Durability;
046import org.apache.hadoop.hbase.client.Get;
047import org.apache.hadoop.hbase.client.Increment;
048import org.apache.hadoop.hbase.client.Put;
049import org.apache.hadoop.hbase.client.RegionLocator;
050import org.apache.hadoop.hbase.client.Result;
051import org.apache.hadoop.hbase.client.ResultScanner;
052import org.apache.hadoop.hbase.client.Scan;
053import org.apache.hadoop.hbase.client.Table;
054import org.apache.hadoop.hbase.client.TableDescriptor;
055import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
056import org.apache.hadoop.hbase.master.LoadBalancer;
057import org.apache.hadoop.hbase.test.MetricsAssertHelper;
058import org.apache.hadoop.hbase.testclassification.LargeTests;
059import org.apache.hadoop.hbase.testclassification.RegionServerTests;
060import org.apache.hadoop.hbase.util.Bytes;
061import org.apache.hadoop.hbase.util.Threads;
062import org.junit.After;
063import org.junit.AfterClass;
064import org.junit.Before;
065import org.junit.BeforeClass;
066import org.junit.ClassRule;
067import org.junit.Ignore;
068import org.junit.Rule;
069import org.junit.Test;
070import org.junit.experimental.categories.Category;
071import org.junit.rules.TestName;
072import org.slf4j.Logger;
073import org.slf4j.LoggerFactory;
074
075@Category({RegionServerTests.class, LargeTests.class})
076public class TestRegionServerMetrics {
077
078  @ClassRule
079  public static final HBaseClassTestRule CLASS_RULE =
080      HBaseClassTestRule.forClass(TestRegionServerMetrics.class);
081
082  private static final Logger LOG = LoggerFactory.getLogger(TestRegionServerMetrics.class);
083
084  @Rule
085  public TestName testName = new TestName();
086
087  private static MetricsAssertHelper metricsHelper;
088  private static MiniHBaseCluster cluster;
089  private static HRegionServer rs;
090  private static Configuration conf;
091  private static HBaseTestingUtility TEST_UTIL;
092  private static Connection connection;
093  private static MetricsRegionServer metricsRegionServer;
094  private static MetricsRegionServerSource serverSource;
095  private static final int NUM_SCAN_NEXT = 30;
096  private static int numScanNext = 0;
097  private static byte[] cf = Bytes.toBytes("cf");
098  private static byte[] row = Bytes.toBytes("row");
099  private static byte[] qualifier = Bytes.toBytes("qual");
100  private static byte[] val = Bytes.toBytes("val");
101  private static Admin admin;
102  private static boolean TABLES_ON_MASTER;
103
104  @BeforeClass
105  public static void startCluster() throws Exception {
106    metricsHelper = CompatibilityFactory.getInstance(MetricsAssertHelper.class);
107    TEST_UTIL = new HBaseTestingUtility();
108    TABLES_ON_MASTER = LoadBalancer.isTablesOnMaster(TEST_UTIL.getConfiguration());
109    conf = TEST_UTIL.getConfiguration();
110    conf.getLong("hbase.splitlog.max.resubmit", 0);
111    // Make the failure test faster
112    conf.setInt("zookeeper.recovery.retry", 0);
113    // testMobMetrics creates few hfiles and manages compaction manually.
114    conf.setInt("hbase.hstore.compactionThreshold", 100);
115    conf.setInt("hbase.hstore.compaction.max", 100);
116    conf.setInt("hbase.regionserver.periodicmemstoreflusher.rangeofdelayseconds", 4*60);
117    conf.setInt(HConstants.REGIONSERVER_INFO_PORT, -1);
118
119    TEST_UTIL.startMiniCluster();
120    cluster = TEST_UTIL.getHBaseCluster();
121    cluster.waitForActiveAndReadyMaster();
122    admin = TEST_UTIL.getAdmin();
123    connection = TEST_UTIL.getConnection();
124
125    while (cluster.getLiveRegionServerThreads().isEmpty() &&
126        cluster.getRegionServer(0) == null &&
127        rs.getMetrics() == null) {
128      Threads.sleep(100);
129    }
130    rs = cluster.getRegionServer(0);
131    metricsRegionServer = rs.getMetrics();
132    serverSource = metricsRegionServer.getMetricsSource();
133  }
134
135  @AfterClass
136  public static void after() throws Exception {
137    if (TEST_UTIL != null) {
138      TEST_UTIL.shutdownMiniCluster();
139    }
140  }
141
142  TableName tableName;
143  Table table;
144
145  @Before
146  public void beforeTestMethod() throws Exception {
147    metricsRegionServer.getRegionServerWrapper().forceRecompute();
148    tableName = TableName.valueOf(testName.getMethodName());
149    table = TEST_UTIL.createTable(tableName, cf);
150  }
151
152  @After
153  public void afterTestMethod() throws Exception {
154    admin.disableTable(tableName);
155    admin.deleteTable(tableName);
156  }
157
158  public void waitTableDeleted(TableName name, long timeoutInMillis) throws Exception {
159    long start = System.currentTimeMillis();
160    while (true) {
161      HTableDescriptor[] tables = admin.listTables();
162      for (HTableDescriptor htd : tables) {
163        if (htd.getNameAsString() == name.getNameAsString())
164          return;
165      }
166      if (System.currentTimeMillis() - start > timeoutInMillis)
167        return;
168      Thread.sleep(1000);
169    }
170  }
171
172  public void assertCounter(String metric, long expectedValue) {
173    metricsHelper.assertCounter(metric, expectedValue, serverSource);
174  }
175
176  public void assertGauge(String metric, long expectedValue) {
177    metricsHelper.assertGauge(metric, expectedValue, serverSource);
178  }
179
180  // Aggregates metrics from regions and assert given list of metrics and expected values.
181  public void assertRegionMetrics(String metric, long expectedValue) throws Exception {
182    try (RegionLocator locator = connection.getRegionLocator(tableName)) {
183      for ( HRegionLocation location: locator.getAllRegionLocations()) {
184        HRegionInfo hri = location.getRegionInfo();
185        MetricsRegionAggregateSource agg =
186            rs.getRegion(hri.getRegionName()).getMetrics().getSource().getAggregateSource();
187        String prefix = "namespace_" + NamespaceDescriptor.DEFAULT_NAMESPACE_NAME_STR +
188            "_table_" + tableName.getNameAsString() +
189            "_region_" + hri.getEncodedName()+
190            "_metric_";
191        metricsHelper.assertCounter(prefix + metric, expectedValue, agg);
192      }
193    }
194  }
195
196  public void doNPuts(int n, boolean batch) throws Exception {
197    if (batch) {
198      List<Put> puts = new ArrayList<>();
199      for (int i = 0; i < n; i++) {
200        Put p = new Put(Bytes.toBytes("" + i + "row")).addColumn(cf, qualifier, val);
201        puts.add(p);
202      }
203      table.put(puts);
204    } else {
205      for (int i = 0; i < n; i++) {
206        Put p = new Put(row).addColumn(cf, qualifier, val);
207        table.put(p);
208      }
209    }
210  }
211
212  public void doNGets(int n, boolean batch) throws Exception {
213    if (batch) {
214      List<Get> gets = new ArrayList<>();
215      for (int i = 0; i < n; i++) {
216        gets.add(new Get(row));
217      }
218      table.get(gets);
219    } else {
220      for (int i = 0; i < n; i++) {
221        table.get(new Get(row));
222      }
223    }
224  }
225
226  public void doScan(int n, boolean caching) throws IOException {
227    Scan scan = new Scan();
228    if (caching) {
229      scan.setCaching(n);
230    } else {
231      scan.setCaching(1);
232    }
233    ResultScanner scanner = table.getScanner(scan);
234    for (int i = 0; i < n; i++) {
235      Result res = scanner.next();
236      LOG.debug("Result row: " + Bytes.toString(res.getRow()) + ", value: " +
237          Bytes.toString(res.getValue(cf, qualifier)));
238    }
239  }
240
241  @Test
242  public void testRegionCount() throws Exception {
243    metricsHelper.assertGauge("regionCount", TABLES_ON_MASTER? 1: 3, serverSource);
244  }
245
246  @Test
247  public void testLocalFiles() throws Exception {
248    assertGauge("percentFilesLocal", 0);
249    assertGauge("percentFilesLocalSecondaryRegions", 0);
250  }
251
252  @Test
253  public void testRequestCount() throws Exception {
254    // Do a first put to be sure that the connection is established, meta is there and so on.
255    doNPuts(1, false);
256
257    metricsRegionServer.getRegionServerWrapper().forceRecompute();
258    long requests = metricsHelper.getCounter("totalRequestCount", serverSource);
259    long rowActionRequests = metricsHelper.getCounter("totalRowActionRequestCount", serverSource);
260    long readRequests = metricsHelper.getCounter("readRequestCount", serverSource);
261    long writeRequests = metricsHelper.getCounter("writeRequestCount", serverSource);
262
263    doNPuts(30, false);
264
265    metricsRegionServer.getRegionServerWrapper().forceRecompute();
266    assertCounter("totalRequestCount", requests + 30);
267    assertCounter("totalRowActionRequestCount", rowActionRequests + 30);
268    assertCounter("readRequestCount", readRequests);
269    assertCounter("writeRequestCount", writeRequests + 30);
270
271    doNGets(10, false);
272
273    metricsRegionServer.getRegionServerWrapper().forceRecompute();
274    assertCounter("totalRequestCount", requests + 40);
275    assertCounter("totalRowActionRequestCount", rowActionRequests + 40);
276    assertCounter("readRequestCount", readRequests + 10);
277    assertCounter("writeRequestCount", writeRequests + 30);
278
279    assertRegionMetrics("getCount", 10);
280    assertRegionMetrics("putCount", 31);
281
282    doNGets(10, true);  // true = batch
283
284    metricsRegionServer.getRegionServerWrapper().forceRecompute();
285    if (TABLES_ON_MASTER) {
286      assertCounter("totalRequestCount", requests + 41);
287      assertCounter("totalRowActionRequestCount", rowActionRequests + 50);
288      assertCounter("readRequestCount", readRequests + 20);
289    }
290
291
292    assertCounter("writeRequestCount", writeRequests + 30);
293
294    doNPuts(30, true);
295
296    metricsRegionServer.getRegionServerWrapper().forceRecompute();
297    if (TABLES_ON_MASTER) {
298      assertCounter("totalRequestCount", requests + 42);
299      assertCounter("totalRowActionRequestCount", rowActionRequests + 80);
300      assertCounter("readRequestCount", readRequests + 20);
301    }
302    assertCounter("writeRequestCount", writeRequests + 60);
303
304    doScan(10, false); // test after batch put so we have enough lines
305    metricsRegionServer.getRegionServerWrapper().forceRecompute();
306    if (TABLES_ON_MASTER) {
307      assertCounter("totalRequestCount", requests + 52);
308      assertCounter("totalRowActionRequestCount", rowActionRequests + 90);
309      assertCounter("readRequestCount", readRequests + 30);
310    }
311    assertCounter("writeRequestCount", writeRequests + 60);
312    numScanNext += 10;
313
314    doScan(10, true); // true = caching
315    metricsRegionServer.getRegionServerWrapper().forceRecompute();
316    if (TABLES_ON_MASTER) {
317      assertCounter("totalRequestCount", requests + 53);
318      assertCounter("totalRowActionRequestCount", rowActionRequests + 100);
319      assertCounter("readRequestCount", readRequests + 40);
320    }
321    assertCounter("writeRequestCount", writeRequests + 60);
322    numScanNext += 1;
323  }
324
325  @Test
326  public void testGet() throws Exception {
327    // Do a first put to be sure that the connection is established, meta is there and so on.
328    doNPuts(1, false);
329    doNGets(10, false);
330    assertRegionMetrics("getCount", 10);
331    metricsHelper.assertCounterGt("Get_num_ops", 10, serverSource);
332  }
333
334  @Test
335  public void testMutationsWithoutWal() throws Exception {
336    Put p = new Put(row).addColumn(cf, qualifier, val)
337        .setDurability(Durability.SKIP_WAL);
338    table.put(p);
339
340    metricsRegionServer.getRegionServerWrapper().forceRecompute();
341    assertGauge("mutationsWithoutWALCount", 1);
342    long minLength = row.length + cf.length + qualifier.length + val.length;
343    metricsHelper.assertGaugeGt("mutationsWithoutWALSize", minLength, serverSource);
344  }
345
346  @Test
347  public void testStoreCount() throws Exception {
348    // Force a hfile.
349    doNPuts(1, false);
350    TEST_UTIL.getAdmin().flush(tableName);
351
352    metricsRegionServer.getRegionServerWrapper().forceRecompute();
353    assertGauge("storeCount", TABLES_ON_MASTER ? 1 : 5);
354    assertGauge("storeFileCount", 1);
355  }
356
357  @Test
358  public void testStoreFileAge() throws Exception {
359    //Force a hfile.
360    doNPuts(1, false);
361    TEST_UTIL.getAdmin().flush(tableName);
362
363    metricsRegionServer.getRegionServerWrapper().forceRecompute();
364    assertTrue(metricsHelper.getGaugeLong("maxStoreFileAge", serverSource) > 0);
365    assertTrue(metricsHelper.getGaugeLong("minStoreFileAge", serverSource) > 0);
366    assertTrue(metricsHelper.getGaugeLong("avgStoreFileAge", serverSource) > 0);
367  }
368
369  @Test
370  public void testCheckAndPutCount() throws Exception {
371    byte[] valOne = Bytes.toBytes("Value");
372    byte[] valTwo = Bytes.toBytes("ValueTwo");
373    byte[] valThree = Bytes.toBytes("ValueThree");
374
375    Put p = new Put(row);
376    p.addColumn(cf, qualifier, valOne);
377    table.put(p);
378
379    Put pTwo = new Put(row);
380    pTwo.addColumn(cf, qualifier, valTwo);
381    table.checkAndMutate(row, cf).qualifier(qualifier).ifEquals(valOne).thenPut(pTwo);
382
383    Put pThree = new Put(row);
384    pThree.addColumn(cf, qualifier, valThree);
385    table.checkAndMutate(row, cf).qualifier(qualifier).ifEquals(valOne).thenPut(pThree);
386
387    metricsRegionServer.getRegionServerWrapper().forceRecompute();
388    assertCounter("checkMutateFailedCount", 1);
389    assertCounter("checkMutatePassedCount", 1);
390  }
391
392  @Test
393  public void testIncrement() throws Exception {
394    Put p = new Put(row).addColumn(cf, qualifier, Bytes.toBytes(0L));
395    table.put(p);
396
397    for(int count = 0; count < 13; count++) {
398      Increment inc = new Increment(row);
399      inc.addColumn(cf, qualifier, 100);
400      table.increment(inc);
401    }
402
403    metricsRegionServer.getRegionServerWrapper().forceRecompute();
404    assertCounter("incrementNumOps", 13);
405  }
406
407  @Test
408  public void testAppend() throws Exception {
409    doNPuts(1, false);
410
411    for(int count = 0; count< 73; count++) {
412      Append append = new Append(row);
413      append.addColumn(cf, qualifier, Bytes.toBytes(",Test"));
414      table.append(append);
415    }
416
417    metricsRegionServer.getRegionServerWrapper().forceRecompute();
418    assertCounter("appendNumOps", 73);
419  }
420
421  @Test
422  public void testScanSize() throws Exception {
423    doNPuts(100, true);  // batch put
424    Scan s = new Scan();
425    s.setBatch(1);
426    s.setCaching(1);
427    ResultScanner resultScanners = table.getScanner(s);
428
429    for (int nextCount = 0; nextCount < NUM_SCAN_NEXT; nextCount++) {
430      Result result = resultScanners.next();
431      assertNotNull(result);
432      assertEquals(1, result.size());
433    }
434    numScanNext += NUM_SCAN_NEXT;
435    assertRegionMetrics("scanCount", NUM_SCAN_NEXT);
436    if (TABLES_ON_MASTER) {
437      assertCounter("ScanSize_num_ops", numScanNext);
438    }
439  }
440
441  @Test
442  public void testScanTime() throws Exception {
443    doNPuts(100, true);
444    Scan s = new Scan();
445    s.setBatch(1);
446    s.setCaching(1);
447    ResultScanner resultScanners = table.getScanner(s);
448
449    for (int nextCount = 0; nextCount < NUM_SCAN_NEXT; nextCount++) {
450      Result result = resultScanners.next();
451      assertNotNull(result);
452      assertEquals(1, result.size());
453    }
454    numScanNext += NUM_SCAN_NEXT;
455    assertRegionMetrics("scanCount", NUM_SCAN_NEXT);
456    if (TABLES_ON_MASTER) {
457      assertCounter("ScanTime_num_ops", numScanNext);
458    }
459  }
460
461  @Test
462  public void testScanSizeForSmallScan() throws Exception {
463    doNPuts(100, true);
464    Scan s = new Scan();
465    s.setSmall(true);
466    s.setCaching(1);
467    ResultScanner resultScanners = table.getScanner(s);
468
469    for (int nextCount = 0; nextCount < NUM_SCAN_NEXT; nextCount++) {
470      Result result = resultScanners.next();
471      assertNotNull(result);
472      if (TABLES_ON_MASTER) {
473        assertEquals(1, result.size());
474      }
475    }
476    numScanNext += NUM_SCAN_NEXT;
477    assertRegionMetrics("scanCount", NUM_SCAN_NEXT);
478    if (TABLES_ON_MASTER) {
479      assertCounter("ScanSize_num_ops", numScanNext);
480    }
481  }
482
483  @Test
484  public void testMobMetrics() throws IOException, InterruptedException {
485    TableName tableName = TableName.valueOf("testMobMetricsLocal");
486    int numHfiles = 5;
487    HTableDescriptor htd = new HTableDescriptor(tableName);
488    HColumnDescriptor hcd = new HColumnDescriptor(cf);
489    hcd.setMobEnabled(true);
490    hcd.setMobThreshold(0);
491    htd.addFamily(hcd);
492    byte[] val = Bytes.toBytes("mobdata");
493    try {
494      Table table = TEST_UTIL.createTable(htd, new byte[0][0], conf);
495      HRegion region = rs.getRegions(tableName).get(0);
496      for (int insertCount = 0; insertCount < numHfiles; insertCount++) {
497        Put p = new Put(Bytes.toBytes(insertCount));
498        p.addColumn(cf, qualifier, val);
499        table.put(p);
500        admin.flush(tableName);
501      }
502      metricsRegionServer.getRegionServerWrapper().forceRecompute();
503      assertCounter("mobFlushCount", numHfiles);
504      Scan scan = new Scan(Bytes.toBytes(0), Bytes.toBytes(numHfiles));
505      ResultScanner scanner = table.getScanner(scan);
506      scanner.next(100);
507      numScanNext++;  // this is an ugly construct
508      scanner.close();
509      metricsRegionServer.getRegionServerWrapper().forceRecompute();
510      assertCounter("mobScanCellsCount", numHfiles);
511
512      setMobThreshold(region, cf, 100);
513      // metrics are reset by the region initialization
514      region.initialize();
515      region.compact(true);
516      metricsRegionServer.getRegionServerWrapper().forceRecompute();
517      assertCounter("cellsCountCompactedFromMob", numHfiles);
518      assertCounter("cellsCountCompactedToMob", 0);
519
520      scanner = table.getScanner(scan);
521      scanner.next(100);
522      numScanNext++;  // this is an ugly construct
523      metricsRegionServer.getRegionServerWrapper().forceRecompute();
524      assertCounter("mobScanCellsCount", 0);
525
526      for (int insertCount = numHfiles; insertCount < 2 * numHfiles; insertCount++) {
527        Put p = new Put(Bytes.toBytes(insertCount));
528        p.addColumn(cf, qualifier, val);
529        table.put(p);
530        admin.flush(tableName);
531      }
532      setMobThreshold(region, cf, 0);
533
534      // closing the region forces the compaction.discharger to archive the compacted hfiles
535      region.close();
536
537      // metrics are reset by the region initialization
538      region.initialize();
539      region.compact(true);
540      metricsRegionServer.getRegionServerWrapper().forceRecompute();
541      // metrics are reset by the region initialization
542      assertCounter("cellsCountCompactedFromMob", 0);
543      assertCounter("cellsCountCompactedToMob", 2 * numHfiles);
544    } finally {
545      admin.disableTable(tableName);
546      admin.deleteTable(tableName);
547    }
548  }
549
550  private static Region setMobThreshold(Region region, byte[] cfName, long modThreshold) {
551    ColumnFamilyDescriptor cfd = ColumnFamilyDescriptorBuilder
552            .newBuilder(region.getTableDescriptor().getColumnFamily(cfName))
553            .setMobThreshold(modThreshold)
554            .build();
555    TableDescriptor td = TableDescriptorBuilder
556            .newBuilder(region.getTableDescriptor())
557            .removeColumnFamily(cfName)
558            .setColumnFamily(cfd)
559            .build();
560    ((HRegion)region).setTableDescriptor(td);
561    return region;
562  }
563
564  @Test
565  @Ignore
566  public void testRangeCountMetrics() throws Exception {
567    final long[] timeranges =
568        { 1, 3, 10, 30, 100, 300, 1000, 3000, 10000, 30000, 60000, 120000, 300000, 600000 };
569    final String timeRangeType = "TimeRangeCount";
570    final String timeRangeMetricName = "Mutate";
571    boolean timeRangeCountUpdated = false;
572
573    // Do a first put to be sure that the connection is established, meta is there and so on.
574    Put p = new Put(row);
575    p.addColumn(cf, qualifier, val);
576    table.put(p);
577
578    // do some puts and gets
579    for (int i = 0; i < 10; i++) {
580      table.put(p);
581    }
582
583    Get g = new Get(row);
584    for (int i = 0; i < 10; i++) {
585      table.get(g);
586    }
587
588    metricsRegionServer.getRegionServerWrapper().forceRecompute();
589
590    // Check some time range counters were updated
591    long prior = 0;
592
593    String dynamicMetricName;
594    for (int i = 0; i < timeranges.length; i++) {
595      dynamicMetricName =
596          timeRangeMetricName + "_" + timeRangeType + "_" + prior + "-" + timeranges[i];
597      if (metricsHelper.checkCounterExists(dynamicMetricName, serverSource)) {
598        long count = metricsHelper.getGaugeLong(dynamicMetricName, serverSource);
599        if (count > 0) {
600          timeRangeCountUpdated = true;
601          break;
602        }
603      }
604      prior = timeranges[i];
605    }
606    dynamicMetricName =
607        timeRangeMetricName + "_" + timeRangeType + "_" + timeranges[timeranges.length - 1] + "-inf";
608    if (metricsHelper.checkCounterExists(dynamicMetricName, serverSource)) {
609      long count = metricsHelper.getCounter(dynamicMetricName, serverSource);
610      if (count > 0) {
611        timeRangeCountUpdated = true;
612      }
613    }
614    assertEquals(true, timeRangeCountUpdated);
615  }
616
617  @Test
618  public void testAverageRegionSize() throws Exception {
619    //Force a hfile.
620    doNPuts(1, false);
621    TEST_UTIL.getAdmin().flush(tableName);
622
623    metricsRegionServer.getRegionServerWrapper().forceRecompute();
624    assertTrue(metricsHelper.getGaugeDouble("averageRegionSize", serverSource) > 0.0);
625  }
626
627  @Test
628  public void testReadBytes() throws Exception {
629    // Do a first put to be sure that the connection is established, meta is there and so on.
630    doNPuts(1, false);
631    doNGets(10, false);
632    TEST_UTIL.getAdmin().flush(tableName);
633    metricsRegionServer.getRegionServerWrapper().forceRecompute();
634
635    assertTrue("Total read bytes should be larger than 0",
636        metricsRegionServer.getRegionServerWrapper().getTotalBytesRead() > 0);
637    assertTrue("Total local read bytes should be larger than 0",
638        metricsRegionServer.getRegionServerWrapper().getLocalBytesRead() > 0);
639    assertEquals("Total short circuit read bytes should be equal to 0", 0,
640        metricsRegionServer.getRegionServerWrapper().getShortCircuitBytesRead());
641    assertEquals("Total zero-byte read bytes should be equal to 0", 0,
642        metricsRegionServer.getRegionServerWrapper().getZeroCopyBytesRead());
643  }
644}