View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to you under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    * http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.hadoop.hbase.regionserver;
18  
19  import java.util.Map;
20  import java.util.concurrent.ConcurrentHashMap;
21  
22  import org.apache.hadoop.hbase.TableName;
23  import org.apache.hadoop.hbase.classification.InterfaceAudience;
24  import org.apache.hadoop.hbase.metrics.Meter;
25  import org.apache.hadoop.hbase.metrics.MetricRegistry;
26  
27  /**
28   * Implementation of {@link MetricsTableQueryMeter} to track query per second for each table in
29   * a RegionServer.
30   */
31  @InterfaceAudience.Private
32  public class MetricsTableQueryMeterImpl implements MetricsTableQueryMeter {
33    private final Map<TableName, TableMeters> metersByTable = new ConcurrentHashMap<>();
34    private final MetricRegistry metricRegistry;
35  
36    public MetricsTableQueryMeterImpl(MetricRegistry metricRegistry) {
37      this.metricRegistry = metricRegistry;
38    }
39  
40    private static class TableMeters {
41      final Meter tableReadQueryMeter;
42      final Meter tableWriteQueryMeter;
43  
44      TableMeters(MetricRegistry metricRegistry, TableName tableName) {
45        this.tableReadQueryMeter = metricRegistry.meter(qualifyMetricsName(tableName,
46          TABLE_READ_QUERY_PER_SECOND));
47        this.tableWriteQueryMeter =
48          metricRegistry.meter(qualifyMetricsName(tableName, TABLE_WRITE_QUERY_PER_SECOND));
49      }
50  
51      public void updateTableReadQueryMeter(long count) {
52        tableReadQueryMeter.mark(count);
53      }
54  
55      public void updateTableReadQueryMeter() {
56        tableReadQueryMeter.mark();
57      }
58  
59      public void updateTableWriteQueryMeter(long count) {
60        tableWriteQueryMeter.mark(count);
61      }
62  
63      public void updateTableWriteQueryMeter() {
64        tableWriteQueryMeter.mark();
65      }
66    }
67  
68    private static String qualifyMetricsName(TableName tableName, String metric) {
69      StringBuilder sb = new StringBuilder();
70      sb.append("Namespace_").append(tableName.getNamespaceAsString());
71      sb.append("_table_").append(tableName.getQualifierAsString());
72      sb.append("_metric_").append(metric);
73      return sb.toString();
74    }
75  
76    private TableMeters getOrCreateTableMeter(TableName tableName) {
77      TableMeters meters = metersByTable.get(tableName);
78      if (meters == null) {
79        meters = new TableMeters(metricRegistry, tableName);
80        metersByTable.put(tableName, meters);
81      }
82      return meters;
83    }
84  
85    @Override
86    public void updateTableReadQueryMeter(TableName tableName, long count) {
87      getOrCreateTableMeter(tableName).updateTableReadQueryMeter(count);
88    }
89  
90    @Override
91    public void updateTableReadQueryMeter(TableName tableName) {
92      getOrCreateTableMeter(tableName).updateTableReadQueryMeter();
93    }
94  
95    @Override
96    public void updateTableWriteQueryMeter(TableName tableName, long count) {
97      getOrCreateTableMeter(tableName).updateTableWriteQueryMeter(count);
98    }
99  
100   @Override
101   public void updateTableWriteQueryMeter(TableName tableName) {
102     getOrCreateTableMeter(tableName).updateTableWriteQueryMeter();
103   }
104 }