-
Notifications
You must be signed in to change notification settings - Fork 64
/
metrics.clj
64 lines (54 loc) · 2.56 KB
/
metrics.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
(ns ziggurat.metrics
(:require [clojure.tools.logging :as log])
(:import (com.gojek.metrics.datadog DatadogReporter)
(com.gojek.metrics.datadog.transport UdpTransport$Builder UdpTransport)
(java.util.concurrent TimeUnit)
(io.dropwizard.metrics5 MetricRegistry Meter MetricName Histogram)))
(defonce ^:private group (atom nil))
(defonce metrics-registry
(MetricRegistry.))
(defn mk-meter
[category metric]
(let [metric-name (MetricRegistry/name ^String @group ^"[Ljava.lang.String;" (into-array String [category metric]))
tagged-metric (.tagged ^MetricName metric-name ^"[Ljava.lang.String;" (into-array String ["actor" @group]))]
(.meter ^MetricRegistry metrics-registry ^MetricName tagged-metric)))
(defn mk-histogram
[category metric]
(let [metric-name (MetricRegistry/name ^String @group ^"[Ljava.lang.String;" (into-array String [category metric]))
tagged-metric (.tagged ^MetricName metric-name ^"[Ljava.lang.String;" (into-array String ["actor" @group]))]
(.histogram ^MetricRegistry metrics-registry tagged-metric)))
(defn increment-count
([metric-namespace metric]
(increment-count metric-namespace metric 1))
([metric-namespace metric n]
(let [meter ^Meter (mk-meter metric-namespace metric)]
(.mark meter (int n)))))
(defn decrement-count
([metric-namespace metric]
(decrement-count metric-namespace metric 1))
([metric-namespace metric n]
(let [meter ^Meter (mk-meter metric-namespace metric)]
(.mark meter (int (- n))))))
(defn report-time [metric-namespace time-val]
(let [histogram ^Histogram (mk-histogram metric-namespace "all")]
(.update histogram (int time-val))))
(defn start-statsd-reporter [statsd-config env app-name]
(let [{:keys [enabled host port]} statsd-config]
(when enabled
(let [transport (-> (UdpTransport$Builder.)
(.withStatsdHost host)
(.withPort port)
(.build))
reporter (-> (DatadogReporter/forRegistry metrics-registry)
(.withTransport transport)
(.withTags [(str env)])
(.build))]
(log/info "Starting statsd reporter")
(.start reporter 1 TimeUnit/SECONDS)
(reset! group app-name)
{:reporter reporter :transport transport}))))
(defn stop-statsd-reporter [datadog-reporter]
(when-let [{:keys [reporter transport]} datadog-reporter]
(.stop ^DatadogReporter reporter)
(.close ^UdpTransport transport)
(log/info "Stopped statsd reporter")))