dogwatch 1.0.3 → 1.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +2 -1
- data/.rubocop_todo.yml +9 -2
- data/README.md +16 -2
- data/lib/dogwatch/model/monitor.rb +3 -2
- data/lib/dogwatch/model/options.rb +28 -1
- data/lib/dogwatch/model/response.rb +4 -5
- data/lib/dogwatch/version.rb +2 -1
- data/test/dogwatch/test_client.rb +2 -2
- data/test/dogwatch/test_options.rb +22 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f80269f35dd247c32ccb1374d0eaedce141a7cc8
|
4
|
+
data.tar.gz: ed05ffaa074d3e0601ccf05a45d0ae7964b290f9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34e1af8b2a7dec826c40e73da89758d9ede5e58c7f36fab4764a304067ad9e5934ba7f1f643f1c1b325139cdd8ed28a2af0212335f9cffec9582ff9fd0edf331
|
7
|
+
data.tar.gz: 9219b3221a629b8d60f4ed27893057db5cd105e681a80aa508f7d98df847b765e77cda98ee5f3a39929c57534aa62bb304bf4c3fc8d91278850086eb1e62022c
|
data/.rubocop.yml
CHANGED
@@ -11,6 +11,7 @@ AllCops:
|
|
11
11
|
Exclude:
|
12
12
|
- example/**/*
|
13
13
|
- test/data/*
|
14
|
+
TargetRubyVersion: 2.2
|
14
15
|
|
15
16
|
Encoding:
|
16
17
|
Enabled: false
|
@@ -21,4 +22,4 @@ HashSyntax:
|
|
21
22
|
SpaceInsideStringInterpolation:
|
22
23
|
Enabled: false
|
23
24
|
DoubleNegation:
|
24
|
-
Enabled: false
|
25
|
+
Enabled: false
|
data/.rubocop_todo.yml
CHANGED
@@ -1,12 +1,19 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on
|
3
|
+
# on 2016-06-01 14:50:11 +0100 using RuboCop version 0.40.0.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
9
|
# Offense count: 4
|
10
|
-
# Configuration parameters: AllowURI, URISchemes.
|
10
|
+
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
|
11
|
+
# URISchemes: http, https
|
11
12
|
Metrics/LineLength:
|
12
13
|
Max: 90
|
14
|
+
|
15
|
+
# Offense count: 1
|
16
|
+
# Cop supports --auto-correct.
|
17
|
+
Performance/RedundantBlockCall:
|
18
|
+
Exclude:
|
19
|
+
- 'lib/dogwatch/dogfile.rb'
|
data/README.md
CHANGED
@@ -26,6 +26,8 @@ $ gem install dogwatch
|
|
26
26
|
Generate both an api key and an app key and either place them in a file named `~/.dogwatch/credentials` or pass them via the command line.
|
27
27
|
|
28
28
|
A sample credentials file is provided in the `example` directory.
|
29
|
+
|
30
|
+
In order to generate these keys, log into your Datadog account. From there, click on 'Integrations->APIs'. Keep in mind, your org may be allowed only five API Keys.
|
29
31
|
## Usage
|
30
32
|
|
31
33
|
DogWatch is a thin DSL over the [DataDog ruby client](https://github.com/DataDog/dogapi-rb) that handles generating DataDog monitors.
|
@@ -36,7 +38,7 @@ DogWatch.monitor do
|
|
36
38
|
## Create a new monitor - monitor name is REQUIRED
|
37
39
|
monitor 'MONITOR NAME' do
|
38
40
|
type :metric_alert # REQUIRED: One of [:metric_alert | :service_check | :event_alert]
|
39
|
-
query '
|
41
|
+
query 'time_aggr(time_window):space_aggr:metric{tags} [by {key}] operator' # REQUIRED
|
40
42
|
message 'MESSAGE'
|
41
43
|
tags %w(A list of tags to associate with your monitor)
|
42
44
|
|
@@ -52,6 +54,18 @@ DogWatch.monitor do
|
|
52
54
|
end
|
53
55
|
end
|
54
56
|
```
|
57
|
+
Queries are the combination of several items including a time aggregator (over a window of time), space aggregator (avg, sum, min, or max), a set of tags and an optional order by, and an operator.
|
58
|
+
|
59
|
+
From the Datadog documentation:
|
60
|
+
|
61
|
+
```
|
62
|
+
time_aggr(time_window):space_aggr:metric{tags} [by {key}] operator
|
63
|
+
```
|
64
|
+
An example of a query:
|
65
|
+
|
66
|
+
```
|
67
|
+
avg(last_15m):avg:system.disk.used{region:us-east-1,some-tag:some-tag-value,device:/dev/xvdb} by {cluster} * 100 > 55
|
68
|
+
```
|
55
69
|
|
56
70
|
Monitors that already exist are matched by name and updated accordingly. If the name isn't matched exactly, DogWatch assumes you want a new monitor.
|
57
71
|
|
@@ -61,4 +75,4 @@ For a full list of options and a description of each parameter, see [DataDog's A
|
|
61
75
|
|
62
76
|
## TO DO
|
63
77
|
* More descriptive errors
|
64
|
-
* Better error handling if a monitor fails local validation
|
78
|
+
* Better error handling if a monitor fails local validation
|
@@ -11,7 +11,7 @@ module DogWatch
|
|
11
11
|
metric_alert: 'metric alert',
|
12
12
|
service_check: 'service check',
|
13
13
|
event_alert: 'event alert'
|
14
|
-
}
|
14
|
+
}.freeze
|
15
15
|
|
16
16
|
attr_reader :name
|
17
17
|
attr_reader :attributes
|
@@ -26,6 +26,7 @@ module DogWatch
|
|
26
26
|
# @param [Symbol] type
|
27
27
|
# @return [String]
|
28
28
|
def type(type)
|
29
|
+
@monitor_type = type
|
29
30
|
@attributes.type = TYPE_MAP[type]
|
30
31
|
end
|
31
32
|
|
@@ -50,7 +51,7 @@ module DogWatch
|
|
50
51
|
# @param [Proc] block
|
51
52
|
# @return [Hash]
|
52
53
|
def options(&block)
|
53
|
-
opts = DogWatch::Model::Options.new
|
54
|
+
opts = DogWatch::Model::Options.new(@monitor_type)
|
54
55
|
opts.instance_eval(&block)
|
55
56
|
@attributes.options = opts.render
|
56
57
|
end
|
@@ -6,10 +6,19 @@ module DogWatch
|
|
6
6
|
# Handles the options block methods
|
7
7
|
##
|
8
8
|
class Options
|
9
|
+
MONITOR_TYPE_OPTIONS_MAP = {
|
10
|
+
:metric_alert => [:thresholds].freeze,
|
11
|
+
:service_check => [:thresholds].freeze
|
12
|
+
}.freeze
|
13
|
+
|
9
14
|
attr_reader :attributes
|
10
15
|
|
11
|
-
|
16
|
+
# @param [Symbol] monitor_type the monitor type of monitor these
|
17
|
+
# options belong to. This is used to validate monitor type
|
18
|
+
# specific options such as thresholds.
|
19
|
+
def initialize(monitor_type = nil)
|
12
20
|
@attributes = OpenStruct.new
|
21
|
+
@monitor_type = monitor_type
|
13
22
|
end
|
14
23
|
|
15
24
|
def render
|
@@ -55,6 +64,24 @@ module DogWatch
|
|
55
64
|
def include_tags(include = true)
|
56
65
|
@attributes.include_tags = !!include
|
57
66
|
end
|
67
|
+
|
68
|
+
# @param [Hash{String=>Fixnum}] thresholds
|
69
|
+
def thresholds(thresholds)
|
70
|
+
validate_monitor_type_specific_option!(:thresholds)
|
71
|
+
@attributes.thresholds = thresholds
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def validate_monitor_type_specific_option!(option)
|
77
|
+
options = Array(MONITOR_TYPE_OPTIONS_MAP[@monitor_type])
|
78
|
+
return true if options.include?(option)
|
79
|
+
|
80
|
+
# rubocop:disable Metrics/LineLength
|
81
|
+
message = "The #{@monitor_type.inspect} monitor type does not support #{option.inspect}."
|
82
|
+
message << " Did you mean one of #{options.join(', ')}?" if options.any?
|
83
|
+
raise NotImplementedError, message
|
84
|
+
end
|
58
85
|
end
|
59
86
|
end
|
60
87
|
end
|
@@ -8,14 +8,13 @@ module DogWatch
|
|
8
8
|
class Response
|
9
9
|
extend Mixin::Colorize
|
10
10
|
|
11
|
-
ERROR = '400'
|
12
|
-
CREATED = '200'
|
13
|
-
ACCEPTED = '202'
|
11
|
+
ERROR = '400'.freeze
|
12
|
+
CREATED = '200'.freeze
|
13
|
+
ACCEPTED = '202'.freeze
|
14
14
|
colorize(:action,
|
15
15
|
:green => [:created, :accepted, :updated],
|
16
16
|
:yellow => [],
|
17
|
-
:red => [:error]
|
18
|
-
)
|
17
|
+
:red => [:error])
|
19
18
|
|
20
19
|
attr_accessor :response
|
21
20
|
|
data/lib/dogwatch/version.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# nodoc
|
2
2
|
module DogWatch
|
3
3
|
VERSION = IO.read(File.expand_path('../../../VERSION', __FILE__)) rescue '0.0.1'
|
4
|
-
SUMMARY = 'A DSL to create DataDog Monitors'
|
4
|
+
SUMMARY = 'A DSL to create DataDog Monitors'.freeze
|
5
5
|
DESCRIPTION = 'DogWatch provides a simple method for creating DataDog monitors in Ruby.'
|
6
|
+
.freeze
|
6
7
|
end
|
@@ -13,7 +13,7 @@ class TestClient < Minitest::Test
|
|
13
13
|
type: 'metric alert',
|
14
14
|
query: 'test query'
|
15
15
|
]
|
16
|
-
]
|
16
|
+
].freeze
|
17
17
|
|
18
18
|
UPDATED_RESPONSE = [
|
19
19
|
'200',
|
@@ -22,7 +22,7 @@ class TestClient < Minitest::Test
|
|
22
22
|
type: :metric_alert,
|
23
23
|
query: 'scheduled maintenance query'
|
24
24
|
]
|
25
|
-
]
|
25
|
+
].freeze
|
26
26
|
|
27
27
|
def setup
|
28
28
|
config = DogWatch::Model::Config.new('foo', 'bar')
|
@@ -11,7 +11,7 @@ class TestOptions < Minitest::Test
|
|
11
11
|
escalation_message: 'foobar',
|
12
12
|
notify_audit: true,
|
13
13
|
include_tags: false
|
14
|
-
}
|
14
|
+
}.freeze
|
15
15
|
|
16
16
|
# rubocop:disable Metrics/AbcSize
|
17
17
|
def setup
|
@@ -78,4 +78,25 @@ class TestOptions < Minitest::Test
|
|
78
78
|
assert_equal OPTS, @options.render
|
79
79
|
assert_kind_of Hash, @options.render
|
80
80
|
end
|
81
|
+
|
82
|
+
def test_invalid_monitor_type_specific_option
|
83
|
+
@options = DogWatch::Model::Options.new(:event_alert)
|
84
|
+
|
85
|
+
assert_raises NotImplementedError do
|
86
|
+
@options.thresholds('critical' => 90, 'warning' => 80)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_valid_monitor_type_specific_option
|
91
|
+
@options = DogWatch::Model::Options.new(:metric_alert)
|
92
|
+
|
93
|
+
@options.thresholds('critical' => 90, 'warning' => 80)
|
94
|
+
|
95
|
+
actual = @options.attributes.thresholds
|
96
|
+
assert_includes actual, 'critical'
|
97
|
+
assert_equal actual['critical'], 90
|
98
|
+
|
99
|
+
assert_includes actual, 'warning'
|
100
|
+
assert_equal actual['warning'], 80
|
101
|
+
end
|
81
102
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dogwatch
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Greene
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-06-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: dogapi
|