1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.hadoop.hbase.client.metrics;
20
21 import java.io.DataInput;
22 import java.io.DataOutput;
23 import java.io.IOException;
24 import java.util.ArrayList;
25 import java.util.Collection;
26
27 import org.apache.commons.logging.Log;
28 import org.apache.commons.logging.LogFactory;
29 import org.apache.hadoop.hbase.HConstants;
30 import org.apache.hadoop.io.Writable;
31 import org.apache.hadoop.metrics.util.MetricsBase;
32 import org.apache.hadoop.metrics.util.MetricsRegistry;
33 import org.apache.hadoop.metrics.util.MetricsTimeVaryingLong;
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 public class ScanMetrics implements Writable {
49
50 private static final byte SCANMETRICS_VERSION = (byte)1;
51 private static final Log LOG = LogFactory.getLog(ScanMetrics.class);
52 private MetricsRegistry registry = new MetricsRegistry();
53
54
55
56
57 public final MetricsTimeVaryingLong countOfRPCcalls =
58 new MetricsTimeVaryingLong("RPC_CALLS", registry);
59
60
61
62
63 public final MetricsTimeVaryingLong countOfRemoteRPCcalls =
64 new MetricsTimeVaryingLong("REMOTE_RPC_CALLS", registry);
65
66
67
68
69 public final MetricsTimeVaryingLong sumOfMillisSecBetweenNexts =
70 new MetricsTimeVaryingLong("MILLIS_BETWEEN_NEXTS", registry);
71
72
73
74
75 public final MetricsTimeVaryingLong countOfNSRE =
76 new MetricsTimeVaryingLong("NOT_SERVING_REGION_EXCEPTION", registry);
77
78
79
80
81 public final MetricsTimeVaryingLong countOfBytesInResults =
82 new MetricsTimeVaryingLong("BYTES_IN_RESULTS", registry);
83
84
85
86
87 public final MetricsTimeVaryingLong countOfBytesInRemoteResults =
88 new MetricsTimeVaryingLong("BYTES_IN_REMOTE_RESULTS", registry);
89
90
91
92
93 public final MetricsTimeVaryingLong countOfRegions =
94 new MetricsTimeVaryingLong("REGIONS_SCANNED", registry);
95
96
97
98
99 public final MetricsTimeVaryingLong countOfRPCRetries =
100 new MetricsTimeVaryingLong("RPC_RETRIES", registry);
101
102
103
104
105 public final MetricsTimeVaryingLong countOfRemoteRPCRetries =
106 new MetricsTimeVaryingLong("REMOTE_RPC_RETRIES", registry);
107
108
109
110
111 public ScanMetrics () {
112 }
113
114
115
116
117 public void write(DataOutput out) throws IOException {
118 out.writeByte(SCANMETRICS_VERSION);
119 Collection<MetricsBase> mbs = registry.getMetricsList();
120
121
122 int metricsCount = 0;
123 for (MetricsBase mb : mbs) {
124 if ( mb instanceof MetricsTimeVaryingLong) {
125 metricsCount++;
126 } else {
127 throw new IOException("unsupported metrics type. metrics name: "
128 + mb.getName() + ", metrics description: " + mb.getDescription());
129 }
130 }
131
132 out.writeInt(metricsCount);
133 for (MetricsBase mb : mbs) {
134 out.writeUTF(mb.getName());
135 out.writeLong(((MetricsTimeVaryingLong) mb).getCurrentIntervalValue());
136 }
137 }
138
139 public void readFields(DataInput in) throws IOException {
140 int version = in.readByte();
141 if (version > (int)SCANMETRICS_VERSION) {
142 throw new IOException("version " + version + " not supported");
143 }
144
145 int metricsCount = in.readInt();
146 for (int i=0; i<metricsCount; i++) {
147 String metricsName = in.readUTF();
148 long v = in.readLong();
149 MetricsBase mb = registry.get(metricsName);
150 if ( mb instanceof MetricsTimeVaryingLong) {
151 ((MetricsTimeVaryingLong) mb).inc(v);
152 } else {
153 LOG.warn("unsupported metrics type. metrics name: "
154 + mb.getName() + ", metrics description: " + mb.getDescription());
155 }
156 }
157 }
158
159 public MetricsTimeVaryingLong[] getMetricsTimeVaryingLongArray() {
160 Collection<MetricsBase> mbs = registry.getMetricsList();
161 ArrayList<MetricsTimeVaryingLong> mlv =
162 new ArrayList<MetricsTimeVaryingLong>();
163 for (MetricsBase mb : mbs) {
164 if ( mb instanceof MetricsTimeVaryingLong) {
165 mlv.add((MetricsTimeVaryingLong) mb);
166 }
167 }
168 return mlv.toArray(new MetricsTimeVaryingLong[mlv.size()]);
169 }
170
171 }