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.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.util.StringUtils;
30
31 public class BlockCacheTmplImpl
32 extends org.jamon.AbstractTemplateImpl
33 implements org.apache.hadoop.hbase.tmpl.regionserver.BlockCacheTmpl.Intf
34
35 {
36 private final CacheConfig cacheConfig;
37 private final Configuration config;
38 protected static org.apache.hadoop.hbase.tmpl.regionserver.BlockCacheTmpl.ImplData __jamon_setOptionalArguments(org.apache.hadoop.hbase.tmpl.regionserver.BlockCacheTmpl.ImplData p_implData)
39 {
40 return p_implData;
41 }
42 public BlockCacheTmplImpl(org.jamon.TemplateManager p_templateManager, org.apache.hadoop.hbase.tmpl.regionserver.BlockCacheTmpl.ImplData p_implData)
43 {
44 super(p_templateManager, __jamon_setOptionalArguments(p_implData));
45 cacheConfig = p_implData.getCacheConfig();
46 config = p_implData.getConfig();
47 }
48
49 public void renderNoFlush(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter)
50 throws java.io.IOException
51 {
52
53
54 BlockCache bc = cacheConfig == null? null: cacheConfig.getBlockCache();
55 String bcUrl = null;
56 String bcName = null;
57 if (bc != null) {
58 bcUrl = "http://hbase.apache.org/devapidocs/" + bc.getClass().getName().replaceAll("\\.", "/") + ".html";
59 bcName = bc.getClass().getSimpleName();
60 }
61 BlockCache [] bcs = cacheConfig == null? null: cacheConfig.getBlockCache() == null? null: cacheConfig.getBlockCache().getBlockCaches();
62
63 boolean evictions = bcs != null && bcs.length > 1;
64
65
66 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 ");
67
68 {
69
70 __jamon_innerUnit__bc_baseInfo(jamonWriter, cacheConfig, bcUrl, bcName);
71 }
72
73 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_bc_config\">\n ");
74
75 {
76
77 __jamon_innerUnit__bc_config(jamonWriter, cacheConfig );
78 }
79
80 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_bc_stats\">\n ");
81
82 {
83
84 __jamon_innerUnit__bc_stats(jamonWriter, cacheConfig );
85 }
86
87 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_bc_l1\">\n ");
88
89 {
90
91 __jamon_innerUnit__bc_l(jamonWriter, bcs == null? bc: bcs[0], "L1", evictions);
92 }
93
94 jamonWriter.write("\n </div>\n <div class=\"tab-pane\" id=\"tab_bc_l2\">\n ");
95
96 {
97
98 __jamon_innerUnit__bc_l(jamonWriter, bcs == null? null: bcs.length <= 1? null: bcs[1], "L2", evictions);
99 }
100
101 jamonWriter.write("\n </div>\n </div>\n</div>\n\n");
102 }
103
104
105
106 private void __jamon_innerUnit__bc_stats(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final CacheConfig cacheConfig)
107 throws java.io.IOException
108 {
109
110 if (cacheConfig == null || cacheConfig.getBlockCache() == null )
111 {
112
113 jamonWriter.write("\n<p>CacheConfig is null</p>\n");
114 }
115
116 else
117 {
118
119 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>");
120
121 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(cacheConfig.getBlockCache().getCurrentSize())), jamonWriter);
122
123 jamonWriter.write("</td>\n <td>Current size of block cache in use (bytes)</td>\n </tr>\n <tr>\n <td>Free</td>\n <td>");
124
125 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(cacheConfig.getBlockCache().getFreeSize())), jamonWriter);
126
127 jamonWriter.write("</td>\n <td>The total free memory currently available to store more cache entries (bytes)</td>\n </tr>\n <tr>\n <td>Count</td>\n <td>");
128
129 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getBlockCount())), jamonWriter);
130
131 jamonWriter.write("</td>\n <td>Number of blocks in block cache</td>\n </tr>\n ");
132
133 {
134
135 __jamon_innerUnit__evictions_tmpl(jamonWriter, cacheConfig.getBlockCache());
136 }
137
138 jamonWriter.write("\n <tr>\n <td>Hits</td>\n <td>");
139
140 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getStats().getHitCount())), jamonWriter);
141
142 jamonWriter.write("</td>\n <td>Number requests that were cache hits</td>\n </tr>\n <tr>\n <td>Hits Caching</td>\n <td>");
143
144 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getStats().getHitCachingCount())), jamonWriter);
145
146 jamonWriter.write("</td>\n <td>Cache hit block requests but only requests set to cache block if a miss</td>\n </tr>\n <tr>\n <td>Misses</td>\n <td>");
147
148 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getStats().getMissCount())), jamonWriter);
149
150 jamonWriter.write("</td>\n <td>Block requests that were cache misses but set to cache missed blocks</td>\n </tr>\n <tr>\n <td>Misses Caching</td>\n <td>");
151
152 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cacheConfig.getBlockCache().getStats().getMissCount())), jamonWriter);
153
154 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>");
155
156 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,.2f", cacheConfig.getBlockCache().getStats().getHitRatio() * 100)), jamonWriter);
157
158 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf("%"), jamonWriter);
159
160 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");
161 }
162
163 jamonWriter.write("\n");
164 }
165
166
167
168 private void __jamon_innerUnit__bc_config(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final CacheConfig cacheConfig)
169 throws java.io.IOException
170 {
171
172 if (cacheConfig == null )
173 {
174
175 jamonWriter.write("\n<p>CacheConfig is null</p>\n");
176 }
177
178 else
179 {
180
181 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>");
182
183 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldCacheDataOnRead()), jamonWriter);
184
185 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>");
186
187 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldCacheDataOnWrite()), jamonWriter);
188
189 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>");
190
191 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldCacheIndexesOnWrite()), jamonWriter);
192
193 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>");
194
195 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldCacheBloomsOnWrite()), jamonWriter);
196
197 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>");
198
199 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldEvictOnClose()), jamonWriter);
200
201 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>Cache DATA in compressed format</td>\n <td>");
202
203 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldCacheDataCompressed()), jamonWriter);
204
205 jamonWriter.write("</td>\n <td>True if DATA blocks are cached in their compressed form</td>\n </tr>\n <tr>\n <td>Prefetch on Open</td>\n <td>");
206
207 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cacheConfig.shouldPrefetchOnOpen()), jamonWriter);
208
209 jamonWriter.write("</td>\n <td>True if blocks are prefetched into cache on open</td>\n </tr>\n</table>\n");
210 }
211
212 jamonWriter.write("\n");
213 }
214
215
216
217 private void __jamon_innerUnit__bc_baseInfo(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final CacheConfig cacheConfig, final String bcUrl, final String bcName)
218 throws java.io.IOException
219 {
220
221
222 BlockCache bc = cacheConfig == null? null: cacheConfig.getBlockCache();
223 BlockCache [] bcs = bc == null? null: bc.getBlockCaches();
224 String bcl1Url = null;
225 String bcl1Name = null;
226 String bcl2Url = null;
227 String bcl2Name = null;
228 if (bcs != null) {
229 BlockCache bcl1 = bcs[0];
230 if (bcl1 != null) {
231 bcl1Url = "http://hbase.apache.org/devapidocs/" + bcl1.getClass().getName().replaceAll("\\.", "/") + ".html";
232 bcl1Name = bcl1.getClass().getSimpleName();
233 }
234 if (bcs.length == 2) {
235 BlockCache bcl2 = bcs[1];
236 bcl2Url = "http://hbase.apache.org/devapidocs/" + bcl2.getClass().getName().replaceAll("\\.", "/") + ".html";
237 bcl2Name = bcl2.getClass().getSimpleName();
238 }
239 }
240
241
242 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=\"");
243
244 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bcUrl), jamonWriter);
245
246 jamonWriter.write("\">");
247
248 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bcName), jamonWriter);
249
250 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");
251 }
252
253
254
255 private void __jamon_innerUnit__block_cache(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final BlockCache bc, final String name, final boolean evictions)
256 throws java.io.IOException
257 {
258
259
260 final long nanosPerSecond = 1000000000;
261 String bcUrl = "http://hbase.apache.org/devapidocs/" + bc.getClass().getName().replaceAll("\\.", "/") + ".html";
262 String bcName = bc.getClass().getSimpleName();
263 org.apache.hadoop.hbase.io.hfile.BlockCacheUtil.CachedBlocksByFile cbsbf =
264 org.apache.hadoop.hbase.io.hfile.BlockCacheUtil.getLoadedCachedBlocksByFile(config, bc);
265 AgeSnapshot cbsbfSnapshot = cbsbf.getAgeInCacheSnapshot();
266
267 boolean bucketCache = bc.getClass().getSimpleName().equals("BucketCache");
268 BucketCacheStats bucketCacheStats = null;
269 BucketAllocator bucketAllocator = null;
270 Bucket [] buckets = null;
271
272 if (bucketCache) {
273 bucketCacheStats = (BucketCacheStats)bc.getStats();
274 bucketAllocator = ((BucketCache)bc).getAllocator();
275 buckets = bucketAllocator.getBuckets();
276 }
277
278
279 if (cbsbf.isFull() )
280 {
281
282 jamonWriter.write("\n<p><b>Statistics below is based on sampling first ");
283
284 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(cbsbfSnapshot.getMax()), jamonWriter);
285
286 jamonWriter.write(" blocks only</b> (hbase.ui.blockcache.by.file.max)</p> \n");
287 }
288
289 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=\"");
290
291 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bcUrl), jamonWriter);
292
293 jamonWriter.write("\">");
294
295 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bc.getClass().getSimpleName()), jamonWriter);
296
297 jamonWriter.write("</a></td>\n <td>Class implementing this block cache Level</td>\n </tr>\n");
298
299 if (bucketCache )
300 {
301
302 jamonWriter.write("\n <tr>\n <td>Implementation</td>\n <td>");
303
304 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(((BucketCache)bc).getIoEngine()), jamonWriter);
305
306 jamonWriter.write("</a></td>\n <td>IOEngine</td>\n </tr>\n");
307 }
308
309 jamonWriter.write("\n <tr>\n <td>Count</td>\n <td>");
310
311 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cbsbf.getCount())), jamonWriter);
312
313 jamonWriter.write("</td>\n <td>Count of Blocks</td>\n </tr>\n");
314
315 if (!bucketCache )
316 {
317
318 jamonWriter.write("\n <tr>\n <td>Count</td>\n <td>");
319
320 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", cbsbf.getDataCount())), jamonWriter);
321
322 jamonWriter.write("</td>\n <td>Count of DATA Blocks</td>\n </tr>\n");
323 }
324
325 jamonWriter.write("\n <tr>\n <td>Size</td>\n <td>");
326
327 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(cbsbf.getSize())), jamonWriter);
328
329 jamonWriter.write("</td>\n <td>Size of Blocks</td>\n </tr>\n");
330
331 if (!bucketCache )
332 {
333
334 jamonWriter.write("\n <tr>\n <td>Size</td>\n <td>");
335
336 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(StringUtils.humanReadableInt(cbsbf.getDataSize())), jamonWriter);
337
338 jamonWriter.write("</td>\n <td>Size of DATA Blocks</td>\n </tr>\n");
339 }
340
341 jamonWriter.write(" \n");
342
343 if (evictions )
344 {
345
346 {
347
348 __jamon_innerUnit__evictions_tmpl(jamonWriter, bc);
349 }
350 }
351
352 jamonWriter.write(" \n");
353
354 if (bucketCache )
355 {
356
357 jamonWriter.write("\n <tr>\n <td>Hits per Second</td>\n <td>");
358
359 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucketCacheStats.getIOHitsPerSecond()), jamonWriter);
360
361 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>");
362
363 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucketCacheStats.getIOTimePerHit()), jamonWriter);
364
365 jamonWriter.write("</td>\n <td>Time per cache hit</td>\n </tr>\n");
366 }
367
368 jamonWriter.write("\n</table>\n<p>View block cache <a href=\"?format=json&bcn=");
369
370 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(name), jamonWriter);
371
372 jamonWriter.write("\">as JSON</a> | Block cache <a href=\"?format=json&bcn=");
373
374 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(name), jamonWriter);
375
376 jamonWriter.write("&bcv=file\">as JSON by file</a></p>\n");
377
378 if (bucketCache )
379 {
380
381 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");
382
383 for (Bucket bucket: buckets )
384 {
385
386 jamonWriter.write("\n <tr>\n <td>");
387
388 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucket.getBaseOffset()), jamonWriter);
389
390 jamonWriter.write("</td>\n <td>");
391
392 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucket.getItemAllocationSize()), jamonWriter);
393
394 jamonWriter.write("</td>\n <td>");
395
396 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucket.getFreeBytes()), jamonWriter);
397
398 jamonWriter.write("</td>\n <td>");
399
400 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(bucket.getUsedBytes()), jamonWriter);
401
402 jamonWriter.write("</td>\n </tr>\n");
403 }
404
405 jamonWriter.write("\n</table>\n");
406 }
407
408 jamonWriter.write("\n");
409
410
411 cbsbf = null;
412
413 }
414
415
416
417 private void __jamon_innerUnit__bc_l(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final BlockCache bc, final String name, final boolean evictions)
418 throws java.io.IOException
419 {
420
421 if (bc == null )
422 {
423
424 jamonWriter.write("\n<p>No ");
425
426 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(name), jamonWriter);
427
428 jamonWriter.write(" deployed</p>\n");
429 }
430
431 else
432 {
433
434 jamonWriter.write("\n");
435
436 {
437
438 __jamon_innerUnit__block_cache(jamonWriter, bc, name, evictions);
439 }
440
441 jamonWriter.write("\n");
442 }
443
444 jamonWriter.write("\n");
445 }
446
447
448
449 private void __jamon_innerUnit__evictions_tmpl(@SuppressWarnings({"unused","hiding"}) final java.io.Writer jamonWriter, final BlockCache bc)
450 throws java.io.IOException
451 {
452
453
454 AgeSnapshot ageAtEvictionSnapshot = bc.getStats().getAgeAtEvictionSnapshot();
455
456 double mean = ageAtEvictionSnapshot.getMean();
457 double stddev = ageAtEvictionSnapshot.getStdDev();
458
459
460 jamonWriter.write("<tr>\n <td>Evicted</td>\n <td>");
461
462 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", bc.getStats().getEvictedCount())), jamonWriter);
463
464 jamonWriter.write("</td>\n <td>The total number of blocks evicted</td>\n </tr>\n <tr>\n <td>Evictions</td>\n <td>");
465
466 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", bc.getStats().getEvictionCount())), jamonWriter);
467
468 jamonWriter.write("</td>\n <td>The total number of times an eviction has occurred</td>\n </tr>\n");
469
470 if (mean > 0 )
471 {
472
473 jamonWriter.write("\n <tr>\n <td>Mean</td>\n <td>");
474
475 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", (long)(ageAtEvictionSnapshot.getMean()/(1000000 * 1000)))), jamonWriter);
476
477 jamonWriter.write("</td>\n <td>Mean age of Blocks at eviction time (seconds)</td>\n </tr>\n");
478 }
479
480 jamonWriter.write("\n");
481
482 if (stddev > 0 )
483 {
484
485 jamonWriter.write("\n <tr>\n <td>StdDev</td>\n <td>");
486
487 org.jamon.escaping.Escaping.HTML.write(org.jamon.emit.StandardEmitter.valueOf(String.format("%,d", (long)(ageAtEvictionSnapshot.getStdDev()/1000000))), jamonWriter);
488
489 jamonWriter.write("</td>\n <td>Standard Deviation for age of Blocks at eviction time</td>\n </tr>\n");
490 }
491
492 jamonWriter.write("\n");
493 }
494
495
496 }