Skip to content

Commit f75fb44

Browse files
author
Miguel Ping
committed
Support ring async middleware through 3-arity functions
1 parent 2433412 commit f75fb44

File tree

1 file changed

+44
-27
lines changed

1 file changed

+44
-27
lines changed

metrics-clojure-ring/src/metrics/ring/instrument.clj

+44-27
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
(:require [metrics.core :refer [default-registry]]
33
[metrics.counters :refer (counter inc! dec!)]
44
[metrics.meters :refer (meter mark!)]
5-
[metrics.timers :refer (timer time!)]
5+
[metrics.timers :refer (timer time! start stop)]
66
[clojure.string :as string])
77
(:import [com.codahale.metrics MetricRegistry]))
88

@@ -51,23 +51,31 @@
5151
:times times
5252
:request-methods request-methods}))
5353

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)))))
7179

7280
(defn metrics-for
7381
[metrics-db prefix registry]
@@ -87,10 +95,15 @@
8795
([handler]
8896
(instrument handler default-registry))
8997
([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)))))
94107

95108
(defn instrument-by
96109
"Instrument a ring handler using the metrics returned by the `metrics-for`
@@ -107,8 +120,12 @@
107120
(instrument-by handler default-registry metrics-prefix))
108121
([handler ^MetricRegistry reg metrics-prefix]
109122
(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

Comments
 (0)