1
2
3
4 package org.apache.hadoop.hbase.tmpl.regionserver;
5
6
7 import java.util.*;
8
9 import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
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.HRegion;
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.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 public void renderNoFlush(@SuppressWarnings({"unused","hiding"}) 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 <li class=\"\"><a href=\"#tab_coprocessorStats\" data-toggle=\"tab\">Coprocessor 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 class=\"tab-pane\" id=\"tab_coprocessorStats\">\n ");
98
99 {
100
101 __jamon_innerUnit__coprocessorStats(jamonWriter, onlineRegions);
102 }
103
104 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 'catalog' tables 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 region has both an empty start and an empty end key, its the only region in the table. See\n <a href=\"http://hbase.org\">HBase Home</a> for further explication.<p>\n");
105 }
106
107 else
108 {
109
110 jamonWriter.write("\n <p>Not serving regions</p>\n");
111 }
112
113 jamonWriter.write("\n\n");
114 }
115
116
117
118 private void __jamon_innerUnit__requestStats(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
119 throws java.io.IOException
120 {
121
122 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 ");
123
124 for (HRegionInfo r: onlineRegions )
125 {
126
127 jamonWriter.write("\n\n <tr>\n ");
128
129
130 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
131
132
133 jamonWriter.write("<td>");
134
135 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
136
137 jamonWriter.write("</td>\n ");
138
139 if (load != null )
140 {
141
142 jamonWriter.write("\n <td>");
143
144 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getReadRequestsCount()), jamonWriter);
145
146 jamonWriter.write("</td>\n <td>");
147
148 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getWriteRequestsCount()), jamonWriter);
149
150 jamonWriter.write("</td>\n ");
151 }
152
153 jamonWriter.write("\n </tr>\n ");
154 }
155
156 jamonWriter.write("\n </table>\n");
157 }
158
159
160
161 private void __jamon_innerUnit__memstoreStats(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
162 throws java.io.IOException
163 {
164
165 jamonWriter.write("<table class=\"table table-striped\">\n <tr>\n <th>Region Name</th>\n <th>Memstore Size</th>\n </tr>\n\n ");
166
167 for (HRegionInfo r: onlineRegions )
168 {
169
170 jamonWriter.write("\n\n <tr>\n ");
171
172
173 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
174
175
176 jamonWriter.write("<td>");
177
178 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
179
180 jamonWriter.write("</td>\n ");
181
182 if (load != null )
183 {
184
185 jamonWriter.write("\n <td>");
186
187 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getMemstoreSizeMB()), jamonWriter);
188
189 jamonWriter.write("m</td>\n ");
190 }
191
192 jamonWriter.write("\n </tr>\n ");
193 }
194
195 jamonWriter.write("\n </table>\n");
196 }
197
198
199
200 private void __jamon_innerUnit__compactStats(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
201 throws java.io.IOException
202 {
203
204 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 ");
205
206 for (HRegionInfo r: onlineRegions )
207 {
208
209 jamonWriter.write("\n\n <tr>\n ");
210
211
212 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
213 String percentDone = "";
214 if (load != null && load.getTotalCompactingKVs() > 0) {
215 percentDone = String.format("%.2f", 100 *
216 ((float) load.getCurrentCompactedKVs() / load.getTotalCompactingKVs())) + "%";
217 }
218
219
220 jamonWriter.write("<td>");
221
222 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
223
224 jamonWriter.write("</td>\n ");
225
226 if (load != null )
227 {
228
229 jamonWriter.write("\n <td>");
230
231 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getTotalCompactingKVs()), jamonWriter);
232
233 jamonWriter.write("</td>\n <td>");
234
235 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getCurrentCompactedKVs()), jamonWriter);
236
237 jamonWriter.write("</td>\n <td>");
238
239 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(percentDone), jamonWriter);
240
241 jamonWriter.write("</td>\n ");
242 }
243
244 jamonWriter.write("\n </tr>\n ");
245 }
246
247 jamonWriter.write("\n </table>\n");
248 }
249
250
251
252 private void __jamon_innerUnit__baseInfo(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
253 throws java.io.IOException
254 {
255
256 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 </tr>\n\n ");
257
258 for (HRegionInfo r: onlineRegions )
259 {
260
261 jamonWriter.write("\n <tr>\n <td>");
262
263 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
264
265 jamonWriter.write("</td>\n <td>");
266
267 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(Bytes.toStringBinary(r.getStartKey())), jamonWriter);
268
269 jamonWriter.write("</td>\n <td>");
270
271 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(Bytes.toStringBinary(r.getEndKey())), jamonWriter);
272
273 jamonWriter.write("</td>\n </tr>\n ");
274 }
275
276 jamonWriter.write("\n </table>\n");
277 }
278
279
280
281 private void __jamon_innerUnit__storeStats(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
282 throws java.io.IOException
283 {
284
285 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 ");
286
287 for (HRegionInfo r: onlineRegions )
288 {
289
290 jamonWriter.write("\n\n <tr>\n ");
291
292
293 RegionLoad load = regionServer.createRegionLoad(r.getEncodedName());
294
295
296 jamonWriter.write("<td>");
297
298 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
299
300 jamonWriter.write("</td>\n ");
301
302 if (load != null )
303 {
304
305 jamonWriter.write("\n <td>");
306
307 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStores()), jamonWriter);
308
309 jamonWriter.write("</td>\n <td>");
310
311 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStorefiles()), jamonWriter);
312
313 jamonWriter.write("</td>\n <td>");
314
315 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStoreUncompressedSizeMB()), jamonWriter);
316
317 jamonWriter.write("m</td>\n <td>");
318
319 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getStorefileSizeMB()), jamonWriter);
320
321 jamonWriter.write("m</td>\n <td>");
322
323 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getTotalStaticIndexSizeKB()), jamonWriter);
324
325 jamonWriter.write("k</td>\n <td>");
326
327 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getTotalStaticBloomSizeKB()), jamonWriter);
328
329 jamonWriter.write("k</td>\n <td>");
330
331 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(load.getDataLocality()), jamonWriter);
332
333 jamonWriter.write("</td>\n ");
334 }
335
336 jamonWriter.write("\n </tr>\n ");
337 }
338
339 jamonWriter.write("\n </table>\n");
340 }
341
342
343
344 private void __jamon_innerUnit__coprocessorStats(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final List<HRegionInfo> onlineRegions)
345 throws java.io.IOException
346 {
347
348 jamonWriter.write("<table class=\"table table-striped\">\n <tr>\n <th>Region Name</th>\n <th>Coprocessor</th>\n <th>Execution Time Statistics</th>\n </tr>\n\n ");
349
350 for (HRegionInfo r: onlineRegions )
351 {
352
353 jamonWriter.write("\n ");
354
355
356 HRegion region = regionServer.getFromOnlineRegions(r.getEncodedName());
357 MetricsRegionWrapper mWrap = region == null ? null: region.getMetrics().getRegionWrapper();
358
359
360 if (mWrap != null )
361 {
362
363 jamonWriter.write("\n\n ");
364
365 for (Map.Entry<String, DescriptiveStatistics> entry: mWrap.getCoprocessorExecutionStatistics().entrySet() )
366 {
367
368 jamonWriter.write("\n <tr>\n ");
369
370
371 String coprocessorName = entry.getKey();
372 DescriptiveStatistics ds = entry.getValue();
373
374
375 jamonWriter.write("<td>");
376
377 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(r.getRegionNameAsString()), jamonWriter);
378
379 jamonWriter.write("</td>\n <td>");
380
381 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(coprocessorName), jamonWriter);
382
383 jamonWriter.write("</td>\n <td>\n <table class=\"table-condensed\">\n <tr>\n <td>Min Time </td>\n <td>");
384
385 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%.3f%n", ds.getMin()/1000/1000)), jamonWriter);
386
387 jamonWriter.write("ms</td>\n </tr>\n <tr>\n <td>Avg Time </td>\n <td>");
388
389 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%.3f%n", ds.getMean()/1000/1000)), jamonWriter);
390
391 jamonWriter.write("ms</td>\n </tr>\n <tr>\n <td>Max Time </td>\n <td>");
392
393 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%.3f%n", ds.getMax()/1000/1000)), jamonWriter);
394
395 jamonWriter.write("ms</td>\n </tr>\n <tr>\n <td>90th percentile </td>\n <td>");
396
397 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%.3f%n", ds.getPercentile(90d)/1000/1000)), jamonWriter);
398
399 jamonWriter.write("ms</td>\n </tr>\n <tr>\n <td>95th percentile </td>\n <td>");
400
401 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%.3f%n", ds.getPercentile(95d)/1000/1000)), jamonWriter);
402
403 jamonWriter.write("ms</td>\n </tr>\n <tr>\n <td>99th percentile </td>\n <td>");
404
405 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%.3f%n", ds.getPercentile(99d)/1000/1000)), jamonWriter);
406
407 jamonWriter.write("ms</td>\n </tr>\n </table>\n </td>\n </tr>\n ");
408 }
409
410 jamonWriter.write("\n ");
411 }
412
413 jamonWriter.write("\n ");
414 }
415
416 jamonWriter.write("\n </table>\n");
417 }
418
419
420 }