metrics-clojure / metrics-clojure-core / src / metrics / timers.clj

Steve Losh 26d62ce 
Steve Losh 2bf9a78 
Steve Losh 26d62ce 

Steve Losh 95391b4 
Steve Losh 9f89ac1 
Steve Losh da9ae58 

Steve Losh 9f89ac1 
Steve Losh 2bf9a78 

Ian Eure 27c731b 
Steve Losh 26d62ce 

(ns metrics.timers
  (:use [metrics.utils :only (metric-name get-percentiles desugared-title)])
  (:import (com.yammer.metrics Metrics))
  (:import (com.yammer.metrics.core Timer MetricName))
  (:import (java.util.concurrent TimeUnit)))

; Create ----------------------------------------------------------------------
(defn timer [title]
  (Metrics/newTimer ^MetricName (metric-name title)

(defmacro deftimer
  "Define a new Timer metric with the given title.

  The title uses some basic desugaring to let you concisely define metrics:

    ; Define a timer titled \"\" into var foo
    (deftimer foo)
    (deftimer \"foo\")

    ; Define a timer titled \"a.b.c\" into var c
    (deftimer [a b c])
    (deftimer [\"a\" \"b\" \"c\"])
    (deftimer [a \"b\" c])
  (let [[s title] (desugared-title title)]
    `(def ~s (timer ~title))))

; Read ------------------------------------------------------------------------
(defn rates [^Timer m]
  {1 (.oneMinuteRate m)
   5 (.fiveMinuteRate m)
   15 (.fifteenMinuteRate m)})

(defn rate-one [^Timer m]
  (.oneMinuteRate m))

(defn rate-five [^Timer m]
  (.fiveMinuteRate m))

(defn rate-fifteen [^Timer m]
  (.fifteenMinuteRate m))

(defn rate-mean [^Timer m]
  (.meanRate m))

(defn mean [^Timer t]
  (.mean t))

(defn std-dev [^Timer t]
  (.stdDev t))

(defn percentiles
  ([^Timer t]
   (percentiles t [0.75 0.95 0.99 0.999 1.0]))
  ([^Timer t ps]
   (get-percentiles t ps)))

(defn number-recorded [^Timer t]
  (.count t))

(defn largest [^Timer t]
  (.max t))

(defn smallest [^Timer t]
  (.min t))

(defn sample [^Timer t]
  (.getValues (.getSnapshot t)))

; Write -----------------------------------------------------------------------
(defmacro time! [^Timer t & body]
  `(.time ~(vary-meta t assoc :tag `Timer)
         (proxy [Callable] []
           (call [] (do ~@body)))))

(defn time-fn! [^Timer t f]
  (.time t
         (proxy [Callable] []
           (call [] (f)))))

(defn clear! [^Timer t]
  (.clear t))
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.