1
2
3
4 package org.apache.hadoop.hbase.tmpl.master;
5
6
7 import java.util.*;
8
9 import org.apache.hadoop.hbase.master.HMaster;
10
11 import org.apache.hadoop.hbase.ServerLoad;
12
13 import org.apache.hadoop.hbase.ServerName;
14
15 import org.apache.hadoop.hbase.client.HBaseAdmin;
16
17 import org.apache.hadoop.hbase.client.HConnectionManager;
18
19 import org.apache.hadoop.hbase.HTableDescriptor;
20
21 import org.apache.hadoop.hbase.HBaseConfiguration;
22
23 import org.apache.hadoop.hbase.util.VersionInfo;
24
25 import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;
26
27 public class RegionServerListTmplImpl
28 extends org.jamon.AbstractTemplateImpl
29 implements org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl.Intf
30
31 {
32 private final HMaster master;
33 private final List<ServerName> servers;
34 protected static org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl.ImplData p_implData)
35 {
36 if(! p_implData.getServers__IsNotDefault())
37 {
38 p_implData.setServers(null);
39 }
40 return p_implData;
41 }
42 public RegionServerListTmplImpl(org.jamon.TemplateManager p_templateManager, org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl.ImplData p_implData)
43 {
44 super(p_templateManager, __jamon_setOptionalArguments(p_implData));
45 master = p_implData.getMaster();
46 servers = p_implData.getServers();
47 }
48
49 @Override public void renderNoFlush(final java.io.Writer jamonWriter)
50 throws java.io.IOException
51 {
52
53 if ((servers != null && servers.size() > 0))
54 {
55
56 jamonWriter.write("\n\n");
57
58
59 ServerName [] serverNames = servers.toArray(new ServerName[servers.size()]);
60 Arrays.sort(serverNames);
61
62
63 jamonWriter.write("<div class=\"tabbable\">\n <ul class=\"nav nav-pills\">\n <li class=\"active\"><a href=\"#tab_baseStats\" data-toggle=\"tab\">Base Stats</a></li>\n <li class=\"\"><a href=\"#tab_memoryStats\" data-toggle=\"tab\">Memory</a></li>\n <li class=\"\"><a href=\"#tab_requestStats\" data-toggle=\"tab\">Requests</a></li>\n <li class=\"\"><a href=\"#tab_storeStats\" data-toggle=\"tab\">Storefiles</a></li>\n <li class=\"\"><a href=\"#tab_compactStas\" data-toggle=\"tab\">Compactions</a></li>\n </ul>\n <div class=\"tab-content\" style=\"padding-bottom: 9px; border-bottom: 1px solid #ddd;\">\n <div class=\"tab-pane active\" id=\"tab_baseStats\">\n ");
64
65 {
66
67 __jamon_innerUnit__baseStats(jamonWriter, serverNames);
68 }
69
70 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_memoryStats\">\n ");
71
72 {
73
74 __jamon_innerUnit__memoryStats(jamonWriter, serverNames);
75 }
76
77 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_requestStats\">\n ");
78
79 {
80
81 __jamon_innerUnit__requestStats(jamonWriter, serverNames);
82 }
83
84 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_storeStats\">\n ");
85
86 {
87
88 __jamon_innerUnit__storeStats(jamonWriter, serverNames);
89 }
90
91 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_compactStas\">\n ");
92
93 {
94
95 __jamon_innerUnit__compactionStats(jamonWriter, serverNames);
96 }
97
98 jamonWriter.write("\n </div>\n </div>\n</div>\n\n");
99 }
100
101 jamonWriter.write("\n\n");
102 }
103
104
105
106 private void __jamon_innerUnit__serverNameLink(final java.io.Writer jamonWriter, final ServerName serverName, final ServerLoad serverLoad)
107 throws java.io.IOException
108 {
109
110
111 int infoPort = master.getRegionServerInfoPort(serverName);
112 String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status";
113
114
115 if (infoPort > 0)
116 {
117
118 jamonWriter.write("\n <a href=\"");
119
120 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(url), jamonWriter);
121
122 jamonWriter.write("\">");
123
124 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(serverName.getServerName()), jamonWriter);
125
126 jamonWriter.write("</a>\n ");
127 }
128
129 else
130 {
131
132 jamonWriter.write("\n ");
133
134 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(serverName.getServerName()), jamonWriter);
135
136 jamonWriter.write("\n ");
137 }
138
139 jamonWriter.write("\n");
140 }
141
142
143
144 private void __jamon_innerUnit__storeStats(final java.io.Writer jamonWriter, final ServerName[] serverNames)
145 throws java.io.IOException
146 {
147
148 jamonWriter.write("<table class=\"table table-striped\">\n<tr>\n <th>ServerName</th>\n <th>Num. Stores</th>\n <th>Num. Storefiles</th>\n <th>Storefile Size Uncompressed</th>\n <th>Storefile Size</th>\n <th>Index Size</th>\n <th>Bloom Size</th>\n</tr>\n");
149
150
151 for (ServerName serverName: serverNames) {
152
153 ServerLoad sl = master.getServerManager().getLoad(serverName);
154 if (sl != null) {
155
156
157 jamonWriter.write("<tr>\n<td>");
158
159 {
160
161 __jamon_innerUnit__serverNameLink(jamonWriter, serverName, sl);
162 }
163
164 jamonWriter.write("</td>\n<td>");
165
166 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getStores()), jamonWriter);
167
168 jamonWriter.write("</td>\n<td>");
169
170 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getStorefiles()), jamonWriter);
171
172 jamonWriter.write("</td>\n<td>");
173
174 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(
175 sl.getStoreUncompressedSizeMB() * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
176
177 jamonWriter.write("</td>\n<td>");
178
179 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getStorefileSizeInMB()
180 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
181
182 jamonWriter.write("</td>\n<td>");
183
184 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getTotalStaticIndexSizeKB()
185 * TraditionalBinaryPrefix.KILO.value, "B", 1)), jamonWriter);
186
187 jamonWriter.write("</td>\n<td>");
188
189 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getTotalStaticBloomSizeKB()
190 * TraditionalBinaryPrefix.KILO.value, "B", 1)), jamonWriter);
191
192 jamonWriter.write("</td>\n</tr>\n");
193
194
195 } else {
196
197
198 {
199
200 __jamon_innerUnit__emptyStat(jamonWriter, serverName);
201 }
202
203 jamonWriter.write("\n");
204
205
206 }
207 }
208
209
210 jamonWriter.write("</table>\n");
211 }
212
213
214
215 private void __jamon_innerUnit__requestStats(final java.io.Writer jamonWriter, final ServerName[] serverNames)
216 throws java.io.IOException
217 {
218
219 jamonWriter.write("<table class=\"table table-striped\">\n<tr>\n <th>ServerName</th>\n <th>Request Per Second</th>\n <th>Read Request Count</th>\n <th>Write Request Count</th>\n</tr>\n");
220
221
222 for (ServerName serverName: serverNames) {
223
224 ServerLoad sl = master.getServerManager().getLoad(serverName);
225 if (sl != null) {
226
227
228 jamonWriter.write("<tr>\n<td>");
229
230 {
231
232 __jamon_innerUnit__serverNameLink(jamonWriter, serverName, sl);
233 }
234
235 jamonWriter.write("</td>\n<td>");
236
237 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%.0f", sl.getRequestsPerSecond())), jamonWriter);
238
239 jamonWriter.write("</td>\n<td>");
240
241 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getReadRequestsCount()), jamonWriter);
242
243 jamonWriter.write("</td>\n<td>");
244
245 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getWriteRequestsCount()), jamonWriter);
246
247 jamonWriter.write("</td>\n</tr>\n");
248
249
250 } else {
251
252
253 {
254
255 __jamon_innerUnit__emptyStat(jamonWriter, serverName);
256 }
257
258 jamonWriter.write("\n");
259
260
261 }
262 }
263
264
265 jamonWriter.write("</table>\n");
266 }
267
268
269
270 private void __jamon_innerUnit__memoryStats(final java.io.Writer jamonWriter, final ServerName[] serverNames)
271 throws java.io.IOException
272 {
273
274 jamonWriter.write("<table class=\"table table-striped\">\n<tr>\n <th>ServerName</th>\n <th>Used Heap</th>\n <th>Max Heap</th>\n <th>Memstore Size</th>\n\n</tr>\n");
275
276
277 for (ServerName serverName: serverNames) {
278
279 ServerLoad sl = master.getServerManager().getLoad(serverName);
280 if (sl != null) {
281
282
283 jamonWriter.write("<tr>\n <td>");
284
285 {
286
287 __jamon_innerUnit__serverNameLink(jamonWriter, serverName, sl);
288 }
289
290 jamonWriter.write("</td>\n <td>");
291
292 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getUsedHeapMB()
293 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
294
295 jamonWriter.write("</td>\n <td>");
296
297 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getMaxHeapMB()
298 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
299
300 jamonWriter.write("</td>\n <td>");
301
302 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getMemstoreSizeInMB()
303 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
304
305 jamonWriter.write("</td>\n\n</tr>\n");
306
307
308 } else {
309
310
311 {
312
313 __jamon_innerUnit__emptyStat(jamonWriter, serverName);
314 }
315
316 jamonWriter.write("\n");
317
318
319 }
320 }
321
322
323 jamonWriter.write("</table>\n");
324 }
325
326
327
328 private void __jamon_innerUnit__compactionStats(final java.io.Writer jamonWriter, final ServerName[] serverNames)
329 throws java.io.IOException
330 {
331
332 jamonWriter.write("<table class=\"table table-striped\">\n<tr>\n <th>ServerName</th>\n <th>Num. Compacting KVs</th>\n <th>Num. Compacted KVs</th>\n <th>Remaining KVs</th>\n <th>Compaction Progress</th>\n</tr>\n");
333
334
335 for (ServerName serverName: serverNames) {
336
337 ServerLoad sl = master.getServerManager().getLoad(serverName);
338 if (sl != null) {
339 String percentDone = "";
340 if (sl.getTotalCompactingKVs() > 0) {
341 percentDone = String.format("%.2f", 100 *
342 ((float) sl.getCurrentCompactedKVs() / sl.getTotalCompactingKVs())) + "%";
343 }
344
345
346 jamonWriter.write("<tr>\n<td>");
347
348 {
349
350 __jamon_innerUnit__serverNameLink(jamonWriter, serverName, sl);
351 }
352
353 jamonWriter.write("</td>\n<td>");
354
355 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getTotalCompactingKVs()), jamonWriter);
356
357 jamonWriter.write("</td>\n<td>");
358
359 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getCurrentCompactedKVs()), jamonWriter);
360
361 jamonWriter.write("</td>\n<td>");
362
363 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getTotalCompactingKVs() - sl.getCurrentCompactedKVs()), jamonWriter);
364
365 jamonWriter.write("</td>\n<td>");
366
367 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(percentDone), jamonWriter);
368
369 jamonWriter.write("</td>\n</tr>\n");
370
371
372 } else {
373
374
375 {
376
377 __jamon_innerUnit__emptyStat(jamonWriter, serverName);
378 }
379
380 jamonWriter.write("\n");
381
382
383 }
384 }
385
386
387 jamonWriter.write("</table>\n");
388 }
389
390
391
392 private void __jamon_innerUnit__baseStats(final java.io.Writer jamonWriter, final ServerName[] serverNames)
393 throws java.io.IOException
394 {
395
396 jamonWriter.write("<table class=\"table table-striped\">\n<tr>\n <th>ServerName</th>\n <th>Start time</th>\n <th>Version</th>\n <th>Requests Per Second</th>\n <th>Num. Regions</th>\n</tr>\n");
397
398
399 int totalRegions = 0;
400 int totalRequests = 0;
401 int inconsistentNodeNum = 0;
402 String masterVersion = VersionInfo.getVersion();
403 for (ServerName serverName: serverNames) {
404
405 ServerLoad sl = master.getServerManager().getLoad(serverName);
406 String version = master.getRegionServerVersion(serverName);
407 if (!masterVersion.equals(version)) {
408 inconsistentNodeNum ++;
409 }
410
411 double requestsPerSecond = 0.0;
412 int numRegionsOnline = 0;
413
414 if (sl != null) {
415 requestsPerSecond = sl.getRequestsPerSecond();
416 numRegionsOnline = sl.getNumberOfRegions();
417 totalRegions += sl.getNumberOfRegions();
418
419 totalRequests += sl.getNumberOfRequests();
420 }
421 long startcode = serverName.getStartcode();
422
423
424 jamonWriter.write("<tr>\n <td>");
425
426 {
427
428 __jamon_innerUnit__serverNameLink(jamonWriter, serverName, sl);
429 }
430
431 jamonWriter.write("</td>\n <td>");
432
433 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(new Date(startcode)), jamonWriter);
434
435 jamonWriter.write("</td>\n <td>");
436
437 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(version), jamonWriter);
438
439 jamonWriter.write("</td>\n <td>");
440
441 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%.0f", requestsPerSecond)), jamonWriter);
442
443 jamonWriter.write("</td>\n <td>");
444
445 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(numRegionsOnline), jamonWriter);
446
447 jamonWriter.write("</td>\n</tr>\n");
448
449
450 }
451
452
453 jamonWriter.write("<tr><td>Total:");
454
455 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(servers.size()), jamonWriter);
456
457 jamonWriter.write("</td>\n<td></td>\n");
458
459 if (inconsistentNodeNum > 0)
460 {
461
462 jamonWriter.write("\n <td style=\"color:red;\">");
463
464 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(inconsistentNodeNum), jamonWriter);
465
466 jamonWriter.write(" nodes with inconsistent version</td>\n");
467 }
468
469 else
470 {
471
472 jamonWriter.write("\n <td></td>\n");
473 }
474
475 jamonWriter.write("\n<td>");
476
477 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(totalRequests), jamonWriter);
478
479 jamonWriter.write("</td>\n<td>");
480
481 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(totalRegions), jamonWriter);
482
483 jamonWriter.write("</td>\n</tr>\n</table>\n");
484 }
485
486
487
488 private void __jamon_innerUnit__emptyStat(final java.io.Writer jamonWriter, final ServerName serverName)
489 throws java.io.IOException
490 {
491
492 jamonWriter.write("<tr>\n <td>");
493
494 {
495
496 __jamon_innerUnit__serverNameLink(jamonWriter, serverName, null);
497 }
498
499 jamonWriter.write("</td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n </tr>\n");
500 }
501
502
503 }