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
104 private void initMethods(Class<? extends VersionedProtocol> protocol) {
105 for (Method m : protocol.getDeclaredMethods()) {
106 if (get(m.getName()) == null)
107 create(m.getName());
108 }
109 }
110
111 private MetricsTimeVaryingRate get(String key) {
112 return (MetricsTimeVaryingRate) registry.get(key);
113 }
114 private MetricsTimeVaryingRate create(String key) {
115 return new MetricsTimeVaryingRate(key, this.registry);
116 }
117
118 public void inc(String name, int amt) {
119 MetricsTimeVaryingRate m = get(name);
120 if (m == null) {
121 LOG.warn("Got inc() request for method that doesnt exist: " +
122 name);
123 return;
124 }
125 m.inc(amt);
126 }
127
128
129
130
131
132
133
134 public void createMetrics(Class<?>[] ifaces) {
135 createMetrics(ifaces, false);
136 }
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152 public void createMetrics(Class<?>[] ifaces, boolean prefixWithClass) {
153 createMetrics(ifaces, prefixWithClass, null);
154 }
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178 public void createMetrics(Class<?>[] ifaces, boolean prefixWithClass,
179 String [] suffixes) {
180 for (Class<?> iface : ifaces) {
181 Method[] methods = iface.getMethods();
182 for (Method method : methods) {
183 String attrName = prefixWithClass ?
184 getMetricName(iface, method.getName()) : method.getName();
185 if (get(attrName) == null)
186 create(attrName);
187 if (suffixes != null) {
188
189 for (String s : suffixes) {
190 String metricName = attrName + s;
191 if (get(metricName) == null)
192 create(metricName);
193 }
194 }
195 }
196 }
197 }
198
199 public static String getMetricName(Class<?> c, String method) {
200 return c.getSimpleName() + NAME_DELIM + method;
201 }
202
203
204
205
206 public void doUpdates(final MetricsContext context) {
207
208 for (MetricsBase m : registry.getMetricsList()) {
209 m.pushMetric(metricsRecord);
210 }
211 metricsRecord.update();
212 }
213
214 public void shutdown() {
215 if (rpcStatistics != null)
216 rpcStatistics.shutdown();
217 }
218 }