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 String filter;
66 private final ServerName metaLocation;
67 private final Set<ServerName> deadServers;
68 private final boolean catalogJanitorEnabled;
69 private final Map<String,Integer> frags;
70 private final ServerManager serverManager;
71 private final List<ServerName> servers;
72 private final String format;
73 private final AssignmentManager assignmentManager;
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.getFilter__IsNotDefault())
104 {
105 p_implData.setFilter("general");
106 }
107 if(! p_implData.getMetaLocation__IsNotDefault())
108 {
109 p_implData.setMetaLocation(null);
110 }
111 if(! p_implData.getDeadServers__IsNotDefault())
112 {
113 p_implData.setDeadServers(null);
114 }
115 if(! p_implData.getCatalogJanitorEnabled__IsNotDefault())
116 {
117 p_implData.setCatalogJanitorEnabled(true);
118 }
119 if(! p_implData.getFrags__IsNotDefault())
120 {
121 p_implData.setFrags(null);
122 }
123 if(! p_implData.getServerManager__IsNotDefault())
124 {
125 p_implData.setServerManager(null);
126 }
127 if(! p_implData.getServers__IsNotDefault())
128 {
129 p_implData.setServers(null);
130 }
131 if(! p_implData.getFormat__IsNotDefault())
132 {
133 p_implData.setFormat("html");
134 }
135 if(! p_implData.getAssignmentManager__IsNotDefault())
136 {
137 p_implData.setAssignmentManager(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 filter = p_implData.getFilter();
146 metaLocation = p_implData.getMetaLocation();
147 deadServers = p_implData.getDeadServers();
148 catalogJanitorEnabled = p_implData.getCatalogJanitorEnabled();
149 frags = p_implData.getFrags();
150 serverManager = p_implData.getServerManager();
151 servers = p_implData.getServers();
152 format = p_implData.getFormat();
153 assignmentManager = p_implData.getAssignmentManager();
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.setFormat("json" );
168 __jamon__var_6.setFilter(filter);
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=\"/procedures.jsp\">Procedures</a></li>\n <li><a href=\"/logs/\">Local Logs</a></li>\n <li><a href=\"/logLevel\">Log Level</a></li>\n <li><a href=\"/dump\">Debug Dump</a></li>\n <li><a href=\"/jmx\">Metrics Dump</a></li>\n ");
203
204 if (HBaseConfiguration.isShowConfInServlet())
205 {
206
207 jamonWriter.write("\n <li><a href=\"/conf\">HBase Configuration</a></li>\n ");
208 }
209
210 jamonWriter.write("\n </ul>\n </div><!--/.nav-collapse -->\n </div>\n </div>\n\n <div class=\"container-fluid content\">\n\t");
211
212 if (master.isActiveMaster() )
213 {
214
215 jamonWriter.write("\n <div class=\"row inner_header\">\n <div class=\"page-header\">\n <h1>Master <small>");
216
217 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getServerName().getHostname()), jamonWriter);
218
219 jamonWriter.write("</small></h1>\n </div>\n </div>\n\n <div class=\"row\">\n <!-- Various warnings that cluster admins should be aware of -->\n ");
220
221 if (JvmVersion.isBadJvmVersion() )
222 {
223
224 jamonWriter.write("\n <div class=\"alert alert-error\">\n Your current JVM version ");
225
226 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(System.getProperty("java.version")), jamonWriter);
227
228 jamonWriter.write(" is known to be\n unstable with HBase. Please see the\n <a href=\"http://wiki.apache.org/hadoop/Hbase/Troubleshooting#A18\">HBase wiki</a>\n for details.\n </div>\n ");
229 }
230
231 jamonWriter.write("\n ");
232
233 if (master.isInitialized() && !catalogJanitorEnabled )
234 {
235
236 jamonWriter.write("\n <div class=\"alert alert-error\">\n Please note that your cluster is running with the CatalogJanitor disabled. It can be\n re-enabled from the hbase shell by running the command 'catalogjanitor_switch true'\n </div>\n ");
237 }
238
239 jamonWriter.write("\n ");
240
241 if (!master.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 ");
248
249 if (!master.isSplitOrMergeEnabled(Admin.MasterSwitchType.SPLIT) )
250 {
251
252 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 ");
253 }
254
255 jamonWriter.write("\n ");
256
257 if (!master.isSplitOrMergeEnabled(Admin.MasterSwitchType.MERGE) )
258 {
259
260 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 ");
261 }
262
263 jamonWriter.write("\n\n <section>\n <h2>Region Servers</h2>\n ");
264
265 {
266 org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl __jamon__var_7 = new org.apache.hadoop.hbase.tmpl.master.RegionServerListTmpl(this.getTemplateManager());
267 __jamon__var_7.setServers(servers );
268 __jamon__var_7.renderNoFlush(jamonWriter, master);
269 }
270
271 jamonWriter.write("\n\n ");
272
273 if ((deadServers != null) )
274 {
275
276 jamonWriter.write("\n ");
277
278 {
279
280 __jamon_innerUnit__deadRegionServers(jamonWriter);
281 }
282
283 jamonWriter.write("\n ");
284 }
285
286 jamonWriter.write("\n </section>\n <section>\n ");
287
288 {
289 org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl __jamon__var_8 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
290 __jamon__var_8.renderNoFlush(jamonWriter, master );
291 }
292
293 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 ");
294
295 if ((metaLocation != null) )
296 {
297
298 jamonWriter.write("\n ");
299
300 {
301
302 __jamon_innerUnit__userTables(jamonWriter);
303 }
304
305 jamonWriter.write("\n ");
306 }
307
308 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_catalogTables\">\n ");
309
310 if ((metaLocation != null) )
311 {
312
313 jamonWriter.write("\n ");
314
315 {
316
317 __jamon_innerUnit__catalogTables(jamonWriter);
318 }
319
320 jamonWriter.write("\n ");
321 }
322
323 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_userSnapshots\">\n ");
324
325 {
326
327 __jamon_innerUnit__userSnapshots(jamonWriter);
328 }
329
330 jamonWriter.write("\n </div>\n </div>\n </div>\n </section>\n ");
331
332 if (master.getAssignmentManager() != null )
333 {
334
335 jamonWriter.write("\n ");
336
337 {
338 org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl __jamon__var_9 = new org.apache.hadoop.hbase.tmpl.master.AssignmentManagerStatusTmpl(this.getTemplateManager());
339 __jamon__var_9.renderNoFlush(jamonWriter, master.getAssignmentManager());
340 }
341
342 jamonWriter.write("\n ");
343 }
344
345 jamonWriter.write("\n\t");
346 }
347
348 else
349 {
350
351 jamonWriter.write("\n <section>\n ");
352
353 {
354 org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl __jamon__var_10 = new org.apache.hadoop.hbase.tmpl.master.BackupMasterStatusTmpl(this.getTemplateManager());
355 __jamon__var_10.renderNoFlush(jamonWriter, master );
356 }
357
358 jamonWriter.write("\n </section>\n\t");
359 }
360
361 jamonWriter.write("\n\n\n <section>\n ");
362
363 {
364 org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl __jamon__var_11 = new org.apache.hadoop.hbase.tmpl.common.TaskMonitorTmpl(this.getTemplateManager());
365 __jamon__var_11.setFilter(filter );
366 __jamon__var_11.renderNoFlush(jamonWriter);
367 }
368
369 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>");
370
371 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.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.hbase.util.VersionInfo.getRevision()), jamonWriter);
376
377 jamonWriter.write("</td><td>HBase version and revision</td>\n </tr>\n <tr>\n <td>HBase Compiled</td>\n <td>");
378
379 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getDate()), jamonWriter);
380
381 jamonWriter.write(", ");
382
383 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getUser()), jamonWriter);
384
385 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>");
386
387 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.hbase.util.VersionInfo.getSrcChecksum()), jamonWriter);
388
389 jamonWriter.write("</td>\n <td>HBase source MD5 checksum</td>\n </tr>\n <tr>\n <td>Hadoop Version</td>\n <td>");
390
391 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getVersion()), jamonWriter);
392
393 jamonWriter.write(", revision=");
394
395 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getRevision()), jamonWriter);
396
397 jamonWriter.write("</td>\n <td>Hadoop version and revision</td>\n </tr>\n <tr>\n <td>Hadoop Compiled</td>\n <td>");
398
399 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getDate()), jamonWriter);
400
401 jamonWriter.write(", ");
402
403 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getUser()), jamonWriter);
404
405 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>");
406
407 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.hadoop.util.VersionInfo.getSrcChecksum()), jamonWriter);
408
409 jamonWriter.write("</td>\n <td>Hadoop source MD5 checksum</td>\n </tr>\n <tr>\n <td>ZooKeeper Client Version</td>\n <td>");
410
411 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.zookeeper.Version.getVersion()), jamonWriter);
412
413 jamonWriter.write(", revision=");
414
415 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.zookeeper.Version.getRevision()), jamonWriter);
416
417 jamonWriter.write("</td>\n <td>ZooKeeper client version and revision</td>\n </tr>\n <tr>\n <td>ZooKeeper Client Compiled</td>\n <td>");
418
419 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(org.apache.zookeeper.Version.getBuildDate()), jamonWriter);
420
421 jamonWriter.write("</td>\n <td>When ZooKeeper client version was compiled</td>\n </tr>\n <tr>\n <td>Zookeeper Quorum</td>\n <td> ");
422
423 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(formatZKString()), jamonWriter);
424
425 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> ");
426
427 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getZooKeeper().getBaseZNode()), jamonWriter);
428
429 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>");
430
431 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(FSUtils.getRootDir(master.getConfiguration()).toString()), jamonWriter);
432
433 jamonWriter.write("</td>\n <td>Location of HBase home directory</td>\n </tr>\n <tr>\n <td>HMaster Start Time</td>\n <td>");
434
435 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(master.getMasterStartTime())), jamonWriter);
436
437 jamonWriter.write("</td>\n <td>Date stamp of when this HMaster was started</td>\n </tr>\n ");
438
439 if (master.isActiveMaster() )
440 {
441
442 jamonWriter.write("\n\t <tr>\n\t <td>HMaster Active Time</td>\n\t <td>");
443
444 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(master.getMasterActiveTime())), jamonWriter);
445
446 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>");
447
448 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getClusterId() != null ? master.getClusterId() : "Not set"), jamonWriter);
449
450 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>");
451
452 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getServerManager() == null ? "0.00" :
453 StringUtils.limitDecimalTo2(master.getServerManager().getAverageLoad())), jamonWriter);
454
455 jamonWriter.write("</td>\n\t <td>Average number of regions per regionserver. Naive computation.</td>\n\t </tr>\n\t ");
456
457 if (frags != null )
458 {
459
460 jamonWriter.write("\n\t <tr>\n\t <td>Fragmentation</td>\n\t <td>");
461
462 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get("-TOTAL-") != null ? frags.get("-TOTAL-").intValue() + "%" : "n/a"), jamonWriter);
463
464 jamonWriter.write("</td>\n\t <td>Overall fragmentation of all tables, including hbase:meta</td>\n\t </tr>\n\t ");
465 }
466
467 jamonWriter.write("\n\t <tr>\n\t <td>Coprocessors</td>\n\t <td>");
468
469 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getMasterCoprocessorHost() == null ? "[]" :
470 java.util.Arrays.toString(master.getMasterCoprocessors())), jamonWriter);
471
472 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>");
473
474 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(master.getLoadBalancerClassName()), jamonWriter);
475
476 jamonWriter.write("</td>\n\t <td>LoadBalancer to be used in the Master</td>\n\t </tr>\n ");
477 }
478
479 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");
480 }
481
482
483
484 private void __jamon_innerUnit__deadRegionServers(final java.io.Writer jamonWriter)
485 throws java.io.IOException
486 {
487
488 if ((deadServers != null && deadServers.size() > 0))
489 {
490
491 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 ");
492
493
494 DeadServer deadServerUtil = master.getServerManager().getDeadServers();
495 ServerName [] deadServerNames = deadServers.toArray(new ServerName[deadServers.size()]);
496 Arrays.sort(deadServerNames);
497 for (ServerName deadServerName: deadServerNames) {
498
499
500 jamonWriter.write("<tr>\n \t<th></th>\n <td>");
501
502 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerName), jamonWriter);
503
504 jamonWriter.write("</td>\n <td>");
505
506 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServerUtil.getTimeOfDeath(deadServerName)), jamonWriter);
507
508 jamonWriter.write("</td>\n </tr>\n ");
509
510
511 }
512
513
514 jamonWriter.write("<tr>\n <th>Total: </th>\n <td>servers: ");
515
516 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(deadServers.size()), jamonWriter);
517
518 jamonWriter.write("</td>\n <th></th>\n </tr>\n</table>\n");
519 }
520
521 jamonWriter.write("\n");
522 }
523
524
525
526 private void __jamon_innerUnit__catalogTables(final java.io.Writer jamonWriter)
527 throws java.io.IOException
528 {
529
530
531 HTableDescriptor[] sysTables = null;
532 try (Admin admin = master.getConnection().getAdmin()) {
533 sysTables = master.isInitialized() ? admin.listTableDescriptorsByNamespace(
534 NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR) : null;
535 }
536
537
538 if ((sysTables != null && sysTables.length > 0))
539 {
540
541 jamonWriter.write("\n<table class=\"table table-striped\">\n<tr>\n <th>Table Name</th>\n ");
542
543 if ((frags != null) )
544 {
545
546 jamonWriter.write("\n <th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\">Frag.</th>\n ");
547 }
548
549 jamonWriter.write("\n <th>Description</th>\n</tr>\n");
550
551 for (HTableDescriptor systemTable : sysTables)
552 {
553
554 jamonWriter.write("\n<tr>\n");
555
556 TableName tableName = systemTable.getTableName();
557
558 jamonWriter.write("<td><a href=\"table.jsp?name=");
559
560 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);
561
562 jamonWriter.write("\">");
563
564 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName), jamonWriter);
565
566 jamonWriter.write("</a></td>\n ");
567
568 if ((frags != null))
569 {
570
571 jamonWriter.write("\n <td align=\"center\">");
572
573 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString())
574 .intValue() + "%" : "n/a"), jamonWriter);
575
576 jamonWriter.write("</td>\n ");
577 }
578
579 jamonWriter.write("\n ");
580
581 String description = null;
582 if (tableName.equals(TableName.META_TABLE_NAME)){
583 description = "The hbase:meta table holds references to all User Table regions.";
584 } else if (tableName.equals(Canary.DEFAULT_WRITE_TABLE_NAME)){
585 description = "The hbase:canary table is used to sniff the write availbility of"
586 + " each regionserver.";
587 } else if (tableName.equals(AccessControlLists.ACL_TABLE_NAME)){
588 description = "The hbase:acl table holds information about acl";
589 } else if (tableName.equals(VisibilityConstants.LABELS_TABLE_NAME)){
590 description = "The hbase:labels table holds information about visibility labels.";
591 } else if (tableName.equals(TableName.NAMESPACE_TABLE_NAME)){
592 description = "The hbase:namespace table holds information about namespaces.";
593 } else if (tableName.equals(QuotaUtil.QUOTA_TABLE_NAME)){
594 description = "The hbase:quota table holds quota information about number" +
595 " or size of requests in a given time frame.";
596 }
597
598
599 jamonWriter.write("<td>");
600
601 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(description), jamonWriter);
602
603 jamonWriter.write("</td>\n</tr>\n");
604 }
605
606 jamonWriter.write("\n</table>\n");
607 }
608
609 jamonWriter.write("\n");
610 }
611
612
613
614 private void __jamon_innerUnit__userSnapshots(final java.io.Writer jamonWriter)
615 throws java.io.IOException
616 {
617
618
619 List<SnapshotDescription> snapshots = null;
620 try (Admin admin = master.getConnection().getAdmin()) {
621 snapshots = master.isInitialized() ? admin.listSnapshots() : null;
622 }
623
624
625 if ((snapshots != null && snapshots.size() > 0))
626 {
627
628 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 ");
629
630 for (SnapshotDescription snapshotDesc : snapshots)
631 {
632
633 jamonWriter.write("\n ");
634
635
636 TableName snapshotTable = TableName.valueOf(snapshotDesc.getTable());
637
638
639 jamonWriter.write("<tr>\n <td><a href=\"snapshot.jsp?name=");
640
641 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);
642
643 jamonWriter.write("\">");
644
645 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotDesc.getName()), jamonWriter);
646
647 jamonWriter.write("</a> </td>\n <td><a href=\"table.jsp?name=");
648
649 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);
650
651 jamonWriter.write("\">");
652
653 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshotTable.getNameAsString()), jamonWriter);
654
655 jamonWriter.write("</a>\n </td>\n <td>");
656
657 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(new Date(snapshotDesc.getCreationTime())), jamonWriter);
658
659 jamonWriter.write("</td>\n </tr>\n ");
660 }
661
662 jamonWriter.write("\n <p>");
663
664 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(snapshots.size()), jamonWriter);
665
666 jamonWriter.write(" snapshot(s) in set. [<a href=\"/snapshotsStats.jsp\">Snapshot Storefile stats</a>]</p>\n</table>\n");
667 }
668
669 jamonWriter.write("\n");
670 }
671
672
673
674 private void __jamon_innerUnit__userTables(final java.io.Writer jamonWriter)
675 throws java.io.IOException
676 {
677
678
679 HTableDescriptor[] tables = null;
680 try (Admin admin = master.getConnection().getAdmin()) {
681 tables = master.isInitialized() ? admin.listTables() : null;
682 }
683
684
685 if ((tables != null && tables.length > 0))
686 {
687
688 jamonWriter.write("\n<table class=\"table table-striped\">\n <tr>\n <th>Namespace</th>\n <th>Table Name</th>\n ");
689
690 if ((frags != null) )
691 {
692
693 jamonWriter.write("\n <th title=\"Fragmentation - Will be 0% after a major compaction and fluctuate during normal usage.\">Frag.</th>\n ");
694 }
695
696 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 ");
697
698 for (HTableDescriptor htDesc : tables)
699 {
700
701 jamonWriter.write("\n ");
702
703
704 TableName tableName = htDesc.getTableName();
705 Map<RegionState.State, List<HRegionInfo>> tableRegions =
706 master.getAssignmentManager().getRegionStates()
707 .getRegionByStateOfTable(tableName);
708 int openRegionsCount = tableRegions.get(RegionState.State.OPEN).size();
709 int offlineRegionsCount = tableRegions.get(RegionState.State.OFFLINE).size();
710 int splitRegionsCount = tableRegions.get(RegionState.State.SPLIT).size();
711 int failedRegionsCount = tableRegions.get(RegionState.State.FAILED_OPEN).size()
712 + tableRegions.get(RegionState.State.FAILED_CLOSE).size();
713 int otherRegionsCount = 0;
714 for (List<HRegionInfo> list: tableRegions.values()) {
715 otherRegionsCount += list.size();
716 }
717
718 otherRegionsCount = otherRegionsCount - openRegionsCount
719 - failedRegionsCount - offlineRegionsCount
720 - splitRegionsCount;
721
722
723 jamonWriter.write("<tr>\n <td>");
724
725 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNamespaceAsString()), jamonWriter);
726
727 jamonWriter.write("</td>\n <td><a href=table.jsp?name=");
728
729 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getNameAsString()), jamonWriter);
730
731 jamonWriter.write(">");
732
733 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tableName.getQualifierAsString()), jamonWriter);
734
735 jamonWriter.write("</a> </td>\n ");
736
737 if ((frags != null) )
738 {
739
740 jamonWriter.write("\n <td align=\"center\">");
741
742 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(frags.get(tableName.getNameAsString()) != null ? frags.get(tableName.getNameAsString()).intValue() + "%" : "n/a"), jamonWriter);
743
744 jamonWriter.write("</td>\n ");
745 }
746
747 jamonWriter.write("\n <td>");
748
749 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(openRegionsCount), jamonWriter);
750
751 jamonWriter.write("</td>\n <td>");
752
753 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(offlineRegionsCount), jamonWriter);
754
755 jamonWriter.write("</td>\n <td>");
756
757 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(failedRegionsCount), jamonWriter);
758
759 jamonWriter.write("</td>\n <td>");
760
761 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(splitRegionsCount), jamonWriter);
762
763 jamonWriter.write("</td>\n <td>");
764
765 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(otherRegionsCount), jamonWriter);
766
767 jamonWriter.write("</td>\n <td>");
768
769 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(htDesc.toStringCustomizedValues()), jamonWriter);
770
771 jamonWriter.write("</td>\n </tr>\n ");
772 }
773
774 jamonWriter.write("\n <p>");
775
776 org.jamon.escaping.Escaping.NONE.write(org.jamon.emit.StandardEmitter.valueOf(tables.length), jamonWriter);
777
778 jamonWriter.write(" table(s) in set. [<a href=tablesDetailed.jsp>Details</a>]</p>\n</table>\n");
779 }
780
781 jamonWriter.write("\n");
782 }
783
784
785 }