Skip to content

Commit 37b7de8

Browse files
Cameron SumpterSam Hewitt
Cameron Sumpter
authored and
Sam Hewitt
committed
anomaly-detector (#188)
* Add support for cloudwatch anomaly detector * Add test for cloudwatch anomaly detector * Remove need for ->key on name space spec * Remove vector requirement on dimensions spec
1 parent 0dfb4b0 commit 37b7de8

File tree

3 files changed

+85
-0
lines changed

3 files changed

+85
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
(ns crucible.aws.cloudwatch.anomaly-detector
2+
(:require [clojure.spec.alpha :as s]
3+
[crucible.aws.cloudwatch :as cloudwatch]
4+
[crucible.encoding.keys :refer [->key]]
5+
[crucible.resources :refer [defresource spec-or-ref]]))
6+
7+
(s/def ::value (spec-or-ref string?))
8+
9+
(s/def ::name (spec-or-ref string?))
10+
11+
(s/def ::dimension (s/keys :req [::name ::value]))
12+
13+
(s/def ::dimensions (s/coll-of ::dimension))
14+
15+
(s/def ::stat ::cloudwatch/statistic)
16+
17+
(def date-time-regex
18+
#"(19|20)[0-9][0-9]-(0[0-9]|1[0-2])-(0[1-9]|([12][0-9]|3[01]))T([01][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]")
19+
20+
(s/def ::date-time (spec-or-ref (s/and string? #(re-matches date-time-regex %))))
21+
22+
(s/def ::end-time ::date-time)
23+
24+
(s/def ::start-time ::date-time)
25+
26+
(s/def ::range (s/keys :req [::start-time ::end-time]))
27+
28+
(s/def ::ranges (s/coll-of ::range))
29+
30+
(s/def ::namespace (spec-or-ref string?))
31+
32+
(s/def ::metric-name (spec-or-ref string?))
33+
34+
(s/def ::excluded-time-ranges (spec-or-ref ::ranges))
35+
36+
(s/def ::metric-time-zone (spec-or-ref string?))
37+
38+
(s/def ::configuration (s/keys :opt [::excluded-time-ranges ::metric-time-zone]))
39+
40+
(s/def ::anomaly-detector (s/keys :req [::metric-name
41+
::namespace
42+
::stat]))
43+
44+
(defresource anomaly-detector "AWS::CloudWatch::AnomalyDetector" ::anomaly-detector)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"Type" : "AWS::CloudWatch::AnomalyDetector",
3+
"Properties" : {
4+
"Configuration" : {
5+
"ExcludedTimeRanges": [{
6+
"EndTime": "2019-07-01T23:59:59",
7+
"StartTime": "2019-07-01T23:59:59"
8+
}],
9+
"MetricTimeZone": "America/New_York"
10+
},
11+
"Dimensions" : [{
12+
"Name": "Memory",
13+
"Value": "UsedMemory"
14+
}],
15+
"MetricName" : "JvmMetric",
16+
"Namespace" : "AWSSDK/Java",
17+
"Stat" : "Average"
18+
}
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
(ns crucible.aws.cloudwatch.anomaly-detector-test
2+
(:require [cheshire.core :as json]
3+
[clojure.java.io :as io]
4+
[clojure.test :as t :refer :all]
5+
[crucible.assertion :refer [resource=]]
6+
[crucible.aws.cloudwatch.anomaly-detector :as ad]))
7+
8+
(deftest anomaly-detection-test
9+
(testing "encode"
10+
(is (resource=
11+
(json/decode (slurp (io/resource "aws/cloudwatch/anomaly_detector.json")))
12+
(ad/anomaly-detector
13+
{::ad/namespace "AWSSDK/Java"
14+
::ad/stat "Average"
15+
::ad/metric-name "JvmMetric"
16+
::ad/configuration
17+
{::ad/excluded-time-ranges
18+
[{::ad/end-time "2019-07-01T23:59:59"
19+
::ad/start-time "2019-07-01T23:59:59"}]
20+
::ad/metric-time-zone "America/New_York"}
21+
::ad/dimensions [{::ad/name "Memory"
22+
::ad/value "UsedMemory"}]})))))

0 commit comments

Comments
 (0)