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