-
Notifications
You must be signed in to change notification settings - Fork 0
/
metric.clj
80 lines (72 loc) · 2.78 KB
/
metric.clj
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
(ns corbihttp.metric
(:require [com.stuartsierra.component :as component])
(:import io.micrometer.core.instrument.binder.jvm.ClassLoaderMetrics
io.micrometer.core.instrument.binder.jvm.JvmGcMetrics
io.micrometer.core.instrument.binder.jvm.JvmMemoryMetrics
io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics
io.micrometer.core.instrument.binder.system.FileDescriptorMetrics
io.micrometer.core.instrument.binder.system.UptimeMetrics
io.micrometer.core.instrument.binder.system.ProcessorMetrics
io.micrometer.core.instrument.Counter
io.micrometer.core.instrument.MeterRegistry
io.micrometer.core.instrument.Metrics
io.micrometer.core.instrument.Timer
io.micrometer.prometheus.PrometheusConfig
io.micrometer.prometheus.PrometheusMeterRegistry))
(defn ->tags
"Converts a map of tags to an array of string"
[tags]
(into-array String
(->> tags
(map (fn [[k v]] [(name k) (name v)]))
flatten)))
(defn registry-component
[tags]
(let [registry (PrometheusMeterRegistry. PrometheusConfig/DEFAULT)]
(.commonTags (.config registry) (->tags tags))
(Metrics/addRegistry registry)
(.bindTo (ClassLoaderMetrics.) registry)
(.bindTo (JvmGcMetrics.) registry)
(.bindTo (JvmMemoryMetrics.) registry)
(.bindTo (JvmThreadMetrics.) registry)
(.bindTo (FileDescriptorMetrics.) registry)
(.bindTo (UptimeMetrics.) registry)
(.bindTo (ProcessorMetrics.) registry)
registry))
(defn get-timer!
"get a timer by name and tags"
[^MeterRegistry registry n tags]
(.register (doto (Timer/builder (name n))
(.publishPercentiles (double-array [0.5 0.75 0.98 0.99]))
(.tags (->tags tags)))
registry))
(defmacro with-time
[^MeterRegistry registry n tags & body]
`(when ~registry
(let [timer# (get-timer! ~registry ~n ~tags)
current# (java.time.Instant/now)]
(try
(do ~@body)
(finally
(let [end# (java.time.Instant/now)]
(.record timer# (java.time.Duration/between current# end#))))))
(do ~@body)))
(defn increment!
"increments a counter"
([^MeterRegistry registry counter tags]
(increment! registry counter tags 1))
([^MeterRegistry registry counter tags n]
(when registry
(let [builder (doto (Counter/builder (name counter))
(.tags (->tags tags)))
counter (.register builder registry)]
(.increment counter n)))))
(defn scrape [^PrometheusMeterRegistry registry]
(some-> registry .scrape))
(defn prom-handler
[registry]
(fn handler
[_]
{:status 200
:headers {"Content-Type" "text/plain"}
:body (.getBytes (scrape registry))}))