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.Admin;
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 import org.apache.hadoop.hbase.quotas.QuotaUtil;
58
59 public class MasterStatusTmplImpl
60 extends org.jamon.AbstractTemplateImpl
61 implements org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.Intf
62
63 {
64 private final HMaster master;
65 private final Map<String,Integer> frags;
66 private final ServerName metaLocation;
67 private final Set<ServerName> deadServers;
68 private final String filter;
69 private final boolean catalogJanitorEnabled;
70 private final ServerManager serverManager;
71 private final AssignmentManager assignmentManager;
72 private final String format;
73 private final List<ServerName> servers;
74
75
76 public String formatZKString() {
77 StringBuilder quorums = new StringBuilder();
78 String zkQuorum = master.getZooKeeper().getQuorum();
79
80 if (null == zkQuorum) {
81 return quorums.toString();
82 }
83
84 String[] zks = zkQuorum.split(",");
85
86 if (zks.length == 0) {
87 return quorums.toString();
88 }
89
90 for(int i = 0; i < zks.length; ++i) {
91 quorums.append(zks[i].trim());
92
93 if (i != (zks.length - 1)) {
94 quorums.append("<br/>");
95 }
96 }
97
98 return quorums.toString();
99 }
100
101 protected static org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData p_implData)
102 {
103 if(! p_implData.getFrags__IsNotDefault())
104 {
105 p_implData.setFrags(null);
106 }
107 if(! p_implData.getMetaLocation__IsNotDefault())
108 {
109 p_implData.setMetaLocation(null);
110 }
111 if(! p_implData.getDeadServers__IsNotDefault())
112 {
113 p_implData.setDeadServers(null);
114 }
115 if(! p_implData.getFilter__IsNotDefault())
116 {
117 p_implData.setFilter("general");
118 }
119 if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())
120 {
121 p_implData.setCatalogJanitorEnabled(true);
122 }
123 if(! p_implData.getServerManager__IsNotDefault())
124 {
125 p_implData.setServerManager(null);
126 }
127 if(! p_implData.getAssignmentManager__IsNotDefault())
128 {
129 p_implData.setAssignmentManager(null);
130 }
131 if(! p_implData.getFormat__IsNotDefault())
132 {
133 p_implData.setFormat("html");
134 }
135 if(! p_implData.getServers__IsNotDefault())
136 {
137 p_implData.setServers(null);
138 }
139 return p_implData;
140 }
141 public MasterStatusTmplImpl(org.jamon.TemplateManager p_templateManager, org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData p_implData)
142 {
143 super(p_templateManager, __jamon_setOptionalArguments(p_implData));
144 master = p_implData.getMaster();
145 frags = p_implData.getFrags();
146 metaLocation = p_implData.getMetaLocation();
147 deadServers = p_implData.getDeadServers();
148 filter = p_implData.getFilter();
149 catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();
150 serverManager = p_implData.getServerManager();
151 assignmentManager = p_implData.getAssignmentManager();
152 format = p_implData.getFormat();
153 servers = p_implData.getServers();
154 }
155
156 @Override public void renderNoFlush(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-fluid\">\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=\"/procedures.jsp\">Procedures</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-fluid content\">\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.isInMaintenanceMode() )
242 {
243
244 jamonWriter.write("\n <div class=\"alert alert-warning\">\n Your Master is in maintenance mode. This may be because of HBCK aborting while\n running in repair mode. Please re-run HBCK in repair mode.\n </div>\n ");
245 }
246
247 jamonWriter.write("\n ");
248
249 if (!master.isBalancerOn() )
250 {
251
252 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 ");
253 }
254
255 jamonWriter.write("\n ");
256
257 if (!master.isSplitOrMergeEnabled(Admin.MasterSwitchType.SPLIT) )
258 {
259
260 jamonWriter.write("\n <div class=\"alert alert-warning\">\n Region splits are disabled. This may be the result of HBCK aborting while\n running in repair mode. Manually enable splits from the HBase shell,\n or re-run HBCK in repair mode.\n </div>\n ");
261 }
262
263 jamonWriter.write("\n ");
264
265 if (!master.isSplitOrMergeEnabled(Admin.MasterSwitchType.MERGE) )
266 {
267
268 jamonWriter.write("\n <div class=\"alert alert-warning\">\n Region merges are disabled. This may be the result of HBCK aborting while\n running in repair mode. Manually enable merges from the HBase shell,\n or re-run HBCK in repair mode.\n </div>\n ");
269 }
270
271 jamonWriter.write("\n\n <section>\n <h2>Region Servers</h2>\n ");
272
273 {
274 org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl __jamon__var_1 = new org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl(this.getTemplateManager());
275 __jamon__var_1.setServers(servers );
276 __jamon__var_1.renderNoFlush(jamonWriter, master);
277 }
278
279 jamonWriter.write("\n\n ");
280
281 if ((deadServers != null) )
282 {
283
284 jamonWriter.write("\n ");
285
286 {
287
288 __jamon_innerUnit__deadRegionServers(jamonWriter);
289 }
290
291 jamonWriter.write("\n ");
292 }
293
294 jamonWriter.write("\n </section>\n <section>\n ");
295
296 {
297 org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl __jamon__var_2 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
298 __jamon__var_2.renderNoFlush(jamonWriter, master );
299 }
300
301 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 ");
302
303 if ((metaLocation != null) )
304 {
305
306 jamonWriter.write("\n ");
307
308 {
309
310 __jamon_innerUnit__userTables(jamonWriter);
311 }
312
313 jamonWriter.write("\n ");
314 }
315
316 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_catalogTables\">\n ");
317
318 if ((metaLocation != null) )
319 {
320
321 jamonWriter.write("\n ");
322
323 {
324
325 __jamon_innerUnit__catalogTables(jamonWriter);
326 }
327
328 jamonWriter.write("\n ");
329 }
330
331 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_userSnapshots\">\n ");
332
333 {
334
335 __jamon_innerUnit__userSnapshots(jamonWriter);
336 }
337
338 jamonWriter.write("\n </div>\n </div>\n </div>\n </section>\n ");
339
340 if (master.getAssignmentManager() != null )
341 {
342
343 jamonWriter.write("\n ");
344
345 {
346 org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl __jamon__var_3 = new org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl(this.getTemplateManager());
347 __jamon__var_3.renderNoFlush(jamonWriter, master.getAssignmentManager());
348 }
349
350 jamonWriter.write("\n ");
351 }
352
353 jamonWriter.write("\n\t");
354 }
355
356 else
357 {
358
359 jamonWriter.write("\n <section>\n ");
360
361 {
362 org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl __jamon__var_4 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
363 __jamon__var_4.renderNoFlush(jamonWriter, master );
364 }
365
366 jamonWriter.write("\n </section>\n\t");
367 }
368
369 jamonWriter.write("\n\n\n <section>\n ");
370
371 {
372 org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl __jamon__var_5 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());
373 __jamon__var_5.setFilter(filter );
374 __jamon__var_5.renderNoFlush(jamonWriter);
375 }
376
377 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>");
378
379 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getVersion()), jamonWriter);
380
381 jamonWriter.write(", revision=");
382
383 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getRevision()), jamonWriter);
384
385 jamonWriter.write("</td><td>HBase version and revision</td>\n </tr>\n <tr>\n <td>HBase Compiled</td>\n <td>");
386
387 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getDate()), jamonWriter);
388
389 jamonWriter.write(", ");
390
391 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getUser()), jamonWriter);
392
393 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>");
394
395 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getSrcChecksum()), jamonWriter);
396
397 jamonWriter.write("</td>\n <td>HBase source MD5 checksum</td>\n </tr>\n <tr>\n <td>Hadoop Version</td>\n <td>");
398
399 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getVersion()), jamonWriter);
400
401 jamonWriter.write(", revision=");
402
403 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getRevision()), jamonWriter);
404
405 jamonWriter.write("</td>\n <td>Hadoop version and revision</td>\n </tr>\n <tr>\n <td>Hadoop Compiled</td>\n <td>");
406
407 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getDate()), jamonWriter);
408
409 jamonWriter.write(", ");
410
411 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getUser()), jamonWriter);
412
413 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>");
414
415 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getSrcChecksum()), jamonWriter);
416
417 jamonWriter.write("</td>\n <td>Hadoop source MD5 checksum</td>\n </tr>\n <tr>\n <td>ZooKeeper Client Version</td>\n <td>");
418
419 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.zookeeper.Version.getVersion()), jamonWriter);
420
421 jamonWriter.write(", revision=");
422
423 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.zookeeper.Version.getRevision()), jamonWriter);
424
425 jamonWriter.write("</td>\n <td>ZooKeeper client version and revision</td>\n </tr>\n <tr>\n <td>ZooKeeper Client Compiled</td>\n <td>");
426
427 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.zookeeper.Version.getBuildDate()), jamonWriter);
428
429 jamonWriter.write("</td>\n <td>When ZooKeeper client version was compiled</td>\n </tr>\n <tr>\n <td>Zookeeper Quorum</td>\n <td> ");
430
431 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(formatZKString()), jamonWriter);
432
433 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> ");
434
435 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getZooKeeper().getBaseZNode()), jamonWriter);
436
437 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>");
438
439 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(FSUtils.getRootDir(master.getConfiguration()).toString()), jamonWriter);
440
441 jamonWriter.write("</td>\n <td>Location of HBase home directory</td>\n </tr>\n <tr>\n <td>HMaster Start Time</td>\n <td>");
442
443 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(master.getMasterStartTime())), jamonWriter);
444
445 jamonWriter.write("</td>\n <td>Date stamp of when this HMaster was started</td>\n </tr>\n ");
446
447 if (master.isActiveMaster() )
448 {
449
450 jamonWriter.write("\n\t <tr>\n\t <td>HMaster Active Time</td>\n\t <td>");
451
452 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(master.getMasterActiveTime())), jamonWriter);
453
454 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>");
455
456 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getClusterId() != null ? master.getClusterId() : "Not set"), jamonWriter);
457
458 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>");
459
460 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getServerManager() == null ? "0.00" :
461 StringUtils.limitDecimalTo2(master.getServerManager().getAverageLoad())), jamonWriter);
462
463 jamonWriter.write("</td>\n\t <td>Average number of regions per regionserver. Naive computation.</td>\n\t </tr>\n\t ");
464
465 if (frags != null )
466 {
467
468 jamonWriter.write("\n\t <tr>\n\t <td>Fragmentation</td>\n\t <td>");
469
470 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get("-TOTAL-") != null ? frags.get("-TOTAL-").intValue() + "%" : "n/a"), jamonWriter);
471
472 jamonWriter.write("</td>\n\t <td>Overall fragmentation of all tables, including hbase:meta</td>\n\t </tr>\n\t ");
473 }
474
475 jamonWriter.write("\n\t <tr>\n\t <td>Coprocessors</td>\n\t <td>");
476
477 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getMasterCoprocessorHost() == null ? "[]" :
478 java.util.Arrays.toString(master.getMasterCoprocessors())), jamonWriter);
479
480 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>");
481
482 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getLoadBalancerClassName()), jamonWriter);
483
484 jamonWriter.write("</td>\n\t <td>LoadBalancer to be used in the Master</td>\n\t </tr>\n ");
485 }
486
487 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/jquery.tablesorter.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 <script>\n $(document).ready(function() \n { \n $(\"#baseStatsTable\").tablesorter();\n $(\"#memoryStatsTable\").tablesorter();\n $(\"#requestStatsTable\").tablesorter();\n $(\"#storeStatsTable\").tablesorter();\n $(\"#compactionStatsTable\").tablesorter();\n \n $(\"#userTables\").tablesorter();\n } \n );\n </script>\n </body>\n</html>\n\n");
488 }
489
490
491
492 private void __jamon_innerUnit__deadRegionServers(final java.io.Writer jamonWriter)
493 throws java.io.IOException
494 {
495
496 if ((deadServers != null && deadServers.size() > 0))
497 {
498
499 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 ");
500
501
502 DeadServer deadServerUtil = master.getServerManager().getDeadServers();
503 ServerName [] deadServerNames = deadServers.toArray(new ServerName[deadServers.size()]);
504 Arrays.sort(deadServerNames);
505 for (ServerName deadServerName: deadServerNames) {
506
507
508 jamonWriter.write("<tr>\n \t<th></th>\n <td>");
509
510 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerName), jamonWriter);
511
512 jamonWriter.write("</td>\n <td>");
513
514 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerUtil.getTimeOfDeath(deadServerName)), jamonWriter);
515
516 jamonWriter.write("</td>\n </tr>\n ");
517
518
519 }
520
521
522 jamonWriter.write("<tr>\n <th>Total: </th>\n <td>servers: ");
523
524 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServers.size()), jamonWriter);
525
526 jamonWriter.write("</td>\n <th></th>\n </tr>\n</table>\n");
527 }
528
529 jamonWriter.write("\n");
530 }
531
532
533
534 private void __jamon_innerUnit__catalogTables(final java.io.Writer jamonWriter)
535 throws java.io.IOException
536 {
537
538
539 HTableDescriptor[] sysTables = null;
540 try (Admin admin = master.getConnection().getAdmin()) {
541 sysTables = master.isInitialized() ? admin.listTableDescriptorsByNamespace(
542 NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR) : null;
543 }
544
545
546 if ((sysTables != null && sysTables.length > 0))
547 {
548
549 jamonWriter.write("\n<table class=\"table table-striped\">\n<tr>\n <th>Table Name</th>\n ");
550
551 if ((frags != null) )
552 {
553
554 jamonWriter.write("\n <th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\">Frag.</th>\n ");
555 }
556
557 jamonWriter.write("\n <th>Description</th>\n</tr>\n");
558
559 for (HTableDescriptor systemTable : sysTables)
560 {
561
562 jamonWriter.write("\n<tr>\n");
563
564 TableName tableName = systemTable.getTableName();
565
566 jamonWriter.write("<td><a href=\"table.jsp?name=");
567
568 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);
569
570 jamonWriter.write("\">");
571
572 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);
573
574 jamonWriter.write("</a></td>\n ");
575
576 if ((frags != null))
577 {
578
579 jamonWriter.write("\n <td align=\"center\">");
580
581 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString())
582 .intValue() + "%" : "n/a"), jamonWriter);
583
584 jamonWriter.write("</td>\n ");
585 }
586
587 jamonWriter.write("\n ");
588
589 String description = null;
590 if (tableName.equals(TableName.META_TABLE_NAME)){
591 description = "The hbase:meta table holds references to all User Table regions.";
592 } else if (tableName.equals(Canary.DEFAULT_WRITE_TABLE_NAME)){
593 description = "The hbase:canary table is used to sniff the write availbility of"
594 + " each regionserver.";
595 } else if (tableName.equals(AccessControlLists.ACL_TABLE_NAME)){
596 description = "The hbase:acl table holds information about acl";
597 } else if (tableName.equals(VisibilityConstants.LABELS_TABLE_NAME)){
598 description = "The hbase:labels table holds information about visibility labels.";
599 } else if (tableName.equals(TableName.NAMESPACE_TABLE_NAME)){
600 description = "The hbase:namespace table holds information about namespaces.";
601 } else if (tableName.equals(QuotaUtil.QUOTA_TABLE_NAME)){
602 description = "The hbase:quota table holds quota information about number" +
603 " or size of requests in a given time frame.";
604 } else if (tableName.equals(TableName.valueOf("hbase:rsgroup"))){
605 description = "The hbase:rsgroup table holds information about regionserver groups";
606 }
607
608
609 jamonWriter.write("<td>");
610
611 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(description), jamonWriter);
612
613 jamonWriter.write("</td>\n</tr>\n");
614 }
615
616 jamonWriter.write("\n</table>\n");
617 }
618
619 jamonWriter.write("\n");
620 }
621
622
623
624 private void __jamon_innerUnit__userSnapshots(final java.io.Writer jamonWriter)
625 throws java.io.IOException
626 {
627
628
629 List<SnapshotDescription> snapshots = null;
630 try (Admin admin = master.getConnection().getAdmin()) {
631 snapshots = master.isInitialized() ? admin.listSnapshots() : null;
632 }
633
634
635 if ((snapshots != null && snapshots.size() > 0))
636 {
637
638 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 ");
639
640 for (SnapshotDescription snapshotDesc : snapshots)
641 {
642
643 jamonWriter.write("\n ");
644
645
646 TableName snapshotTable = TableName.valueOf(snapshotDesc.getTable());
647
648
649 jamonWriter.write("<tr>\n <td><a href=\"snapshot.jsp?name=");
650
651 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);
652
653 jamonWriter.write("\">");
654
655 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);
656
657 jamonWriter.write("</a> </td>\n <td><a href=\"table.jsp?name=");
658
659 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);
660
661 jamonWriter.write("\">");
662
663 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);
664
665 jamonWriter.write("</a>\n </td>\n <td>");
666
667 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(snapshotDesc.getCreationTime())), jamonWriter);
668
669 jamonWriter.write("</td>\n </tr>\n ");
670 }
671
672 jamonWriter.write("\n <p>");
673
674 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshots.size()), jamonWriter);
675
676 jamonWriter.write(" snapshot(s) in set. [<a href=\"/snapshotsStats.jsp\">Snapshot Storefile stats</a>]</p>\n</table>\n");
677 }
678
679 jamonWriter.write("\n");
680 }
681
682
683
684 private void __jamon_innerUnit__userTables(final java.io.Writer jamonWriter)
685 throws java.io.IOException
686 {
687
688
689 HTableDescriptor[] tables = null;
690 try (Admin admin = master.getConnection().getAdmin()) {
691 tables = master.isInitialized() ? admin.listTables() : null;
692 }
693
694
695 if ((tables != null && tables.length > 0))
696 {
697
698 jamonWriter.write("\n<table id=\"userTables\" class=\"tablesorter table table-striped\">\n<thead>\n <tr>\n <th>Namespace</th>\n <th>Table Name</th>\n ");
699
700 if ((frags != null) )
701 {
702
703 jamonWriter.write("\n <th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\">Frag.</th>\n ");
704 }
705
706 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</thead>\n<tbody>\n ");
707
708 for (HTableDescriptor htDesc : tables)
709 {
710
711 jamonWriter.write("\n ");
712
713
714 TableName tableName = htDesc.getTableName();
715 Map<RegionState.State, List<HRegionInfo>> tableRegions =
716 master.getAssignmentManager().getRegionStates()
717 .getRegionByStateOfTable(tableName);
718 int openRegionsCount = tableRegions.get(RegionState.State.OPEN).size();
719 int offlineRegionsCount = tableRegions.get(RegionState.State.OFFLINE).size();
720 int splitRegionsCount = tableRegions.get(RegionState.State.SPLIT).size();
721 int failedRegionsCount = tableRegions.get(RegionState.State.FAILED_OPEN).size()
722 + tableRegions.get(RegionState.State.FAILED_CLOSE).size();
723 int otherRegionsCount = 0;
724 for (List<HRegionInfo> list: tableRegions.values()) {
725 otherRegionsCount += list.size();
726 }
727
728 otherRegionsCount = otherRegionsCount - openRegionsCount
729 - failedRegionsCount - offlineRegionsCount
730 - splitRegionsCount;
731
732
733 jamonWriter.write("<tr>\n <td>");
734
735 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNamespaceAsString()), jamonWriter);
736
737 jamonWriter.write("</td>\n <td><a href=table.jsp?name=");
738
739 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNameAsString()), jamonWriter);
740
741 jamonWriter.write(">");
742
743 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getQualifierAsString()), jamonWriter);
744
745 jamonWriter.write("</a> </td>\n ");
746
747 if ((frags != null) )
748 {
749
750 jamonWriter.write("\n <td align=\"center\">");
751
752 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString()).intValue() + "%" : "n/a"), jamonWriter);
753
754 jamonWriter.write("</td>\n ");
755 }
756
757 jamonWriter.write("\n <td>");
758
759 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(openRegionsCount), jamonWriter);
760
761 jamonWriter.write("</td>\n <td>");
762
763 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(offlineRegionsCount), jamonWriter);
764
765 jamonWriter.write("</td>\n <td>");
766
767 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(failedRegionsCount), jamonWriter);
768
769 jamonWriter.write("</td>\n <td>");
770
771 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(splitRegionsCount), jamonWriter);
772
773 jamonWriter.write("</td>\n <td>");
774
775 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(otherRegionsCount), jamonWriter);
776
777 jamonWriter.write("</td>\n <td>");
778
779 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(htDesc.toStringCustomizedValues()), jamonWriter);
780
781 jamonWriter.write("</td>\n </tr>\n ");
782 }
783
784 jamonWriter.write("\n <p>");
785
786 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tables.length), jamonWriter);
787
788 jamonWriter.write(" table(s) in set. [<a href=tablesDetailed.jsp>Details</a>]</p>\n</tbody>\n</table>\n");
789 }
790
791 jamonWriter.write("\n");
792 }
793
794
795 }