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 final RpcServer myServer;
51 private static Log LOG = LogFactory.getLog(HBaseRpcMetrics.class);
52 private final HBaseRPCStatistics rpcStatistics;
53
54 public HBaseRpcMetrics(String hostName, String port,
55 final RpcServer server) {
56 myServer = server;
57 MetricsContext context = MetricsUtil.getContext("rpc");
58 metricsRecord = MetricsUtil.createRecord(context, "metrics");
59
60 metricsRecord.setTag("port", port);
61
62 LOG.info("Initializing RPC Metrics with hostName="
63 + hostName + ", port=" + port);
64
65 context.registerUpdater(this);
66
67 initMethods(HMasterInterface.class);
68 initMethods(HMasterRegionInterface.class);
69 initMethods(HRegionInterface.class);
70 rpcStatistics = new HBaseRPCStatistics(this.registry, hostName, port);
71 }
72
73
74
75
76
77
78
79
80 public final MetricsTimeVaryingLong receivedBytes =
81 new MetricsTimeVaryingLong("ReceivedBytes", registry);
82 public final MetricsTimeVaryingLong sentBytes =
83 new MetricsTimeVaryingLong("SentBytes", registry);
84 public final MetricsTimeVaryingRate rpcQueueTime =
85 new MetricsTimeVaryingRate("RpcQueueTime", registry);
86 public MetricsTimeVaryingRate rpcProcessingTime =
87 new MetricsTimeVaryingRate("RpcProcessingTime", registry);
88 public final MetricsIntValue numOpenConnections =
89 new MetricsIntValue("NumOpenConnections", registry);
90 public final MetricsIntValue callQueueLen =
91 new MetricsIntValue("callQueueLen", registry);
92 public final MetricsTimeVaryingInt authenticationFailures =
93 new MetricsTimeVaryingInt("rpcAuthenticationFailures", registry);
94 public final MetricsTimeVaryingInt authenticationSuccesses =
95 new MetricsTimeVaryingInt("rpcAuthenticationSuccesses", registry);
96 public final MetricsTimeVaryingInt authorizationFailures =
97 new MetricsTimeVaryingInt("rpcAuthorizationFailures", registry);
98 public final MetricsTimeVaryingInt authorizationSuccesses =
99 new MetricsTimeVaryingInt("rpcAuthorizationSuccesses", registry);
100 public MetricsTimeVaryingRate rpcSlowResponseTime =
101 new MetricsTimeVaryingRate("RpcSlowResponse", registry);
102
103 private void initMethods(Class<? extends VersionedProtocol> protocol) {
104 for (Method m : protocol.getDeclaredMethods()) {
105 if (get(m.getName()) == null)
106 create(m.getName());
107 }
108 }
109
110 private MetricsTimeVaryingRate get(String key) {
111 return (MetricsTimeVaryingRate) registry.get(key);
112 }
113 private MetricsTimeVaryingRate create(String key) {
114 return new MetricsTimeVaryingRate(key, this.registry);
115 }
116
117 public void inc(String name, int amt) {
118 MetricsTimeVaryingRate m = get(name);
119 if (m == null) {
120 LOG.warn("Got inc() request for method that doesnt exist: " +
121 name);
122 return;
123 }
124 m.inc(amt);
125 }
126
127
128
129
130
131
132
133 public void createMetrics(Class<?>[] ifaces) {
134 createMetrics(ifaces, false);
135 }
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 public void createMetrics(Class<?>[] ifaces, boolean prefixWithClass) {
152 createMetrics(ifaces, prefixWithClass, null);
153 }
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177 public void createMetrics(Class<?>[] ifaces, boolean prefixWithClass,
178 String [] suffixes) {
179 for (Class<?> iface : ifaces) {
180 Method[] methods = iface.getMethods();
181 for (Method method : methods) {
182 String attrName = prefixWithClass ?
183 getMetricName(iface, method.getName()) : method.getName();
184 if (get(attrName) == null)
185 create(attrName);
186 if (suffixes != null) {
187
188 for (String s : suffixes) {
189 String metricName = attrName + s;
190 if (get(metricName) == null)
191 create(metricName);
192 }
193 }
194 }
195 }
196 }
197
198 public static String getMetricName(Class<?> c, String method) {
199 return c.getSimpleName() + NAME_DELIM + method;
200 }
201
202
203
204
205 public void doUpdates(final MetricsContext context) {
206 synchronized (this) {
207
208
209 numOpenConnections.set(myServer.getNumOpenConnections());
210 callQueueLen.set(myServer.getCallQueueLen());
211 for (MetricsBase m : registry.getMetricsList()) {
212 m.pushMetric(metricsRecord);
213 }
214 }
215 metricsRecord.update();
216 }
217
218 public void shutdown() {
219 if (rpcStatistics != null)
220 rpcStatistics.shutdown();
221 }
222 }