1
2
3
4 package org.apache.hadoop.hbase.tmpl.regionserver;
5
6
7 import java.util.Map;
8
9 import org.apache.hadoop.hbase.io.hfile.BlockCacheUtil.CachedBlocksByFile;
10
11 import org.apache.hadoop.hbase.io.hfile.BlockCacheUtil.AgeSnapshot;
12
13 import org.apache.hadoop.hbase.io.hfile.CachedBlock;
14
15 import org.apache.hadoop.conf.Configuration;
16
17 import org.apache.hadoop.hbase.io.hfile.CacheConfig;
18
19 import org.apache.hadoop.hbase.io.hfile.BlockCache;
20
21 import org.apache.hadoop.hbase.io.hfile.bucket.BucketCacheStats;
22
23 import org.apache.hadoop.hbase.io.hfile.bucket.BucketCache;
24
25 import org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocator;
26
27 import org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocator.Bucket;
28
29 import org.apache.hadoop.hbase.io.hfile.slab.SlabCache;
30
31 import org.apache.hadoop.hbase.io.hfile.slab.SingleSizeCache;
32
33 import org.apache.hadoop.util.StringUtils;
34
35 public class BlockCacheTmplImpl
36 extends org.jamon.AbstractTemplateImpl
37 implements org.apache.hadoop.hbase.tmpl.regionserver.BlockCacheTmpl.Intf
38
39 {
40 private final CacheConfig cacheConfig;
41 private final Configuration config;
42 protected static org.apache.hadoop.hbase.tmpl.regionserver.BlockCacheTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.regionserver.BlockCacheTmpl.ImplData p_implData)
43 {
44 return p_implData;
45 }
46 public BlockCacheTmplImpl(org.jamon.TemplateManager p_templateManager, org.apache.hadoop.hbase.tmpl.regionserver.BlockCacheTmpl.ImplData p_implData)
47 {
48 super(p_templateManager, __jamon_setOptionalArguments(p_implData));
49 cacheConfig = p_implData.getCacheConfig();
50 config = p_implData.getConfig();
51 }
52
53 public void renderNoFlush(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
54 throws java.io.IOException
55 {
56
57
58 BlockCache bc = cacheConfig == null? null: cacheConfig.getBlockCache();
59 String bcUrl = null;
60 String bcName = null;
61 if (bc != null) {
62 bcUrl = "http://hbase.apache.org/devapidocs/" + bc.getClass().getName().replaceAll("\\.", "/") + ".html";
63 bcName = bc.getClass().getSimpleName();
64 }
65 BlockCache [] bcs = cacheConfig == null? null: cacheConfig.getBlockCache() == null? null: cacheConfig.getBlockCache().getBlockCaches();
66
67
68 jamonWriter.write("<div class=\"tabbable\">\n <ul class=\"nav nav-pills\">\n <li class=\"active\"><a href=\"#tab_bc_baseInfo\" data-toggle=\"tab\">Base Info</a></li>\n <li class=\"\"><a href=\"#tab_bc_config\" data-toggle=\"tab\">Config</a></li>\n <li class=\"\"><a href=\"#tab_bc_stats\" data-toggle=\"tab\">Stats</a></li>\n <li class=\"\"><a href=\"#tab_bc_l1\" data-toggle=\"tab\">L1</a></li>\n <li class=\"\"><a href=\"#tab_bc_l2\" data-toggle=\"tab\">L2</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_bc_baseInfo\">\n ");
69
70 {
71
72 __jamon_innerUnit__bc_baseInfo(jamonWriter, cacheConfig, bcUrl, bcName);
73 }
74
75 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_bc_config\">\n ");
76
77 {
78
79 __jamon_innerUnit__bc_config(jamonWriter, cacheConfig );
80 }
81
82 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_bc_stats\">\n ");
83
84 {
85
86 __jamon_innerUnit__bc_stats(jamonWriter, cacheConfig );
87 }
88
89 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_bc_l1\">\n ");
90
91 {
92
93 __jamon_innerUnit__bc_l(jamonWriter, bcs == null? bc: bcs[0], "L1" );
94 }
95
96 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_bc_l2\">\n ");
97
98 {
99
100 __jamon_innerUnit__bc_l(jamonWriter, bcs == null? null: bcs.length <= 1? null: bcs[1], "L2" );
101 }
102
103 jamonWriter.write("\n </div>\n </div>\n</div>\n\n");
104 }
105
106
107
108 private void __jamon_innerUnit__bc_stats(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final CacheConfig cacheConfig)
109 throws java.io.IOException
110 {
111
112 if (cacheConfig == null )
113 {
114
115 jamonWriter.write("\n<p>CacheConfig is null</p>\n");
116 }
117
118 else
119 {
120
121 jamonWriter.write("\n<table class=\"table table-striped\">\n <tr>\n <th>Attribute</th>\n <th>Value</th>\n <th>Description</th>\n </tr>\n <tr>\n <td>Size</td>\n <td>");
122
123 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(cacheConfig.getBlockCache().size())), jamonWriter);
124
125 jamonWriter.write("</td>\n <td>Total size of Block Cache (bytes)</td>\n </tr>\n <tr>\n <td>Free</td>\n <td>");
126
127 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(cacheConfig.getBlockCache().getFreeSize())), jamonWriter);
128
129 jamonWriter.write("</td>\n <td>Free space in Block Cache (bytes)</td>\n </tr>\n <tr>\n <td>Count</td>\n <td>");
130
131 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getBlockCount())), jamonWriter);
132
133 jamonWriter.write("</td>\n <td>Number of blocks in Block Cache</td>\n </tr>\n <tr>\n <td>Evicted</td>\n <td>");
134
135 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getStats().getEvictedCount())), jamonWriter);
136
137 jamonWriter.write("</td>\n <td>Number of blocks evicted</td>\n </tr>\n <tr>\n <td>Evictions</td>\n <td>");
138
139 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getStats().getEvictionCount())), jamonWriter);
140
141 jamonWriter.write("</td>\n <td>Number of times an eviction occurred</td>\n </tr>\n <tr>\n <td>Hits</td>\n <td>");
142
143 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getStats().getHitCount())), jamonWriter);
144
145 jamonWriter.write("</td>\n <td>Number requests that were cache hits</td>\n </tr>\n <tr>\n <td>Hits Caching</td>\n <td>");
146
147 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getStats().getHitCachingCount())), jamonWriter);
148
149 jamonWriter.write("</td>\n <td>Cache hit block requests but only requests set to use Block Cache</td>\n </tr>\n <tr>\n <td>Misses</td>\n <td>");
150
151 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getStats().getMissCount())), jamonWriter);
152
153 jamonWriter.write("</td>\n <td>Number of requests that were cache misses</td>\n </tr>\n <tr>\n <td>Misses Caching</td>\n <td>");
154
155 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getStats().getMissCount())), jamonWriter);
156
157 jamonWriter.write("</td>\n <td>Block requests that were cache misses but only requests set to use Block Cache</td>\n </tr>\n <tr>\n <td>Hit Ratio</td>\n <td>");
158
159 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,.2f", cacheConfig.getBlockCache().getStats().getHitRatio() * 100)), jamonWriter);
160
161 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf("%"), jamonWriter);
162
163 jamonWriter.write("</td>\n <td>Hit Count divided by total requests count</td>\n </tr>\n</table>\n<p>If Block Cache is made up of more than one cache -- i.e. a L1 and a L2 -- then the above\nare combined counts. Request count is sum of hits and misses.</p>\n");
164 }
165
166 jamonWriter.write("\n");
167 }
168
169
170
171 private void __jamon_innerUnit__bc_config(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final CacheConfig cacheConfig)
172 throws java.io.IOException
173 {
174
175 if (cacheConfig == null )
176 {
177
178 jamonWriter.write("\n<p>CacheConfig is null</p>\n");
179 }
180
181 else
182 {
183
184 jamonWriter.write("\n<table class=\"table table-striped\">\n <tr>\n <th>Attribute</th>\n <th>Value</th>\n <th>Description</th>\n </tr>\n <tr>\n <td>Cache DATA on Read</td>\n <td>");
185
186 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldCacheDataOnRead()), jamonWriter);
187
188 jamonWriter.write("</td>\n <td>True if DATA blocks are cached on read\n (INDEX & BLOOM blocks are always cached)</td>\n </tr>\n <tr>\n <td>Cache DATA on Write</td>\n <td>");
189
190 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldCacheDataOnWrite()), jamonWriter);
191
192 jamonWriter.write("</td>\n <td>True if DATA blocks are cached on write.</td>\n </tr>\n <tr>\n <td>Cache INDEX on Write</td>\n <td>");
193
194 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldCacheIndexesOnWrite()), jamonWriter);
195
196 jamonWriter.write("</td>\n <td>True if INDEX blocks are cached on write</td>\n </tr>\n <tr>\n <td>Cache BLOOM on Write</td>\n <td>");
197
198 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldCacheBloomsOnWrite()), jamonWriter);
199
200 jamonWriter.write("</td>\n <td>True if BLOOM blocks are cached on write</td>\n </tr>\n <tr>\n <td>Evict blocks on Close</td>\n <td>");
201
202 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldEvictOnClose()), jamonWriter);
203
204 jamonWriter.write("</td>\n <td>True if blocks are evicted from cache when an HFile\n reader is closed</td>\n </tr>\n <tr>\n <td>Compress blocks</td>\n <td>");
205
206 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldCacheCompressed()), jamonWriter);
207
208 jamonWriter.write("</td>\n <td>True if blocks are compressed in cache</td>\n </tr>\n <tr>\n <td>Prefetch on Open</td>\n <td>");
209
210 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldPrefetchOnOpen()), jamonWriter);
211
212 jamonWriter.write("</td>\n <td>True if blocks are prefetched into cache on open</td>\n </tr>\n</table>\n");
213 }
214
215 jamonWriter.write("\n");
216 }
217
218
219
220 private void __jamon_innerUnit__bc_baseInfo(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final CacheConfig cacheConfig, final String bcUrl, final String bcName)
221 throws java.io.IOException
222 {
223
224
225 BlockCache bc = cacheConfig == null? null: cacheConfig.getBlockCache();
226 BlockCache [] bcs = bc == null? null: bc.getBlockCaches();
227 String bcl1Url = null;
228 String bcl1Name = null;
229 String bcl2Url = null;
230 String bcl2Name = null;
231 if (bcs != null) {
232 BlockCache bcl1 = bcs[0];
233 if (bcl1 != null) {
234 bcl1Url = "http://hbase.apache.org/devapidocs/" + bcl1.getClass().getName().replaceAll("\\.", "/") + ".html";
235 bcl1Name = bcl1.getClass().getSimpleName();
236 }
237 if (bcs.length == 2) {
238 BlockCache bcl2 = bcs[1];
239 bcl2Url = "http://hbase.apache.org/devapidocs/" + bcl2.getClass().getName().replaceAll("\\.", "/") + ".html";
240 bcl2Name = bcl2.getClass().getSimpleName();
241 }
242 }
243
244
245 jamonWriter.write("<table class=\"table table-striped\">\n <tr>\n <th>Attribute</th>\n <th>Value</th>\n <th>Description</th>\n </tr>\n </tr>\n <tr>\n <td>Implementation</td>\n <td><a href=\"");
246
247 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bcUrl), jamonWriter);
248
249 jamonWriter.write("\">");
250
251 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bcName), jamonWriter);
252
253 jamonWriter.write("</a></td>\n <td>Block Cache implementing class</td>\n </tr>\n</table>\n<p>See <a href=\"http://hbase.apache.org/book.html#block.cache\">Block Cache</a> in the HBase Reference Guide for help.</p>\n");
254 }
255
256
257
258 private void __jamon_innerUnit__block_cache(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final BlockCache bc, final String name)
259 throws java.io.IOException
260 {
261
262
263 final long nanosPerSecond = 1000000000;
264 String bcUrl = "http://hbase.apache.org/devapidocs/" + bc.getClass().getName().replaceAll("\\.", "/") + ".html";
265 String bcName = bc.getClass().getSimpleName();
266 org.apache.hadoop.hbase.io.hfile.BlockCacheUtil.CachedBlocksByFile cbsbf =
267 org.apache.hadoop.hbase.io.hfile.BlockCacheUtil.getLoadedCachedBlocksByFile(config, bc);
268 AgeSnapshot snapshot = cbsbf.getAgeSnapshot();
269
270 boolean slabCache = bc.getClass().getSimpleName().equals("SlabCache");
271 Map<Integer, SingleSizeCache> sizer = null;
272
273 boolean bucketCache = bc.getClass().getSimpleName().equals("BucketCache");
274 BucketCacheStats bucketCacheStats = null;
275 BucketAllocator bucketAllocator = null;
276 Bucket [] buckets = null;
277
278 if (slabCache) {
279 sizer = ((SlabCache)bc).getSizer();
280 } else if (bucketCache) {
281 bucketCacheStats = (BucketCacheStats)bc.getStats();
282 bucketAllocator = ((BucketCache)bc).getAllocator();
283 buckets = bucketAllocator.getBuckets();
284 }
285
286
287 if (cbsbf.isFull() )
288 {
289
290 jamonWriter.write("\n<p><b>Too many blocks!</b> Listing out the first ");
291
292 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(snapshot.getMax()), jamonWriter);
293
294 jamonWriter.write(" only (hbase.ui.blockcache.by.file.max)</p> \n");
295 }
296
297 jamonWriter.write("\n<table id=\"blocks_summary\" class=\"table table-striped\">\n <tr>\n <th>Attribute</th>\n <th>Value</th>\n <th>Description</th>\n </tr>\n <tr>\n <td>Implementation</td>\n <td><a href=\"");
298
299 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bcUrl), jamonWriter);
300
301 jamonWriter.write("\">");
302
303 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bc.getClass().getSimpleName()), jamonWriter);
304
305 jamonWriter.write("</a></td>\n <td>Class implementing this Block Cache Level</td>\n </tr>\n");
306
307 if (bucketCache )
308 {
309
310 jamonWriter.write("\n <tr>\n <td>Implementation</td>\n <td>");
311
312 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(((BucketCache)bc).getIoEngine()), jamonWriter);
313
314 jamonWriter.write("</a></td>\n <td>IOEngine</td>\n </tr>\n");
315 }
316
317 jamonWriter.write("\n <tr>\n <td>Count</td>\n <td>");
318
319 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cbsbf.getCount())), jamonWriter);
320
321 jamonWriter.write("</td>\n <td>Count of Blocks</td>\n </tr>\n");
322
323 if (!bucketCache )
324 {
325
326 jamonWriter.write("\n <tr>\n <td>Count</td>\n <td>");
327
328 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cbsbf.getDataCount())), jamonWriter);
329
330 jamonWriter.write("</td>\n <td>Count of DATA Blocks</td>\n </tr>\n");
331 }
332
333 jamonWriter.write("\n <tr>\n <td>Size</td>\n <td>");
334
335 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(cbsbf.getSize())), jamonWriter);
336
337 jamonWriter.write("</td>\n <td>Size of Blocks</td>\n </tr>\n");
338
339 if (!bucketCache )
340 {
341
342 jamonWriter.write("\n <tr>\n <td>Size</td>\n <td>");
343
344 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(cbsbf.getDataSize())), jamonWriter);
345
346 jamonWriter.write("</td>\n <td>Size of DATA Blocks</td>\n </tr>\n");
347 }
348
349 jamonWriter.write("\n");
350
351 if (!slabCache )
352 {
353
354 jamonWriter.write("\n <tr>\n <td>Mean</td>\n <td>");
355
356 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", (long)(snapshot.getMean()/nanosPerSecond))), jamonWriter);
357
358 jamonWriter.write("</td>\n <td>Mean age of Blocks in cache (seconds)</td>\n </tr>\n <tr>\n <td>StdDev</td>\n <td>");
359
360 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", (long)(snapshot.getStdDev()/nanosPerSecond))), jamonWriter);
361
362 jamonWriter.write("</td>\n <td>Age standard deviation of Blocks in cache</td>\n </tr>\n <tr>\n <td>Min</td>\n <td>");
363
364 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", (long)(snapshot.getMin()/nanosPerSecond))), jamonWriter);
365
366 jamonWriter.write("</td>\n <td>Min age of Blocks in cache (seconds)</td>\n </tr>\n <tr>\n <td>Max</td>\n <td>");
367
368 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", (long)(snapshot.getMax()/nanosPerSecond))), jamonWriter);
369
370 jamonWriter.write("</td>\n <td>Max age of Blocks in cache (seconds)</td>\n </tr>\n <tr>\n <td>95th Percentile</td>\n <td>");
371
372 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", (long)(snapshot.get95thPercentile()/nanosPerSecond))), jamonWriter);
373
374 jamonWriter.write("</td>\n <td>95th percentile of age of Blocks in cache (seconds)</td>\n </tr>\n <tr>\n <td>99th Percentile</td>\n <td>");
375
376 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", (long)(snapshot.get99thPercentile()/nanosPerSecond))), jamonWriter);
377
378 jamonWriter.write("</td>\n <td>99th percentile of age of Blocks in cache (seconds)</td>\n </tr>\n");
379 }
380
381 jamonWriter.write("\n");
382
383 if (bucketCache )
384 {
385
386 jamonWriter.write("\n <tr>\n <td>Hits per Second</td>\n <td>");
387
388 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucketCacheStats.getIOHitsPerSecond()), jamonWriter);
389
390 jamonWriter.write("</td>\n <td>Block gets against this cache per second</td>\n </tr>\n <tr>\n <td>Time per Hit</td>\n <td>");
391
392 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucketCacheStats.getIOTimePerHit()), jamonWriter);
393
394 jamonWriter.write("</td>\n <td>Time per cache hit</td>\n </tr>\n");
395 }
396
397 jamonWriter.write("\n</table>\n<p>View Block Cache <a href=\"?format=json&bcn=");
398
399 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(name), jamonWriter);
400
401 jamonWriter.write("\">as JSON</a> | Block Cache <a href=\"?format=json&bcn=");
402
403 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(name), jamonWriter);
404
405 jamonWriter.write("&bcv=file\">as JSON by file</a></p>\n");
406
407 if (bucketCache )
408 {
409
410 jamonWriter.write("\n<p>BucketCache does not discern between DATA and META blocks so we do not show DATA counts (If deploy is using CombinedBlockCache, BucketCache is only DATA blocks</p>\n<h3>BucketCache Buckets</h3>\n<table class=\"table table-striped\">\n <tr>\n <th>Bucket Offset</th>\n <th>Allocation Size</th>\n <th>Free Count</th>\n <th>Used Count</th>\n </tr>\n");
411
412 for (Bucket bucket: buckets )
413 {
414
415 jamonWriter.write("\n <tr>\n <td>");
416
417 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucket.getBaseOffset()), jamonWriter);
418
419 jamonWriter.write("</td>\n <td>");
420
421 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucket.getItemAllocationSize()), jamonWriter);
422
423 jamonWriter.write("</td>\n <td>");
424
425 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucket.getFreeBytes()), jamonWriter);
426
427 jamonWriter.write("</td>\n <td>");
428
429 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucket.getUsedBytes()), jamonWriter);
430
431 jamonWriter.write("</td>\n </tr>\n");
432 }
433
434 jamonWriter.write("\n</table>\n");
435 }
436
437 else if (slabCache )
438 {
439
440 jamonWriter.write("\n<p>SlabCache does not keep account of block ages so can not show stats on how long blocks have been cached.</p>\n<h3>SlabCache Slabs</h3>\n<table class=\"table table-striped\">\n <tr>\n <th>Block Size</th>\n <th>Size</th>\n <th>Free Size</th>\n <th>Count</th>\n <th>Evicted</th>\n <th>Evictions</th>\n <th>Hits</th>\n <th>Caching</th>\n <th>Misses</th>\n <th>Caching</th>\n <th>Hit Ratio</th>\n </tr>\n");
441
442 for (Map.Entry<Integer, SingleSizeCache> e: sizer.entrySet() )
443 {
444
445 jamonWriter.write("\n <tr>\n <td>");
446
447 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(e.getKey())), jamonWriter);
448
449 jamonWriter.write("</td>\n <td>");
450
451 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(e.getValue().size())), jamonWriter);
452
453 jamonWriter.write("</td>\n <td>");
454
455 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(e.getValue().getFreeSize())), jamonWriter);
456
457 jamonWriter.write("</td>\n <td>");
458
459 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(e.getValue().getBlockCount())), jamonWriter);
460
461 jamonWriter.write("</td>\n <td>");
462
463 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(e.getValue().getStats().getEvictedCount())), jamonWriter);
464
465 jamonWriter.write("</td>\n <td>");
466
467 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(e.getValue().getStats().getEvictionCount())), jamonWriter);
468
469 jamonWriter.write("</td>\n <td>");
470
471 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(e.getValue().getStats().getHitCount())), jamonWriter);
472
473 jamonWriter.write("</td>\n <td>");
474
475 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(e.getValue().getStats().getHitCachingCount())), jamonWriter);
476
477 jamonWriter.write("</td>\n <td>");
478
479 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(e.getValue().getStats().getMissCount())), jamonWriter);
480
481 jamonWriter.write("</td>\n <td>");
482
483 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(e.getValue().getStats().getMissCachingCount())), jamonWriter);
484
485 jamonWriter.write("</td>\n <td>");
486
487 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,.2f", e.getValue().getStats().getHitRatio() * 100)), jamonWriter);
488
489 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf("%"), jamonWriter);
490
491 jamonWriter.write("</td>\n </tr>\n");
492 }
493
494 jamonWriter.write("\n</table>\n");
495 }
496
497 jamonWriter.write("\n");
498
499
500 cbsbf = null;
501
502 }
503
504
505
506 private void __jamon_innerUnit__bc_l(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final BlockCache bc, final String name)
507 throws java.io.IOException
508 {
509
510 if (bc == null )
511 {
512
513 jamonWriter.write("\n<p>No ");
514
515 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(name), jamonWriter);
516
517 jamonWriter.write(" deployed</p>\n");
518 }
519
520 else
521 {
522
523 jamonWriter.write("\n");
524
525 {
526
527 __jamon_innerUnit__block_cache(jamonWriter, bc, name);
528 }
529
530 jamonWriter.write("\n");
531 }
532
533 jamonWriter.write("\n");
534 }
535
536
537 }