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 putBatchTimeHisto;
45      final MetricHistogram deleteTimeHisto;
46      final MetricHistogram deleteBatchTimeHisto;
47      final MetricHistogram scanTimeHisto;
48      final MetricHistogram scanSizeHisto;
49  
50      TableHistograms(DynamicMetricsRegistry registry, TableName tn) {
51        getTimeHisto = registry.newTimeHistogram(qualifyMetricsName(tn, GET_TIME));
52        incrementTimeHisto = registry.newTimeHistogram(
53            qualifyMetricsName(tn, INCREMENT_TIME));
54        appendTimeHisto = registry.newTimeHistogram(qualifyMetricsName(tn, APPEND_TIME));
55        putTimeHisto = registry.newTimeHistogram(qualifyMetricsName(tn, PUT_TIME));
56        putBatchTimeHisto = registry.newTimeHistogram(qualifyMetricsName(tn, PUT_BATCH_TIME));
57        deleteTimeHisto = registry.newTimeHistogram(qualifyMetricsName(tn, DELETE_TIME));
58        deleteBatchTimeHisto = registry.newTimeHistogram(
59            qualifyMetricsName(tn, DELETE_BATCH_TIME));
60        scanTimeHisto = registry.newTimeHistogram(qualifyMetricsName(tn, SCAN_TIME));
61        scanSizeHisto = registry.newSizeHistogram(qualifyMetricsName(tn, SCAN_SIZE));
62      }
63  
64      public void updatePut(long time) {
65        putTimeHisto.add(time);
66      }
67  
68      public void updatePutBatch(long time) {
69        putBatchTimeHisto.add(time);
70      }
71  
72      public void updateDelete(long t) {
73        deleteTimeHisto.add(t);
74      }
75  
76      public void updateDeleteBatch(long t) {
77        deleteBatchTimeHisto.add(t);
78      }
79  
80      public void updateGet(long t) {
81        getTimeHisto.add(t);
82      }
83  
84      public void updateIncrement(long t) {
85        incrementTimeHisto.add(t);
86      }
87  
88      public void updateAppend(long t) {
89        appendTimeHisto.add(t);
90      }
91  
92      public void updateScanSize(long scanSize) {
93        scanSizeHisto.add(scanSize);
94      }
95  
96      public void updateScanTime(long t) {
97        scanTimeHisto.add(t);
98      }
99    }
100 
101   @VisibleForTesting
102   public static String qualifyMetricsName(TableName tableName, String metric) {
103     StringBuilder sb = new StringBuilder();
104     sb.append("Namespace_").append(tableName.getNamespaceAsString());
105     sb.append("_table_").append(tableName.getQualifierAsString());
106     sb.append("_metric_").append(metric);
107     return sb.toString();
108   }
109 
110   @VisibleForTesting
111   public TableHistograms getOrCreateTableHistogram(String tableName) {
112     // TODO Java8's ConcurrentHashMap#computeIfAbsent would be stellar instead
113     final TableName tn = TableName.valueOf(tableName);
114     TableHistograms latency = histogramsByTable.get(tn);
115     if (latency == null) {
116       latency = new TableHistograms(getMetricsRegistry(), tn);
117       histogramsByTable.put(tn, latency);
118     }
119     return latency;
120   }
121 
122   public MetricsTableLatenciesImpl() {
123     this(METRICS_NAME, METRICS_DESCRIPTION, METRICS_CONTEXT, METRICS_JMX_CONTEXT);
124   }
125 
126   public MetricsTableLatenciesImpl(String metricsName, String metricsDescription,
127       String metricsContext, String metricsJmxContext) {
128     super(metricsName, metricsDescription, metricsContext, metricsJmxContext);
129   }
130 
131   @Override
132   public void updatePut(String tableName, long t) {
133     getOrCreateTableHistogram(tableName).updatePut(t);
134   }
135 
136   @Override
137   public void updatePutBatch(String tableName, long t) {
138     getOrCreateTableHistogram(tableName).updatePutBatch(t);
139   }
140 
141   @Override
142   public void updateDelete(String tableName, long t) {
143     getOrCreateTableHistogram(tableName).updateDelete(t);
144   }
145 
146   @Override
147   public void updateDeleteBatch(String tableName, long t) {
148     getOrCreateTableHistogram(tableName).updateDeleteBatch(t);
149   }
150 
151   @Override
152   public void updateGet(String tableName, long t) {
153     getOrCreateTableHistogram(tableName).updateGet(t);
154   }
155 
156   @Override
157   public void updateIncrement(String tableName, long t) {
158     getOrCreateTableHistogram(tableName).updateIncrement(t);
159   }
160 
161   @Override
162   public void updateAppend(String tableName, long t) {
163     getOrCreateTableHistogram(tableName).updateAppend(t);
164   }
165 
166   @Override
167   public void updateScanSize(String tableName, long scanSize) {
168     getOrCreateTableHistogram(tableName).updateScanSize(scanSize);
169   }
170 
171   @Override
172   public void updateScanTime(String tableName, long t) {
173     getOrCreateTableHistogram(tableName).updateScanTime(t);
174   }
175 }