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

(ns metrics.gauges
  (:use [metrics.utils :only (metric-name desugared-title)])
  (:import (com.yammer.metrics Metrics))
  (:import (com.yammer.metrics.core Gauge)))


; Create ----------------------------------------------------------------------
(defmacro gauge
  "Create a new Gauge metric with the given title.

  The body exprs will be used to retrieve the value of the Gauge when requested."
  [title & body]
  `(Metrics/newGauge (metric-name ~title)
                     (proxy [Gauge] []
                       (value [] (do ~@body)))))

(defn gauge-fn
  "Create a new Gauge metric with the given title.

  The given function will be called (with no arguments) to retrieve the value of
  the Gauge when requested."
  [title f]
  (Metrics/newGauge (metric-name title)
                    (proxy [Gauge] []
                      (value [] (f)))))


(defmacro defgauge
  "Define a new Gauge metric with the given title.

  The rest of the arguments may be a body form or function to call to
  retrieve the value of the Gauge.

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

    ; Define a gauge titled \"default.default.foo\" into var foo
    (defgauge foo ,,,)
    (defgauge \"foo\" ,,,)

    ; Define a gauge titled \"a.b.c\" into var c
    (defgauge [a b c] ,,,)
    (defgauge [\"a\" \"b\" \"c\"] ,,,)
    (defgauge [a \"b\" c] ,,,)
  "
  [title & [b & bs :as body]]
  (let [[s title] (desugared-title title)]
    (if (and (empty? bs)
             (symbol? b)
             (fn? (eval b)))
      `(def ~s (gauge-fn ~title ~b))
      `(def ~s (gauge ~title ~@body)))))


; Read ------------------------------------------------------------------------
(defn value
  "Return the value of the given Gauge."
  [^Gauge g]
  (.value g))
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 ProjectModifiedEvent.java.
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.