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.jupiter.api.Assertions.assertFalse; 021import static org.junit.jupiter.api.Assertions.assertTrue; 022import static org.mockito.Mockito.mock; 023import static org.mockito.Mockito.when; 024 025import java.security.PrivilegedAction; 026import org.apache.hadoop.conf.Configuration; 027import org.apache.hadoop.hbase.CompatibilityFactory; 028import org.apache.hadoop.hbase.HBaseConfiguration; 029import org.apache.hadoop.hbase.TableName; 030import org.apache.hadoop.hbase.regionserver.metrics.MetricsTableRequests; 031import org.apache.hadoop.hbase.security.User; 032import org.apache.hadoop.hbase.test.MetricsAssertHelper; 033import org.apache.hadoop.hbase.testclassification.LargeTests; 034import org.apache.hadoop.hbase.testclassification.RegionServerTests; 035import org.junit.jupiter.api.BeforeAll; 036import org.junit.jupiter.api.BeforeEach; 037import org.junit.jupiter.api.Tag; 038import org.junit.jupiter.api.Test; 039 040@Tag(RegionServerTests.TAG) 041@Tag(LargeTests.TAG) 042public class TestMetricsUserAggregate { 043 044 private static MetricsAssertHelper HELPER = 045 CompatibilityFactory.getInstance(MetricsAssertHelper.class); 046 047 private MetricsRegionServerWrapperStub wrapper; 048 private MetricsRegionServer rsm; 049 private MetricsUserAggregate userAgg; 050 private TableName tableName = TableName.valueOf("testUserAggregateMetrics"); 051 052 @BeforeAll 053 public static void classSetUp() { 054 HELPER.init(); 055 } 056 057 @BeforeEach 058 public void setUp() { 059 wrapper = new MetricsRegionServerWrapperStub(); 060 Configuration conf = HBaseConfiguration.create(); 061 conf.setBoolean(MetricsUserAggregateFactory.METRIC_USER_ENABLED_CONF, true); 062 rsm = new MetricsRegionServer(wrapper, conf, null); 063 userAgg = (MetricsUserAggregate) rsm.getMetricsUserAggregate(); 064 } 065 066 private void doOperations() { 067 HRegion region = mock(HRegion.class); 068 MetricsTableRequests metricsTableRequests = mock(MetricsTableRequests.class); 069 when(region.getMetricsTableRequests()).thenReturn(metricsTableRequests); 070 when(metricsTableRequests.isEnableTableLatenciesMetrics()).thenReturn(false); 071 when(metricsTableRequests.isEnabTableQueryMeterMetrics()).thenReturn(false); 072 for (int i = 0; i < 10; i++) { 073 rsm.updateGet(region, 10, 10); 074 } 075 for (int i = 0; i < 11; i++) { 076 rsm.updateScan(region, 11, 111, 1111); 077 } 078 for (int i = 0; i < 12; i++) { 079 rsm.updatePut(region, 12); 080 } 081 for (int i = 0; i < 13; i++) { 082 rsm.updateDelete(region, 13); 083 } 084 for (int i = 0; i < 14; i++) { 085 rsm.updateIncrement(region, 14, 140); 086 } 087 for (int i = 0; i < 15; i++) { 088 rsm.updateAppend(region, 15, 150); 089 } 090 for (int i = 0; i < 16; i++) { 091 rsm.updateReplay(16); 092 } 093 } 094 095 @Test 096 public void testPerUserOperations() { 097 Configuration conf = HBaseConfiguration.create(); 098 User userFoo = User.createUserForTesting(conf, "FOO", new String[0]); 099 User userBar = User.createUserForTesting(conf, "BAR", new String[0]); 100 101 userFoo.getUGI().doAs(new PrivilegedAction<Void>() { 102 @Override 103 public Void run() { 104 doOperations(); 105 return null; 106 } 107 }); 108 109 userBar.getUGI().doAs(new PrivilegedAction<Void>() { 110 @Override 111 public Void run() { 112 doOperations(); 113 return null; 114 } 115 }); 116 117 HELPER.assertCounter("userfoometricgetnumops", 10, userAgg.getSource()); 118 HELPER.assertCounter("userfoometricscantimenumops", 11, userAgg.getSource()); 119 HELPER.assertCounter("userfoometricputnumops", 12, userAgg.getSource()); 120 HELPER.assertCounter("userfoometricdeletenumops", 13, userAgg.getSource()); 121 HELPER.assertCounter("userfoometricincrementnumops", 14, userAgg.getSource()); 122 HELPER.assertCounter("userfoometricappendnumops", 15, userAgg.getSource()); 123 HELPER.assertCounter("userfoometricreplaynumops", 16, userAgg.getSource()); 124 HELPER.assertCounter("userfoometricblockbytesscannedcount", 16531, userAgg.getSource()); 125 126 HELPER.assertCounter("userbarmetricgetnumops", 10, userAgg.getSource()); 127 HELPER.assertCounter("userbarmetricscantimenumops", 11, userAgg.getSource()); 128 HELPER.assertCounter("userbarmetricputnumops", 12, userAgg.getSource()); 129 HELPER.assertCounter("userbarmetricdeletenumops", 13, userAgg.getSource()); 130 HELPER.assertCounter("userbarmetricincrementnumops", 14, userAgg.getSource()); 131 HELPER.assertCounter("userbarmetricappendnumops", 15, userAgg.getSource()); 132 HELPER.assertCounter("userbarmetricreplaynumops", 16, userAgg.getSource()); 133 HELPER.assertCounter("userbarmetricblockbytesscannedcount", 16531, userAgg.getSource()); 134 } 135 136 @Test 137 public void testLossyCountingOfUserMetrics() { 138 Configuration conf = HBaseConfiguration.create(); 139 int noOfUsers = 10000; 140 for (int i = 1; i <= noOfUsers; i++) { 141 User.createUserForTesting(conf, "FOO" + i, new String[0]).getUGI() 142 .doAs(new PrivilegedAction<Void>() { 143 @Override 144 public Void run() { 145 HRegion region = mock(HRegion.class); 146 MetricsTableRequests metricsTableRequests = mock(MetricsTableRequests.class); 147 when(region.getMetricsTableRequests()).thenReturn(metricsTableRequests); 148 when(metricsTableRequests.isEnableTableLatenciesMetrics()).thenReturn(false); 149 when(metricsTableRequests.isEnabTableQueryMeterMetrics()).thenReturn(false); 150 rsm.updateGet(region, 10, 100); 151 return null; 152 } 153 }); 154 } 155 assertTrue(((MetricsUserAggregateSourceImpl) userAgg.getSource()).getUserSources().size() 156 <= (noOfUsers / 10)); 157 for (int i = 1; i <= noOfUsers / 10; i++) { 158 assertFalse( 159 HELPER.checkCounterExists("userfoo" + i + "metricgetnumops", userAgg.getSource())); 160 assertFalse(HELPER.checkCounterExists("userfoo" + i + "metricblockbytesscannedcount", 161 userAgg.getSource())); 162 } 163 HELPER.assertCounter("userfoo" + noOfUsers + "metricgetnumops", 1, userAgg.getSource()); 164 HELPER.assertCounter("userfoo" + noOfUsers + "metricblockbytesscannedcount", 100, 165 userAgg.getSource()); 166 } 167}