lita-datadog 0.9.0 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rspec +1 -0
- data/.travis.yml +3 -3
- data/README.md +14 -0
- data/lib/lita-datadog.rb +2 -0
- data/lib/lita/handlers/datadog.rb +42 -50
- data/lib/lita/helpers/graphs.rb +18 -0
- data/lib/lita/helpers/utilities.rb +78 -0
- data/lita-datadog.gemspec +4 -4
- data/locales/en.yml +11 -1
- data/spec/lita/handlers/datadog_spec.rb +48 -20
- data/spec/spec_helper.rb +17 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e93b235ba1458b7bafd84b79fc69a0dacd5b4da
|
4
|
+
data.tar.gz: fe1a7a633fab19e2720c502c781ac26b5e7e12d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7f2bfd6595bee7e7684856418e1bd8d5e7f2a98125c21068c88c9cb5e64b10938593964a7b87ab12a791ab23c496a99e2771e2807e7a1ec881821248e9de162
|
7
|
+
data.tar.gz: d029ea15a656fd46da382aee1cbd008b10ccf63bee0d3600d1d60f16b25828d8d4716209214bef96b31ecbcc6fef9e3009c6306eb582cc8a43209463b49c1fb2
|
data/.gitignore
CHANGED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color --profile 5
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -81,6 +81,20 @@ to:"<time description>"
|
|
81
81
|
|
82
82
|
Time descriptions are parsed by https://github.com/mojombo/chronic
|
83
83
|
|
84
|
+
### Muting
|
85
|
+
|
86
|
+
Muting a host:
|
87
|
+
|
88
|
+
```
|
89
|
+
Lita dd mute <hostname> [message:"Some reason"]
|
90
|
+
```
|
91
|
+
|
92
|
+
Unmuting a host:
|
93
|
+
|
94
|
+
```
|
95
|
+
Lita dd unmute <hostname>
|
96
|
+
```
|
97
|
+
|
84
98
|
## License
|
85
99
|
|
86
100
|
[MIT](http://opensource.org/licenses/MIT)
|
data/lib/lita-datadog.rb
CHANGED
@@ -6,68 +6,60 @@ module Lita
|
|
6
6
|
config :timerange, default: 3600
|
7
7
|
config :waittime, default: 0
|
8
8
|
|
9
|
+
include Lita::Helpers::Utilities
|
10
|
+
include Lita::Helpers::Graphs
|
11
|
+
|
9
12
|
route(
|
10
|
-
/^graph\s(
|
13
|
+
/^graph\s(?<args>.*)$/,
|
11
14
|
:graph,
|
12
15
|
command: true,
|
13
|
-
help: {
|
16
|
+
help: {
|
17
|
+
t('help.graph.syntax') => t('help.graph.desc')
|
18
|
+
}
|
14
19
|
)
|
15
20
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
21
|
+
route(
|
22
|
+
/^dd\smute\s(?<hostname>\S*)(\smessage:"(?<message>.*)")?$/,
|
23
|
+
:mute,
|
24
|
+
command: true,
|
25
|
+
help: {
|
26
|
+
t('help.mute.syntax') => t('help.mute.desc')
|
27
|
+
}
|
28
|
+
)
|
20
29
|
|
21
|
-
|
30
|
+
route(
|
31
|
+
/^dd\sunmute\s(?<hostname>\S*)$/,
|
32
|
+
:unmute,
|
33
|
+
command: true,
|
34
|
+
help: {
|
35
|
+
t('help.unmute.syntax') => t('help.unmute.desc')
|
36
|
+
}
|
37
|
+
)
|
22
38
|
|
23
|
-
def
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
args[:event])
|
39
|
+
def graph(response)
|
40
|
+
content = snapshot(parse_arguments(response.match_data['args']))
|
41
|
+
response.reply(content)
|
42
|
+
end
|
28
43
|
|
29
|
-
|
30
|
-
|
31
|
-
|
44
|
+
def mute(response)
|
45
|
+
hostname = response.match_data['hostname']
|
46
|
+
message = response.match_data['message']
|
47
|
+
args = {}
|
48
|
+
args['message'] = message unless message.nil?
|
49
|
+
if mute_host(hostname, args)
|
50
|
+
response.reply(t('mute.success', host: hostname))
|
32
51
|
else
|
33
|
-
t('errors.request')
|
52
|
+
response.reply(t('errors.request'))
|
34
53
|
end
|
35
54
|
end
|
36
55
|
|
37
|
-
def
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
def parse_arguments(arg_string)
|
46
|
-
end_ts = parse_end(arg_string)
|
47
|
-
start_ts = parse_start(arg_string, end_ts)
|
48
|
-
metric = parse_metric(arg_string)
|
49
|
-
event = parse_event(arg_string)
|
50
|
-
{ metric: metric, start: start_ts, end: end_ts, event: event }
|
51
|
-
end
|
52
|
-
|
53
|
-
def parse_end(string)
|
54
|
-
found = /(to|end):"(.+?)"/.match(string)
|
55
|
-
found ? Chronic.parse(found[2]).to_i : Time.now.to_i
|
56
|
-
end
|
57
|
-
|
58
|
-
def parse_start(string, end_ts)
|
59
|
-
found = /(from|start):"(.+?)"/.match(string)
|
60
|
-
found ? Chronic.parse(found[2]).to_i : end_ts - config.timerange
|
61
|
-
end
|
62
|
-
|
63
|
-
def parse_metric(string)
|
64
|
-
found = /metric:"(.+?)"/.match(string)
|
65
|
-
found ? found[1] : 'system.load.1{*}'
|
66
|
-
end
|
67
|
-
|
68
|
-
def parse_event(string)
|
69
|
-
found = /event:"(.+?)"/.match(string)
|
70
|
-
found ? found[1] : ''
|
56
|
+
def unmute(response)
|
57
|
+
hostname = response.match_data['hostname']
|
58
|
+
if unmute_host(hostname)
|
59
|
+
response.reply(t('unmute.success', host: hostname))
|
60
|
+
else
|
61
|
+
response.reply(t('errors.request'))
|
62
|
+
end
|
71
63
|
end
|
72
64
|
end
|
73
65
|
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Lita
|
2
|
+
module Helpers
|
3
|
+
# Helpers for different ways to generate a graph
|
4
|
+
module Graphs
|
5
|
+
def snapshot(args)
|
6
|
+
url = get_graph_url(args[:metric],
|
7
|
+
args[:start],
|
8
|
+
args[:end],
|
9
|
+
args[:event])
|
10
|
+
|
11
|
+
return t('errors.request') if url.nil?
|
12
|
+
# NOTE: Is this still needed?
|
13
|
+
sleep config.waittime
|
14
|
+
url['snapshot_url']
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
module Lita
|
2
|
+
module Helpers
|
3
|
+
# Helpers to go alongside fetching & parsing things
|
4
|
+
module Utilities
|
5
|
+
def mute_host(hostname, args)
|
6
|
+
client = Dogapi::Client.new(config.api_key, config.application_key)
|
7
|
+
return false unless client
|
8
|
+
|
9
|
+
return_code, contents = client.mute_host(hostname, args)
|
10
|
+
|
11
|
+
if return_code.to_s != '200'
|
12
|
+
log.warning("URL (#{return_code}): #{contents['errors'].join('\n')}")
|
13
|
+
return false
|
14
|
+
end
|
15
|
+
|
16
|
+
true
|
17
|
+
end
|
18
|
+
|
19
|
+
def unmute_host(hostname)
|
20
|
+
client = Dogapi::Client.new(config.api_key, config.application_key)
|
21
|
+
return false unless client
|
22
|
+
|
23
|
+
return_code, contents = client.unmute_host(hostname)
|
24
|
+
|
25
|
+
if return_code.to_s != '200'
|
26
|
+
log.warning("URL (#{return_code}): #{contents['errors'].join('\n')}")
|
27
|
+
return false
|
28
|
+
end
|
29
|
+
|
30
|
+
true
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_graph_url(metric_query, start_ts, end_ts, event_query)
|
34
|
+
client = Dogapi::Client.new(config.api_key, config.application_key)
|
35
|
+
|
36
|
+
return nil unless client
|
37
|
+
|
38
|
+
return_code, contents = client.graph_snapshot(metric_query, start_ts,
|
39
|
+
end_ts, event_query)
|
40
|
+
|
41
|
+
if return_code.to_s != '200'
|
42
|
+
log.warning("URL (#{return_code}): #{contents['errors'].join('\n')}")
|
43
|
+
return nil
|
44
|
+
end
|
45
|
+
|
46
|
+
contents
|
47
|
+
end
|
48
|
+
|
49
|
+
def parse_arguments(arg_string)
|
50
|
+
end_ts = parse_end(arg_string)
|
51
|
+
start_ts = parse_start(arg_string, end_ts)
|
52
|
+
metric = parse_metric(arg_string)
|
53
|
+
event = parse_event(arg_string)
|
54
|
+
{ metric: metric, start: start_ts, end: end_ts, event: event }
|
55
|
+
end
|
56
|
+
|
57
|
+
def parse_end(string)
|
58
|
+
found = /(to|end):"(.+?)"/.match(string)
|
59
|
+
found ? Chronic.parse(found[2]).to_i : Time.now.to_i
|
60
|
+
end
|
61
|
+
|
62
|
+
def parse_start(string, end_ts)
|
63
|
+
found = /(from|start):"(.+?)"/.match(string)
|
64
|
+
found ? Chronic.parse(found[2]).to_i : end_ts - config.timerange
|
65
|
+
end
|
66
|
+
|
67
|
+
def parse_metric(string)
|
68
|
+
found = /metric:"(.+?)"/.match(string)
|
69
|
+
found ? found[1] : 'system.load.1{*}'
|
70
|
+
end
|
71
|
+
|
72
|
+
def parse_event(string)
|
73
|
+
found = /event:"(.+?)"/.match(string)
|
74
|
+
found ? found[1] : ''
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
data/lita-datadog.gemspec
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = 'lita-datadog'
|
3
|
-
spec.version = '0.
|
3
|
+
spec.version = '0.10.0'
|
4
4
|
spec.authors = ['Eric Sigler']
|
5
5
|
spec.email = ['me@esigler.com']
|
6
6
|
spec.description = 'A Datadog plugin for Lita'
|
7
|
-
spec.summary =
|
7
|
+
spec.summary = spec.description
|
8
8
|
spec.homepage = 'http://github.com/esigler/lita-datadog'
|
9
9
|
spec.license = 'MIT'
|
10
10
|
spec.metadata = { 'lita_plugin_type' => 'handler' }
|
11
11
|
|
12
12
|
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
13
|
-
spec.executables = spec.files.grep(
|
14
|
-
spec.test_files = spec.files.grep(
|
13
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
14
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
15
|
spec.require_paths = ['lib']
|
16
16
|
|
17
17
|
spec.add_runtime_dependency 'lita', '>= 4.0'
|
data/locales/en.yml
CHANGED
@@ -3,8 +3,18 @@ en:
|
|
3
3
|
handlers:
|
4
4
|
datadog:
|
5
5
|
errors:
|
6
|
-
request: Error
|
6
|
+
request: Error making DataDog request
|
7
7
|
help:
|
8
8
|
graph:
|
9
9
|
syntax: 'graph metric:"simple.metric.1{*},simple.metric.5{*}'
|
10
10
|
desc: 'Graph those metrics, for the default time range'
|
11
|
+
mute:
|
12
|
+
syntax: 'dd mute <hostname> [message:"Some reason"]'
|
13
|
+
desc: 'Mute a host in DataDog, optionally with a message'
|
14
|
+
unmute:
|
15
|
+
syntax: 'dd unmute <hostname>'
|
16
|
+
desc: 'Unmute a host in DataDog'
|
17
|
+
mute:
|
18
|
+
success: "Host %{host} muted"
|
19
|
+
unmute:
|
20
|
+
success: "Host %{host} unmuted"
|
@@ -1,20 +1,28 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Lita::Handlers::Datadog, lita_handler: true do
|
4
|
-
EXAMPLE_IMAGE_URL = 'http://www.example.com/path/that/ends/in.png'
|
5
|
-
EXAMPLE_ERROR_MSG = 'Error
|
4
|
+
EXAMPLE_IMAGE_URL = 'http://www.example.com/path/that/ends/in.png'.freeze
|
5
|
+
EXAMPLE_ERROR_MSG = 'Error making DataDog request'.freeze
|
6
6
|
|
7
7
|
let(:success) do
|
8
8
|
client = double
|
9
9
|
allow(client).to receive(:graph_snapshot) {
|
10
10
|
[200, { 'snapshot_url' => EXAMPLE_IMAGE_URL }]
|
11
11
|
}
|
12
|
+
allow(client).to receive(:mute_host) {
|
13
|
+
[200, { 'hostname' => 'host01' }]
|
14
|
+
}
|
15
|
+
allow(client).to receive(:unmute_host) {
|
16
|
+
[200, { 'hostname' => 'host01' }]
|
17
|
+
}
|
12
18
|
client
|
13
19
|
end
|
14
20
|
|
15
21
|
let(:error) do
|
16
22
|
client = double
|
17
|
-
allow(client).to receive(:graph_snapshot) { [500, {}] }
|
23
|
+
allow(client).to receive(:graph_snapshot) { [500, { 'errors' => ['foo'] }] }
|
24
|
+
allow(client).to receive(:mute_host) { [500, { 'errors' => ['foo'] }] }
|
25
|
+
allow(client).to receive(:unmute_host) { [500, { 'errors' => ['foo'] }] }
|
18
26
|
client
|
19
27
|
end
|
20
28
|
|
@@ -31,24 +39,10 @@ describe Lita::Handlers::Datadog, lita_handler: true do
|
|
31
39
|
is_expected.to route_command(
|
32
40
|
'graph metric:"system.load.1{*}" event:"sources:something"')
|
33
41
|
.to(:graph)
|
34
|
-
end
|
35
|
-
|
36
|
-
describe '.default_config' do
|
37
|
-
it 'sets the api_key to nil' do
|
38
|
-
expect(Lita.config.handlers.datadog.api_key).to be_nil
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'sets the application_key to nil' do
|
42
|
-
expect(Lita.config.handlers.datadog.application_key).to be_nil
|
43
|
-
end
|
44
42
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
it 'sets the waittime to 0' do
|
50
|
-
expect(Lita.config.handlers.datadog.waittime).to eq(0)
|
51
|
-
end
|
43
|
+
is_expected.to route_command('dd mute host01').to(:mute)
|
44
|
+
is_expected.to route_command('dd mute host01 message:"Foo Bar"').to(:mute)
|
45
|
+
is_expected.to route_command('dd unmute host01')
|
52
46
|
end
|
53
47
|
|
54
48
|
describe '#graph' do
|
@@ -82,4 +76,38 @@ describe Lita::Handlers::Datadog, lita_handler: true do
|
|
82
76
|
expect(replies.last).to eq(EXAMPLE_ERROR_MSG)
|
83
77
|
end
|
84
78
|
end
|
79
|
+
|
80
|
+
describe '#mute' do
|
81
|
+
it 'mutes a hostname' do
|
82
|
+
expect(Dogapi::Client).to receive(:new) { success }
|
83
|
+
send_command('dd mute host01')
|
84
|
+
expect(replies.last).to eq('Host host01 muted')
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'mutes a hostname with a message' do
|
88
|
+
expect(Dogapi::Client).to receive(:new) { success }
|
89
|
+
send_command('dd mute host01 message:"Foo Bar"')
|
90
|
+
expect(replies.last).to eq('Host host01 muted')
|
91
|
+
end
|
92
|
+
|
93
|
+
it 'reports an error if there was a problem with the request' do
|
94
|
+
expect(Dogapi::Client).to receive(:new) { error }
|
95
|
+
send_command('dd mute host01')
|
96
|
+
expect(replies.last).to eq(EXAMPLE_ERROR_MSG)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '#unmute' do
|
101
|
+
it 'unmutes a hostname' do
|
102
|
+
expect(Dogapi::Client).to receive(:new) { success }
|
103
|
+
send_command('dd unmute host01')
|
104
|
+
expect(replies.last).to eq('Host host01 unmuted')
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'reports an error if there was a problem with the request' do
|
108
|
+
expect(Dogapi::Client).to receive(:new) { error }
|
109
|
+
send_command('dd unmute host01')
|
110
|
+
expect(replies.last).to eq(EXAMPLE_ERROR_MSG)
|
111
|
+
end
|
112
|
+
end
|
85
113
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -10,3 +10,20 @@ require 'lita-datadog'
|
|
10
10
|
require 'lita/rspec'
|
11
11
|
|
12
12
|
Lita.version_3_compatibility_mode = false
|
13
|
+
|
14
|
+
RSpec.configure do |config|
|
15
|
+
config.expect_with :rspec do |expectations|
|
16
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
17
|
+
end
|
18
|
+
|
19
|
+
config.mock_with :rspec do |mocks|
|
20
|
+
mocks.verify_partial_doubles = true
|
21
|
+
end
|
22
|
+
|
23
|
+
config.filter_run :focus
|
24
|
+
config.run_all_when_everything_filtered = true
|
25
|
+
config.default_formatter = 'doc' if config.files_to_run.one?
|
26
|
+
config.order = :random
|
27
|
+
|
28
|
+
Kernel.srand config.seed
|
29
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lita-datadog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Sigler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-03-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lita
|
@@ -144,6 +144,7 @@ extensions: []
|
|
144
144
|
extra_rdoc_files: []
|
145
145
|
files:
|
146
146
|
- ".gitignore"
|
147
|
+
- ".rspec"
|
147
148
|
- ".rubocop.yml"
|
148
149
|
- ".travis.yml"
|
149
150
|
- CONTRIBUTING.md
|
@@ -153,6 +154,8 @@ files:
|
|
153
154
|
- Rakefile
|
154
155
|
- lib/lita-datadog.rb
|
155
156
|
- lib/lita/handlers/datadog.rb
|
157
|
+
- lib/lita/helpers/graphs.rb
|
158
|
+
- lib/lita/helpers/utilities.rb
|
156
159
|
- lita-datadog.gemspec
|
157
160
|
- locales/en.yml
|
158
161
|
- spec/lita/handlers/datadog_spec.rb
|
@@ -178,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
178
181
|
version: '0'
|
179
182
|
requirements: []
|
180
183
|
rubyforge_project:
|
181
|
-
rubygems_version: 2.
|
184
|
+
rubygems_version: 2.5.1
|
182
185
|
signing_key:
|
183
186
|
specification_version: 4
|
184
187
|
summary: A Datadog plugin for Lita
|