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.client.replication.ReplicationAdmin;
36
37 import org.apache.hadoop.hbase.HRegionInfo;
38
39 import org.apache.hadoop.hbase.master.RegionState;
40
41 import org.apache.hadoop.hbase.HTableDescriptor;
42
43 import org.apache.hadoop.hbase.HBaseConfiguration;
44
45 import org.apache.hadoop.hbase.TableName;
46
47 import org.apache.hadoop.hbase.tool.CanaryTool;
48
49 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription;
50
51 import org.apache.hadoop.hbase.master.DeadServer;
52
53 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
54
55 import org.apache.hadoop.hbase.replication.ReplicationPeer;
56
57 import org.apache.hadoop.hbase.replication.ReplicationPeerConfig;
58
59 import org.apache.hadoop.hbase.replication.ReplicationSerDeHelper;
60
61 import org.apache.hadoop.hbase.security.visibility.VisibilityConstants;
62
63 import org.apache.hadoop.hbase.security.access.AccessControlLists;
64
65 import org.apache.hadoop.hbase.quotas.QuotaUtil;
66
67 public class MasterStatusTmplImpl
68 extends org.jamon.AbstractTemplateImpl
69 implements org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.Intf
70
71 {
72 private final HMaster master;
73 private final boolean catalogJanitorEnabled;
74 private final AssignmentManager assignmentManager;
75 private final Set<ServerName> deadServers;
76 private final ServerManager serverManager;
77 private final String filter;
78 private final Map<String,Integer> frags;
79 private final List<ServerName> servers;
80 private final ServerName metaLocation;
81 private final String format;
82
83
84 public String formatZKString() {
85 StringBuilder quorums = new StringBuilder();
86 String zkQuorum = master.getZooKeeper().getQuorum();
87
88 if (null == zkQuorum) {
89 return quorums.toString();
90 }
91
92 String[] zks = zkQuorum.split(",");
93
94 if (zks.length == 0) {
95 return quorums.toString();
96 }
97
98 for(int i = 0; i < zks.length; ++i) {
99 quorums.append(zks[i].trim());
100
101 if (i != (zks.length - 1)) {
102 quorums.append("<br/>");
103 }
104 }
105
106 return quorums.toString();
107 }
108
109 protected static org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData p_implData)
110 {
111 if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())
112 {
113 p_implData.setCatalogJanitorEnabled(true);
114 }
115 if(! p_implData.getAssignmentManager__IsNotDefault())
116 {
117 p_implData.setAssignmentManager(null);
118 }
119 if(! p_implData.getDeadServers__IsNotDefault())
120 {
121 p_implData.setDeadServers(null);
122 }
123 if(! p_implData.getServerManager__IsNotDefault())
124 {
125 p_implData.setServerManager(null);
126 }
127 if(! p_implData.getFilter__IsNotDefault())
128 {
129 p_implData.setFilter("general");
130 }
131 if(! p_implData.getFrags__IsNotDefault())
132 {
133 p_implData.setFrags(null);
134 }
135 if(! p_implData.getServers__IsNotDefault())
136 {
137 p_implData.setServers(null);
138 }
139 if(! p_implData.getMetaLocation__IsNotDefault())
140 {
141 p_implData.setMetaLocation(null);
142 }
143 if(! p_implData.getFormat__IsNotDefault())
144 {
145 p_implData.setFormat("html");
146 }
147 return p_implData;
148 }
149 public MasterStatusTmplImpl(org.jamon.TemplateManager p_templateManager, org.apache.hadoop.hbase.tmpl.master.MasterStatusTmpl.ImplData p_implData)
150 {
151 super(p_templateManager, __jamon_setOptionalArguments(p_implData));
152 master = p_implData.getMaster();
153 catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();
154 assignmentManager = p_implData.getAssignmentManager();
155 deadServers = p_implData.getDeadServers();
156 serverManager = p_implData.getServerManager();
157 filter = p_implData.getFilter();
158 frags = p_implData.getFrags();
159 servers = p_implData.getServers();
160 metaLocation = p_implData.getMetaLocation();
161 format = p_implData.getFormat();
162 }
163
164 @Override public void renderNoFlush(final java.io.Writer jamonWriter)
165 throws java.io.IOException
166 {
167
168 if (format.equals("json") )
169 {
170
171 jamonWriter.write("\n ");
172
173 {
174 org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl __jamon__var_7 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());
175 __jamon__var_7.setFormat("json" );
176 __jamon__var_7.setFilter(filter);
177 __jamon__var_7.renderNoFlush(jamonWriter);
178 }
179
180 jamonWriter.write("\n ");
181
182 return;
183 }
184
185 jamonWriter.write("\n");
186
187
188 ServerManager serverManager = master.getServerManager();
189 AssignmentManager assignmentManager = master.getAssignmentManager();
190
191
192 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>");
193
194 if (master.isActiveMaster() )
195 {
196
197 jamonWriter.write("Master: ");
198 }
199
200 else
201 {
202
203 jamonWriter.write("Backup Master: ");
204 }
205
206 jamonWriter.write("\n ");
207
208 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getServerName().getHostname()), jamonWriter);
209
210 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 <li><a href=\"/prof\">Profiler</a></li>\n ");
211
212 if (HBaseConfiguration.isShowConfInServlet())
213 {
214
215 jamonWriter.write("\n <li><a href=\"/conf\">HBase Configuration</a></li>\n ");
216 }
217
218 jamonWriter.write("\n </ul>\n </div><!--/.nav-collapse -->\n </div>\n </div>\n\n <div class=\"container-fluid content\">\n\t");
219
220 if (master.isActiveMaster() )
221 {
222
223 jamonWriter.write("\n <div class=\"row inner_header\">\n <div class=\"page-header\">\n <h1>Master <small>");
224
225 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getServerName().getHostname()), jamonWriter);
226
227 jamonWriter.write("</small></h1>\n </div>\n </div>\n\n <div class=\"row\">\n <!-- Various warnings that cluster admins should be aware of -->\n ");
228
229 if (JvmVersion.isBadJvmVersion() )
230 {
231
232 jamonWriter.write("\n <div class=\"alert alert-error\">\n Your current JVM version ");
233
234 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(System.getProperty("java.version")), jamonWriter);
235
236 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 ");
237 }
238
239 jamonWriter.write("\n ");
240
241 if (master.isInitialized() && !catalogJanitorEnabled )
242 {
243
244 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 ");
245 }
246
247 jamonWriter.write("\n ");
248
249 if (master.isInMaintenanceMode() )
250 {
251
252 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 ");
253 }
254
255 jamonWriter.write("\n ");
256
257 if (!master.isBalancerOn() )
258 {
259
260 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 ");
261 }
262
263 jamonWriter.write("\n ");
264
265 if (!master.isSplitOrMergeEnabled(Admin.MasterSwitchType.SPLIT) )
266 {
267
268 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 ");
269 }
270
271 jamonWriter.write("\n ");
272
273 if (!master.isSplitOrMergeEnabled(Admin.MasterSwitchType.MERGE) )
274 {
275
276 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 ");
277 }
278
279 jamonWriter.write("\n\n ");
280
281 if (master.getAssignmentManager() != null )
282 {
283
284 jamonWriter.write("\n ");
285
286 {
287 org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl __jamon__var_8 = new org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl(this.getTemplateManager());
288 __jamon__var_8.renderNoFlush(jamonWriter, master.getAssignmentManager());
289 }
290
291 jamonWriter.write("\n ");
292 }
293
294 jamonWriter.write("\n\n <section>\n <h2>Region Servers</h2>\n ");
295
296 {
297 org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl __jamon__var_9 = new org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl(this.getTemplateManager());
298 __jamon__var_9.setServers(servers );
299 __jamon__var_9.renderNoFlush(jamonWriter, master);
300 }
301
302 jamonWriter.write("\n\n ");
303
304 if ((deadServers != null) )
305 {
306
307 jamonWriter.write("\n ");
308
309 {
310
311 __jamon_innerUnit__deadRegionServers(jamonWriter);
312 }
313
314 jamonWriter.write("\n ");
315 }
316
317 jamonWriter.write("\n </section>\n <section>\n ");
318
319 {
320 org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl __jamon__var_10 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
321 __jamon__var_10.renderNoFlush(jamonWriter, master );
322 }
323
324 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 ");
325
326 if ((metaLocation != null) )
327 {
328
329 jamonWriter.write("\n ");
330
331 {
332
333 __jamon_innerUnit__userTables(jamonWriter);
334 }
335
336 jamonWriter.write("\n ");
337 }
338
339 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_catalogTables\">\n ");
340
341 if ((metaLocation != null) )
342 {
343
344 jamonWriter.write("\n ");
345
346 {
347
348 __jamon_innerUnit__catalogTables(jamonWriter);
349 }
350
351 jamonWriter.write("\n ");
352 }
353
354 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_userSnapshots\">\n ");
355
356 {
357
358 __jamon_innerUnit__userSnapshots(jamonWriter);
359 }
360
361 jamonWriter.write("\n </div>\n </div>\n </div>\n </section>\n <section>\n <h2>Peers</h2>\n ");
362
363 {
364
365 __jamon_innerUnit__peerConfigs(jamonWriter);
366 }
367
368 jamonWriter.write("\n </section>\n\t");
369 }
370
371 else
372 {
373
374 jamonWriter.write("\n <section>\n ");
375
376 {
377 org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl __jamon__var_11 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
378 __jamon__var_11.renderNoFlush(jamonWriter, master );
379 }
380
381 jamonWriter.write("\n </section>\n\t");
382 }
383
384 jamonWriter.write("\n\n\n <section>\n ");
385
386 {
387 org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl __jamon__var_12 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());
388 __jamon__var_12.setFilter(filter );
389 __jamon__var_12.renderNoFlush(jamonWriter);
390 }
391
392 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>JVM Version</td>\n <td>");
393
394 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(JvmVersion.getVersion()), jamonWriter);
395
396 jamonWriter.write("</td>\n <td>JVM vendor and version</td>\n </tr>\n <tr>\n <td>HBase Version</td>\n <td>");
397
398 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getVersion()), jamonWriter);
399
400 jamonWriter.write(", revision=");
401
402 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getRevision()), jamonWriter);
403
404 jamonWriter.write("</td><td>HBase version and revision</td>\n </tr>\n <tr>\n <td>HBase Compiled</td>\n <td>");
405
406 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getDate()), jamonWriter);
407
408 jamonWriter.write(", ");
409
410 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getUser()), jamonWriter);
411
412 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>");
413
414 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getSrcChecksum()), jamonWriter);
415
416 jamonWriter.write("</td>\n <td>HBase source MD5 checksum</td>\n </tr>\n <tr>\n <td>Hadoop Version</td>\n <td>");
417
418 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getVersion()), jamonWriter);
419
420 jamonWriter.write(", revision=");
421
422 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getRevision()), jamonWriter);
423
424 jamonWriter.write("</td>\n <td>Hadoop version and revision</td>\n </tr>\n <tr>\n <td>Hadoop Compiled</td>\n <td>");
425
426 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getDate()), jamonWriter);
427
428 jamonWriter.write(", ");
429
430 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getUser()), jamonWriter);
431
432 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>");
433
434 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getSrcChecksum()), jamonWriter);
435
436 jamonWriter.write("</td>\n <td>Hadoop source MD5 checksum</td>\n </tr>\n <tr>\n <td>ZooKeeper Client Version</td>\n <td>");
437
438 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.zookeeper.Version.getVersion()), jamonWriter);
439
440 jamonWriter.write("</td>\n <td>ZooKeeper client version and revision</td>\n </tr>\n <tr>\n <td>ZooKeeper Client Compiled</td>\n <td>");
441
442 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.zookeeper.Version.getBuildDate()), jamonWriter);
443
444 jamonWriter.write("</td>\n <td>When ZooKeeper client version was compiled</td>\n </tr>\n <tr>\n <td>Zookeeper Quorum</td>\n <td> ");
445
446 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(formatZKString()), jamonWriter);
447
448 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> ");
449
450 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getZooKeeper().getBaseZNode()), jamonWriter);
451
452 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>");
453
454 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(FSUtils.getRootDir(master.getConfiguration()).toString()), jamonWriter);
455
456 jamonWriter.write("</td>\n <td>Location of HBase home directory</td>\n </tr>\n <tr>\n <td>HMaster Start Time</td>\n <td>");
457
458 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(master.getMasterStartTime())), jamonWriter);
459
460 jamonWriter.write("</td>\n <td>Date stamp of when this HMaster was started</td>\n </tr>\n ");
461
462 if (master.isActiveMaster() )
463 {
464
465 jamonWriter.write("\n\t <tr>\n\t <td>HMaster Active Time</td>\n\t <td>");
466
467 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(master.getMasterActiveTime())), jamonWriter);
468
469 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>");
470
471 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getClusterId() != null ? master.getClusterId() : "Not set"), jamonWriter);
472
473 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>");
474
475 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getServerManager() == null ? "0.00" :
476 StringUtils.limitDecimalTo2(master.getServerManager().getAverageLoad())), jamonWriter);
477
478 jamonWriter.write("</td>\n\t <td>Average number of regions per regionserver. Naive computation.</td>\n\t </tr>\n\t ");
479
480 if (frags != null )
481 {
482
483 jamonWriter.write("\n\t <tr>\n\t <td>Fragmentation</td>\n\t <td>");
484
485 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get("-TOTAL-") != null ? frags.get("-TOTAL-").intValue() + "%" : "n/a"), jamonWriter);
486
487 jamonWriter.write("</td>\n\t <td>Overall fragmentation of all tables, including hbase:meta</td>\n\t </tr>\n\t ");
488 }
489
490 jamonWriter.write("\n\t <tr>\n\t <td>Coprocessors</td>\n\t <td>");
491
492 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getMasterCoprocessorHost() == null ? "[]" :
493 java.util.Arrays.toString(master.getMasterCoprocessors())), jamonWriter);
494
495 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>");
496
497 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getLoadBalancerClassName()), jamonWriter);
498
499 jamonWriter.write("</td>\n\t <td>LoadBalancer to be used in the Master</td>\n\t </tr>\n ");
500 }
501
502 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");
503 }
504
505
506
507 private void __jamon_innerUnit__userSnapshots(final java.io.Writer jamonWriter)
508 throws java.io.IOException
509 {
510
511
512 List<SnapshotDescription> snapshots = null;
513 try (Admin admin = master.getConnection().getAdmin()) {
514 snapshots = master.isInitialized() ? admin.listSnapshots() : null;
515 }
516
517
518 if ((snapshots != null && snapshots.size() > 0))
519 {
520
521 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 ");
522
523 for (SnapshotDescription snapshotDesc : snapshots)
524 {
525
526 jamonWriter.write("\n ");
527
528
529 TableName snapshotTable = TableName.valueOf(snapshotDesc.getTable());
530
531
532 jamonWriter.write("<tr>\n <td><a href=\"snapshot.jsp?name=");
533
534 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);
535
536 jamonWriter.write("\">");
537
538 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);
539
540 jamonWriter.write("</a> </td>\n <td><a href=\"table.jsp?name=");
541
542 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);
543
544 jamonWriter.write("\">");
545
546 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);
547
548 jamonWriter.write("</a>\n </td>\n <td>");
549
550 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(snapshotDesc.getCreationTime())), jamonWriter);
551
552 jamonWriter.write("</td>\n </tr>\n ");
553 }
554
555 jamonWriter.write("\n <p>");
556
557 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshots.size()), jamonWriter);
558
559 jamonWriter.write(" snapshot(s) in set. [<a href=\"/snapshotsStats.jsp\">Snapshot Storefile stats</a>]</p>\n</table>\n");
560 }
561
562 jamonWriter.write("\n");
563 }
564
565
566
567 private void __jamon_innerUnit__catalogTables(final java.io.Writer jamonWriter)
568 throws java.io.IOException
569 {
570
571
572 HTableDescriptor[] sysTables = null;
573 try (Admin admin = master.getConnection().getAdmin()) {
574 sysTables = master.isInitialized() ? admin.listTableDescriptorsByNamespace(
575 NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR) : null;
576 }
577
578
579 if ((sysTables != null && sysTables.length > 0))
580 {
581
582 jamonWriter.write("\n<table class=\"table table-striped\">\n<tr>\n <th>Table Name</th>\n ");
583
584 if ((frags != null) )
585 {
586
587 jamonWriter.write("\n <th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\">Frag.</th>\n ");
588 }
589
590 jamonWriter.write("\n <th>Description</th>\n</tr>\n");
591
592 for (HTableDescriptor systemTable : sysTables)
593 {
594
595 jamonWriter.write("\n<tr>\n");
596
597 TableName tableName = systemTable.getTableName();
598
599 jamonWriter.write("<td><a href=\"table.jsp?name=");
600
601 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);
602
603 jamonWriter.write("\">");
604
605 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);
606
607 jamonWriter.write("</a></td>\n ");
608
609 if ((frags != null))
610 {
611
612 jamonWriter.write("\n <td align=\"center\">");
613
614 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString())
615 .intValue() + "%" : "n/a"), jamonWriter);
616
617 jamonWriter.write("</td>\n ");
618 }
619
620 jamonWriter.write("\n ");
621
622 String description = null;
623 if (tableName.equals(TableName.META_TABLE_NAME)){
624 description = "The hbase:meta table holds references to all User Table regions.";
625 } else if (tableName.equals(CanaryTool.DEFAULT_WRITE_TABLE_NAME)){
626 description = "The hbase:canary table is used to sniff the write availbility of"
627 + " each regionserver.";
628 } else if (tableName.equals(AccessControlLists.ACL_TABLE_NAME)){
629 description = "The hbase:acl table holds information about acl";
630 } else if (tableName.equals(VisibilityConstants.LABELS_TABLE_NAME)){
631 description = "The hbase:labels table holds information about visibility labels.";
632 } else if (tableName.equals(TableName.NAMESPACE_TABLE_NAME)){
633 description = "The hbase:namespace table holds information about namespaces.";
634 } else if (tableName.equals(QuotaUtil.QUOTA_TABLE_NAME)){
635 description = "The hbase:quota table holds quota information about number" +
636 " or size of requests in a given time frame.";
637 } else if (tableName.equals(TableName.valueOf("hbase:rsgroup"))){
638 description = "The hbase:rsgroup table holds information about regionserver groups";
639 }
640
641
642 jamonWriter.write("<td>");
643
644 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(description), jamonWriter);
645
646 jamonWriter.write("</td>\n</tr>\n");
647 }
648
649 jamonWriter.write("\n</table>\n");
650 }
651
652 jamonWriter.write("\n");
653 }
654
655
656
657 private void __jamon_innerUnit__userTables(final java.io.Writer jamonWriter)
658 throws java.io.IOException
659 {
660
661
662 HTableDescriptor[] tables = null;
663 try (Admin admin = master.getConnection().getAdmin()) {
664 tables = master.isInitialized() ? admin.listTables() : null;
665 }
666
667
668 if ((tables != null && tables.length > 0))
669 {
670
671 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 ");
672
673 if ((frags != null) )
674 {
675
676 jamonWriter.write("\n <th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\">Frag.</th>\n ");
677 }
678
679 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 ");
680
681 for (HTableDescriptor htDesc : tables)
682 {
683
684 jamonWriter.write("\n ");
685
686
687 TableName tableName = htDesc.getTableName();
688 Map<RegionState.State, List<HRegionInfo>> tableRegions =
689 master.getAssignmentManager().getRegionStates()
690 .getRegionByStateOfTable(tableName);
691 int openRegionsCount = tableRegions.get(RegionState.State.OPEN).size();
692 int openingRegionsCount = tableRegions.get(RegionState.State.OPENING).size();
693 int closedRegionsCount = tableRegions.get(RegionState.State.CLOSED).size();
694 int closingRegionsCount = tableRegions.get(RegionState.State.CLOSING).size();
695 int offlineRegionsCount = tableRegions.get(RegionState.State.OFFLINE).size();
696 int splitRegionsCount = tableRegions.get(RegionState.State.SPLIT).size();
697 int failedRegionsCount = tableRegions.get(RegionState.State.FAILED_OPEN).size()
698 + tableRegions.get(RegionState.State.FAILED_CLOSE).size();
699 int otherRegionsCount = 0;
700 for (List<HRegionInfo> list: tableRegions.values()) {
701 otherRegionsCount += list.size();
702 }
703
704 otherRegionsCount = otherRegionsCount - openRegionsCount
705 - failedRegionsCount - offlineRegionsCount
706 - splitRegionsCount;
707
708
709 jamonWriter.write("<tr>\n <td>");
710
711 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNamespaceAsString()), jamonWriter);
712
713 jamonWriter.write("</td>\n <td><a href=table.jsp?name=");
714
715 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNameAsString()), jamonWriter);
716
717 jamonWriter.write(">");
718
719 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getQualifierAsString()), jamonWriter);
720
721 jamonWriter.write("</a> </td>\n ");
722
723 if ((frags != null) )
724 {
725
726 jamonWriter.write("\n <td align=\"center\">");
727
728 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString()).intValue() + "%" : "n/a"), jamonWriter);
729
730 jamonWriter.write("</td>\n ");
731 }
732
733 jamonWriter.write("\n <td>");
734
735 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(openRegionsCount), jamonWriter);
736
737 jamonWriter.write("</td>\n ");
738
739 if ((openingRegionsCount > 0) )
740 {
741
742 jamonWriter.write(" <td><a href=\"/rits.jsp?table=");
743
744 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNameAsString()), jamonWriter);
745
746 jamonWriter.write("&state=OPENING\">");
747
748 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(openingRegionsCount), jamonWriter);
749
750 jamonWriter.write("</td> ");
751 }
752
753 else
754 {
755
756 jamonWriter.write("<td>");
757
758 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(openingRegionsCount), jamonWriter);
759
760 jamonWriter.write("</td> ");
761 }
762
763 jamonWriter.write("\n <td>");
764
765 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(closedRegionsCount), jamonWriter);
766
767 jamonWriter.write("</td>\n ");
768
769 if ((closingRegionsCount > 0) )
770 {
771
772 jamonWriter.write(" <td><a href=\"/rits.jsp?table=");
773
774 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNameAsString()), jamonWriter);
775
776 jamonWriter.write("&state=CLOSING\">");
777
778 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(closingRegionsCount), jamonWriter);
779
780 jamonWriter.write("</td> ");
781 }
782
783 else
784 {
785
786 jamonWriter.write("<td>");
787
788 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(closingRegionsCount), jamonWriter);
789
790 jamonWriter.write("</td> ");
791 }
792
793 jamonWriter.write("\n <td>");
794
795 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(offlineRegionsCount), jamonWriter);
796
797 jamonWriter.write("</td>\n <td>");
798
799 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(failedRegionsCount), jamonWriter);
800
801 jamonWriter.write("</td>\n <td>");
802
803 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(splitRegionsCount), jamonWriter);
804
805 jamonWriter.write("</td>\n <td>");
806
807 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(otherRegionsCount), jamonWriter);
808
809 jamonWriter.write("</td>\n <td>");
810
811 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(htDesc.toStringCustomizedValues()), jamonWriter);
812
813 jamonWriter.write("</td>\n </tr>\n ");
814 }
815
816 jamonWriter.write("\n <p>");
817
818 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tables.length), jamonWriter);
819
820 jamonWriter.write(" table(s) in set. [<a href=tablesDetailed.jsp>Details</a>]</p>\n</tbody>\n</table>\n");
821 }
822
823 jamonWriter.write("\n");
824 }
825
826
827
828 private void __jamon_innerUnit__peerConfigs(final java.io.Writer jamonWriter)
829 throws java.io.IOException
830 {
831
832
833 Map<String, ReplicationPeerConfig> peers = null;
834 try (ReplicationAdmin admin = new ReplicationAdmin(master.getConfiguration())) {
835 peers = admin.listPeerConfigs();
836 }
837
838
839 jamonWriter.write("<table class=\"table table-striped\">\n <tr>\n <th>Peer Id</th>\n <th>Cluster Key</th>\n <th>Bandwidth</th>\n <th>Table Cfs</th>\n </tr>\n");
840
841 if ((peers != null && peers.size() > 0))
842 {
843
844 jamonWriter.write("\n ");
845
846 for (Map.Entry<String, ReplicationPeerConfig> peer : peers.entrySet() )
847 {
848
849 jamonWriter.write("\n ");
850
851
852 String peerId = peer.getKey();
853 ReplicationPeerConfig peerConfig = peer.getValue();
854
855
856 jamonWriter.write("<tr>\n <td>");
857
858 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerId), jamonWriter);
859
860 jamonWriter.write("</td>\n <td>");
861
862 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getClusterKey()), jamonWriter);
863
864 jamonWriter.write("</td>\n <td>");
865
866 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getBandwidth() == 0? "UNLIMITED" : StringUtils.humanReadableInt(peerConfig.getBandwidth())), jamonWriter);
867
868 jamonWriter.write("</td>\n <td>\n ");
869
870 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getTableCFsMap() == null ? "" : ReplicationSerDeHelper.convertToString(peerConfig.getTableCFsMap()).replaceAll(";", "; ")), jamonWriter);
871
872 jamonWriter.write("\n </td>\n </tr>\n ");
873 }
874
875 jamonWriter.write("\n");
876 }
877
878 jamonWriter.write("\n<tr><td>Total: ");
879
880 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf((peers != null) ? peers.size() : 0), jamonWriter);
881
882 jamonWriter.write("</td></tr>\n</table>\n");
883 }
884
885
886
887 private void __jamon_innerUnit__deadRegionServers(final java.io.Writer jamonWriter)
888 throws java.io.IOException
889 {
890
891 if ((deadServers != null && deadServers.size() > 0))
892 {
893
894 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 ");
895
896
897 DeadServer deadServerUtil = master.getServerManager().getDeadServers();
898 ServerName [] deadServerNames = deadServers.toArray(new ServerName[deadServers.size()]);
899 Arrays.sort(deadServerNames);
900 for (ServerName deadServerName: deadServerNames) {
901
902
903 jamonWriter.write("<tr>\n \t<th></th>\n <td>");
904
905 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerName), jamonWriter);
906
907 jamonWriter.write("</td>\n <td>");
908
909 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerUtil.getTimeOfDeath(deadServerName)), jamonWriter);
910
911 jamonWriter.write("</td>\n </tr>\n ");
912
913
914 }
915
916
917 jamonWriter.write("<tr>\n <th>Total: </th>\n <td>servers: ");
918
919 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServers.size()), jamonWriter);
920
921 jamonWriter.write("</td>\n <th></th>\n </tr>\n</table>\n");
922 }
923
924 jamonWriter.write("\n");
925 }
926
927
928 }