Advertisement
Guest User

Untitled

a guest
Jun 15th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. (ns verita.util.metrics
  2.   (:gen-class)
  3.   (:require [clojure.spec.alpha :as spec]
  4.             [io.pedestal.log :as logger]
  5.             [mount.core :refer [defstate] :as mount]
  6.             [environ.core :refer [env]]
  7.             [verita.util.common :as common])
  8.   (:import (java.util.concurrent TimeUnit)
  9.            (org.slf4j LoggerFactory)
  10.            (com.codahale.metrics Slf4jReporter Gauge MetricRegistry
  11.                                  ConsoleReporter ScheduledReporter MetricFilter)
  12.            (com.codahale.metrics.health HealthCheck)
  13.            (com.readytalk.metrics StatsDReporter)))
  14.  
  15. ;; enable asserts
  16. (spec/check-asserts true)
  17.  
  18.  
  19. (def ^:dynamic *config*
  20.   {:reporter-type (-> env :verita-reporter keyword)
  21.    :report-period (or (common/safe (Integer. ^String (:verita-report-period env))) 2)
  22.    :statsd-server (or (:statsd-server env) "127.0.0.1")
  23.    :statsd-port   (or (common/safe (Integer. ^String (:statsd-port env))) 8125)})
  24.  
  25. (spec/def ::registry #(instance? MetricRegistry %))
  26. (spec/def ::time-unit #(instance? TimeUnit %))
  27. (spec/def ::rate-unit ::time-unit)
  28. (spec/def ::duration-unit ::time-unit)
  29. (spec/def ::report-period pos-int?)
  30. (spec/def ::report-timeunit ::time-unit)
  31. (spec/def ::logger-name string?)
  32. (spec/def ::prefix string?)
  33. (spec/def ::reporter-type #{:console :slf4j :statsd})
  34. (spec/def ::host string?)
  35. (spec/def ::port pos-int?)
  36. (spec/def ::max-size-bytes pos-int?)
  37. (spec/def ::max-latency-ms pos-int?)
  38.  
  39.  
  40. (defmulti reporter-type ::reporter-type)
  41.  
  42.  
  43. (defmethod reporter-type :console [_]
  44.   (spec/keys :req [::registry
  45.                    ::rate-unit
  46.                    ::duration-unit
  47.                    ::report-period
  48.                    ::report-timeunit]))
  49.  
  50.  
  51. (defmethod reporter-type :slf4j [_]
  52.   (spec/keys :req [::registry
  53.                    ::rate-unit
  54.                    ::duration-unit
  55.                    ::report-period
  56.                    ::report-timeunit
  57.                    ::logger-name]))
  58.  
  59.  
  60. (defmethod reporter-type :statsd [_]
  61.   (spec/keys :req [::registry
  62.                    ::host
  63.                    ::port
  64.                    ::rate-unit
  65.                    ::duration-unit
  66.                    ::report-period
  67.                    ::report-timeunit]))
  68.  
  69.  
  70. (spec/def ::reporter-params (spec/multi-spec reporter-type ::reporter-type))
  71.  
  72.  
  73. (defn console-reporter
  74.   "create console reporter for given registry and start it. return nil."
  75.   [params]
  76.   (spec/assert ::reporter-params params)
  77.   (doto (some-> (ConsoleReporter/forRegistry (::registry params))
  78.                 (.outputTo System/out)
  79.                 (.convertRatesTo (::rate-unit params))
  80.                 (.convertDurationsTo (::duration-unit params))
  81.                 (.build))
  82.     (.start (::report-period params) (::report-timeunit params))))
  83.  
  84.  
  85. (defn slf4j-reporter
  86.   "create SLF4j reporter for given registry and start it. return nil."
  87.   [params]
  88.   (spec/assert ::reporter-params params)
  89.   (doto (some-> (Slf4jReporter/forRegistry (::registry params))
  90.                 (.outputTo (LoggerFactory/getLogger ^String (::logger-name params)))
  91.                 (.convertRatesTo (::rate-unit params))
  92.                 (.convertDurationsTo (::duration-unit params))
  93.                 (.build))
  94.     (.start (::report-period params) (::report-timeunit params))))
  95.  
  96. (defn statsd-reporter
  97.   "create StatsD reporter for given registry and start it. return nil."
  98.   [params]
  99.   (spec/assert ::reporter-params params)
  100.   (doto (some-> (StatsDReporter/forRegistry (::registry params))
  101.                 (.convertRatesTo (::rate-unit params))
  102.                 (.convertDurationsTo (::duration-unit params))
  103.                 (.build (::host params) (::port params)))
  104.     (.start (::report-period params) (::report-timeunit params))))
  105.  
  106.  
  107. (defn init-metric-reporter
  108.   "return initialzed MetricRegistry object."
  109.   [reporter-type]
  110.  
  111.   (case (spec/assert ::reporter-type reporter-type)
  112.  
  113.     :console (logger/metric-registry #(console-reporter {::reporter-type   :console
  114.                                                          ::registry        %
  115.                                                          ::rate-unit       TimeUnit/SECONDS
  116.                                                          ::duration-unit   TimeUnit/MILLISECONDS
  117.                                                          ::report-period   (:report-period *config*)
  118.                                                          ::report-timeunit TimeUnit/SECONDS}))
  119.  
  120.     :slf4j (logger/metric-registry #(slf4j-reporter {::reporter-type   :slf4j
  121.                                                      ::registry        %
  122.                                                      ::rate-unit       TimeUnit/SECONDS
  123.                                                      ::duration-unit   TimeUnit/MILLISECONDS
  124.                                                      ::report-period   (:report-period *config*)
  125.                                                      ::report-timeunit TimeUnit/SECONDS
  126.                                                      ::logger-name     "verita"}))
  127.  
  128.     :statsd (logger/metric-registry #(statsd-reporter {::reporter-type   :statsd
  129.                                                        ::host            (:statsd-server *config*)
  130.                                                        ::port            (Integer. (:statsd-port *config*))
  131.                                                        ::registry        %
  132.                                                        ::rate-unit       TimeUnit/SECONDS
  133.                                                        ::duration-unit   TimeUnit/MILLISECONDS
  134.                                                        ::report-period   (:report-period *config*)
  135.                                                        ::report-timeunit TimeUnit/SECONDS}))))
  136.  
  137.  
  138.  
  139.  
  140. ;; Defines reporter to be passed to metrics functions
  141. (defonce custom-reporter (init-metric-reporter (:reporter-type *config*)))
  142.  
  143. (logger/gauge custom-reporter "verita.jvm.max" (fn [] (common/max-jvm-memory)))
  144. (logger/gauge custom-reporter "verita.jvm.free" (fn [] (common/free-jvm-memory)))
  145. (logger/gauge custom-reporter "verita.jvm.total" (fn [] (common/total-jvm-memory)))
  146. (logger/gauge custom-reporter "verita.jvm.used" (fn [] (common/used-jvm-memory)))
  147.  
  148. (logger/gauge custom-reporter "verita.cpu.system" (fn [] (common/system-cpu-load)))
  149. (logger/gauge custom-reporter "verita.cpu.jvm-proc" (fn [] (common/process-cpu-load)))
  150.  
  151. (logger/gauge custom-reporter "verita.file.max-descr" (fn [] (common/max-file-descriptor)))
  152. (logger/gauge custom-reporter "verita.file.open-descr" (fn [] (common/open-file-descriptor)))
  153.  
  154. (logger/gauge custom-reporter "verita.swap.total" (fn [] (common/total-swap-size)))
  155. (logger/gauge custom-reporter "verita.swap.free" (fn [] (common/free-swap-size)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement