-
-
Notifications
You must be signed in to change notification settings - Fork 248
/
example_metrics.kt
57 lines (46 loc) · 1.98 KB
/
example_metrics.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package guide.howto.monitor_http4k
import org.http4k.core.HttpHandler
import org.http4k.core.HttpTransaction
import org.http4k.core.Method.GET
import org.http4k.core.Request
import org.http4k.core.Response
import org.http4k.core.Status.Companion.OK
import org.http4k.core.then
import org.http4k.filter.HttpTransactionLabeler
import org.http4k.filter.ResponseFilters
import org.http4k.routing.bind
import org.http4k.routing.routes
import java.time.Duration
fun main() {
val app = routes("foo/{name}" bind { _: Request -> Response(OK) })
fun metricConsumer(name: String, time: Duration) = println("$name ${time.toMillis()}ms")
// this is a general use filter for reporting on http transactions
val standardFilter = ResponseFilters.ReportHttpTransaction { tx: HttpTransaction ->
metricConsumer("txLabels are: ${tx.labels}", tx.duration)
metricConsumer("uri is: ${tx.request.uri}", tx.duration)
}
val addCustomLabels: HttpTransactionLabeler = { tx: HttpTransaction ->
tx.label("status", tx.response.status.code.toString())
}
val withCustomLabels = ResponseFilters.ReportHttpTransaction(
transactionLabeler = addCustomLabels
) { tx: HttpTransaction ->
// send metrics to some custom system here...
println("custom txLabels are: ${tx.labels} ${tx.duration}")
}
// this filter provides an anonymous identifier of the route
val identifiedRouteFilter =
ResponseFilters.ReportRouteLatency { requestGroup: String, duration: Duration ->
metricConsumer("requestGroup is: $requestGroup", duration)
}
val monitoredApp: HttpHandler = standardFilter
.then(withCustomLabels)
.then(identifiedRouteFilter)
.then(app)
monitoredApp(Request(GET, "/foo/bob"))
// prints...
// requestGroup is: GET.foo_{name}.2xx.200 7ms
// custom txLabels are: {routingGroup=foo/{name}, status=200} PT0.05S
// txLabels are: {routingGroup=foo/{name}} 51ms
// uri is: /foo/bob 51ms
}