|
1 | 1 | (ns metrics.ring.expose
|
2 |
| - (:import (com.codahale.metrics Gauge Timer Counter Histogram Meter)) |
| 2 | + (:import (com.codahale.metrics Gauge Timer Counter Histogram Meter) |
| 3 | + (java.util.concurrent TimeUnit)) |
3 | 4 | (:require [clojure.string :as string]
|
4 | 5 | [metrics.gauges :as gauges]
|
5 | 6 | [metrics.meters :as meters]
|
|
9 | 10 | [ring.util.response :refer [header response]]
|
10 | 11 | [metrics.core :refer [default-registry]]
|
11 | 12 | [metrics.utils :refer [all-metrics]]
|
| 13 | + [metrics.ring.unit :as unit] |
12 | 14 | [cheshire.core :refer [generate-string]]))
|
13 | 15 |
|
14 | 16 |
|
15 | 17 | ; Define rendering protocol ---------------------------------------------------
|
16 | 18 | (defprotocol RenderableMetric
|
17 |
| - (render-to-basic [metric] "Turn a metric into a basic Clojure datastructure.")) |
| 19 | + (render-to-basic [metric unit-opts] "Turn a metric into a basic Clojure datastructure.")) |
18 | 20 |
|
19 | 21 | (extend-type Gauge
|
20 | 22 | RenderableMetric
|
21 |
| - (render-to-basic [g] |
| 23 | + (render-to-basic [g _] |
22 | 24 | {:type :gauge
|
23 | 25 | :value (gauges/value g)}))
|
24 | 26 |
|
25 | 27 | (extend-type Timer
|
26 | 28 | RenderableMetric
|
27 |
| - (render-to-basic [t] |
28 |
| - {:type :timer |
29 |
| - :rates (timers/rates t) |
30 |
| - :percentiles (timers/percentiles t) |
31 |
| - :max (timers/largest t) |
32 |
| - :min (timers/smallest t) |
33 |
| - :mean (timers/mean t) |
34 |
| - :standard-deviation (timers/std-dev t)})) |
| 29 | + (render-to-basic [t unit-opts] |
| 30 | + {:type :timer |
| 31 | + :duration-unit (:duration-unit-label unit-opts) |
| 32 | + :rate-unit (:rate-unit-label unit-opts) |
| 33 | + :rates (unit/convert-rates (timers/rates t) unit-opts) |
| 34 | + :percentiles (unit/convert-percentiles (timers/percentiles t) unit-opts) |
| 35 | + :max (unit/convert-duration (timers/largest t) unit-opts) |
| 36 | + :min (unit/convert-duration (timers/smallest t) unit-opts) |
| 37 | + :mean (unit/convert-duration (timers/mean t) unit-opts) |
| 38 | + :standard-deviation (unit/convert-duration (timers/std-dev t) unit-opts)})) |
35 | 39 |
|
36 | 40 | (extend-type Meter
|
37 | 41 | RenderableMetric
|
38 |
| - (render-to-basic [m] |
39 |
| - {:type :meter |
40 |
| - :rates (meters/rates m)})) |
| 42 | + (render-to-basic [m unit-opts] |
| 43 | + {:type :meter |
| 44 | + :rate-unit (:rate-unit-label unit-opts) |
| 45 | + :rates (unit/convert-rates (meters/rates m) unit-opts)})) |
41 | 46 |
|
42 | 47 | (extend-type Histogram
|
43 | 48 | RenderableMetric
|
44 |
| - (render-to-basic [h] |
| 49 | + (render-to-basic [h _] |
45 | 50 | {:type :histogram
|
46 | 51 | :max (histograms/largest h)
|
47 | 52 | :min (histograms/smallest h)
|
|
51 | 56 |
|
52 | 57 | (extend-type Counter
|
53 | 58 | RenderableMetric
|
54 |
| - (render-to-basic [c] |
| 59 | + (render-to-basic [c _] |
55 | 60 | {:type :counter
|
56 | 61 | :value (counters/value c)}))
|
57 | 62 |
|
|
75 | 80 | strip-trailing-slash)
|
76 | 81 | \/))
|
77 | 82 |
|
78 |
| -(defn- render-metric [[metric-name metric]] |
79 |
| - [metric-name (render-to-basic metric)]) |
| 83 | +(defn- render-metric [[metric-name metric] unit-opts] |
| 84 | + [metric-name (render-to-basic metric unit-opts)]) |
80 | 85 |
|
81 | 86 | (defn- placeholder? [c]
|
82 | 87 | (contains? #{"" "*"} c))
|
|
102 | 107 |
|
103 | 108 | (defn render-metrics
|
104 | 109 | ([]
|
105 |
| - (render-metrics default-registry nil)) |
| 110 | + (render-metrics default-registry nil nil)) |
106 | 111 | ([filter]
|
107 |
| - (render-metrics default-registry filter)) |
108 |
| - ([registry filter] |
109 |
| - (into {} (map render-metric (->> registry |
110 |
| - (all-metrics) |
111 |
| - (filter-metrics filter)))))) |
| 112 | + (render-metrics default-registry filter nil)) |
| 113 | + ([registry filter unit-context] |
| 114 | + (into {} (map #(render-metric % unit-context) (->> registry |
| 115 | + (all-metrics) |
| 116 | + (filter-metrics filter)))))) |
112 | 117 |
|
113 | 118 | (defn serve-metrics
|
114 | 119 | ([request]
|
115 | 120 | (serve-metrics request default-registry))
|
116 | 121 | ([request registry]
|
117 | 122 | (serve-metrics request registry false))
|
118 |
| - ([request registry {:keys [pretty-print? filter] :as opts}] |
119 |
| - (let [metrics-map (render-metrics registry filter) |
| 123 | + ([request registry {:keys [pretty-print? filter rate-unit duration-unit]}] |
| 124 | + (let [metrics-map (render-metrics registry filter (unit/build-options rate-unit duration-unit)) |
120 | 125 | json (generate-string metrics-map {:pretty pretty-print?})]
|
121 | 126 | (-> (response json)
|
122 | 127 | (header "Content-Type" "application/json")))))
|
|
134 | 139 | ^String filter (get-in request [:params :filter])]
|
135 | 140 | (if (or (.startsWith request-uri (sanitize-uri uri))
|
136 | 141 | (= request-uri uri))
|
137 |
| - (serve-metrics request registry (merge {:filter filter} opts)) |
| 142 | + (serve-metrics request registry (merge {:filter filter |
| 143 | + :rate-unit TimeUnit/SECONDS |
| 144 | + :duration-unit TimeUnit/NANOSECONDS} opts)) |
138 | 145 | (handler request))))))
|
0 commit comments