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.HashMap;
20  
21  import org.apache.hadoop.hbase.TableName;
22  import org.apache.hadoop.hbase.classification.InterfaceAudience;
23  import org.apache.hadoop.hbase.metrics.BaseSourceImpl;
24  import org.apache.hadoop.metrics2.MetricHistogram;
25  import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;
26  
27  import com.google.common.annotations.VisibleForTesting;
28  
29  /**
30   * Implementation of {@link MetricsTableLatencies} to track latencies for one table in a
31   * RegionServer.
32   */
33  @InterfaceAudience.Private
34  public class MetricsTableLatenciesImpl extends BaseSourceImpl implements MetricsTableLatencies {
35  
36    private final HashMap<TableName,TableHistograms> histogramsByTable = new HashMap<>();
37  
38    @VisibleForTesting
39    public static class TableHistograms {
40      final MetricHistogram getTimeHisto;
41      final MetricHistogram incrementTimeHisto;
42      final MetricHistogram appendTimeHisto;
43      final MetricHistogram putTimeHisto;
44      final MetricHistogram deleteTimeHisto;
45      final MetricHistogram scanTimeHisto;
46      final MetricHistogram scanSizeHisto;
47  
48      TableHistograms(DynamicMetricsRegistry registry, TableName tn) {
49        getTimeHisto = registry.newTimeHistogram(qualifyMetricsName(tn, GET_TIME));
50        incrementTimeHisto = registry.newTimeHistogram(
51            qualifyMetricsName(tn, INCREMENT_TIME));
52        appendTimeHisto = registry.newTimeHistogram(qualifyMetricsName(tn, APPEND_TIME));
53        putTimeHisto = registry.newTimeHistogram(qualifyMetricsName(tn, PUT_TIME));
54        deleteTimeHisto = registry.newTimeHistogram(qualifyMetricsName(tn, DELETE_TIME));
55        scanTimeHisto = registry.newTimeHistogram(qualifyMetricsName(tn, SCAN_TIME));
56        scanSizeHisto = registry.newSizeHistogram(qualifyMetricsName(tn, SCAN_SIZE));
57      }
58  
59      public void updatePut(long time) {
60        putTimeHisto.add(time);
61      }
62  
63      public void updateDelete(long t) {
64        deleteTimeHisto.add(t);
65      }
66  
67      public void updateGet(long t) {
68        getTimeHisto.add(t);
69      }
70  
71      public void updateIncrement(long t) {
72        incrementTimeHisto.add(t);
73      }
74  
75      public void updateAppend(long t) {
76        appendTimeHisto.add(t);
77      }
78  
79      public void updateScanSize(long scanSize) {
80        scanSizeHisto.add(scanSize);
81      }
82  
83      public void updateScanTime(long t) {
84        scanTimeHisto.add(t);
85      }
86    }
87  
88    @VisibleForTesting
89    public static String qualifyMetricsName(TableName tableName, String metric) {
90      StringBuilder sb = new StringBuilder();
91      sb.append("Namespace_").append(tableName.getNamespaceAsString());
92      sb.append("_table_").append(tableName.getQualifierAsString());
93      sb.append("_metric_").append(metric);
94      return sb.toString();
95    }
96  
97    @VisibleForTesting
98    public TableHistograms getOrCreateTableHistogram(String tableName) {
99      // TODO Java8's ConcurrentHashMap#computeIfAbsent would be stellar instead
100     final TableName tn = TableName.valueOf(tableName);
101     TableHistograms latency = histogramsByTable.get(tn);
102     if (latency == null) {
103       latency = new TableHistograms(getMetricsRegistry(), tn);
104       histogramsByTable.put(tn, latency);
105     }
106     return latency;
107   }
108 
109   public MetricsTableLatenciesImpl() {
110     this(METRICS_NAME, METRICS_DESCRIPTION, METRICS_CONTEXT, METRICS_JMX_CONTEXT);
111   }
112 
113   public MetricsTableLatenciesImpl(String metricsName, String metricsDescription,
114       String metricsContext, String metricsJmxContext) {
115     super(metricsName, metricsDescription, metricsContext, metricsJmxContext);
116   }
117 
118   @Override
119   public void updatePut(String tableName, long t) {
120     getOrCreateTableHistogram(tableName).updatePut(t);
121   }
122 
123   @Override
124   public void updateDelete(String tableName, long t) {
125     getOrCreateTableHistogram(tableName).updateDelete(t);
126   }
127 
128   @Override
129   public void updateGet(String tableName, long t) {
130     getOrCreateTableHistogram(tableName).updateGet(t);
131   }
132 
133   @Override
134   public void updateIncrement(String tableName, long t) {
135     getOrCreateTableHistogram(tableName).updateIncrement(t);
136   }
137 
138   @Override
139   public void updateAppend(String tableName, long t) {
140     getOrCreateTableHistogram(tableName).updateAppend(t);
141   }
142 
143   @Override
144   public void updateScanSize(String tableName, long scanSize) {
145     getOrCreateTableHistogram(tableName).updateScanSize(scanSize);
146   }
147 
148   @Override
149   public void updateScanTime(String tableName, long t) {
150     getOrCreateTableHistogram(tableName).updateScanTime(t);
151   }
152 }