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}