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.tool.Canary;
46
47 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription;
48
49 import org.apache.hadoop.hbase.master.DeadServer;
50
51 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
52
53 import org.apache.hadoop.hbase.security.visibility.VisibilityConstants;
54
55 import org.apache.hadoop.hbase.security.access.AccessControlLists;
56
57 public class MasterStatusTmplImpl
58 extends org.jamon.AbstractTemplateImpl
59 implements org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.Intf
60
61 {
62 private final HMaster master;
63 private final HBaseAdmin admin;
64 private final ServerManager serverManager;
65 private final boolean catalogJanitorEnabled;
66 private final Set<ServerName> deadServers;
67 private final String filter;
68 private final ServerName metaLocation;
69 private final AssignmentManager assignmentManager;
70 private final String format;
71 private final Map<String,Integer> frags;
72 private final List<ServerName> servers;
73
74
75 public String formatZKString() {
76 StringBuilder quorums = new StringBuilder();
77 String zkQuorum = master.getZooKeeperWatcher().getQuorum();
78
79 if (null == zkQuorum) {
80 return quorums.toString();
81 }
82
83 String[] zks = zkQuorum.split(",");
84
85 if (zks.length == 0) {
86 return quorums.toString();
87 }
88
89 for(int i = 0; i < zks.length; ++i) {
90 quorums.append(zks[i].trim());
91
92 if (i != (zks.length - 1)) {
93 quorums.append("<br/>");
94 }
95 }
96
97 return quorums.toString();
98 }
99
100 protected static org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData p_implData)
101 {
102 if(! p_implData.getServerManager__IsNotDefault())
103 {
104 p_implData.setServerManager(null);
105 }
106 if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())
107 {
108 p_implData.setCatalogJanitorEnabled(true);
109 }
110 if(! p_implData.getDeadServers__IsNotDefault())
111 {
112 p_implData.setDeadServers(null);
113 }
114 if(! p_implData.getFilter__IsNotDefault())
115 {
116 p_implData.setFilter("general");
117 }
118 if(! p_implData.getMetaLocation__IsNotDefault())
119 {
120 p_implData.setMetaLocation(null);
121 }
122 if(! p_implData.getAssignmentManager__IsNotDefault())
123 {
124 p_implData.setAssignmentManager(null);
125 }
126 if(! p_implData.getFormat__IsNotDefault())
127 {
128 p_implData.setFormat("html");
129 }
130 if(! p_implData.getFrags__IsNotDefault())
131 {
132 p_implData.setFrags(null);
133 }
134 if(! p_implData.getServers__IsNotDefault())
135 {
136 p_implData.setServers(null);
137 }
138 return p_implData;
139 }
140 public MasterStatusTmplImpl(org.jamon.TemplateManager p_templateManager, org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData p_implData)
141 {
142 super(p_templateManager, __jamon_setOptionalArguments(p_implData));
143 master = p_implData.getMaster();
144 admin = p_implData.getAdmin();
145 serverManager = p_implData.getServerManager();
146 catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();
147 deadServers = p_implData.getDeadServers();
148 filter = p_implData.getFilter();
149 metaLocation = p_implData.getMetaLocation();
150 assignmentManager = p_implData.getAssignmentManager();
151 format = p_implData.getFormat();
152 frags = p_implData.getFrags();
153 servers = p_implData.getServers();
154 }
155
156 public void renderNoFlush(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
157 throws java.io.IOException
158 {
159
160 if (format.equals("json") )
161 {
162
163 jamonWriter.write("\n ");
164
165 {
166 org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl __jamon__var_0 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());
167 __jamon__var_0.setFormat("json" );
168 __jamon__var_0.setFilter(filter);
169 __jamon__var_0.renderNoFlush(jamonWriter);
170 }
171
172 jamonWriter.write("\n ");
173
174 return;
175 }
176
177 jamonWriter.write("\n");
178
179
180 ServerManager serverManager = master.getServerManager();
181 AssignmentManager assignmentManager = master.getAssignmentManager();
182
183
184 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>");
185
186 if (master.isActiveMaster() )
187 {
188
189 jamonWriter.write("Master: ");
190 }
191
192 else
193 {
194
195 jamonWriter.write("Backup Master: ");
196 }
197
198 jamonWriter.write("\n ");
199
200 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getServerName().getHostname()), jamonWriter);
201
202 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 ");
203
204 if (HBaseConfiguration.isShowConfInServlet())
205 {
206
207 jamonWriter.write("\n <li><a href=\"/conf\">HBase Configuration</a></li>\n ");
208 }
209
210 jamonWriter.write("\n </ul>\n </div><!--/.nav-collapse -->\n </div>\n </div>\n\n <div class=\"container\">\n\t");
211
212 if (master.isActiveMaster() )
213 {
214
215 jamonWriter.write("\n <div class=\"row inner_header\">\n <div class=\"page-header\">\n <h1>Master <small>");
216
217 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getServerName().getHostname()), jamonWriter);
218
219 jamonWriter.write("</small></h1>\n </div>\n </div>\n\n <div class=\"row\">\n <!-- Various warnings that cluster admins should be aware of -->\n ");
220
221 if (JvmVersion.isBadJvmVersion() )
222 {
223
224 jamonWriter.write("\n <div class=\"alert alert-error\">\n Your current JVM version ");
225
226 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(System.getProperty("java.version")), jamonWriter);
227
228 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 ");
229 }
230
231 jamonWriter.write("\n ");
232
233 if (master.isInitialized() && !catalogJanitorEnabled )
234 {
235
236 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 ");
237 }
238
239 jamonWriter.write("\n ");
240
241 if (!master.isBalancerOn() )
242 {
243
244 jamonWriter.write("\n <div class=\"alert alert-warning\">\n The Load Balancer is not enabled which will eventually cause performance degradation\n in HBase as Regions will not be distributed across all RegionServers. The balancer\n is only expected to be disabled during rolling upgrade scenarios.\n </div>\n ");
245 }
246
247 jamonWriter.write("\n\n <section>\n <h2>Region Servers</h2>\n ");
248
249 {
250 org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl __jamon__var_1 = new org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl(this.getTemplateManager());
251 __jamon__var_1.setServers(servers );
252 __jamon__var_1.renderNoFlush(jamonWriter, master);
253 }
254
255 jamonWriter.write("\n\n ");
256
257 if ((deadServers != null) )
258 {
259
260 jamonWriter.write("\n ");
261
262 {
263
264 __jamon_innerUnit__deadRegionServers(jamonWriter);
265 }
266
267 jamonWriter.write("\n ");
268 }
269
270 jamonWriter.write("\n </section>\n <section>\n ");
271
272 {
273 org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl __jamon__var_2 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
274 __jamon__var_2.renderNoFlush(jamonWriter, master );
275 }
276
277 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 ");
278
279 if ((metaLocation != null) )
280 {
281
282 jamonWriter.write("\n ");
283
284 {
285
286 __jamon_innerUnit__userTables(jamonWriter);
287 }
288
289 jamonWriter.write("\n ");
290 }
291
292 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_catalogTables\">\n ");
293
294 if ((metaLocation != null) )
295 {
296
297 jamonWriter.write("\n ");
298
299 {
300
301 __jamon_innerUnit__catalogTables(jamonWriter);
302 }
303
304 jamonWriter.write("\n ");
305 }
306
307 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_userSnapshots\">\n ");
308
309 {
310
311 __jamon_innerUnit__userSnapshots(jamonWriter);
312 }
313
314 jamonWriter.write("\n </div>\n </div>\n </div>\n </section>\n ");
315
316 {
317 org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl __jamon__var_3 = new org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl(this.getTemplateManager());
318 __jamon__var_3.renderNoFlush(jamonWriter, master.getAssignmentManager());
319 }
320
321 jamonWriter.write("\n\t");
322 }
323
324 else
325 {
326
327 jamonWriter.write("\n <section>\n ");
328
329 {
330 org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl __jamon__var_4 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
331 __jamon__var_4.renderNoFlush(jamonWriter, master );
332 }
333
334 jamonWriter.write("\n </section>\n\t");
335 }
336
337 jamonWriter.write("\n\n\n <section>\n ");
338
339 {
340 org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl __jamon__var_5 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());
341 __jamon__var_5.setFilter(filter );
342 __jamon__var_5.renderNoFlush(jamonWriter);
343 }
344
345 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>");
346
347 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getVersion()), jamonWriter);
348
349 jamonWriter.write(", r");
350
351 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getRevision()), jamonWriter);
352
353 jamonWriter.write("</td><td>HBase version and revision</td>\n </tr>\n <tr>\n <td>HBase Compiled</td>\n <td>");
354
355 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getDate()), jamonWriter);
356
357 jamonWriter.write(", ");
358
359 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getUser()), jamonWriter);
360
361 jamonWriter.write("</td>\n <td>When HBase version was compiled and by whom</td>\n </tr>\n <tr>\n <td>HBase Source Checksum</td>\n <td>");
362
363 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getSrcChecksum()), jamonWriter);
364
365 jamonWriter.write("</td>\n <td>HBase source MD5 checksum</td>\n </tr>\n <tr>\n <td>Hadoop Version</td>\n <td>");
366
367 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getVersion()), jamonWriter);
368
369 jamonWriter.write(", r");
370
371 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getRevision()), jamonWriter);
372
373 jamonWriter.write("</td>\n <td>Hadoop version and revision</td>\n </tr>\n <tr>\n <td>Hadoop Compiled</td>\n <td>");
374
375 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getDate()), jamonWriter);
376
377 jamonWriter.write(", ");
378
379 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getUser()), jamonWriter);
380
381 jamonWriter.write("</td>\n <td>When Hadoop version was compiled and by whom</td>\n </tr>\n <tr>\n <td>Hadoop Source Checksum</td>\n <td>");
382
383 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getSrcChecksum()), jamonWriter);
384
385 jamonWriter.write("</td>\n <td>Hadoop source MD5 checksum</td>\n </tr>\n <tr>\n <td>ZooKeeper Client Version</td>\n <td>");
386
387 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.zookeeper.Version.getVersion()), jamonWriter);
388
389 jamonWriter.write(", revision=");
390
391 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.zookeeper.Version.getRevision()), jamonWriter);
392
393 jamonWriter.write("</td>\n <td>ZooKeeper client version and revision</td>\n </tr>\n <tr>\n <td>ZooKeeper Client Compiled</td>\n <td>");
394
395 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.zookeeper.Version.getBuildDate()), jamonWriter);
396
397 jamonWriter.write("</td>\n <td>When ZooKeeper client version was compiled</td>\n </tr>\n <tr>\n <td>Zookeeper Quorum</td>\n <td> ");
398
399 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(formatZKString()), jamonWriter);
400
401 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> ");
402
403 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getZooKeeper().getBaseZNode()), jamonWriter);
404
405 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>");
406
407 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(FSUtils.getRootDir(master.getConfiguration()).toString()), jamonWriter);
408
409 jamonWriter.write("</td>\n <td>Location of HBase home directory</td>\n </tr>\n <tr>\n <td>HMaster Start Time</td>\n <td>");
410
411 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(master.getMasterStartTime())), jamonWriter);
412
413 jamonWriter.write("</td>\n <td>Date stamp of when this HMaster was started</td>\n </tr>\n ");
414
415 if (master.isActiveMaster() )
416 {
417
418 jamonWriter.write("\n\t <tr>\n\t <td>HMaster Active Time</td>\n\t <td>");
419
420 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(master.getMasterActiveTime())), jamonWriter);
421
422 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>");
423
424 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getClusterId() != null ? master.getClusterId() : "Not set"), jamonWriter);
425
426 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>");
427
428 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.limitDecimalTo2(master.getServerManager().getAverageLoad())), jamonWriter);
429
430 jamonWriter.write("</td>\n\t <td>Average number of regions per regionserver. Naive computation.</td>\n\t </tr>\n\t ");
431
432 if (frags != null )
433 {
434
435 jamonWriter.write("\n\t <tr>\n\t <td>Fragmentation</td>\n\t <td>");
436
437 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get("-TOTAL-") != null ? frags.get("-TOTAL-").intValue() + "%" : "n/a"), jamonWriter);
438
439 jamonWriter.write("</td>\n\t <td>Overall fragmentation of all tables, including hbase:meta</td>\n\t </tr>\n\t ");
440 }
441
442 jamonWriter.write("\n\t <tr>\n\t <td>Coprocessors</td>\n\t <td>");
443
444 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(java.util.Arrays.toString(master.getCoprocessors())), jamonWriter);
445
446 jamonWriter.write("</td>\n\t <td>Coprocessors currently loaded by the master</td>\n\t </tr>\n\t <tr>\n\t <td>LoadBalancer</td>\n\t <td>");
447
448 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getLoadBalancerClassName()), jamonWriter);
449
450 jamonWriter.write("</td>\n\t <td>LoadBalancer to be used in the Master</td>\n\t </tr>\n ");
451 }
452
453 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");
454 }
455
456
457
458 private void __jamon_innerUnit__userSnapshots(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
459 throws java.io.IOException
460 {
461
462
463 List<SnapshotDescription> snapshots = admin.listSnapshots();
464
465
466 if ((snapshots != null && snapshots.size() > 0))
467 {
468
469 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 ");
470
471 for (SnapshotDescription snapshotDesc : snapshots)
472 {
473
474 jamonWriter.write("\n ");
475
476
477 TableName snapshotTable = TableName.valueOf(snapshotDesc.getTable());
478
479
480 jamonWriter.write("<tr>\n <td><a href=\"snapshot.jsp?name=");
481
482 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);
483
484 jamonWriter.write("\">");
485
486 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);
487
488 jamonWriter.write("</a> </td>\n <td><a href=\"table.jsp?name=");
489
490 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);
491
492 jamonWriter.write("\">");
493
494 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);
495
496 jamonWriter.write("</a>\n </td>\n <td>");
497
498 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(snapshotDesc.getCreationTime())), jamonWriter);
499
500 jamonWriter.write("</td>\n </tr>\n ");
501 }
502
503 jamonWriter.write("\n <p>");
504
505 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshots.size()), jamonWriter);
506
507 jamonWriter.write(" snapshot(s) in set.</p>\n</table>\n");
508 }
509
510 jamonWriter.write("\n");
511 }
512
513
514
515 private void __jamon_innerUnit__catalogTables(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
516 throws java.io.IOException
517 {
518
519
520 HTableDescriptor[] sysTables = admin.listTableDescriptorsByNamespace(NamespaceDescriptor
521 .SYSTEM_NAMESPACE_NAME_STR);
522
523
524 jamonWriter.write("<table class=\"table table-striped\">\n<tr>\n <th>Table Name</th>\n ");
525
526 if ((frags != null) )
527 {
528
529 jamonWriter.write("\n <th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\">Frag.</th>\n ");
530 }
531
532 jamonWriter.write("\n <th>Description</th>\n</tr>\n");
533
534 for (HTableDescriptor systemTable : sysTables)
535 {
536
537 jamonWriter.write("\n<tr>\n");
538
539 TableName tableName = systemTable.getTableName();
540
541 jamonWriter.write("<td><a href=\"table.jsp?name=");
542
543 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);
544
545 jamonWriter.write("\">");
546
547 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);
548
549 jamonWriter.write("</a></td>\n ");
550
551 if ((frags != null))
552 {
553
554 jamonWriter.write("\n <td align=\"center\">");
555
556 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString())
557 .intValue() + "%" : "n/a"), jamonWriter);
558
559 jamonWriter.write("</td>\n ");
560 }
561
562 jamonWriter.write("\n ");
563
564 String description = null;
565 if (tableName.equals(TableName.META_TABLE_NAME)){
566 description = "The hbase:meta table holds references to all User Table regions.";
567 } else if (tableName.equals(Canary.DEFAULT_WRITE_TABLE_NAME)){
568 description = "The hbase:canary table is used to sniff the write availbility of"
569 + " each regionserver.";
570 } else if (tableName.equals(AccessControlLists.ACL_TABLE_NAME)){
571 description = "The hbase:acl table holds information about acl";
572 } else if (tableName.equals(VisibilityConstants.LABELS_TABLE_NAME)){
573 description = "The hbase:labels table holds information about visibility labels.";
574 } else if (tableName.equals(TableName.NAMESPACE_TABLE_NAME)){
575 description = "The hbase:namespace table holds information about namespaces.";
576 }
577
578
579 jamonWriter.write("<td>");
580
581 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(description), jamonWriter);
582
583 jamonWriter.write("</td>\n</tr>\n");
584 }
585
586 jamonWriter.write("\n</table>\n");
587 }
588
589
590
591 private void __jamon_innerUnit__userTables(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
592 throws java.io.IOException
593 {
594
595
596 HTableDescriptor[] tables = admin.listTables();
597
598
599 if ((tables != null && tables.length > 0))
600 {
601
602 jamonWriter.write("\n<table class=\"table table-striped\">\n <tr>\n <th>Namespace</th>\n <th>Table Name</th>\n ");
603
604 if ((frags != null) )
605 {
606
607 jamonWriter.write("\n <th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\">Frag.</th>\n ");
608 }
609
610 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 ");
611
612 for (HTableDescriptor htDesc : tables)
613 {
614
615 jamonWriter.write("\n ");
616
617
618 TableName tableName = htDesc.getTableName();
619 Map<RegionState.State, List<HRegionInfo>> tableRegions =
620 master.getAssignmentManager().getRegionStates()
621 .getRegionByStateOfTable(tableName);
622 int openRegionsCount = tableRegions.get(RegionState.State.OPEN).size();
623 int offlineRegionsCount = tableRegions.get(RegionState.State.OFFLINE).size();
624 int splitRegionsCount = tableRegions.get(RegionState.State.SPLIT).size();
625 int failedRegionsCount = tableRegions.get(RegionState.State.FAILED_OPEN).size()
626 + tableRegions.get(RegionState.State.FAILED_CLOSE).size();
627 int otherRegionsCount = 0;
628 for (List<HRegionInfo> list: tableRegions.values()) {
629 otherRegionsCount += list.size();
630 }
631
632 otherRegionsCount = otherRegionsCount - openRegionsCount
633 - failedRegionsCount - offlineRegionsCount
634 - splitRegionsCount;
635
636
637 jamonWriter.write("<tr>\n <td>");
638
639 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNamespaceAsString()), jamonWriter);
640
641 jamonWriter.write("</td>\n <td><a href=table.jsp?name=");
642
643 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNameAsString()), jamonWriter);
644
645 jamonWriter.write(">");
646
647 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getQualifierAsString()), jamonWriter);
648
649 jamonWriter.write("</a> </td>\n ");
650
651 if ((frags != null) )
652 {
653
654 jamonWriter.write("\n <td align=\"center\">");
655
656 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString()).intValue() + "%" : "n/a"), jamonWriter);
657
658 jamonWriter.write("</td>\n ");
659 }
660
661 jamonWriter.write("\n <td>");
662
663 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(openRegionsCount), jamonWriter);
664
665 jamonWriter.write("</td>\n <td>");
666
667 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(offlineRegionsCount), jamonWriter);
668
669 jamonWriter.write("</td>\n <td>");
670
671 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(failedRegionsCount), jamonWriter);
672
673 jamonWriter.write("</td>\n <td>");
674
675 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(splitRegionsCount), jamonWriter);
676
677 jamonWriter.write("</td>\n <td>");
678
679 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(otherRegionsCount), jamonWriter);
680
681 jamonWriter.write("</td>\n <td>");
682
683 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(htDesc.toStringCustomizedValues()), jamonWriter);
684
685 jamonWriter.write("</td>\n </tr>\n ");
686 }
687
688 jamonWriter.write("\n <p>");
689
690 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tables.length), jamonWriter);
691
692 jamonWriter.write(" table(s) in set. [<a href=tablesDetailed.jsp>Details</a>]</p>\n</table>\n");
693 }
694
695 jamonWriter.write("\n");
696 }
697
698
699
700 private void __jamon_innerUnit__deadRegionServers(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
701 throws java.io.IOException
702 {
703
704 if ((deadServers != null && deadServers.size() > 0))
705 {
706
707 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 ");
708
709
710 DeadServer deadServerUtil = master.getServerManager().getDeadServers();
711 ServerName [] deadServerNames = deadServers.toArray(new ServerName[deadServers.size()]);
712 Arrays.sort(deadServerNames);
713 for (ServerName deadServerName: deadServerNames) {
714
715
716 jamonWriter.write("<tr>\n \t<th></th>\n <td>");
717
718 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerName), jamonWriter);
719
720 jamonWriter.write("</td>\n <td>");
721
722 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerUtil.getTimeOfDeath(deadServerName)), jamonWriter);
723
724 jamonWriter.write("</td>\n </tr>\n ");
725
726
727 }
728
729
730 jamonWriter.write("<tr>\n <th>Total: </th>\n <td>servers: ");
731
732 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServers.size()), jamonWriter);
733
734 jamonWriter.write("</td>\n <th></th>\n </tr>\n</table>\n");
735 }
736
737 jamonWriter.write("\n");
738
739
740 HConnectionManager.deleteConnection(admin.getConfiguration());
741
742 }
743
744
745 }