1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package org.apache.hadoop.hbase.ipc;
22
23 import org.apache.commons.logging.Log;
24 import org.apache.commons.logging.LogFactory;
25 import org.apache.hadoop.hbase.ipc.VersionedProtocol;
26 import org.apache.hadoop.metrics.MetricsContext;
27 import org.apache.hadoop.metrics.MetricsRecord;
28 import org.apache.hadoop.metrics.MetricsUtil;
29 import org.apache.hadoop.metrics.Updater;
30 import org.apache.hadoop.metrics.util.*;
31
32 import java.lang.reflect.Method;
33
34
35
36
37
38
39
40
41
42
43
44
45
46 public class HBaseRpcMetrics implements Updater {
47 public static final String NAME_DELIM = "$";
48 private final MetricsRegistry registry = new MetricsRegistry();
49 private final MetricsRecord metricsRecord;
50 private static Log LOG = LogFactory.getLog(HBaseRpcMetrics.class);
51 private final HBaseRPCStatistics rpcStatistics;
52
53 public HBaseRpcMetrics(String hostName, String port) {
54 MetricsContext context = MetricsUtil.getContext("rpc");
55 metricsRecord = MetricsUtil.createRecord(context, "metrics");
56
57 metricsRecord.setTag("port", port);
58
59 LOG.info("Initializing RPC Metrics with hostName="
60 + hostName + ", port=" + port);
61
62 context.registerUpdater(this);
63
64 initMethods(HMasterInterface.class);
65 initMethods(HMasterRegionInterface.class);
66 initMethods(HRegionInterface.class);
67 rpcStatistics = new HBaseRPCStatistics(this.registry, hostName, port);
68 }
69
70
71
72
73
74
75
76
77 public final MetricsTimeVaryingLong receivedBytes =
78 new MetricsTimeVaryingLong("ReceivedBytes", registry);
79 public final MetricsTimeVaryingLong sentBytes =
80 new MetricsTimeVaryingLong("SentBytes", registry);
81 public final MetricsTimeVaryingRate rpcQueueTime =
82 new MetricsTimeVaryingRate("RpcQueueTime", registry);
83 public MetricsTimeVaryingRate rpcProcessingTime =
84 new MetricsTimeVaryingRate("RpcProcessingTime", registry);
85 public final MetricsIntValue numOpenConnections =
86 new MetricsIntValue("NumOpenConnections", registry);
87 public final MetricsIntValue callQueueLen =
88 new MetricsIntValue("callQueueLen", registry);
89 public final MetricsIntValue priorityCallQueueLen =
90 new MetricsIntValue("priorityCallQueueLen", registry);
91 public final MetricsTimeVaryingInt authenticationFailures =
92 new MetricsTimeVaryingInt("rpcAuthenticationFailures", registry);
93 public final MetricsTimeVaryingInt authenticationSuccesses =
94 new MetricsTimeVaryingInt("rpcAuthenticationSuccesses", registry);
95 public final MetricsTimeVaryingInt authorizationFailures =
96 new MetricsTimeVaryingInt("rpcAuthorizationFailures", registry);
97 public final MetricsTimeVaryingInt authorizationSuccesses =
98 new MetricsTimeVaryingInt("rpcAuthorizationSuccesses", registry);
99 public MetricsTimeVaryingRate rpcSlowResponseTime =
100 new MetricsTimeVaryingRate("RpcSlowResponse", registry);
101 public final MetricsIntValue replicationCallQueueLen =
102 new MetricsIntValue("replicationCallQueueLen", registry);
103 public final MetricsIntValue activeRpcCount =
104 new MetricsIntValue("activeRpcCount", registry);
105
106 private void initMethods(Class<? extends VersionedProtocol> protocol) {
107 for (Method m : protocol.getDeclaredMethods()) {
108 if (get(m.getName()) == null)
109 create(m.getName());
110 }
111 }
112
113 private MetricsTimeVaryingRate get(String key) {
114 return (MetricsTimeVaryingRate) registry.get(key);
115 }
116 private MetricsTimeVaryingRate create(String key) {
117 return new MetricsTimeVaryingRate(key, this.registry);
118 }
119
120 public void inc(String name, int amt) {
121 MetricsTimeVaryingRate m = get(name);
122 if (m == null) {
123 LOG.warn("Got inc() request for method that doesnt exist: " +
124 name);
125 return;
126 }
127 m.inc(amt);
128 }
129
130
131
132
133
134
135
136 public void createMetrics(Class<?>[] ifaces) {
137 createMetrics(ifaces, false);
138 }
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154 public void createMetrics(Class<?>[] ifaces, boolean prefixWithClass) {
155 createMetrics(ifaces, prefixWithClass, null);
156 }
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180 public void createMetrics(Class<?>[] ifaces, boolean prefixWithClass,
181 String [] suffixes) {
182 for (Class<?> iface : ifaces) {
183 Method[] methods = iface.getMethods();
184 for (Method method : methods) {
185 String attrName = prefixWithClass ?
186 getMetricName(iface, method.getName()) : method.getName();
187 if (get(attrName) == null)
188 create(attrName);
189 if (suffixes != null) {
190
191 for (String s : suffixes) {
192 String metricName = attrName + s;
193 if (get(metricName) == null)
194 create(metricName);
195 }
196 }
197 }
198 }
199 }
200
201 public static String getMetricName(Class<?> c, String method) {
202 return c.getSimpleName() + NAME_DELIM + method;
203 }
204
205
206
207
208 public void doUpdates(final MetricsContext context) {
209
210 for (MetricsBase m : registry.getMetricsList()) {
211 m.pushMetric(metricsRecord);
212 }
213 metricsRecord.update();
214 }
215
216 public void shutdown() {
217 if (rpcStatistics != null)
218 rpcStatistics.shutdown();
219 }
220 }