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