-
Notifications
You must be signed in to change notification settings - Fork 80
/
counters.clj
71 lines (56 loc) · 1.77 KB
/
counters.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
(ns metrics.counters
(:require [metrics.core :refer [default-registry metric-name]]
[metrics.utils :refer [desugared-title]])
(:import [com.codahale.metrics MetricRegistry Counter]
java.util.concurrent.TimeUnit))
(defn counter
"Create and return a new Counter metric with the given title. If a
Counter already exists with the given title, will return that Counter.
Title can be a plain string like \"foo\" or a vector of three strings (group,
type, and title) like:
[\"myapp\" \"webserver\" \"connections\"]
"
([title]
(counter default-registry title))
([^MetricRegistry reg title]
(.counter reg (metric-name title))))
(defmacro defcounter
"Define a new Counter metric with the given title.
The title uses some basic desugaring to let you concisely define metrics:
; Define a counter titled \"default.default.foo\" into var foo
(defcounter foo)
(defcounter \"foo\")
; Define a counter titled \"a.b.c\" into var c
(defcounter [a b c])
(defcounter [\"a\" \"b\" \"c\"])
(defcounter [a \"b\" c])
"
([title]
(let [[s title] (desugared-title title)]
`(def ~s (counter '~title))))
([^MetricRegistry reg title]
(let [[s title] (desugared-title title)]
`(def ~s (counter ~reg '~title)))))
(defn value
"Return the current value of the counter."
[^Counter c]
(.getCount c))
(defn inc!
"Increment the counter by the given amount (or 1 if not specified)."
([^Counter c]
(inc! c 1))
([^Counter c n]
(.inc c n)
c))
(defn dec!
"Decrement the counter by the given amount (or 1 if not specified)."
([^Counter c]
(dec! c 1))
([^Counter c n]
(.dec c n)
c))
(defn clear!
"Clear the given counter, resetting its value to zero."
[^Counter c]
(.dec c (.getCount c))
c)