This repository has been archived by the owner on Sep 3, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
utils.cljs
78 lines (67 loc) · 2.37 KB
/
utils.cljs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
(ns puppetlabs.metrics.dashboard.utils
(:require-macros [cljs.core.async.macros :refer [go]])
(:require [cljs.core.async :as async]))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Private
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; abstracting the JS data structure into functions in case we decide
;; to use clojurescript structures instead in the future
(defn metrics-data-map
[]
(js-obj))
(defn data-item
[value]
(let [item (js-obj)
now (js/Date.)]
(set! (.-time item) now)
(set! (.-value item) value)
item))
(declare get-values-for-metric)
(defn add-metric-value
[num-historical-data-points metrics-data metric-id value]
(let [metric-data (get-values-for-metric metrics-data metric-id)]
(.push metric-data (data-item value))
(when (> (.-length metric-data) num-historical-data-points)
(.shift metric-data))))
(defn update-metrics-data
[num-historical-data-points metrics-data latest-data-fn]
(let [channel (async/chan)]
(latest-data-fn channel)
(go
(let [latest-data (async/<! channel)]
(doseq [[k v] latest-data]
(add-metric-value num-historical-data-points metrics-data k v))
(async/close! channel)))))
(defn update-metrics-and-reschedule!
[polling-interval num-historical-data-points metrics-data latest-data-fn]
(go
(async/<!
(update-metrics-data
num-historical-data-points
metrics-data
latest-data-fn))
(js/setTimeout (partial update-metrics-and-reschedule!
polling-interval
num-historical-data-points
metrics-data
latest-data-fn)
polling-interval)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Public
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defn begin-metrics-loop
[polling-interval num-historical-data-points latest-data-fn]
(let [metrics-data (metrics-data-map)]
(update-metrics-and-reschedule!
polling-interval
num-historical-data-points
metrics-data
latest-data-fn)
metrics-data))
(defn get-values-for-metric
[metrics-data metric-id]
(if-let [vals (aget metrics-data metric-id)]
vals
(do
(aset metrics-data metric-id (array))
(aget metrics-data metric-id))))