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}