1
2
3
4 package org.apache.hadoop.hbase.tmpl.regionserver;
5
6
7 import java.util.*;
8
9 import org.apache.commons.lang.time.FastDateFormat;
10
11 import org.apache.hadoop.hbase.regionserver.HRegionServer;
12
13 import org.apache.hadoop.hbase.util.Bytes;
14
15 import org.apache.hadoop.hbase.HRegionInfo;
16
17 import org.apache.hadoop.hbase.regionserver.Region;
18
19 import org.apache.hadoop.hbase.ServerName;
20
21 import org.apache.hadoop.hbase.HBaseConfiguration;
22
23 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
24
25 import org.apache.hadoop.hbase.protobuf.generated.AdminProtos.ServerInfo;
26
27 import org.apache.hadoop.hbase.protobuf.generated.ClusterStatusProtos.RegionLoad;
28
29 import org.apache.hadoop.hbase.client.RegionReplicaUtil;
30
31 import org.apache.hadoop.hbase.regionserver.MetricsRegionWrapper;
32
33 import org.apache.hadoop.util.StringUtils.TraditionalBinaryPrefix;
34
35 public class RegionListTmplImpl
36 extends org.jamon.AbstractTemplateImpl
37 implements org.apache.hadoop.hbase.tmpl.regionserver.RegionListTmpl.Intf
38
39 {
40 private final HRegionServer regionServer;
41 private final List<HRegionInfo> onlineRegions;
42 protected static org.apache.hadoop.hbase.tmpl.regionserver.RegionListTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.regionserver.RegionListTmpl.ImplData p_implData)
43 {
44 return p_implData;
45 }
46 public RegionListTmplImpl(org.jamon.TemplateManager p_templateManager, org.apache.hadoop.hbase.tmpl.regionserver.RegionListTmpl.ImplData p_implData)
47 {
48 super(p_templateManager, __jamon_setOptionalArguments(p_implData));
49 regionServer = p_implData.getRegionServer();
50 onlineRegions = p_implData.getOnlineRegions();
51 }
52
53 @Override public void renderNoFlush(final java.io.Writer jamonWriter)
54 throws java.io.IOException
55 {
56
57 if ((onlineRegions != null && onlineRegions.size() > 0) )
58 {
59
60 jamonWriter.write("\n\n ");
61
62
63 Collections.sort(onlineRegions);
64
65
66 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 ");
67
68 {
69
70 __jamon_innerUnit__baseInfo(jamonWriter, onlineRegions);
71 }
72
73 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_regionRequestStats\">\n ");
74
75 {
76
77 __jamon_innerUnit__requestStats(jamonWriter, onlineRegions);
78 }
79
80 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_regionStoreStats\">\n ");
81
82 {
83
84 __jamon_innerUnit__storeStats(jamonWriter, onlineRegions);
85 }
86
87 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_regionMemstoreStats\">\n ");
88
89 {
90
91 __jamon_innerUnit__memstoreStats(jamonWriter, onlineRegions);
92 }
93
94 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_regionCompactStats\">\n ");
95
96 {
97
98 __jamon_innerUnit__compactStats(jamonWriter, onlineRegions);
99 }
100
101 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");
102 }
103
104 else
105 {
106
107 jamonWriter.write("\n <p>Not serving regions</p>\n");
108 }
109
110 jamonWriter.write("\n\n");
111 }
112
113
114
115 private void __jamon_innerUnit__requestStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
116 throws java.io.IOException
117 {
118
119 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 ");
120
121 for (HRegionInfo r: onlineRegions )
122 {
123
124 jamonWriter.write("\n\n <tr>\n ");
125
126
127 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
128
129
130 jamonWriter.write("<td><a href=\"region.jsp?name=");
131
132 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
133
134 jamonWriter.write("\">\n ");
135
136 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
137
138 jamonWriter.write("</a>\n </td>\n ");
139
140 if (load != null )
141 {
142
143 jamonWriter.write("\n <td>");
144
145 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getReadRequestsCount()), jamonWriter);
146
147 jamonWriter.write("</td>\n <td>");
148
149 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getWriteRequestsCount()), jamonWriter);
150
151 jamonWriter.write("</td>\n ");
152 }
153
154 jamonWriter.write("\n </tr>\n ");
155 }
156
157 jamonWriter.write("\n </table>\n");
158 }
159
160
161
162 private void __jamon_innerUnit__memstoreStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
163 throws java.io.IOException
164 {
165
166 jamonWriter.write("<table class=\"table table-striped\">\n <tr>\n <th>Region Name</th>\n <th>Memstore Size</th>\n </tr>\n\n ");
167
168 for (HRegionInfo r: onlineRegions )
169 {
170
171 jamonWriter.write("\n\n <tr>\n ");
172
173
174 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
175
176
177 jamonWriter.write("<td><a href=\"region.jsp?name=");
178
179 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
180
181 jamonWriter.write("\">\n ");
182
183 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
184
185 jamonWriter.write("</a>\n </td>\n ");
186
187 if (load != null )
188 {
189
190 jamonWriter.write("\n <td>");
191
192 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(
193 load.getMemstoreSizeMB() * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
194
195 jamonWriter.write("</td>\n ");
196 }
197
198 jamonWriter.write("\n </tr>\n ");
199 }
200
201 jamonWriter.write("\n </table>\n");
202 }
203
204
205
206 private void __jamon_innerUnit__compactStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
207 throws java.io.IOException
208 {
209
210 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 <th>Last Major Compaction</th>\n </tr>\n\n ");
211
212 for (HRegionInfo r: onlineRegions )
213 {
214
215 jamonWriter.write("\n\n <tr>\n ");
216
217
218 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
219 String percentDone = "";
220 String compactTime = "";
221 if (load != null) {
222 if (load.getTotalCompactingKVs() > 0) {
223 percentDone = String.format("%.2f", 100 *
224 ((float) load.getCurrentCompactedKVs() / load.getTotalCompactingKVs())) + "%";
225 }
226 if (load.getLastMajorCompactionTs() > 0) {
227 FastDateFormat fdf = FastDateFormat.getInstance("yyyy-MM-dd HH:mm ZZ");
228 compactTime = fdf.format(load.getLastMajorCompactionTs());
229 }
230 }
231
232
233 jamonWriter.write("<td><a href=\"region.jsp?name=");
234
235 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
236
237 jamonWriter.write("\">\n ");
238
239 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
240
241 jamonWriter.write("</a>\n </td>\n ");
242
243 if (load != null )
244 {
245
246 jamonWriter.write("\n <td>");
247
248 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getTotalCompactingKVs()), jamonWriter);
249
250 jamonWriter.write("</td>\n <td>");
251
252 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getCurrentCompactedKVs()), jamonWriter);
253
254 jamonWriter.write("</td>\n <td>");
255
256 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(percentDone), jamonWriter);
257
258 jamonWriter.write("</td>\n <td>");
259
260 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(compactTime), jamonWriter);
261
262 jamonWriter.write("</td>\n ");
263 }
264
265 jamonWriter.write("\n </tr>\n ");
266 }
267
268 jamonWriter.write("\n </table>\n");
269 }
270
271
272
273 private void __jamon_innerUnit__baseInfo(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
274 throws java.io.IOException
275 {
276
277 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 ");
278
279 for (HRegionInfo r: onlineRegions )
280 {
281
282 jamonWriter.write("\n <tr>\n <td><a href=\"region.jsp?name=");
283
284 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
285
286 jamonWriter.write("\">\n ");
287
288 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
289
290 jamonWriter.write("</a>\n </td>\n <td>");
291
292 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(Bytes.toStringBinary(r.getStartKey())), jamonWriter);
293
294 jamonWriter.write("</td>\n <td>");
295
296 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(Bytes.toStringBinary(r.getEndKey())), jamonWriter);
297
298 jamonWriter.write("</td>\n <td>");
299
300 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getReplicaId()), jamonWriter);
301
302 jamonWriter.write("</td>\n </tr>\n ");
303 }
304
305 jamonWriter.write("\n </table>\n");
306 }
307
308
309
310 private void __jamon_innerUnit__storeStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
311 throws java.io.IOException
312 {
313
314 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 ");
315
316 for (HRegionInfo r: onlineRegions )
317 {
318
319 jamonWriter.write("\n\n <tr>\n ");
320
321
322 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
323
324
325 jamonWriter.write("<td><a href=\"region.jsp?name=");
326
327 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
328
329 jamonWriter.write("\">\n ");
330
331 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
332
333 jamonWriter.write("</a>\n </td>\n ");
334
335 if (load != null )
336 {
337
338 jamonWriter.write("\n <td>");
339
340 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStores()), jamonWriter);
341
342 jamonWriter.write("</td>\n <td>");
343
344 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStorefiles()), jamonWriter);
345
346 jamonWriter.write("</td>\n <td>");
347
348 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(load.getStoreUncompressedSizeMB()
349 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
350
351 jamonWriter.write("</td>\n <td>");
352
353 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(load.getStorefileSizeMB()
354 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
355
356 jamonWriter.write("</td>\n <td>");
357
358 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(load.getTotalStaticIndexSizeKB()
359 * TraditionalBinaryPrefix.KILO.value, "B", 1)), jamonWriter);
360
361 jamonWriter.write("</td>\n <td>");
362
363 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(load.getTotalStaticBloomSizeKB()
364 * TraditionalBinaryPrefix.KILO.value, "B", 1)), jamonWriter);
365
366 jamonWriter.write("</td>\n <td>");
367
368 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getDataLocality()), jamonWriter);
369
370 jamonWriter.write("</td>\n ");
371 }
372
373 jamonWriter.write("\n </tr>\n ");
374 }
375
376 jamonWriter.write("\n </table>\n");
377 }
378
379
380 }