2
2
(:require [metrics.core :refer [default-registry ]]
3
3
[metrics.counters :refer (counter inc! dec!)]
4
4
[metrics.meters :refer (meter mark!)]
5
- [metrics.timers :refer (timer time!)]
5
+ [metrics.timers :refer (timer time! start stop )]
6
6
[clojure.string :as string])
7
7
(:import [com.codahale.metrics MetricRegistry]))
8
8
51
51
:times times
52
52
:request-methods request-methods}))
53
53
54
- (defn handle-request [handler metrics request]
55
- (let [{:keys [active-requests requests responses
56
- schemes statuses times request-methods]} metrics]
57
- (inc! active-requests)
58
- (try
59
- (let [request-method (:request-method request)
60
- request-scheme (:scheme request)]
61
- (mark! requests)
62
- (mark-in! request-methods request-method)
63
- (mark-in! schemes request-scheme)
64
- (let [resp (time! (times request-method (times :other ))
65
- (handler request))
66
- ^{:tag " int" } status-code (or (:status resp) 404 )]
67
- (mark! responses)
68
- (mark-in! statuses (int (/ status-code 100 )))
69
- resp))
70
- (finally (dec! active-requests)))))
54
+ (defn- time-request [thunk metrics request]
55
+ (let [{:keys [active-requests requests responses
56
+ schemes statuses times request-methods]} metrics]
57
+ (inc! active-requests)
58
+ (try
59
+ (let [request-method (:request-method request)
60
+ request-scheme (:scheme request)]
61
+ (mark! requests)
62
+ (mark-in! request-methods request-method)
63
+ (mark-in! schemes request-scheme)
64
+ (let [resp (time! (times request-method (times :other ))
65
+ (thunk ))
66
+ ^{:tag " int" } status-code (or (:status resp) 404 )]
67
+ (mark! responses)
68
+ (mark-in! statuses (int (/ status-code 100 )))
69
+ resp))
70
+ (finally (dec! active-requests)))))
71
+
72
+ (defn handle-request
73
+ ([handler metrics request]
74
+ (time-request #(handler request) metrics request))
75
+ ([handler metrics request respond raise]
76
+ (try
77
+ (time-request #(handler request respond raise) metrics request)
78
+ (catch Exception e (raise e)))))
71
79
72
80
(defn metrics-for
73
81
[metrics-db prefix registry]
87
95
([handler]
88
96
(instrument handler default-registry ))
89
97
([handler ^MetricRegistry reg]
90
- (fn [request]
91
- (handle-request handler
92
- (ring-metrics reg {:prefix []})
93
- request))))
98
+ (fn
99
+ ([request]
100
+ (handle-request handler
101
+ (ring-metrics reg {:prefix []})
102
+ request))
103
+ ([request respond raise]
104
+ (handle-request handler
105
+ (ring-metrics reg {:prefix []})
106
+ request respond raise)))))
94
107
95
108
(defn instrument-by
96
109
" Instrument a ring handler using the metrics returned by the `metrics-for`
107
120
(instrument-by handler default-registry metrics-prefix))
108
121
([handler ^MetricRegistry reg metrics-prefix]
109
122
(let [metrics-db (atom {})]
110
- (fn [request]
111
- (let [prefix (metrics-prefix request)]
112
- (handle-request handler
113
- (metrics-for metrics-db prefix reg)
114
- request))))))
123
+ (fn
124
+ ([request]
125
+ (handle-request handler
126
+ (metrics-for metrics-db (metrics-prefix request) reg)
127
+ request))
128
+ ([request respond raise]
129
+ (handle-request handler
130
+ (metrics-for metrics-db (metrics-prefix request) reg)
131
+ request respond raise))))))
0 commit comments