kennel 1.52.0 → 1.55.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Readme.md +24 -13
- data/lib/kennel/models/monitor.rb +3 -3
- data/lib/kennel/models/project.rb +2 -2
- data/lib/kennel/models/team.rb +3 -11
- data/lib/kennel/tasks.rb +30 -0
- data/lib/kennel/version.rb +1 -1
- data/template/Readme.md +21 -13
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e23afaba22ded8b1fb654a9552ed135247cb3a9a5c5610090bfa9096123ffb4
|
4
|
+
data.tar.gz: 7e4096a43a6fcd52f519131c2238879f2eb551d90c5883a9d5e1e8996f90075c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bb7d4a1e6f48f645e220169bcabac5ae8fed56f01033a63be6ea855e5308e62ec3d31a4c9326823d99e973d85056f1151a1924ae33ced07b620224b1e716eb8b
|
7
|
+
data.tar.gz: 7bb59bc7ca8bd3b024903c61bdc11c4f816d9fca0fc666cae36dcdb6258d660608ba6cfe16ccbf1877957c54eb9e9feda437055d44fe4f5a3e0abe701623680d
|
data/Readme.md
CHANGED
@@ -42,19 +42,23 @@ Keep datadog monitors/dashboards/etc in version control, avoid chaotic managemen
|
|
42
42
|
- `gem install bundler && bundle install`
|
43
43
|
- `cp .env.example .env`
|
44
44
|
- open [Datadog API Settings](https://app.datadoghq.com/account/settings#api)
|
45
|
-
- find or create your personal "Application Key" and add it to `.env` as `DATADOG_APP_KEY=` (will be on the last page if new)
|
46
45
|
- copy any `API Key` and add it to `.env` as `DATADOG_API_KEY`
|
46
|
+
- find or create (check last page) your personal "Application Key" and add it to `.env` as `DATADOG_APP_KEY=`
|
47
|
+
- change the `DATADOG_SUBDOMAIN=app` in `.env` to your companies subdomain if you have one
|
47
48
|
-->
|
48
49
|
|
49
50
|
### Adding a team
|
50
51
|
|
52
|
+
- `mention` is used for all team monitors via `super()`
|
53
|
+
- `renotify_interval` is used for all team monitors (defaults to `0` / off)
|
54
|
+
- `tags` is used for all team monitors/dashboards (defaults to `team:<team-name>`)
|
55
|
+
|
51
56
|
```Ruby
|
52
57
|
# teams/my_team.rb
|
53
58
|
module Teams
|
54
59
|
class MyTeam < Kennel::Models::Team
|
55
60
|
defaults(
|
56
|
-
|
57
|
-
email: -> { "my-team@example.com" }
|
61
|
+
mention: -> { "@slack-my-team" }
|
58
62
|
)
|
59
63
|
end
|
60
64
|
end
|
@@ -62,13 +66,14 @@ end
|
|
62
66
|
|
63
67
|
### Adding a new monitor
|
64
68
|
- use [datadog monitor UI](https://app.datadoghq.com/monitors#create/metric) to create a monitor
|
65
|
-
- get the `id` from the url
|
66
|
-
- `RESOURCE=monitor ID=12345 bundle exec rake kennel:import`
|
67
69
|
- see below
|
68
70
|
|
69
71
|
### Updating an existing monitor
|
72
|
+
- use [datadog monitor UI](https://app.datadoghq.com/monitors#create/metric) to find a monitor
|
73
|
+
- get the `id` from the url
|
74
|
+
- run `RESOURCE=monitor ID=12345 bundle exec rake kennel:import` and copy the output
|
70
75
|
- find or create a project in `projects/`
|
71
|
-
- add
|
76
|
+
- add the monitor to `parts: [` list, for example:
|
72
77
|
```Ruby
|
73
78
|
# projects/my_project.rb
|
74
79
|
class MyProject < Kennel::Models::Project
|
@@ -83,7 +88,8 @@ end
|
|
83
88
|
kennel_id: -> { "load-too-high" }, # make up a unique name
|
84
89
|
name: -> { "Foobar Load too high" }, # nice descriptive name that will show up in alerts and emails
|
85
90
|
message: -> {
|
86
|
-
# Explain what behavior to expect and how to fix the cause
|
91
|
+
# Explain what behavior to expect and how to fix the cause
|
92
|
+
# Use #{super()} to add team notifications.
|
87
93
|
<<~TEXT
|
88
94
|
Foobar will be slow and that could cause Barfoo to go down.
|
89
95
|
Add capacity or debug why it is suddenly slow.
|
@@ -98,21 +104,22 @@ end
|
|
98
104
|
)
|
99
105
|
end
|
100
106
|
```
|
101
|
-
- `bundle exec rake plan
|
102
|
-
- alternatively: `bundle exec rake generate` to only update the generated `json` files
|
107
|
+
- run `PROJECT=my_project bundle exec rake plan`, an Update to the existing monitor should be shown (not Create / Delete)
|
108
|
+
- alternatively: `bundle exec rake generate` to only locally update the generated `json` files
|
103
109
|
- review changes then `git commit`
|
104
110
|
- make a PR ... get reviewed ... merge
|
105
111
|
- datadog is updated by travis
|
106
112
|
|
107
113
|
### Adding a new dashboard
|
108
114
|
- go to [datadog dashboard UI](https://app.datadoghq.com/dashboard/lists) and click on _New Dashboard_ to create a dashboard
|
109
|
-
- get the `id` from the url
|
110
|
-
- `RESOURCE=dashboard ID=abc-def-ghi bundle exec rake kennel:import`
|
111
115
|
- see below
|
112
116
|
|
113
117
|
### Updating an existing dashboard
|
118
|
+
- go to [datadog dashboard UI](https://app.datadoghq.com/dashboard/lists) and click on _New Dashboard_ to find a dashboard
|
119
|
+
- get the `id` from the url
|
120
|
+
- run `RESOURCE=dashboard ID=abc-def-ghi bundle exec rake kennel:import` and copy the output
|
114
121
|
- find or create a project in `projects/`
|
115
|
-
- add a dashboard to `parts: [` list
|
122
|
+
- add a dashboard to `parts: [` list, for example:
|
116
123
|
```Ruby
|
117
124
|
class MyProject < Kennel::Models::Project
|
118
125
|
defaults(
|
@@ -172,6 +179,10 @@ To link to existing monitors via their kennel_id
|
|
172
179
|
|
173
180
|
Run `rake kennel:alerts TAG=service:my-service` to see all un-muted alerts for a given datadog monitor tag.
|
174
181
|
|
182
|
+
### Validating mentions work
|
183
|
+
|
184
|
+
`rake kennel:validate_mentions` should run as part of CI
|
185
|
+
|
175
186
|
## Examples
|
176
187
|
|
177
188
|
### Reusable monitors/dashes/etc
|
@@ -196,7 +207,7 @@ Reuse it in multiple projects.
|
|
196
207
|
```Ruby
|
197
208
|
class Database < Kennel::Models::Project
|
198
209
|
defaults(
|
199
|
-
team: -> { Kennel::Models::Team.new(
|
210
|
+
team: -> { Kennel::Models::Team.new(mention: -> { '@slack-foo' }, kennel_id: -> { 'foo' }) },
|
200
211
|
parts: -> { [Monitors::LoadTooHigh.new(self, critical: -> { 13 })] }
|
201
212
|
)
|
202
213
|
end
|
@@ -15,7 +15,7 @@ module Kennel
|
|
15
15
|
evaluation_delay: nil,
|
16
16
|
new_host_delay: 300,
|
17
17
|
timeout_h: 0,
|
18
|
-
renotify_interval:
|
18
|
+
renotify_interval: 0,
|
19
19
|
no_data_timeframe: nil # this works out ok since if notify_no_data is on, it would never be nil
|
20
20
|
}.freeze
|
21
21
|
DEFAULT_ESCALATION_MESSAGE = ["", nil].freeze
|
@@ -27,9 +27,9 @@ module Kennel
|
|
27
27
|
)
|
28
28
|
|
29
29
|
defaults(
|
30
|
-
message: -> { "\n\n
|
30
|
+
message: -> { "\n\n#{project.mention}" },
|
31
31
|
escalation_message: -> { DEFAULT_ESCALATION_MESSAGE.first },
|
32
|
-
renotify_interval: -> {
|
32
|
+
renotify_interval: -> { project.team.renotify_interval },
|
33
33
|
warning: -> { nil },
|
34
34
|
ok: -> { nil },
|
35
35
|
id: -> { nil },
|
@@ -2,10 +2,10 @@
|
|
2
2
|
module Kennel
|
3
3
|
module Models
|
4
4
|
class Project < Base
|
5
|
-
settings :team, :parts, :tags, :
|
5
|
+
settings :team, :parts, :tags, :mention
|
6
6
|
defaults(
|
7
7
|
tags: -> { ["service:#{kennel_id}"] + team.tags },
|
8
|
-
|
8
|
+
mention: -> { team.mention }
|
9
9
|
)
|
10
10
|
|
11
11
|
def self.file_location
|
data/lib/kennel/models/team.rb
CHANGED
@@ -2,19 +2,11 @@
|
|
2
2
|
module Kennel
|
3
3
|
module Models
|
4
4
|
class Team < Base
|
5
|
-
settings :
|
5
|
+
settings :mention, :tags, :renotify_interval, :kennel_id
|
6
6
|
defaults(
|
7
|
-
tags: -> { ["team:#{kennel_id.sub(/^teams_/, "")}"] }
|
7
|
+
tags: -> { ["team:#{kennel_id.sub(/^teams_/, "")}"] },
|
8
|
+
renotify_interval: -> { 0 }
|
8
9
|
)
|
9
|
-
|
10
|
-
def initialize(*)
|
11
|
-
super
|
12
|
-
invalid! "remove leading # from slack" if slack.to_s.start_with?("#")
|
13
|
-
end
|
14
|
-
|
15
|
-
def tracking_id
|
16
|
-
kennel_id
|
17
|
-
end
|
18
10
|
end
|
19
11
|
end
|
20
12
|
end
|
data/lib/kennel/tasks.rb
CHANGED
@@ -12,6 +12,36 @@ namespace :kennel do
|
|
12
12
|
abort "Error during diffing" unless $CHILD_STATUS.success?
|
13
13
|
end
|
14
14
|
|
15
|
+
# ideally do this on every run, but it's slow (~1.5s) and brittle (might not find all + might find false-positives)
|
16
|
+
# https://help.datadoghq.com/hc/en-us/requests/254114 for automatic validation
|
17
|
+
desc "Verify that all used monitor mentions are valid"
|
18
|
+
task validate_mentions: :environment do
|
19
|
+
known = Kennel.send(:api)
|
20
|
+
.send(:request, :get, "/monitor/notifications")
|
21
|
+
.fetch(:handles)
|
22
|
+
.values
|
23
|
+
.flatten(1)
|
24
|
+
.map { |v| v.fetch(:value) }
|
25
|
+
|
26
|
+
known += ENV["KNOWN"].to_s.split(",")
|
27
|
+
|
28
|
+
bad = []
|
29
|
+
Dir["generated/**/*.json"].each do |f|
|
30
|
+
next unless message = JSON.parse(File.read(f))["message"]
|
31
|
+
used = message.scan(/\s(@[^\s{,'"]+)/).flatten(1)
|
32
|
+
.grep(/^@.*@|^@.*-/) # ignore @here etc handles ... datadog uses @foo@bar.com for emails and @foo-bar for integrations
|
33
|
+
(used - known).each { |v| bad << [f, v] }
|
34
|
+
end
|
35
|
+
|
36
|
+
if bad.any?
|
37
|
+
subdomain = ENV["DATADOG_SUBDOMAIN"]
|
38
|
+
url = (subdomain ? "https://zendesk.datadoghq.com" : "") + "/account/settings"
|
39
|
+
puts "Invalid mentions found, either ignore them by adding to `KNOWN` env var or add them via #{url}"
|
40
|
+
bad.each { |f, v| puts "Invalid mention #{v} in monitor message of #{f}" }
|
41
|
+
abort
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
15
45
|
desc "generate local definitions"
|
16
46
|
task generate: :environment do
|
17
47
|
Kennel.generate
|
data/lib/kennel/version.rb
CHANGED
data/template/Readme.md
CHANGED
@@ -25,18 +25,22 @@ Keep datadog monitors/dashboards/etc in version control, avoid chaotic managemen
|
|
25
25
|
- `gem install bundler && bundle install`
|
26
26
|
- `cp .env.example .env`
|
27
27
|
- open [Datadog API Settings](https://app.datadoghq.com/account/settings#api)
|
28
|
-
- find or create your personal "Application Key" and add it to `.env` as `DATADOG_APP_KEY=` (will be on the last page if new)
|
29
28
|
- copy any `API Key` and add it to `.env` as `DATADOG_API_KEY`
|
29
|
+
- find or create (check last page) your personal "Application Key" and add it to `.env` as `DATADOG_APP_KEY=`
|
30
|
+
- change the `DATADOG_SUBDOMAIN=app` in `.env` to your companies subdomain if you have one
|
30
31
|
|
31
32
|
### Adding a team
|
32
33
|
|
34
|
+
- `mention` is used for all team monitors via `super()`
|
35
|
+
- `renotify_interval` is used for all team monitors (defaults to `0` / off)
|
36
|
+
- `tags` is used for all team monitors/dashboards (defaults to `team:<team-name>`)
|
37
|
+
|
33
38
|
```Ruby
|
34
39
|
# teams/my_team.rb
|
35
40
|
module Teams
|
36
41
|
class MyTeam < Kennel::Models::Team
|
37
42
|
defaults(
|
38
|
-
|
39
|
-
email: -> { "my-team@example.com" }
|
43
|
+
mention: -> { "@slack-my-team" }
|
40
44
|
)
|
41
45
|
end
|
42
46
|
end
|
@@ -44,13 +48,14 @@ end
|
|
44
48
|
|
45
49
|
### Adding a new monitor
|
46
50
|
- use [datadog monitor UI](https://app.datadoghq.com/monitors#create/metric) to create a monitor
|
47
|
-
- get the `id` from the url
|
48
|
-
- `RESOURCE=monitor ID=12345 bundle exec rake kennel:import`
|
49
51
|
- see below
|
50
52
|
|
51
53
|
### Updating an existing monitor
|
54
|
+
- use [datadog monitor UI](https://app.datadoghq.com/monitors#create/metric) to find a monitor
|
55
|
+
- get the `id` from the url
|
56
|
+
- run `RESOURCE=monitor ID=12345 bundle exec rake kennel:import` and copy the output
|
52
57
|
- find or create a project in `projects/`
|
53
|
-
- add
|
58
|
+
- add the monitor to `parts: [` list, for example:
|
54
59
|
```Ruby
|
55
60
|
# projects/my_project.rb
|
56
61
|
class MyProject < Kennel::Models::Project
|
@@ -65,7 +70,8 @@ end
|
|
65
70
|
kennel_id: -> { "load-too-high" }, # make up a unique name
|
66
71
|
name: -> { "Foobar Load too high" }, # nice descriptive name that will show up in alerts and emails
|
67
72
|
message: -> {
|
68
|
-
# Explain what behavior to expect and how to fix the cause
|
73
|
+
# Explain what behavior to expect and how to fix the cause
|
74
|
+
# Use #{super()} to add team notifications.
|
69
75
|
<<~TEXT
|
70
76
|
Foobar will be slow and that could cause Barfoo to go down.
|
71
77
|
Add capacity or debug why it is suddenly slow.
|
@@ -80,21 +86,22 @@ end
|
|
80
86
|
)
|
81
87
|
end
|
82
88
|
```
|
83
|
-
- `bundle exec rake plan
|
84
|
-
- alternatively: `bundle exec rake generate` to only update the generated `json` files
|
89
|
+
- run `PROJECT=my_project bundle exec rake plan`, an Update to the existing monitor should be shown (not Create / Delete)
|
90
|
+
- alternatively: `bundle exec rake generate` to only locally update the generated `json` files
|
85
91
|
- review changes then `git commit`
|
86
92
|
- make a PR ... get reviewed ... merge
|
87
93
|
- datadog is updated by travis
|
88
94
|
|
89
95
|
### Adding a new dashboard
|
90
96
|
- go to [datadog dashboard UI](https://app.datadoghq.com/dashboard/lists) and click on _New Dashboard_ to create a dashboard
|
91
|
-
- get the `id` from the url
|
92
|
-
- `RESOURCE=dashboard ID=abc-def-ghi bundle exec rake kennel:import`
|
93
97
|
- see below
|
94
98
|
|
95
99
|
### Updating an existing dashboard
|
100
|
+
- go to [datadog dashboard UI](https://app.datadoghq.com/dashboard/lists) and click on _New Dashboard_ to find a dashboard
|
101
|
+
- get the `id` from the url
|
102
|
+
- run `RESOURCE=dashboard ID=abc-def-ghi bundle exec rake kennel:import` and copy the output
|
96
103
|
- find or create a project in `projects/`
|
97
|
-
- add a dashboard to `parts: [` list
|
104
|
+
- add a dashboard to `parts: [` list, for example:
|
98
105
|
```Ruby
|
99
106
|
class MyProject < Kennel::Models::Project
|
100
107
|
defaults(
|
@@ -142,6 +149,7 @@ To link to existing monitors via their kennel_id
|
|
142
149
|
|
143
150
|
- Screens `uptime` widgets can use `monitor: {id: "foo:bar"}`
|
144
151
|
- Screens `alert_graph` widgets can use `alert_id: "foo:bar"`
|
152
|
+
- Monitors `composite` can use `query: -> { "%{foo:bar} || %{foo:baz}" }`
|
145
153
|
|
146
154
|
### Debugging changes locally
|
147
155
|
|
@@ -177,7 +185,7 @@ Reuse it in multiple projects.
|
|
177
185
|
```Ruby
|
178
186
|
class Database < Kennel::Models::Project
|
179
187
|
defaults(
|
180
|
-
team: -> { Kennel::Models::Team.new(
|
188
|
+
team: -> { Kennel::Models::Team.new(mention: -> { '@slack-foo' }, kennel_id: -> { 'foo' }) },
|
181
189
|
parts: -> { [Monitors::LoadTooHigh.new(self, critical: -> { 13 })] }
|
182
190
|
)
|
183
191
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kennel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.55.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Grosser
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-09-
|
11
|
+
date: 2019-09-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|