lita-datadog 0.2.0 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -11
- data/.travis.yml +1 -1
- data/CONTRIBUTING.md +9 -0
- data/Gemfile +1 -1
- data/README.md +38 -10
- data/Rakefile +5 -3
- data/lib/lita-datadog.rb +3 -0
- data/lib/lita/handlers/datadog.rb +49 -37
- data/lita-datadog.gemspec +22 -21
- data/locales/en.yml +6 -0
- data/spec/lita/handlers/datadog_spec.rb +35 -18
- data/spec/spec_helper.rb +2 -0
- metadata +26 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 674d744f8af8eef3c2124caf7fe6f330edfed54d
|
4
|
+
data.tar.gz: dd9e912e13bb4ce44fd3ba42991301c68b2c8790
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e331d216b2083724b8ee65a9c939a7be060200b8a86720362b653175315a424aae3698e292830b3c3d8a1248969f1f22d867a9647a4babd959a23c9fefc000f
|
7
|
+
data.tar.gz: fe96cea3e2fd8a0040f81e0be28da1a0da91ec463be3890eb137ce8ac6784c5d68f08b1f7095293f26baa29d33318f1736d5ff2de816fc6e50ec1c61060b7bb6
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
Pull requests are awesome! Pull requests with tests are even more awesome!
|
2
|
+
|
3
|
+
## Quick steps
|
4
|
+
|
5
|
+
1. Fork the repo.
|
6
|
+
2. Run the tests: `bundle && rake`
|
7
|
+
3. Add a test for your change. Only refactoring and documentation changes require no new tests. If you are adding functionality or fixing a bug, it needs a test!
|
8
|
+
4. Make the test pass.
|
9
|
+
5. Push to your fork and submit a pull request.
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,10 +1,13 @@
|
|
1
1
|
# lita-datadog
|
2
2
|
|
3
|
-
[![Build Status](https://
|
4
|
-
[![
|
5
|
-
[![
|
3
|
+
[![Build Status](https://img.shields.io/travis/esigler/lita-datadog/master.svg)](https://travis-ci.org/esigler/lita-datadog)
|
4
|
+
[![MIT License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](https://tldrlegal.com/license/mit-license)
|
5
|
+
[![RubyGems :: RMuh Gem Version](http://img.shields.io/gem/v/lita-datadog.svg)](https://rubygems.org/gems/lita-datadog)
|
6
|
+
[![Coveralls Coverage](https://img.shields.io/coveralls/esigler/lita-datadog/master.svg)](https://coveralls.io/r/esigler/lita-datadog)
|
7
|
+
[![Code Climate](https://img.shields.io/codeclimate/github/esigler/lita-datadog.svg)](https://codeclimate.com/github/esigler/lita-datadog)
|
8
|
+
[![Gemnasium](https://img.shields.io/gemnasium/esigler/lita-datadog.svg)](https://gemnasium.com/esigler/lita-datadog)
|
6
9
|
|
7
|
-
|
10
|
+
A [Datadog](http://datadoghq.com) plugin for [Lita](https://github.com/jimmycuadra/lita).
|
8
11
|
|
9
12
|
## Installation
|
10
13
|
|
@@ -18,25 +21,50 @@ gem "lita-datadog"
|
|
18
21
|
|
19
22
|
### Required attributes
|
20
23
|
|
21
|
-
You will need
|
24
|
+
You will need a DataDog API key, and an application key. Go to https://app.datadoghq.com/account/settings#api for both.
|
22
25
|
|
23
|
-
|
24
|
-
|
26
|
+
Add the following variable to your Lita config file:
|
27
|
+
```
|
28
|
+
Lita.configure do |config|
|
29
|
+
...
|
30
|
+
config.handlers.datadog.api_key = '_api_key_goes_here_'
|
31
|
+
config.handlers.datadog.application_key = '_app_key_goes_here_'
|
32
|
+
...
|
33
|
+
end
|
34
|
+
```
|
25
35
|
|
26
36
|
### Optional attributes
|
27
37
|
|
28
38
|
* `timerange` (Integer) - How long in seconds a time range will be for graphs. Default: `3600`
|
29
|
-
* `waittime` (Integer) - How long to wait after getting a URL from Datadog to display it (sometimes the graph isn't ready yet). Default: `
|
30
|
-
|
31
|
-
### Example
|
39
|
+
* `waittime` (Integer) - How long to wait after getting a URL from Datadog to display it (sometimes the graph isn't ready yet). Default: `0`
|
32
40
|
|
33
41
|
## Usage
|
34
42
|
|
43
|
+
### Graphs
|
44
|
+
|
45
|
+
Basic graph of the load on all of your systems:
|
46
|
+
|
35
47
|
```
|
36
48
|
Lita graph metric:"system.load.1{*}"
|
49
|
+
```
|
50
|
+
|
51
|
+
Graph of load for one specific system:
|
52
|
+
```
|
37
53
|
Lita graph metric:"system.load.1{host:hostname01}"
|
54
|
+
```
|
55
|
+
|
56
|
+
Multiple attributes plotted in one graph:
|
57
|
+
```
|
38
58
|
Lita graph metric:"system.load.1{*},system.load.5{*}"
|
59
|
+
```
|
60
|
+
|
61
|
+
Show graph, with events marked in:
|
62
|
+
```
|
39
63
|
Lita graph metric:"system.load.1{*}" event:"sources:sourcename"
|
64
|
+
```
|
65
|
+
|
66
|
+
Manipulate time range being graphed:
|
67
|
+
```
|
40
68
|
Lita graph metric:"system.load.1{*}" start:"2 hours ago"
|
41
69
|
Lita graph metric:"system.load.1{*}" from:"2 hours ago" to:"30 minutes ago"
|
42
70
|
```
|
data/Rakefile
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rspec/core/rake_task'
|
3
|
+
require 'rubocop/rake_task'
|
3
4
|
|
4
5
|
RSpec::Core::RakeTask.new(:spec)
|
6
|
+
RuboCop::RakeTask.new(:rubocop)
|
5
7
|
|
6
|
-
task default: :spec
|
8
|
+
task default: [:spec, :rubocop]
|
data/lib/lita-datadog.rb
CHANGED
@@ -1,61 +1,73 @@
|
|
1
|
-
require 'dogapi'
|
2
|
-
require 'chronic'
|
3
|
-
|
4
1
|
module Lita
|
5
2
|
module Handlers
|
6
3
|
class Datadog < Handler
|
4
|
+
config :api_key, required: true
|
5
|
+
config :application_key, required: true
|
6
|
+
config :timerange, default: 3600
|
7
|
+
config :waittime, default: 0
|
8
|
+
|
7
9
|
route(
|
8
10
|
/^graph\s(.*)$/,
|
9
11
|
:graph,
|
10
12
|
command: true,
|
11
|
-
help: { 'graph
|
12
|
-
'Graph those metrics, for the default time range' }
|
13
|
+
help: { t('help.graph.syntax') => t('help.graph.desc') }
|
13
14
|
)
|
14
15
|
|
15
|
-
def self.default_config(config)
|
16
|
-
config.api_key = nil
|
17
|
-
config.application_key = nil
|
18
|
-
config.timerange = 3600
|
19
|
-
config.waittime = 1
|
20
|
-
end
|
21
|
-
|
22
16
|
def graph(response)
|
23
17
|
args = parse_arguments(response.matches[0][0])
|
24
|
-
|
25
|
-
|
18
|
+
response.reply(get_response(args))
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def get_response(args)
|
24
|
+
return_code, snapshot = get_graph_url(args[:metric],
|
25
|
+
args[:start],
|
26
|
+
args[:end],
|
27
|
+
args[:event])
|
28
|
+
|
26
29
|
if return_code.to_s == '200'
|
27
|
-
sleep
|
28
|
-
|
30
|
+
sleep config.waittime
|
31
|
+
return snapshot['snapshot_url']
|
29
32
|
else
|
30
|
-
|
33
|
+
t('errors.request')
|
31
34
|
end
|
32
35
|
end
|
33
36
|
|
34
|
-
|
37
|
+
def get_graph_url(metric_query, start_ts, end_ts, event_query)
|
38
|
+
client = Dogapi::Client.new(config.api_key, config.application_key)
|
35
39
|
|
36
|
-
|
37
|
-
return nil if Lita.config.handlers.datadog.api_key.nil? ||
|
38
|
-
Lita.config.handlers.datadog.application_key.nil?
|
40
|
+
return nil unless client
|
39
41
|
|
40
|
-
client
|
41
|
-
Lita.config.handlers.datadog.application_key)
|
42
|
-
|
43
|
-
return client.graph_snapshot(metric_query, start_ts, end_ts, event_query) if client
|
42
|
+
client.graph_snapshot(metric_query, start_ts, end_ts, event_query)
|
44
43
|
end
|
45
44
|
|
46
45
|
def parse_arguments(arg_string)
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
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] : ''
|
59
71
|
end
|
60
72
|
end
|
61
73
|
|
data/lita-datadog.gemspec
CHANGED
@@ -1,26 +1,27 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
|
-
spec.name =
|
3
|
-
spec.version =
|
4
|
-
spec.authors = [
|
5
|
-
spec.email = [
|
6
|
-
spec.description =
|
7
|
-
spec.summary =
|
8
|
-
spec.homepage =
|
9
|
-
spec.license =
|
10
|
-
spec.metadata = {
|
2
|
+
spec.name = 'lita-datadog'
|
3
|
+
spec.version = '0.9.0'
|
4
|
+
spec.authors = ['Eric Sigler']
|
5
|
+
spec.email = ['me@esigler.com']
|
6
|
+
spec.description = 'A Datadog plugin for Lita'
|
7
|
+
spec.summary = 'A Datadog plugin for Lita'
|
8
|
+
spec.homepage = 'http://github.com/esigler/lita-datadog'
|
9
|
+
spec.license = 'MIT'
|
10
|
+
spec.metadata = { 'lita_plugin_type' => 'handler' }
|
11
11
|
|
12
|
-
spec.files = `git ls-files`.split(
|
13
|
-
spec.executables = spec.files.grep(
|
14
|
-
spec.test_files = spec.files.grep(
|
15
|
-
spec.require_paths = [
|
12
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
13
|
+
spec.executables = spec.files.grep(/^bin\//) { |f| File.basename(f) }
|
14
|
+
spec.test_files = spec.files.grep(/^(test|spec|features)\//)
|
15
|
+
spec.require_paths = ['lib']
|
16
16
|
|
17
|
-
spec.add_runtime_dependency
|
18
|
-
spec.add_runtime_dependency
|
19
|
-
spec.add_runtime_dependency
|
17
|
+
spec.add_runtime_dependency 'lita', '>= 4.0'
|
18
|
+
spec.add_runtime_dependency 'dogapi'
|
19
|
+
spec.add_runtime_dependency 'chronic'
|
20
20
|
|
21
|
-
spec.add_development_dependency
|
22
|
-
spec.add_development_dependency
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
25
|
-
spec.add_development_dependency
|
21
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
22
|
+
spec.add_development_dependency 'coveralls'
|
23
|
+
spec.add_development_dependency 'rake'
|
24
|
+
spec.add_development_dependency 'rspec', '>= 3.0.0'
|
25
|
+
spec.add_development_dependency 'rubocop'
|
26
|
+
spec.add_development_dependency 'simplecov'
|
26
27
|
end
|
data/locales/en.yml
CHANGED
@@ -4,10 +4,34 @@ describe Lita::Handlers::Datadog, lita_handler: true do
|
|
4
4
|
EXAMPLE_IMAGE_URL = 'http://www.example.com/path/that/ends/in.png'
|
5
5
|
EXAMPLE_ERROR_MSG = 'Error requesting Datadog graph'
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
let(:success) do
|
8
|
+
client = double
|
9
|
+
allow(client).to receive(:graph_snapshot) {
|
10
|
+
[200, { 'snapshot_url' => EXAMPLE_IMAGE_URL }]
|
11
|
+
}
|
12
|
+
client
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:error) do
|
16
|
+
client = double
|
17
|
+
allow(client).to receive(:graph_snapshot) { [500, {}] }
|
18
|
+
client
|
19
|
+
end
|
20
|
+
|
21
|
+
it do
|
22
|
+
is_expected.to route_command(
|
23
|
+
'graph metric:"system.load.1{*}"')
|
24
|
+
.to(:graph)
|
25
|
+
is_expected.to route_command(
|
26
|
+
'graph metric:"system.load.1{host:hostname01}"')
|
27
|
+
.to(:graph)
|
28
|
+
is_expected.to route_command(
|
29
|
+
'graph metric:"system.load.1{*},system.load.5{*}"')
|
30
|
+
.to(:graph)
|
31
|
+
is_expected.to route_command(
|
32
|
+
'graph metric:"system.load.1{*}" event:"sources:something"')
|
33
|
+
.to(:graph)
|
34
|
+
end
|
11
35
|
|
12
36
|
describe '.default_config' do
|
13
37
|
it 'sets the api_key to nil' do
|
@@ -22,45 +46,38 @@ describe Lita::Handlers::Datadog, lita_handler: true do
|
|
22
46
|
expect(Lita.config.handlers.datadog.timerange).to eq(3600)
|
23
47
|
end
|
24
48
|
|
25
|
-
it 'sets the waittime to
|
26
|
-
expect(Lita.config.handlers.datadog.waittime).to eq(
|
49
|
+
it 'sets the waittime to 0' do
|
50
|
+
expect(Lita.config.handlers.datadog.waittime).to eq(0)
|
27
51
|
end
|
28
52
|
end
|
29
53
|
|
30
54
|
describe '#graph' do
|
31
55
|
it 'with valid metric returns an image url' do
|
32
|
-
|
33
|
-
allow_any_instance_of(Lita::Handlers::Datadog).to \
|
34
|
-
receive(:graph_snapshot).with(any_args).and_return([200, response])
|
56
|
+
expect(Dogapi::Client).to receive(:new) { success }
|
35
57
|
send_command('graph metric:"system.load.1{*}"')
|
36
58
|
expect(replies.last).to eq(EXAMPLE_IMAGE_URL)
|
37
59
|
end
|
38
60
|
|
39
61
|
it 'with invalid metric returns an error' do
|
40
|
-
|
41
|
-
receive(:graph_snapshot).with(any_args).and_return([500, nil])
|
62
|
+
expect(Dogapi::Client).to receive(:new) { error }
|
42
63
|
send_command('graph metric:"omg.wtf.bbq{*}"')
|
43
64
|
expect(replies.last).to eq(EXAMPLE_ERROR_MSG)
|
44
65
|
end
|
45
66
|
|
46
67
|
it 'with valid metric and event returns an image url' do
|
47
|
-
|
48
|
-
allow_any_instance_of(Lita::Handlers::Datadog).to \
|
49
|
-
receive(:graph_snapshot).with(any_args).and_return([200, response])
|
68
|
+
expect(Dogapi::Client).to receive(:new) { success }
|
50
69
|
send_command('graph metric:"system.load.1{*}"')
|
51
70
|
expect(replies.last).to eq(EXAMPLE_IMAGE_URL)
|
52
71
|
end
|
53
72
|
|
54
73
|
it 'with an invalid metric returns an error' do
|
55
|
-
|
56
|
-
receive(:graph_snapshot).with(any_args).and_return([500, nil])
|
74
|
+
expect(Dogapi::Client).to receive(:new) { error }
|
57
75
|
send_command('graph metric:"omg.wtf.bbq{*}" event:"sources:sourcename"')
|
58
76
|
expect(replies.last).to eq(EXAMPLE_ERROR_MSG)
|
59
77
|
end
|
60
78
|
|
61
79
|
it 'with an invalid event returns an error' do
|
62
|
-
|
63
|
-
receive(:graph_snapshot).with(any_args).and_return([500, nil])
|
80
|
+
expect(Dogapi::Client).to receive(:new) { error }
|
64
81
|
send_command('graph metric:"system.load.1{*}" event:"omg:wtf"')
|
65
82
|
expect(replies.last).to eq(EXAMPLE_ERROR_MSG)
|
66
83
|
end
|
data/spec/spec_helper.rb
CHANGED
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.9.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: 2014-
|
11
|
+
date: 2014-12-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: lita
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '4.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '4.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: dogapi
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +66,20 @@ dependencies:
|
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.3'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: coveralls
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
84
|
name: rake
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -86,16 +100,16 @@ dependencies:
|
|
86
100
|
requirements:
|
87
101
|
- - ">="
|
88
102
|
- !ruby/object:Gem::Version
|
89
|
-
version: 3.0.0
|
103
|
+
version: 3.0.0
|
90
104
|
type: :development
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
94
108
|
- - ">="
|
95
109
|
- !ruby/object:Gem::Version
|
96
|
-
version: 3.0.0
|
110
|
+
version: 3.0.0
|
97
111
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
112
|
+
name: rubocop
|
99
113
|
requirement: !ruby/object:Gem::Requirement
|
100
114
|
requirements:
|
101
115
|
- - ">="
|
@@ -109,7 +123,7 @@ dependencies:
|
|
109
123
|
- !ruby/object:Gem::Version
|
110
124
|
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
126
|
+
name: simplecov
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
114
128
|
requirements:
|
115
129
|
- - ">="
|
@@ -122,7 +136,7 @@ dependencies:
|
|
122
136
|
- - ">="
|
123
137
|
- !ruby/object:Gem::Version
|
124
138
|
version: '0'
|
125
|
-
description: A
|
139
|
+
description: A Datadog plugin for Lita
|
126
140
|
email:
|
127
141
|
- me@esigler.com
|
128
142
|
executables: []
|
@@ -132,6 +146,7 @@ files:
|
|
132
146
|
- ".gitignore"
|
133
147
|
- ".rubocop.yml"
|
134
148
|
- ".travis.yml"
|
149
|
+
- CONTRIBUTING.md
|
135
150
|
- Gemfile
|
136
151
|
- LICENSE
|
137
152
|
- README.md
|
@@ -163,10 +178,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
163
178
|
version: '0'
|
164
179
|
requirements: []
|
165
180
|
rubyforge_project:
|
166
|
-
rubygems_version: 2.2.
|
181
|
+
rubygems_version: 2.2.2
|
167
182
|
signing_key:
|
168
183
|
specification_version: 4
|
169
|
-
summary:
|
184
|
+
summary: A Datadog plugin for Lita
|
170
185
|
test_files:
|
171
186
|
- spec/lita/handlers/datadog_spec.rb
|
172
187
|
- spec/spec_helper.rb
|