1 package net.pterodactylus.sone.template
3 import com.codahale.metrics.*
4 import net.pterodactylus.sone.utils.*
5 import net.pterodactylus.util.template.*
8 * [Filter] that renders a [Histogram] as a table row.
10 class HistogramRenderer : Filter {
12 override fun format(templateContext: TemplateContext, data: Any?, parameters: Map<String, Any?>?): Any? {
13 templateContext["metricName"] = (parameters?.get("name") as String?)?.dotToCamel()?.let { "Page.Metrics.$it.Title" }
14 (data as? Histogram)?.snapshot?.run {
15 templateContext["count"] = data.count
16 templateContext["min"] = min
17 templateContext["max"] = max
18 templateContext["mean"] = mean
19 templateContext["median"] = median
20 templateContext["percentile75"] = get75thPercentile()
21 templateContext["percentile95"] = get95thPercentile()
22 templateContext["percentile98"] = get98thPercentile()
23 templateContext["percentile99"] = get99thPercentile()
24 templateContext["percentile999"] = get999thPercentile()
26 return template.render(templateContext)
31 private val template = """<tr>
32 <td><% metricName|l10n|html></td>
33 <td class="numeric"><% count|html></td>
34 <td class="numeric"><% min|duration scale=='μs'|html></td>
35 <td class="numeric"><% max|duration scale=='μs'|html></td>
36 <td class="numeric"><% mean|duration scale=='μs'|html></td>
37 <td class="numeric"><% median|duration scale=='μs'|html></td>
38 <td class="numeric"><% percentile75|duration scale=='μs'|html></td>
39 <td class="numeric"><% percentile95|duration scale=='μs'|html></td>
40 <td class="numeric"><% percentile98|duration scale=='μs'|html></td>
41 <td class="numeric"><% percentile99|duration scale=='μs'|html></td>
42 <td class="numeric"><% percentile999|duration scale=='μs'|html></td>
45 private fun String.dotToCamel() =
46 split(".").joinToString("", transform = String::capitalize)