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