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  package org.apache.hadoop.hbase.client;
19  
20  import com.google.protobuf.ByteString;
21  import org.apache.hadoop.hbase.client.ConnectionManager.HConnectionImplementation;
22  import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
23  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ClientService;
24  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.GetRequest;
25  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.ScanRequest;
26  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MultiRequest;
27  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutateRequest;
28  import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto.MutationType;
29  import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier;
30  import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.RegionSpecifier.RegionSpecifierType;
31  import org.apache.hadoop.hbase.testclassification.MetricsTests;
32  import org.apache.hadoop.hbase.testclassification.SmallTests;
33  import org.apache.hadoop.hbase.util.Bytes;
34  import org.junit.AfterClass;
35  import org.junit.Assert;
36  import org.junit.BeforeClass;
37  import org.junit.Test;
38  import org.junit.experimental.categories.Category;
39  import org.mockito.Mockito;
40  
41  import java.io.IOException;
42  
43  @Category({MetricsTests.class, SmallTests.class})
44  public class TestMetricsConnection {
45  
46    private static MetricsConnection METRICS;
47  
48    @BeforeClass
49    public static void beforeClass() {
50      HConnectionImplementation mocked = Mockito.mock(HConnectionImplementation.class);
51      Mockito.when(mocked.toString()).thenReturn("mocked-connection");
52      METRICS = new MetricsConnection(Mockito.mock(HConnectionImplementation.class));
53    }
54  
55    @AfterClass
56    public static void afterClass() {
57      METRICS.shutdown();
58    }
59  
60    @Test
61    public void testStaticMetrics() throws IOException {
62      final byte[] foo = Bytes.toBytes("foo");
63      final RegionSpecifier region = RegionSpecifier.newBuilder()
64          .setValue(ByteString.EMPTY)
65          .setType(RegionSpecifierType.REGION_NAME)
66          .build();
67      final int loop = 5;
68  
69      for (int i = 0; i < loop; i++) {
70        METRICS.updateRpc(
71            ClientService.getDescriptor().findMethodByName("Get"),
72            GetRequest.getDefaultInstance(),
73            MetricsConnection.newCallStats());
74        METRICS.updateRpc(
75            ClientService.getDescriptor().findMethodByName("Scan"),
76            ScanRequest.getDefaultInstance(),
77            MetricsConnection.newCallStats());
78        METRICS.updateRpc(
79            ClientService.getDescriptor().findMethodByName("Multi"),
80            MultiRequest.getDefaultInstance(),
81            MetricsConnection.newCallStats());
82        METRICS.updateRpc(
83            ClientService.getDescriptor().findMethodByName("Mutate"),
84            MutateRequest.newBuilder()
85                .setMutation(ProtobufUtil.toMutation(MutationType.APPEND, new Append(foo)))
86                .setRegion(region)
87                .build(),
88            MetricsConnection.newCallStats());
89        METRICS.updateRpc(
90            ClientService.getDescriptor().findMethodByName("Mutate"),
91            MutateRequest.newBuilder()
92                .setMutation(ProtobufUtil.toMutation(MutationType.DELETE, new Delete(foo)))
93                .setRegion(region)
94                .build(),
95            MetricsConnection.newCallStats());
96        METRICS.updateRpc(
97            ClientService.getDescriptor().findMethodByName("Mutate"),
98            MutateRequest.newBuilder()
99                .setMutation(ProtobufUtil.toMutation(MutationType.INCREMENT, new Increment(foo)))
100               .setRegion(region)
101               .build(),
102           MetricsConnection.newCallStats());
103       METRICS.updateRpc(
104           ClientService.getDescriptor().findMethodByName("Mutate"),
105           MutateRequest.newBuilder()
106               .setMutation(ProtobufUtil.toMutation(MutationType.PUT, new Put(foo)))
107               .setRegion(region)
108               .build(),
109           MetricsConnection.newCallStats());
110     }
111     for (MetricsConnection.CallTracker t : new MetricsConnection.CallTracker[] {
112         METRICS.getTracker, METRICS.scanTracker, METRICS.multiTracker, METRICS.appendTracker,
113         METRICS.deleteTracker, METRICS.incrementTracker, METRICS.putTracker
114     }) {
115       Assert.assertEquals("Failed to invoke callTimer on " + t, loop, t.callTimer.count());
116       Assert.assertEquals("Failed to invoke reqHist on " + t, loop, t.reqHist.count());
117       Assert.assertEquals("Failed to invoke respHist on " + t, loop, t.respHist.count());
118     }
119   }
120 }