Skip to content

Instantly share code, notes, and snippets.

@CampingScorpion
Created May 24, 2014 01:04
Show Gist options
  • Save CampingScorpion/e023fec8441a5145d9a5 to your computer and use it in GitHub Desktop.
Save CampingScorpion/e023fec8441a5145d9a5 to your computer and use it in GitHub Desktop.
(defn wrap-middleware-logging
([handler middlware-name]
(wrap-middleware-logging handler middlware-name false))
([handler middlware-name summarize-and-log?]
(fn [req]
(tap (str middleware-name "-REQUEST") request)
(let [start (ts/now)
result (handler req)
end (ts/now)
result (if (map? result) ;; safety valve for legacy middlewares
(update-in result
[::timings]
#(conj (or % [])
{:middleware middlware-name
:middleware-elapsed (- end start)}))
result)]
(tap (str middleware-name "-RESPONSE") result)
(if (and summarize-and-log?
(map? result)) ;; safety valve for legacy middlewares
(do
(tracing/info {:middleware-timings (::timings result)}
[:middleware-timings])
(dissoc result ::timings))
result)))))
(defn wrap-middlewares [summarizing? handler middlewares]
(let [summarize?-determinations (conj (vec (repeat (dec (count middlewares))
false))
summarizing?)
mw-names (map str middlewares)
logging-mws (for [[summarize? mw-name] (map list
summarize?-determinations
mw-names)]
`(wrap-middleware-logging ~mw-name ~summarize?))]
`(-> ~handler
~@(interleave middlewares logging-mws))))
(defmacro summarizing-middleware->
"Top-level way to log timing info for each middleware it wraps"
[handler & middlewares]
(wrap-middlewares true handler middlewares))
(defmacro middleware->
"Use from within other summarizing-middleware-> calls"
[handler & middlewares]
(wrap-middlewares false handler middlewares))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment