1
2
3
4 package org.apache.hadoop.hbase.tmpl.regionserver;
5
6
7 import java.util.*;
8
9 import org.apache.hadoop.hbase.regionserver.HRegionServer;
10
11 import org.apache.hadoop.hbase.util.Bytes;
12
13 import org.apache.hadoop.hbase.HRegionInfo;
14
15 import org.apache.hadoop.hbase.regionserver.Region;
16
17 import org.apache.hadoop.hbase.ServerName;
18
19 import org.apache.hadoop.hbase.HBaseConfiguration;
20
21 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
22
23 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ServerInfo;
24
25 import org.apache.hadoop.hbase.protobuf.generated.ClusterStatusProtos.RegionLoad;
26
27 import org.apache.hadoop.hbase.client.RegionReplicaUtil;
28
29 import org.apache.hadoop.hbase.regionserver.MetricsRegionWrapper;
30
31 public class RegionListTmplImpl
32 extends org.jamon.AbstractTemplateImpl
33 implements org.apache.hadoop.hbase.tmpl.regionserver.RegionListTmpl.Intf
34
35 {
36 private final HRegionServer regionServer;
37 private final List<HRegionInfo> onlineRegions;
38 protected static org.apache.hadoop.hbase.tmpl.regionserver.RegionListTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.regionserver.RegionListTmpl.ImplData p_implData)
39 {
40 return p_implData;
41 }
42 public RegionListTmplImpl(org.jamon.TemplateManager p_templateManager, org.apache.hadoop.hbase.tmpl.regionserver.RegionListTmpl.ImplData p_implData)
43 {
44 super(p_templateManager, __jamon_setOptionalArguments(p_implData));
45 regionServer = p_implData.getRegionServer();
46 onlineRegions = p_implData.getOnlineRegions();
47 }
48
49 @Override public void renderNoFlush(final java.io.Writer jamonWriter)
50 throws java.io.IOException
51 {
52
53 if ((onlineRegions != null && onlineRegions.size() > 0) )
54 {
55
56 jamonWriter.write("\n\n ");
57
58
59 Collections.sort(onlineRegions);
60
61
62 jamonWriter.write("<div class=\"tabbable\">\n <ul class=\"nav nav-pills\">\n <li class=\"active\"><a href=\"#tab_regionBaseInfo\" data-toggle=\"tab\">Base Info</a> </li>\n <li><a href=\"#tab_regionRequestStats\" data-toggle=\"tab\">Request metrics</a></li>\n <li class=\"\"><a href=\"#tab_regionStoreStats\" data-toggle=\"tab\">Storefile Metrics</a></li>\n <li class=\"\"><a href=\"#tab_regionMemstoreStats\" data-toggle=\"tab\">Memstore Metrics</a></li>\n <li class=\"\"><a href=\"#tab_regionCompactStats\" data-toggle=\"tab\">Compaction Metrics</a></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_regionBaseInfo\">\n ");
63
64 {
65
66 __jamon_innerUnit__baseInfo(jamonWriter, onlineRegions);
67 }
68
69 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_regionRequestStats\">\n ");
70
71 {
72
73 __jamon_innerUnit__requestStats(jamonWriter, onlineRegions);
74 }
75
76 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_regionStoreStats\">\n ");
77
78 {
79
80 __jamon_innerUnit__storeStats(jamonWriter, onlineRegions);
81 }
82
83 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_regionMemstoreStats\">\n ");
84
85 {
86
87 __jamon_innerUnit__memstoreStats(jamonWriter, onlineRegions);
88 }
89
90 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_regionCompactStats\">\n ");
91
92 {
93
94 __jamon_innerUnit__compactStats(jamonWriter, onlineRegions);
95 }
96
97 jamonWriter.write("\n </div>\n </div>\n </div>\n <p>Region names are made of the containing table's name, a comma,\n the start key, a comma, and a randomly generated region id. To illustrate,\n the region named\n <em>domains,apache.org,5464829424211263407</em> is party to the table\n <em>domains</em>, has an id of <em>5464829424211263407</em> and the first key\n in the region is <em>apache.org</em>. The <em>hbase:meta</em> 'table' is an internal\n system table (or a 'catalog' table in db-speak).\n The hbase:meta table keeps a list of all regions in the system. The empty key is used to denote\n table start and table end. A region with an empty start key is the first region in a table.\n If a region has both an empty start key and an empty end key, it's the only region in the\n table. See <a href=\"http://hbase.org\">HBase Home</a> for further explication.<p>\n");
98 }
99
100 else
101 {
102
103 jamonWriter.write("\n <p>Not serving regions</p>\n");
104 }
105
106 jamonWriter.write("\n\n");
107 }
108
109
110
111 private void __jamon_innerUnit__requestStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
112 throws java.io.IOException
113 {
114
115 jamonWriter.write("<table class=\"table table-striped\">\n <tr>\n <th>Region Name</th>\n <th>Read Request Count</th>\n <th>Write Request Count</th>\n </tr>\n\n ");
116
117 for (HRegionInfo r: onlineRegions )
118 {
119
120 jamonWriter.write("\n\n <tr>\n ");
121
122
123 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
124
125
126 jamonWriter.write("<td><a href=\"region.jsp?name=");
127
128 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
129
130 jamonWriter.write("\">\n ");
131
132 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
133
134 jamonWriter.write("</a>\n </td>\n ");
135
136 if (load != null )
137 {
138
139 jamonWriter.write("\n <td>");
140
141 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getReadRequestsCount()), jamonWriter);
142
143 jamonWriter.write("</td>\n <td>");
144
145 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getWriteRequestsCount()), jamonWriter);
146
147 jamonWriter.write("</td>\n ");
148 }
149
150 jamonWriter.write("\n </tr>\n ");
151 }
152
153 jamonWriter.write("\n </table>\n");
154 }
155
156
157
158 private void __jamon_innerUnit__memstoreStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
159 throws java.io.IOException
160 {
161
162 jamonWriter.write("<table class=\"table table-striped\">\n <tr>\n <th>Region Name</th>\n <th>Memstore Size</th>\n </tr>\n\n ");
163
164 for (HRegionInfo r: onlineRegions )
165 {
166
167 jamonWriter.write("\n\n <tr>\n ");
168
169
170 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
171
172
173 jamonWriter.write("<td><a href=\"region.jsp?name=");
174
175 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
176
177 jamonWriter.write("\">\n ");
178
179 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
180
181 jamonWriter.write("</a>\n </td>\n ");
182
183 if (load != null )
184 {
185
186 jamonWriter.write("\n <td>");
187
188 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getMemstoreSizeMB()), jamonWriter);
189
190 jamonWriter.write("m</td>\n ");
191 }
192
193 jamonWriter.write("\n </tr>\n ");
194 }
195
196 jamonWriter.write("\n </table>\n");
197 }
198
199
200
201 private void __jamon_innerUnit__compactStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
202 throws java.io.IOException
203 {
204
205 jamonWriter.write("<table class=\"table table-striped\">\n <tr>\n <th>Region Name</th>\n <th>Num. Compacting KVs</th>\n <th>Num. Compacted KVs</th>\n <th>Compaction Progress</th>\n </tr>\n\n ");
206
207 for (HRegionInfo r: onlineRegions )
208 {
209
210 jamonWriter.write("\n\n <tr>\n ");
211
212
213 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
214 String percentDone = "";
215 if (load != null && load.getTotalCompactingKVs() > 0) {
216 percentDone = String.format("%.2f", 100 *
217 ((float) load.getCurrentCompactedKVs() / load.getTotalCompactingKVs())) + "%";
218 }
219
220
221 jamonWriter.write("<td><a href=\"region.jsp?name=");
222
223 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
224
225 jamonWriter.write("\">\n ");
226
227 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
228
229 jamonWriter.write("</a>\n </td>\n ");
230
231 if (load != null )
232 {
233
234 jamonWriter.write("\n <td>");
235
236 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getTotalCompactingKVs()), jamonWriter);
237
238 jamonWriter.write("</td>\n <td>");
239
240 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getCurrentCompactedKVs()), jamonWriter);
241
242 jamonWriter.write("</td>\n <td>");
243
244 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(percentDone), jamonWriter);
245
246 jamonWriter.write("</td>\n ");
247 }
248
249 jamonWriter.write("\n </tr>\n ");
250 }
251
252 jamonWriter.write("\n </table>\n");
253 }
254
255
256
257 private void __jamon_innerUnit__baseInfo(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
258 throws java.io.IOException
259 {
260
261 jamonWriter.write("<table class=\"table table-striped\">\n <tr>\n <th>Region Name</th>\n <th>Start Key</th>\n <th>End Key</th>\n <th>ReplicaID</th>\n </tr>\n\n ");
262
263 for (HRegionInfo r: onlineRegions )
264 {
265
266 jamonWriter.write("\n <tr>\n <td><a href=\"region.jsp?name=");
267
268 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
269
270 jamonWriter.write("\">\n ");
271
272 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
273
274 jamonWriter.write("</a>\n </td>\n <td>");
275
276 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(Bytes.toStringBinary(r.getStartKey())), jamonWriter);
277
278 jamonWriter.write("</td>\n <td>");
279
280 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(Bytes.toStringBinary(r.getEndKey())), jamonWriter);
281
282 jamonWriter.write("</td>\n <td>");
283
284 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getReplicaId()), jamonWriter);
285
286 jamonWriter.write("</td>\n </tr>\n ");
287 }
288
289 jamonWriter.write("\n </table>\n");
290 }
291
292
293
294 private void __jamon_innerUnit__storeStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
295 throws java.io.IOException
296 {
297
298 jamonWriter.write("<table class=\"table table-striped\">\n <tr>\n <th>Region Name</th>\n <th>Num. Stores</th>\n <th>Num. Storefiles</th>\n <th>Storefile Size Uncompressed</th>\n <th>Storefile Size</th>\n <th>Index Size</th>\n <th>Bloom Size</th>\n <th>Data Locality</th>\n </tr>\n\n ");
299
300 for (HRegionInfo r: onlineRegions )
301 {
302
303 jamonWriter.write("\n\n <tr>\n ");
304
305
306 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
307
308
309 jamonWriter.write("<td><a href=\"region.jsp?name=");
310
311 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
312
313 jamonWriter.write("\">\n ");
314
315 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
316
317 jamonWriter.write("</a>\n </td>\n ");
318
319 if (load != null )
320 {
321
322 jamonWriter.write("\n <td>");
323
324 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStores()), jamonWriter);
325
326 jamonWriter.write("</td>\n <td>");
327
328 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStorefiles()), jamonWriter);
329
330 jamonWriter.write("</td>\n <td>");
331
332 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStoreUncompressedSizeMB()), jamonWriter);
333
334 jamonWriter.write("m</td>\n <td>");
335
336 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStorefileSizeMB()), jamonWriter);
337
338 jamonWriter.write("m</td>\n <td>");
339
340 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getTotalStaticIndexSizeKB()), jamonWriter);
341
342 jamonWriter.write("k</td>\n <td>");
343
344 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getTotalStaticBloomSizeKB()), jamonWriter);
345
346 jamonWriter.write("k</td>\n <td>");
347
348 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getDataLocality()), jamonWriter);
349
350 jamonWriter.write("</td>\n ");
351 }
352
353 jamonWriter.write("\n </tr>\n ");
354 }
355
356 jamonWriter.write("\n </table>\n");
357 }
358
359
360 }