1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
31
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
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 }