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