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 ServerName metaLocation;
74 private final boolean catalogJanitorEnabled;
75 private final String format;
76 private final List<ServerName> servers;
77 private final String filter;
78 private final ServerManager serverManager;
79 private final Map<String,Integer> frags;
80 private final AssignmentManager assignmentManager;
81 private final Set<ServerName> deadServers;
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.getMetaLocation__IsNotDefault())
112 {
113 p_implData.setMetaLocation(null);
114 }
115 if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())
116 {
117 p_implData.setCatalogJanitorEnabled(true);
118 }
119 if(! p_implData.getFormat__IsNotDefault())
120 {
121 p_implData.setFormat("html");
122 }
123 if(! p_implData.getServers__IsNotDefault())
124 {
125 p_implData.setServers(null);
126 }
127 if(! p_implData.getFilter__IsNotDefault())
128 {
129 p_implData.setFilter("general");
130 }
131 if(! p_implData.getServerManager__IsNotDefault())
132 {
133 p_implData.setServerManager(null);
134 }
135 if(! p_implData.getFrags__IsNotDefault())
136 {
137 p_implData.setFrags(null);
138 }
139 if(! p_implData.getAssignmentManager__IsNotDefault())
140 {
141 p_implData.setAssignmentManager(null);
142 }
143 if(! p_implData.getDeadServers__IsNotDefault())
144 {
145 p_implData.setDeadServers(null);
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 metaLocation = p_implData.getMetaLocation();
154 catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();
155 format = p_implData.getFormat();
156 servers = p_implData.getServers();
157 filter = p_implData.getFilter();
158 serverManager = p_implData.getServerManager();
159 frags = p_implData.getFrags();
160 assignmentManager = p_implData.getAssignmentManager();
161 deadServers = p_implData.getDeadServers();
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_0 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());
175 __jamon__var_0.setFormat("json" );
176 __jamon__var_0.setFilter(filter);
177 __jamon__var_0.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 <section>\n <h2>Region Servers</h2>\n ");
280
281 {
282 org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl __jamon__var_1 = new org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl(this.getTemplateManager());
283 __jamon__var_1.setServers(servers );
284 __jamon__var_1.renderNoFlush(jamonWriter, master);
285 }
286
287 jamonWriter.write("\n\n ");
288
289 if ((deadServers != null) )
290 {
291
292 jamonWriter.write("\n ");
293
294 {
295
296 __jamon_innerUnit__deadRegionServers(jamonWriter);
297 }
298
299 jamonWriter.write("\n ");
300 }
301
302 jamonWriter.write("\n </section>\n <section>\n ");
303
304 {
305 org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl __jamon__var_2 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
306 __jamon__var_2.renderNoFlush(jamonWriter, master );
307 }
308
309 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 ");
310
311 if ((metaLocation != null) )
312 {
313
314 jamonWriter.write("\n ");
315
316 {
317
318 __jamon_innerUnit__userTables(jamonWriter);
319 }
320
321 jamonWriter.write("\n ");
322 }
323
324 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_catalogTables\">\n ");
325
326 if ((metaLocation != null) )
327 {
328
329 jamonWriter.write("\n ");
330
331 {
332
333 __jamon_innerUnit__catalogTables(jamonWriter);
334 }
335
336 jamonWriter.write("\n ");
337 }
338
339 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_userSnapshots\">\n ");
340
341 {
342
343 __jamon_innerUnit__userSnapshots(jamonWriter);
344 }
345
346 jamonWriter.write("\n </div>\n </div>\n </div>\n </section>\n <section>\n <h2>Peers</h2>\n ");
347
348 {
349
350 __jamon_innerUnit__peerConfigs(jamonWriter);
351 }
352
353 jamonWriter.write("\n </section>\n ");
354
355 if (master.getAssignmentManager() != null )
356 {
357
358 jamonWriter.write("\n ");
359
360 {
361 org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl __jamon__var_3 = new org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl(this.getTemplateManager());
362 __jamon__var_3.renderNoFlush(jamonWriter, master.getAssignmentManager());
363 }
364
365 jamonWriter.write("\n ");
366 }
367
368 jamonWriter.write("\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_4 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
378 __jamon__var_4.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_5 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());
388 __jamon__var_5.setFilter(filter );
389 __jamon__var_5.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 offlineRegionsCount = tableRegions.get(RegionState.State.OFFLINE).size();
693 int splitRegionsCount = tableRegions.get(RegionState.State.SPLIT).size();
694 int failedRegionsCount = tableRegions.get(RegionState.State.FAILED_OPEN).size()
695 + tableRegions.get(RegionState.State.FAILED_CLOSE).size();
696 int otherRegionsCount = 0;
697 for (List<HRegionInfo> list: tableRegions.values()) {
698 otherRegionsCount += list.size();
699 }
700
701 otherRegionsCount = otherRegionsCount - openRegionsCount
702 - failedRegionsCount - offlineRegionsCount
703 - splitRegionsCount;
704
705
706 jamonWriter.write("<tr>\n <td>");
707
708 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNamespaceAsString()), jamonWriter);
709
710 jamonWriter.write("</td>\n <td><a href=table.jsp?name=");
711
712 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNameAsString()), jamonWriter);
713
714 jamonWriter.write(">");
715
716 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getQualifierAsString()), jamonWriter);
717
718 jamonWriter.write("</a> </td>\n ");
719
720 if ((frags != null) )
721 {
722
723 jamonWriter.write("\n <td align=\"center\">");
724
725 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString()).intValue() + "%" : "n/a"), jamonWriter);
726
727 jamonWriter.write("</td>\n ");
728 }
729
730 jamonWriter.write("\n <td>");
731
732 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(openRegionsCount), jamonWriter);
733
734 jamonWriter.write("</td>\n <td>");
735
736 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(offlineRegionsCount), jamonWriter);
737
738 jamonWriter.write("</td>\n <td>");
739
740 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(failedRegionsCount), jamonWriter);
741
742 jamonWriter.write("</td>\n <td>");
743
744 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(splitRegionsCount), jamonWriter);
745
746 jamonWriter.write("</td>\n <td>");
747
748 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(otherRegionsCount), jamonWriter);
749
750 jamonWriter.write("</td>\n <td>");
751
752 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(htDesc.toStringCustomizedValues()), jamonWriter);
753
754 jamonWriter.write("</td>\n </tr>\n ");
755 }
756
757 jamonWriter.write("\n <p>");
758
759 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tables.length), jamonWriter);
760
761 jamonWriter.write(" table(s) in set. [<a href=tablesDetailed.jsp>Details</a>]</p>\n</tbody>\n</table>\n");
762 }
763
764 jamonWriter.write("\n");
765 }
766
767
768
769 private void __jamon_innerUnit__peerConfigs(final java.io.Writer jamonWriter)
770 throws java.io.IOException
771 {
772
773
774 Map<String, ReplicationPeerConfig> peers = null;
775 try (ReplicationAdmin admin = new ReplicationAdmin(master.getConfiguration())) {
776 peers = admin.listPeerConfigs();
777 }
778
779
780 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");
781
782 if ((peers != null && peers.size() > 0))
783 {
784
785 jamonWriter.write("\n ");
786
787 for (Map.Entry<String, ReplicationPeerConfig> peer : peers.entrySet() )
788 {
789
790 jamonWriter.write("\n ");
791
792
793 String peerId = peer.getKey();
794 ReplicationPeerConfig peerConfig = peer.getValue();
795
796
797 jamonWriter.write("<tr>\n <td>");
798
799 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerId), jamonWriter);
800
801 jamonWriter.write("</td>\n <td>");
802
803 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getClusterKey()), jamonWriter);
804
805 jamonWriter.write("</td>\n <td>");
806
807 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getBandwidth() == 0? "UNLIMITED" : StringUtils.humanReadableInt(peerConfig.getBandwidth())), jamonWriter);
808
809 jamonWriter.write("</td>\n <td>\n ");
810
811 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(peerConfig.getTableCFsMap() == null ? "" : ReplicationSerDeHelper.convertToString(peerConfig.getTableCFsMap()).replaceAll(";", "; ")), jamonWriter);
812
813 jamonWriter.write("\n </td>\n </tr>\n ");
814 }
815
816 jamonWriter.write("\n");
817 }
818
819 jamonWriter.write("\n<tr><td>Total: ");
820
821 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf((peers != null) ? peers.size() : 0), jamonWriter);
822
823 jamonWriter.write("</td></tr>\n</table>\n");
824 }
825
826
827
828 private void __jamon_innerUnit__deadRegionServers(final java.io.Writer jamonWriter)
829 throws java.io.IOException
830 {
831
832 if ((deadServers != null && deadServers.size() > 0))
833 {
834
835 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 ");
836
837
838 DeadServer deadServerUtil = master.getServerManager().getDeadServers();
839 ServerName [] deadServerNames = deadServers.toArray(new ServerName[deadServers.size()]);
840 Arrays.sort(deadServerNames);
841 for (ServerName deadServerName: deadServerNames) {
842
843
844 jamonWriter.write("<tr>\n \t<th></th>\n <td>");
845
846 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerName), jamonWriter);
847
848 jamonWriter.write("</td>\n <td>");
849
850 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerUtil.getTimeOfDeath(deadServerName)), jamonWriter);
851
852 jamonWriter.write("</td>\n </tr>\n ");
853
854
855 }
856
857
858 jamonWriter.write("<tr>\n <th>Total: </th>\n <td>servers: ");
859
860 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServers.size()), jamonWriter);
861
862 jamonWriter.write("</td>\n <th></th>\n </tr>\n</table>\n");
863 }
864
865 jamonWriter.write("\n");
866 }
867
868
869 }