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