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.procedure2.util.StringUtils;
12
13 import org.apache.hadoop.hbase.replication.ReplicationLoadSource;
14
15 import org.apache.hadoop.hbase.ServerLoad;
16
17 import org.apache.hadoop.hbase.ServerName;
18
19 import org.apache.hadoop.hbase.client.HBaseAdmin;
20
21 import org.apache.hadoop.hbase.client.HConnectionManager;
22
23 import org.apache.hadoop.hbase.HTableDescriptor;
24
25 import org.apache.hadoop.hbase.HBaseConfiguration;
26
27 import org.apache.hadoop.hbase.util.VersionInfo;
28
29 import org.apache.hadoop.hbase.util.Pair;
30
31 import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;
32
33 public class RegionServerListTmplImpl
34 extends org.jamon.AbstractTemplateImpl
35 implements org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl.Intf
36
37 {
38 private final HMaster master;
39 private final List<ServerName> servers;
40 protected static org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl.ImplData p_implData)
41 {
42 if(! p_implData.getServers__IsNotDefault())
43 {
44 p_implData.setServers(null);
45 }
46 return p_implData;
47 }
48 public RegionServerListTmplImpl(org.jamon.TemplateManager p_templateManager, org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl.ImplData p_implData)
49 {
50 super(p_templateManager, __jamon_setOptionalArguments(p_implData));
51 master = p_implData.getMaster();
52 servers = p_implData.getServers();
53 }
54
55 @Override public void renderNoFlush(final java.io.Writer jamonWriter)
56 throws java.io.IOException
57 {
58
59 if ((servers != null && servers.size() > 0))
60 {
61
62 jamonWriter.write("\n\n");
63
64
65 ServerName [] serverNames = servers.toArray(new ServerName[servers.size()]);
66 Arrays.sort(serverNames);
67
68
69 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_compactStats\" data-toggle=\"tab\">Compactions</a></li>\n <li class=\"\"><a href=\"#tab_replicationStats\" data-toggle=\"tab\">Replications</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 ");
70
71 {
72
73 __jamon_innerUnit__baseStats(jamonWriter, serverNames);
74 }
75
76 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_memoryStats\">\n ");
77
78 {
79
80 __jamon_innerUnit__memoryStats(jamonWriter, serverNames);
81 }
82
83 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_requestStats\">\n ");
84
85 {
86
87 __jamon_innerUnit__requestStats(jamonWriter, serverNames);
88 }
89
90 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_storeStats\">\n ");
91
92 {
93
94 __jamon_innerUnit__storeStats(jamonWriter, serverNames);
95 }
96
97 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_compactStats\">\n ");
98
99 {
100
101 __jamon_innerUnit__compactionStats(jamonWriter, serverNames);
102 }
103
104 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_replicationStats\">\n ");
105
106 {
107
108 __jamon_innerUnit__replicationStats(jamonWriter, serverNames);
109 }
110
111 jamonWriter.write("\n </div>\n </div>\n</div>\n\n");
112 }
113
114 jamonWriter.write("\n\n");
115 }
116
117
118
119 private void __jamon_innerUnit__replicationStats(final java.io.Writer jamonWriter, final ServerName[] serverNames)
120 throws java.io.IOException
121 {
122
123
124 HashMap<String, List<Pair<ServerName, ReplicationLoadSource>>> replicationLoadSourceMap
125 = master.getReplicationLoad(serverNames);
126 List<String> peers = null;
127 if (replicationLoadSourceMap != null && replicationLoadSourceMap.size() > 0){
128 peers = new ArrayList<>(replicationLoadSourceMap.keySet());
129 Collections.sort(peers);
130 }
131
132
133 if ((replicationLoadSourceMap != null && replicationLoadSourceMap.size() > 0) )
134 {
135
136 jamonWriter.write("\n\n<div class=\"tabbable\">\n <ul class=\"nav nav-tabs\">\n ");
137
138
139 String active = "active";
140 for (String peer : peers){
141
142
143 jamonWriter.write("<li class=");
144
145 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(active), jamonWriter);
146
147 jamonWriter.write("><a href=\"#tab_");
148
149 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(peer), jamonWriter);
150
151 jamonWriter.write("\" data-toggle=\"tab\">Peer ");
152
153 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(peer), jamonWriter);
154
155 jamonWriter.write("</a> </li>\n ");
156
157
158 active = "";
159 }
160
161
162 jamonWriter.write("</ul>\n <div class=\"tab-content\">\n ");
163
164
165 active = "active";
166 for (String peer : peers){
167
168
169 jamonWriter.write("<div class=\"tab-pane ");
170
171 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(active), jamonWriter);
172
173 jamonWriter.write("\" id=\"tab_");
174
175 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(peer), jamonWriter);
176
177 jamonWriter.write("\">\n <table class=\"table table-striped\">\n <tr>\n <th>Server</th>\n <th>AgeOfLastShippedOp</th>\n <th>SizeOfLogQueue</th>\n <th>ReplicationLag</th>\n </tr>\n\n ");
178
179 for (Pair<ServerName, ReplicationLoadSource> pair: replicationLoadSourceMap.get(peer) )
180 {
181
182 jamonWriter.write("\n <tr>\n <td>");
183
184 {
185
186 __jamon_innerUnit__serverNameLink(jamonWriter, pair.getFirst());
187 }
188
189 jamonWriter.write("</td>\n <td>");
190
191 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanTimeDiff(pair.getSecond().getAgeOfLastShippedOp())), jamonWriter);
192
193 jamonWriter.write("</td>\n <td>");
194
195 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(pair.getSecond().getSizeOfLogQueue()), jamonWriter);
196
197 jamonWriter.write("</td>\n <td>");
198
199 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanTimeDiff(pair.getSecond().getReplicationLag())), jamonWriter);
200
201 jamonWriter.write("</td>\n </tr>\n ");
202 }
203
204 jamonWriter.write("\n </table>\n </div>\n ");
205
206
207 active = "";
208 }
209
210
211 jamonWriter.write("</div>\n</div>\n");
212 }
213
214 else
215 {
216
217 jamonWriter.write("\n <p>No Peers Metrics</p>\n");
218 }
219
220 jamonWriter.write("\n");
221 }
222
223
224
225 private void __jamon_innerUnit__requestStats(final java.io.Writer jamonWriter, final ServerName[] serverNames)
226 throws java.io.IOException
227 {
228
229 jamonWriter.write("<table id=\"requestStatsTable\" class=\"tablesorter table table-striped\">\n<thead>\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</thead>\n<tbody>\n");
230
231
232 for (ServerName serverName: serverNames) {
233
234 ServerLoad sl = master.getServerManager().getLoad(serverName);
235 if (sl != null) {
236
237
238 jamonWriter.write("<tr>\n<td>");
239
240 {
241
242 __jamon_innerUnit__serverNameLink(jamonWriter, serverName);
243 }
244
245 jamonWriter.write("</td>\n<td>");
246
247 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%.0f", sl.getRequestsPerSecond())), jamonWriter);
248
249 jamonWriter.write("</td>\n<td>");
250
251 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getReadRequestsCount()), jamonWriter);
252
253 jamonWriter.write("</td>\n<td>");
254
255 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getWriteRequestsCount()), jamonWriter);
256
257 jamonWriter.write("</td>\n</tr>\n");
258
259
260 } else {
261
262
263 {
264
265 __jamon_innerUnit__emptyStat(jamonWriter, serverName);
266 }
267
268 jamonWriter.write("\n");
269
270
271 }
272 }
273
274
275 jamonWriter.write("</tbody>\n</table>\n");
276 }
277
278
279
280 private void __jamon_innerUnit__emptyStat(final java.io.Writer jamonWriter, final ServerName serverName)
281 throws java.io.IOException
282 {
283
284 jamonWriter.write("<tr>\n <td>");
285
286 {
287
288 __jamon_innerUnit__serverNameLink(jamonWriter, serverName);
289 }
290
291 jamonWriter.write("</td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n <td></td>\n </tr>\n");
292 }
293
294
295
296 private void __jamon_innerUnit__serverNameLink(final java.io.Writer jamonWriter, final ServerName serverName)
297 throws java.io.IOException
298 {
299
300
301 int infoPort = master.getRegionServerInfoPort(serverName);
302 String url = "//" + serverName.getHostname() + ":" + infoPort + "/rs-status";
303
304
305 if (infoPort > 0)
306 {
307
308 jamonWriter.write("\n <a href=\"");
309
310 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(url), jamonWriter);
311
312 jamonWriter.write("\">");
313
314 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(serverName.getServerName()), jamonWriter);
315
316 jamonWriter.write("</a>\n ");
317 }
318
319 else
320 {
321
322 jamonWriter.write("\n ");
323
324 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(serverName.getServerName()), jamonWriter);
325
326 jamonWriter.write("\n ");
327 }
328
329 jamonWriter.write("\n");
330 }
331
332
333
334 private void __jamon_innerUnit__memoryStats(final java.io.Writer jamonWriter, final ServerName[] serverNames)
335 throws java.io.IOException
336 {
337
338 jamonWriter.write("<table id=\"memoryStatsTable\" class=\"tablesorter table table-striped\">\n<thead>\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</thead>\n<tbody>\n");
339
340
341 for (ServerName serverName: serverNames) {
342
343 ServerLoad sl = master.getServerManager().getLoad(serverName);
344 if (sl != null) {
345
346
347 jamonWriter.write("<tr>\n <td>");
348
349 {
350
351 __jamon_innerUnit__serverNameLink(jamonWriter, serverName);
352 }
353
354 jamonWriter.write("</td>\n <td>");
355
356 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getUsedHeapMB()
357 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
358
359 jamonWriter.write("</td>\n <td>");
360
361 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getMaxHeapMB()
362 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
363
364 jamonWriter.write("</td>\n <td>");
365
366 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getMemstoreSizeInMB()
367 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
368
369 jamonWriter.write("</td>\n\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("</tbody>\n</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 id=\"baseStatsTable\" class=\"tablesorter table table-striped\">\n<thead>\n<tr>\n <th>ServerName</th>\n <th>Start time</th>\n <th>Last contact</th>\n <th>Version</th>\n <th>Requests Per Second</th>\n <th>Num. Regions</th>\n</tr>\n</thead>\n<tbody> \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 long lastContact = 0;
414
415 if (sl != null) {
416 requestsPerSecond = sl.getRequestsPerSecond();
417 numRegionsOnline = sl.getNumberOfRegions();
418 totalRegions += sl.getNumberOfRegions();
419
420 totalRequests += sl.getNumberOfRequests();
421 lastContact = (System.currentTimeMillis() - sl.getReportTime())/1000;
422 }
423 long startcode = serverName.getStartcode();
424
425
426 jamonWriter.write("<tr>\n <td>");
427
428 {
429
430 __jamon_innerUnit__serverNameLink(jamonWriter, serverName);
431 }
432
433 jamonWriter.write("</td>\n <td>");
434
435 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(new Date(startcode)), jamonWriter);
436
437 jamonWriter.write("</td>\n <td>");
438
439 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(lastContact, "s", 1)), jamonWriter);
440
441 jamonWriter.write("</td>\n <td>");
442
443 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(version), jamonWriter);
444
445 jamonWriter.write("</td>\n <td>");
446
447 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%.0f", requestsPerSecond)), jamonWriter);
448
449 jamonWriter.write("</td>\n <td>");
450
451 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(numRegionsOnline), jamonWriter);
452
453 jamonWriter.write("</td>\n</tr>\n");
454
455
456 }
457
458
459 jamonWriter.write("</tbody> \n<tr><td>Total:");
460
461 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(servers.size()), jamonWriter);
462
463 jamonWriter.write("</td>\n<td></td>\n<td></td>\n");
464
465 if (inconsistentNodeNum > 0)
466 {
467
468 jamonWriter.write("\n <td style=\"color:red;\">");
469
470 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(inconsistentNodeNum), jamonWriter);
471
472 jamonWriter.write(" nodes with inconsistent version</td>\n");
473 }
474
475 else
476 {
477
478 jamonWriter.write("\n <td></td>\n");
479 }
480
481 jamonWriter.write("\n<td>");
482
483 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(totalRequests), jamonWriter);
484
485 jamonWriter.write("</td>\n<td>");
486
487 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(totalRegions), jamonWriter);
488
489 jamonWriter.write("</td>\n</tr>\n</table>\n");
490 }
491
492
493
494 private void __jamon_innerUnit__compactionStats(final java.io.Writer jamonWriter, final ServerName[] serverNames)
495 throws java.io.IOException
496 {
497
498 jamonWriter.write("<table id=\"compactionStatsTable\" class=\"tablesorter table table-striped\">\n<thead>\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</thead>\n<tbody>\n");
499
500
501 for (ServerName serverName: serverNames) {
502
503 ServerLoad sl = master.getServerManager().getLoad(serverName);
504 if (sl != null) {
505 String percentDone = "";
506 if (sl.getTotalCompactingKVs() > 0) {
507 percentDone = String.format("%.2f", 100 *
508 ((float) sl.getCurrentCompactedKVs() / sl.getTotalCompactingKVs())) + "%";
509 }
510
511
512 jamonWriter.write("<tr>\n<td>");
513
514 {
515
516 __jamon_innerUnit__serverNameLink(jamonWriter, serverName);
517 }
518
519 jamonWriter.write("</td>\n<td>");
520
521 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getTotalCompactingKVs()), jamonWriter);
522
523 jamonWriter.write("</td>\n<td>");
524
525 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getCurrentCompactedKVs()), jamonWriter);
526
527 jamonWriter.write("</td>\n<td>");
528
529 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getTotalCompactingKVs() - sl.getCurrentCompactedKVs()), jamonWriter);
530
531 jamonWriter.write("</td>\n<td>");
532
533 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(percentDone), jamonWriter);
534
535 jamonWriter.write("</td>\n</tr>\n");
536
537
538 } else {
539
540
541 {
542
543 __jamon_innerUnit__emptyStat(jamonWriter, serverName);
544 }
545
546 jamonWriter.write("\n");
547
548
549 }
550 }
551
552
553 jamonWriter.write("</tbody>\n</table>\n");
554 }
555
556
557
558 private void __jamon_innerUnit__storeStats(final java.io.Writer jamonWriter, final ServerName[] serverNames)
559 throws java.io.IOException
560 {
561
562 jamonWriter.write("<table id=\"storeStatsTable\" class=\"tablesorter table table-striped\">\n<thead>\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</thead>\n<tbody>\n");
563
564
565 for (ServerName serverName: serverNames) {
566
567 ServerLoad sl = master.getServerManager().getLoad(serverName);
568 if (sl != null) {
569
570
571 jamonWriter.write("<tr>\n<td>");
572
573 {
574
575 __jamon_innerUnit__serverNameLink(jamonWriter, serverName);
576 }
577
578 jamonWriter.write("</td>\n<td>");
579
580 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getStores()), jamonWriter);
581
582 jamonWriter.write("</td>\n<td>");
583
584 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(sl.getStorefiles()), jamonWriter);
585
586 jamonWriter.write("</td>\n<td>");
587
588 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(
589 sl.getStoreUncompressedSizeMB() * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
590
591 jamonWriter.write("</td>\n<td>");
592
593 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getStorefileSizeInMB()
594 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
595
596 jamonWriter.write("</td>\n<td>");
597
598 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getTotalStaticIndexSizeKB()
599 * TraditionalBinaryPrefix.KILO.value, "B", 1)), jamonWriter);
600
601 jamonWriter.write("</td>\n<td>");
602
603 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(sl.getTotalStaticBloomSizeKB()
604 * TraditionalBinaryPrefix.KILO.value, "B", 1)), jamonWriter);
605
606 jamonWriter.write("</td>\n</tr>\n");
607
608
609 } else {
610
611
612 {
613
614 __jamon_innerUnit__emptyStat(jamonWriter, serverName);
615 }
616
617 jamonWriter.write("\n");
618
619
620 }
621 }
622
623
624 jamonWriter.write("</tbody>\n</table>\n");
625 }
626
627
628 }