1
2
3
4 package org.apache.hadoop.hbase.tmpl.master;
5
6
7 import java.util.*;
8
9 import org.apache.hadoop.util.StringUtils;
10
11 import org.apache.hadoop.hbase.util.Bytes;
12
13 import org.apache.hadoop.hbase.util.JvmVersion;
14
15 import org.apache.hadoop.hbase.util.FSUtils;
16
17 import org.apache.hadoop.hbase.master.HMaster;
18
19 import org.apache.hadoop.hbase.master.AssignmentManager;
20
21 import org.apache.hadoop.hbase.master.ServerManager;
22
23 import org.apache.hadoop.hbase.HConstants;
24
25 import org.apache.hadoop.hbase.NamespaceDescriptor;
26
27 import org.apache.hadoop.hbase.ServerLoad;
28
29 import org.apache.hadoop.hbase.ServerName;
30
31 import org.apache.hadoop.hbase.client.HBaseAdmin;
32
33 import org.apache.hadoop.hbase.client.HConnectionManager;
34
35 import org.apache.hadoop.hbase.HRegionInfo;
36
37 import org.apache.hadoop.hbase.master.RegionState;
38
39 import org.apache.hadoop.hbase.HTableDescriptor;
40
41 import org.apache.hadoop.hbase.HBaseConfiguration;
42
43 import org.apache.hadoop.hbase.TableName;
44
45 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription;
46
47 import org.apache.hadoop.hbase.master.DeadServer;
48
49 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
50
51 import org.apache.hadoop.hbase.security.visibility.VisibilityConstants;
52
53 import org.apache.hadoop.hbase.security.access.AccessControlLists;
54
55 public class MasterStatusTmplImpl
56 extends org.jamon.AbstractTemplateImpl
57 implements org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.Intf
58
59 {
60 private final HMaster master;
61 private final HBaseAdmin admin;
62 private final Set<ServerName> deadServers;
63 private final String format;
64 private final ServerName metaLocation;
65 private final boolean catalogJanitorEnabled;
66 private final List<ServerName> servers;
67 private final AssignmentManager assignmentManager;
68 private final String filter;
69 private final Map<String,Integer> frags;
70 private final ServerManager serverManager;
71
72
73 public String formatZKString() {
74 StringBuilder quorums = new StringBuilder();
75 String zkQuorum = master.getZooKeeperWatcher().getQuorum();
76
77 if (null == zkQuorum) {
78 return quorums.toString();
79 }
80
81 String[] zks = zkQuorum.split(",");
82
83 if (zks.length == 0) {
84 return quorums.toString();
85 }
86
87 for(int i = 0; i < zks.length; ++i) {
88 quorums.append(zks[i].trim()).append(",");
89
90 if ((i+1) % 4 == 0 && i != (zks.length - 1)) {
91 quorums.append("<br/>");
92 }
93 }
94
95 quorums.setLength(quorums.length() - 1);
96 return quorums.toString();
97 }
98
99 protected static org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData p_implData)
100 {
101 if(! p_implData.getDeadServers__IsNotDefault())
102 {
103 p_implData.setDeadServers(null);
104 }
105 if(! p_implData.getFormat__IsNotDefault())
106 {
107 p_implData.setFormat("html");
108 }
109 if(! p_implData.getMetaLocation__IsNotDefault())
110 {
111 p_implData.setMetaLocation(null);
112 }
113 if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())
114 {
115 p_implData.setCatalogJanitorEnabled(true);
116 }
117 if(! p_implData.getServers__IsNotDefault())
118 {
119 p_implData.setServers(null);
120 }
121 if(! p_implData.getAssignmentManager__IsNotDefault())
122 {
123 p_implData.setAssignmentManager(null);
124 }
125 if(! p_implData.getFilter__IsNotDefault())
126 {
127 p_implData.setFilter("general");
128 }
129 if(! p_implData.getFrags__IsNotDefault())
130 {
131 p_implData.setFrags(null);
132 }
133 if(! p_implData.getServerManager__IsNotDefault())
134 {
135 p_implData.setServerManager(null);
136 }
137 return p_implData;
138 }
139 public MasterStatusTmplImpl(org.jamon.TemplateManager p_templateManager, org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData p_implData)
140 {
141 super(p_templateManager, __jamon_setOptionalArguments(p_implData));
142 master = p_implData.getMaster();
143 admin = p_implData.getAdmin();
144 deadServers = p_implData.getDeadServers();
145 format = p_implData.getFormat();
146 metaLocation = p_implData.getMetaLocation();
147 catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();
148 servers = p_implData.getServers();
149 assignmentManager = p_implData.getAssignmentManager();
150 filter = p_implData.getFilter();
151 frags = p_implData.getFrags();
152 serverManager = p_implData.getServerManager();
153 }
154
155 public void renderNoFlush(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
156 throws java.io.IOException
157 {
158
159 if (format.equals("json") )
160 {
161
162 jamonWriter.write("\n ");
163
164 {
165 org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl __jamon__var_0 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());
166 __jamon__var_0.setFilter(filter);
167 __jamon__var_0.setFormat("json" );
168 __jamon__var_0.renderNoFlush(jamonWriter);
169 }
170
171 jamonWriter.write("\n ");
172
173 return;
174 }
175
176 jamonWriter.write("\n");
177
178
179 ServerManager serverManager = master.getServerManager();
180 AssignmentManager assignmentManager = master.getAssignmentManager();
181
182
183 jamonWriter.write("<!--[if IE]>\n<!DOCTYPE html>\n<![endif]-->\n<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\">\n <title>Master: ");
184
185 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getServerName().getHostname()), jamonWriter);
186
187 jamonWriter.write("</title>\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <meta name=\"description\" content=\"\">\n <link href=\"/static/css/bootstrap.min.css\" rel=\"stylesheet\">\n <link href=\"/static/css/bootstrap-theme.min.css\" rel=\"stylesheet\">\n <link href=\"/static/css/hbase.css\" rel=\"stylesheet\">\n </head>\n\n <body>\n\n <div class=\"navbar navbar-fixed-top navbar-default\">\n <div class=\"container\">\n <div class=\"navbar-header\">\n <button type=\"button\" class=\"navbar-toggle\" data-toggle=\"collapse\" data-target=\".navbar-collapse\">\n <span class=\"icon-bar\"></span>\n <span class=\"icon-bar\"></span>\n <span class=\"icon-bar\"></span>\n </button>\n <a class=\"navbar-brand\" href=\"/master-status\"><img src=\"/static/hbase_logo_small.png\" alt=\"HBase Logo\"/></a>\n </div>\n <div class=\"collapse navbar-collapse\">\n <ul class=\"nav navbar-nav\">\n <li class=\"active\"><a href=\"/\">Home</a></li>\n <li><a href=\"/tablesDetailed.jsp\">Table Details</a></li>\n <li><a href=\"/logs/\">Local Logs</a></li>\n <li><a href=\"/logLevel\">Log Level</a></li>\n <li><a href=\"/dump\">Debug Dump</a></li>\n <li><a href=\"/jmx\">Metrics Dump</a></li>\n ");
188
189 if (HBaseConfiguration.isShowConfInServlet())
190 {
191
192 jamonWriter.write("\n <li><a href=\"/conf\">HBase Configuration</a></li>\n ");
193 }
194
195 jamonWriter.write("\n </ul>\n </div><!--/.nav-collapse -->\n </div>\n </div>\n\n <div class=\"container\">\n\t");
196
197 if (master.isActiveMaster() )
198 {
199
200 jamonWriter.write("\n <div class=\"row inner_header\">\n <div class=\"page-header\">\n <h1>Master <small>");
201
202 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getServerName().getHostname()), jamonWriter);
203
204 jamonWriter.write(" </small></h1>\n </div>\n </div>\n\n <div class=\"row\">\n <!-- Various warnings that cluster admins should be aware of -->\n ");
205
206 if (JvmVersion.isBadJvmVersion() )
207 {
208
209 jamonWriter.write("\n <div class=\"alert alert-error\">\n Your current JVM version ");
210
211 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(System.getProperty("java.version")), jamonWriter);
212
213 jamonWriter.write(" is known to be\n unstable with HBase. Please see the\n <a href=\"http://wiki.apache.org/hadoop/Hbase/Troubleshooting#A18\">HBase wiki</a>\n for details.\n </div>\n ");
214 }
215
216 jamonWriter.write("\n ");
217
218 if (master.isInitialized() && !catalogJanitorEnabled )
219 {
220
221 jamonWriter.write("\n <div class=\"alert alert-error\">\n Please note that your cluster is running with the CatalogJanitor disabled. It can be\n re-enabled from the hbase shell by running the command 'catalogjanitor_switch true'\n </div>\n ");
222 }
223
224 jamonWriter.write("\n\n <section>\n <h2>Region Servers</h2>\n ");
225
226 {
227 org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl __jamon__var_1 = new org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl(this.getTemplateManager());
228 __jamon__var_1.setServers(servers );
229 __jamon__var_1.renderNoFlush(jamonWriter, master);
230 }
231
232 jamonWriter.write("\n\n ");
233
234 if ((deadServers != null) )
235 {
236
237 jamonWriter.write("\n ");
238
239 {
240
241 __jamon_innerUnit__deadRegionServers(jamonWriter);
242 }
243
244 jamonWriter.write("\n ");
245 }
246
247 jamonWriter.write("\n </section>\n <section>\n ");
248
249 {
250 org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl __jamon__var_2 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
251 __jamon__var_2.renderNoFlush(jamonWriter, master );
252 }
253
254 jamonWriter.write("\n </section>\n <section>\n <h2>Tables</h2>\n <div class=\"tabbable\">\n <ul class=\"nav nav-pills\">\n <li class=\"active\">\n <a href=\"#tab_userTables\" data-toggle=\"tab\">User Tables</a>\n </li>\n <li class=\"\">\n <a href=\"#tab_catalogTables\" data-toggle=\"tab\">System Tables</a>\n </li>\n <li class=\"\">\n <a href=\"#tab_userSnapshots\" data-toggle=\"tab\">Snapshots</a>\n </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_userTables\">\n ");
255
256 if ((metaLocation != null) )
257 {
258
259 jamonWriter.write("\n ");
260
261 {
262
263 __jamon_innerUnit__userTables(jamonWriter);
264 }
265
266 jamonWriter.write("\n ");
267 }
268
269 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_catalogTables\">\n ");
270
271 if ((metaLocation != null) )
272 {
273
274 jamonWriter.write("\n ");
275
276 {
277
278 __jamon_innerUnit__catalogTables(jamonWriter);
279 }
280
281 jamonWriter.write("\n ");
282 }
283
284 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_userSnapshots\">\n ");
285
286 {
287
288 __jamon_innerUnit__userSnapshots(jamonWriter);
289 }
290
291 jamonWriter.write("\n </div>\n </div>\n </div>\n </section>\n ");
292
293 {
294 org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl __jamon__var_3 = new org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl(this.getTemplateManager());
295 __jamon__var_3.renderNoFlush(jamonWriter, master.getAssignmentManager());
296 }
297
298 jamonWriter.write("\n\t");
299 }
300
301 else
302 {
303
304 jamonWriter.write("\n <section>\n ");
305
306 {
307 org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl __jamon__var_4 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
308 __jamon__var_4.renderNoFlush(jamonWriter, master );
309 }
310
311 jamonWriter.write("\n </section>\n\t");
312 }
313
314 jamonWriter.write(" \n\n\n <section>\n ");
315
316 {
317 org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl __jamon__var_5 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());
318 __jamon__var_5.setFilter(filter );
319 __jamon__var_5.renderNoFlush(jamonWriter);
320 }
321
322 jamonWriter.write("\n </section>\n\n <section>\n <h2>Software Attributes</h2>\n <table id=\"attributes_table\" class=\"table table-striped\">\n <tr>\n <th>Attribute Name</th>\n <th>Value</th>\n <th>Description</th>\n </tr>\n <tr>\n <td>HBase Version</td>\n <td>");
323
324 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getVersion()), jamonWriter);
325
326 jamonWriter.write(", r");
327
328 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getRevision()), jamonWriter);
329
330 jamonWriter.write("</td><td>HBase version and revision</td>\n </tr>\n <tr>\n <td>HBase Compiled</td>\n <td>");
331
332 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getDate()), jamonWriter);
333
334 jamonWriter.write(", ");
335
336 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getUser()), jamonWriter);
337
338 jamonWriter.write("</td>\n <td>When HBase version was compiled and by whom</td>\n </tr>\n <tr>\n <td>Hadoop Version</td>\n <td>");
339
340 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getVersion()), jamonWriter);
341
342 jamonWriter.write(", r");
343
344 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getRevision()), jamonWriter);
345
346 jamonWriter.write("</td>\n <td>Hadoop version and revision</td>\n </tr>\n <tr>\n <td>Hadoop Compiled</td>\n <td>");
347
348 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getDate()), jamonWriter);
349
350 jamonWriter.write(", ");
351
352 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getUser()), jamonWriter);
353
354 jamonWriter.write("</td>\n <td>When Hadoop version was compiled and by whom</td>\n </tr>\n <tr>\n <td>Zookeeper Quorum</td>\n <td> ");
355
356 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(formatZKString()), jamonWriter);
357
358 jamonWriter.write(" </td>\n <td>Addresses of all registered ZK servers. For more, see <a href=\"/zk.jsp\">zk dump</a>.</td>\n </tr>\n <tr>\n <td>Zookeeper Base Path</td>\n <td> ");
359
360 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getZooKeeper().getBaseZNode()), jamonWriter);
361
362 jamonWriter.write("</td>\n <td>Root node of this cluster in ZK.</td>\n </tr>\n <tr>\n <td>HBase Root Directory</td>\n <td>");
363
364 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(FSUtils.getRootDir(master.getConfiguration()).toString()), jamonWriter);
365
366 jamonWriter.write("</td>\n <td>Location of HBase home directory</td>\n </tr>\n <tr>\n <td>HMaster Start Time</td>\n <td>");
367
368 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(master.getMasterStartTime())), jamonWriter);
369
370 jamonWriter.write("</td>\n <td>Date stamp of when this HMaster was started</td>\n </tr>\n ");
371
372 if (master.isActiveMaster() )
373 {
374
375 jamonWriter.write("\n\t <tr>\n\t <td>HMaster Active Time</td>\n\t <td>");
376
377 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(master.getMasterActiveTime())), jamonWriter);
378
379 jamonWriter.write("</td>\n\t <td>Date stamp of when this HMaster became active</td>\n\t </tr>\n\t <tr>\n\t <td>HBase Cluster ID</td>\n\t <td>");
380
381 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getClusterId() != null ? master.getClusterId() : "Not set"), jamonWriter);
382
383 jamonWriter.write("</td>\n\t <td>Unique identifier generated for each HBase cluster</td>\n\t </tr>\n\t <tr>\n\t <td>Load average</td>\n\t <td>");
384
385 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.limitDecimalTo2(master.getServerManager().getAverageLoad())), jamonWriter);
386
387 jamonWriter.write("</td>\n\t <td>Average number of regions per regionserver. Naive computation.</td>\n\t </tr>\n\t ");
388
389 if (frags != null )
390 {
391
392 jamonWriter.write("\n\t <tr>\n\t <td>Fragmentation</td>\n\t <td>");
393
394 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get("-TOTAL-") != null ? frags.get("-TOTAL-").intValue() + "%" : "n/a"), jamonWriter);
395
396 jamonWriter.write("</td>\n\t <td>Overall fragmentation of all tables, including hbase:meta</td>\n\t </tr>\n\t ");
397 }
398
399 jamonWriter.write("\n\t <tr>\n\t <td>Coprocessors</td>\n\t <td>");
400
401 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(java.util.Arrays.toString(master.getCoprocessors())), jamonWriter);
402
403 jamonWriter.write("</td>\n\t <td>Coprocessors currently loaded by the master</td>\n\t </tr>\n ");
404 }
405
406 jamonWriter.write("\n </table>\n </section>\n </div>\n </div> <!-- /container -->\n\n <script src=\"/static/js/jquery.min.js\" type=\"text/javascript\"></script>\n <script src=\"/static/js/bootstrap.min.js\" type=\"text/javascript\"></script>\n <script src=\"/static/js/tab.js\" type=\"text/javascript\"></script>\n </body>\n</html>\n\n");
407 }
408
409
410
411 private void __jamon_innerUnit__userSnapshots(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
412 throws java.io.IOException
413 {
414
415
416 List<SnapshotDescription> snapshots = admin.listSnapshots();
417
418
419 if ((snapshots != null && snapshots.size() > 0))
420 {
421
422 jamonWriter.write("\n<table class=\"table table-striped\">\n <tr>\n <th>Snapshot Name</th>\n <th>Table</th>\n <th>Creation Time</th>\n </tr>\n ");
423
424 for (SnapshotDescription snapshotDesc : snapshots)
425 {
426
427 jamonWriter.write("\n ");
428
429
430 TableName snapshotTable = TableName.valueOf(snapshotDesc.getTable());
431
432
433 jamonWriter.write("<tr>\n <td><a href=\"snapshot.jsp?name=");
434
435 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);
436
437 jamonWriter.write("\">");
438
439 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);
440
441 jamonWriter.write("</a> </td>\n <td><a href=\"table.jsp?name=");
442
443 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);
444
445 jamonWriter.write("\">");
446
447 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);
448
449 jamonWriter.write("</a>\n </td>\n <td>");
450
451 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(snapshotDesc.getCreationTime())), jamonWriter);
452
453 jamonWriter.write("</td>\n </tr>\n ");
454 }
455
456 jamonWriter.write("\n <p>");
457
458 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshots.size()), jamonWriter);
459
460 jamonWriter.write(" snapshot(s) in set.</p>\n</table>\n");
461 }
462
463 jamonWriter.write("\n");
464 }
465
466
467
468 private void __jamon_innerUnit__catalogTables(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
469 throws java.io.IOException
470 {
471
472
473 HTableDescriptor[] sysTables = admin.listTableDescriptorsByNamespace(NamespaceDescriptor
474 .SYSTEM_NAMESPACE_NAME_STR);
475
476
477 jamonWriter.write("<table class=\"table table-striped\">\n<tr>\n <th>Table Name</th>\n ");
478
479 if ((frags != null) )
480 {
481
482 jamonWriter.write("\n <th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\">Frag.</th>\n ");
483 }
484
485 jamonWriter.write("\n <th>Description</th>\n</tr>\n");
486
487 for (HTableDescriptor systemTable : sysTables)
488 {
489
490 jamonWriter.write("\n<tr>\n");
491
492 TableName tableName = systemTable.getTableName();
493
494 jamonWriter.write("<td><a href=\"table.jsp?name=");
495
496 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);
497
498 jamonWriter.write("\">");
499
500 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);
501
502 jamonWriter.write("</a></td>\n ");
503
504 if ((frags != null))
505 {
506
507 jamonWriter.write("\n <td align=\"center\">");
508
509 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString())
510 .intValue() + "%" : "n/a"), jamonWriter);
511
512 jamonWriter.write("</td>\n ");
513 }
514
515 jamonWriter.write("\n ");
516
517 String description = null;
518 if (tableName.equals(TableName.META_TABLE_NAME)){
519 description = "The hbase:meta table holds references to all User Table regions";
520 } else if (tableName.equals(AccessControlLists.ACL_TABLE_NAME)){
521 description = "The hbase:acl table holds information about acl";
522 } else if (tableName.equals(VisibilityConstants.LABELS_TABLE_NAME)){
523 description = "The hbase:labels table holds information about visibility labels";
524 } else {
525 description = "The .NAMESPACE. table holds information about namespaces.";
526 }
527
528
529 jamonWriter.write("<td>");
530
531 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(description), jamonWriter);
532
533 jamonWriter.write("</td>\n</tr>\n");
534 }
535
536 jamonWriter.write("\n</table>\n");
537 }
538
539
540
541 private void __jamon_innerUnit__userTables(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
542 throws java.io.IOException
543 {
544
545
546 HTableDescriptor[] tables = admin.listTables();
547
548
549 if ((tables != null && tables.length > 0))
550 {
551
552 jamonWriter.write("\n<table class=\"table table-striped\">\n <tr>\n <th>Namespace</th>\n <th>Table Name</th>\n ");
553
554 if ((frags != null) )
555 {
556
557 jamonWriter.write("\n <th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\">Frag.</th>\n ");
558 }
559
560 jamonWriter.write("\n <th>Online Regions</th>\n <th>Offline Regions</th>\n <th>Failed Regions</th>\n <th>Split Regions</th>\n <th>Other Regions</th>\n <th>Description</th>\n </tr>\n ");
561
562 for (HTableDescriptor htDesc : tables)
563 {
564
565 jamonWriter.write("\n ");
566
567
568 Map<RegionState.State, List<HRegionInfo>> tableRegions =
569 master.getAssignmentManager().getRegionStates()
570 .getRegionByStateOfTable(htDesc.getTableName());
571 int openRegionsCount = tableRegions.get(RegionState.State.OPEN).size();
572 int offlineRegionsCount = tableRegions.get(RegionState.State.OFFLINE).size();
573 int splitRegionsCount = tableRegions.get(RegionState.State.SPLIT).size();
574 int failedRegionsCount = tableRegions.get(RegionState.State.FAILED_OPEN).size()
575 + tableRegions.get(RegionState.State.FAILED_CLOSE).size();
576 int otherRegionsCount = 0;
577 for (List<HRegionInfo> list: tableRegions.values()) {
578 otherRegionsCount += list.size();
579 }
580
581 otherRegionsCount = otherRegionsCount - openRegionsCount
582 - failedRegionsCount - offlineRegionsCount
583 - splitRegionsCount;
584
585
586 jamonWriter.write("<tr>\n <td>");
587
588 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(htDesc.getTableName().getNamespaceAsString()), jamonWriter);
589
590 jamonWriter.write("</td>\n <td><a href=table.jsp?name=");
591
592 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(htDesc.getTableName().getNameAsString()), jamonWriter);
593
594 jamonWriter.write(">");
595
596 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(htDesc.getTableName().getQualifierAsString()), jamonWriter);
597
598 jamonWriter.write("</a> </td>\n ");
599
600 if ((frags != null) )
601 {
602
603 jamonWriter.write("\n <td align=\"center\">");
604
605 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(htDesc.getTableName().getNameAsString()) != null ? frags.get(htDesc.getTableName().getQualifierAsString()).intValue() + "%" : "n/a"), jamonWriter);
606
607 jamonWriter.write("</td>\n ");
608 }
609
610 jamonWriter.write("\n <td>");
611
612 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(openRegionsCount), jamonWriter);
613
614 jamonWriter.write("</td>\n <td>");
615
616 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(offlineRegionsCount), jamonWriter);
617
618 jamonWriter.write("</td>\n <td>");
619
620 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(failedRegionsCount), jamonWriter);
621
622 jamonWriter.write("</td>\n <td>");
623
624 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(splitRegionsCount), jamonWriter);
625
626 jamonWriter.write("</td>\n <td>");
627
628 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(otherRegionsCount), jamonWriter);
629
630 jamonWriter.write("</td>\n <td>");
631
632 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(htDesc.toStringCustomizedValues()), jamonWriter);
633
634 jamonWriter.write("</td>\n </tr>\n ");
635 }
636
637 jamonWriter.write("\n <p>");
638
639 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tables.length), jamonWriter);
640
641 jamonWriter.write(" table(s) in set. [<a href=tablesDetailed.jsp>Details</a>]</p>\n</table>\n");
642 }
643
644 jamonWriter.write("\n");
645 }
646
647
648
649 private void __jamon_innerUnit__deadRegionServers(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
650 throws java.io.IOException
651 {
652
653 if ((deadServers != null && deadServers.size() > 0))
654 {
655
656 jamonWriter.write("\n<h2>Dead Region Servers</h2>\n<table class=\"table table-striped\">\n <tr>\n <th></th>\n <th>ServerName</th>\n <th>Stop time</th>\n </tr>\n ");
657
658
659 DeadServer deadServerUtil = master.getServerManager().getDeadServers();
660 ServerName [] deadServerNames = deadServers.toArray(new ServerName[deadServers.size()]);
661 Arrays.sort(deadServerNames);
662 for (ServerName deadServerName: deadServerNames) {
663
664
665 jamonWriter.write("<tr>\n \t<th></th>\n <td>");
666
667 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerName), jamonWriter);
668
669 jamonWriter.write("</td>\n <td>");
670
671 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerUtil.getTimeOfDeath(deadServerName)), jamonWriter);
672
673 jamonWriter.write("</td>\n </tr>\n ");
674
675
676 }
677
678
679 jamonWriter.write("<tr>\n <th>Total: </th>\n <td>servers: ");
680
681 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServers.size()), jamonWriter);
682
683 jamonWriter.write("</td>\n <th></th>\n </tr>\n</table>\n");
684 }
685
686 jamonWriter.write("\n");
687
688
689 HConnectionManager.deleteConnection(admin.getConfiguration());
690
691 }
692
693
694 }