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__baseInfo(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>Start Key</th>\n <th>End Key</th>\n <th>ReplicaID</th>\n </tr>\n\n ");
118
119 for (HRegionInfo r: onlineRegions )
120 {
121
122 jamonWriter.write("\n <tr>\n <td><a href=\"region.jsp?name=");
123
124 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
125
126 jamonWriter.write("\">\n ");
127
128 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
129
130 jamonWriter.write("</a>\n </td>\n <td>");
131
132 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(Bytes.toStringBinary(r.getStartKey())), jamonWriter);
133
134 jamonWriter.write("</td>\n <td>");
135
136 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(Bytes.toStringBinary(r.getEndKey())), jamonWriter);
137
138 jamonWriter.write("</td>\n <td>");
139
140 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getReplicaId()), jamonWriter);
141
142 jamonWriter.write("</td>\n </tr>\n ");
143 }
144
145 jamonWriter.write("\n </table>\n");
146 }
147
148
149
150 private void __jamon_innerUnit__storeStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
151 throws java.io.IOException
152 {
153
154 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 ");
155
156 for (HRegionInfo r: onlineRegions )
157 {
158
159 jamonWriter.write("\n\n <tr>\n ");
160
161
162 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
163
164
165 jamonWriter.write("<td><a href=\"region.jsp?name=");
166
167 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
168
169 jamonWriter.write("\">\n ");
170
171 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
172
173 jamonWriter.write("</a>\n </td>\n ");
174
175 if (load != null )
176 {
177
178 jamonWriter.write("\n <td>");
179
180 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStores()), jamonWriter);
181
182 jamonWriter.write("</td>\n <td>");
183
184 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStorefiles()), jamonWriter);
185
186 jamonWriter.write("</td>\n <td>");
187
188 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(load.getStoreUncompressedSizeMB()
189 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
190
191 jamonWriter.write("</td>\n <td>");
192
193 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(load.getStorefileSizeMB()
194 * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
195
196 jamonWriter.write("</td>\n <td>");
197
198 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(load.getTotalStaticIndexSizeKB()
199 * TraditionalBinaryPrefix.KILO.value, "B", 1)), jamonWriter);
200
201 jamonWriter.write("</td>\n <td>");
202
203 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(load.getTotalStaticBloomSizeKB()
204 * TraditionalBinaryPrefix.KILO.value, "B", 1)), jamonWriter);
205
206 jamonWriter.write("</td>\n <td>");
207
208 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getDataLocality()), jamonWriter);
209
210 jamonWriter.write("</td>\n ");
211 }
212
213 jamonWriter.write("\n </tr>\n ");
214 }
215
216 jamonWriter.write("\n </table>\n");
217 }
218
219
220
221 private void __jamon_innerUnit__requestStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
222 throws java.io.IOException
223 {
224
225 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 ");
226
227 for (HRegionInfo r: onlineRegions )
228 {
229
230 jamonWriter.write("\n\n <tr>\n ");
231
232
233 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
234
235
236 jamonWriter.write("<td><a href=\"region.jsp?name=");
237
238 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
239
240 jamonWriter.write("\">\n ");
241
242 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
243
244 jamonWriter.write("</a>\n </td>\n ");
245
246 if (load != null )
247 {
248
249 jamonWriter.write("\n <td>");
250
251 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getReadRequestsCount()), jamonWriter);
252
253 jamonWriter.write("</td>\n <td>");
254
255 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getWriteRequestsCount()), jamonWriter);
256
257 jamonWriter.write("</td>\n ");
258 }
259
260 jamonWriter.write("\n </tr>\n ");
261 }
262
263 jamonWriter.write("\n </table>\n");
264 }
265
266
267
268 private void __jamon_innerUnit__memstoreStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
269 throws java.io.IOException
270 {
271
272 jamonWriter.write("<table class=\"table table-striped\">\n <tr>\n <th>Region Name</th>\n <th>Memstore Size</th>\n </tr>\n\n ");
273
274 for (HRegionInfo r: onlineRegions )
275 {
276
277 jamonWriter.write("\n\n <tr>\n ");
278
279
280 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
281
282
283 jamonWriter.write("<td><a href=\"region.jsp?name=");
284
285 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
286
287 jamonWriter.write("\">\n ");
288
289 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
290
291 jamonWriter.write("</a>\n </td>\n ");
292
293 if (load != null )
294 {
295
296 jamonWriter.write("\n <td>");
297
298 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(TraditionalBinaryPrefix.long2String(
299 load.getMemstoreSizeMB() * TraditionalBinaryPrefix.MEGA.value, "B", 1)), jamonWriter);
300
301 jamonWriter.write("</td>\n ");
302 }
303
304 jamonWriter.write("\n </tr>\n ");
305 }
306
307 jamonWriter.write("\n </table>\n");
308 }
309
310
311
312 private void __jamon_innerUnit__compactStats(final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
313 throws java.io.IOException
314 {
315
316 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 ");
317
318 for (HRegionInfo r: onlineRegions )
319 {
320
321 jamonWriter.write("\n\n <tr>\n ");
322
323
324 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
325 String percentDone = "";
326 if (load != null && load.getTotalCompactingKVs() > 0) {
327 percentDone = String.format("%.2f", 100 *
328 ((float) load.getCurrentCompactedKVs() / load.getTotalCompactingKVs())) + "%";
329 }
330
331
332 jamonWriter.write("<td><a href=\"region.jsp?name=");
333
334 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getEncodedName()), jamonWriter);
335
336 jamonWriter.write("\">\n ");
337
338 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
339
340 jamonWriter.write("</a>\n </td>\n ");
341
342 if (load != null )
343 {
344
345 jamonWriter.write("\n <td>");
346
347 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getTotalCompactingKVs()), jamonWriter);
348
349 jamonWriter.write("</td>\n <td>");
350
351 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getCurrentCompactedKVs()), jamonWriter);
352
353 jamonWriter.write("</td>\n <td>");
354
355 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(percentDone), 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 }