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 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
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 }