lita-datadog 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d792f049f2c903792f8cb120c287e363c3f7db64
4
- data.tar.gz: 2b2be86036fbd45be1d6790e952ecfb943be5ed3
3
+ metadata.gz: fd4e57520c88208a94b5c25e9097ddb937434faa
4
+ data.tar.gz: 83cb05a53cfc3fb0a92599d4ca5bf9aa3423c6fe
5
5
  SHA512:
6
- metadata.gz: 8284cb8a9a066aecfe14f0a48aefc90a803fffb3a168cd191939cc9874327322df3a12a6e917def236ce1918e99910565d83de412350fa6ed0663995314f3e1e
7
- data.tar.gz: f3443b1b0f27fce7981a533706641f58ac6f67048dd12765c7d5d32201747fae1c790280e0880eca20cc8e7fea8431739eac4186f16beab7f0b22f6f0a225f0d
6
+ metadata.gz: 6b69e3ff4a8a1929187424cef95957ee6dfcc7644fc9cf631bb0cd2438368c87eff14e628377e4fec97678b2db03e22434075ce63905d29a6423bee507c27757
7
+ data.tar.gz: 146518897c2d1ce891f12f0ddbaf27b130895e5f7be0ef40e03b75d1fe84f404b8178781ca54db09c5e6d7cdad4b47bd84c17c922c00589ffdc45b460388d0b6
data/.rubocop.yml CHANGED
@@ -3,7 +3,10 @@ AllCops:
3
3
  - lita-datadog.gemspec
4
4
 
5
5
  LineLength:
6
- Max: 99
6
+ Max: 120
7
+
8
+ MethodLength:
9
+ Max: 20
7
10
 
8
11
  Documentation:
9
12
  Enabled: false
data/.travis.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.0.0
3
+ - 2.1.0
4
4
  script: bundle exec rake
5
5
  before_install:
6
6
  - gem update --system
data/README.md CHANGED
@@ -25,7 +25,8 @@ You will need to get your API key, and configure an application key. Go to http
25
25
 
26
26
  ### Optional attributes
27
27
 
28
- * `default_timerange` (Integer) - How long in seconds a default time range will be for graphs. Default: `3600`
28
+ * `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: `1`
29
30
 
30
31
  ### Example
31
32
 
@@ -33,9 +34,25 @@ You will need to get your API key, and configure an application key. Go to http
33
34
 
34
35
  ```
35
36
  Lita graph metric:"system.load.1{*}"
37
+ Lita graph metric:"system.load.1{host:hostname01}"
36
38
  Lita graph metric:"system.load.1{*},system.load.5{*}"
39
+ Lita graph metric:"system.load.1{*}" event:"sources:sourcename"
40
+ Lita graph metric:"system.load.1{*}" start:"2 hours ago"
41
+ Lita graph metric:"system.load.1{*}" from:"2 hours ago" to:"30 minutes ago"
37
42
  ```
38
43
 
44
+ Graph takes the following arguments:
45
+ ```
46
+ metric:"<metric>"
47
+ event:"<event>"
48
+ start:"<time description>"
49
+ end:"<time description>"
50
+ from:"<time description>"
51
+ to:"<time description>"
52
+ ```
53
+
54
+ Time descriptions are parsed by https://github.com/mojombo/chronic
55
+
39
56
  ## License
40
57
 
41
58
  [MIT](http://opensource.org/licenses/MIT)
@@ -1,29 +1,30 @@
1
1
  require 'dogapi'
2
+ require 'chronic'
2
3
 
3
4
  module Lita
4
5
  module Handlers
5
6
  class Datadog < Handler
6
7
  route(
7
- /^graph\smetric:"(\S+)"$/,
8
- :simple_metric,
8
+ /^graph\s(.*)$/,
9
+ :graph,
9
10
  command: true,
10
11
  help: { 'graph metric:"simple.metric.1{*},simple.metric.5{*}"' =>
11
- 'Graph those metrics across all events, for the default time range' }
12
+ 'Graph those metrics, for the default time range' }
12
13
  )
13
14
 
14
15
  def self.default_config(config)
15
16
  config.api_key = nil
16
17
  config.application_key = nil
17
- config.default_timerange = 3600
18
+ config.timerange = 3600
19
+ config.waittime = 1
18
20
  end
19
21
 
20
- def simple_metric(response)
21
- metric = response.matches[0][0]
22
- end_ts = Time.now.to_i
23
- start_ts = end_ts - Lita.config.handlers.datadog.default_timerange
24
- _return_code, snapshot = graph_snapshot(metric, start_ts, end_ts, '*')
25
- if snapshot
26
- sleep 1 # TODO: Requesting the image immediately causes a blank image to be cached.
22
+ def graph(response)
23
+ args = parse_arguments(response.matches[0][0])
24
+ return_code, snapshot = graph_snapshot(args[:metric], args[:start],
25
+ args[:end], args[:event])
26
+ if return_code.to_s == '200'
27
+ sleep Lita.config.handlers.datadog.waittime
27
28
  response.reply(snapshot['snapshot_url'])
28
29
  else
29
30
  response.reply('Error requesting Datadog graph')
@@ -41,6 +42,21 @@ module Lita
41
42
 
42
43
  return client.graph_snapshot(metric_query, start_ts, end_ts, event_query) if client
43
44
  end
45
+
46
+ def parse_arguments(arg_string)
47
+ end_m = /(to|end):"(.+?)"/.match(arg_string)
48
+ end_ts = end_m ? Chronic.parse(end_m[2]).to_i : Time.now.to_i
49
+ start_m = /(from|start):"(.+?)"/.match(arg_string)
50
+ start_ts = start_m ? Chronic.parse(start_m[2]).to_i : end_ts - Lita.config.handlers.datadog.timerange
51
+ metric_m = /metric:"(.+?)"/.match(arg_string)
52
+ metric = metric_m ? metric_m[1] : 'system.load.1{*}'
53
+ event_m = /event:"(.+?)"/.match(arg_string)
54
+ event = event_m ? event_m[1] : ''
55
+ { metric: metric,
56
+ start: start_ts,
57
+ end: end_ts,
58
+ event: event }
59
+ end
44
60
  end
45
61
 
46
62
  Lita.register_handler(Datadog)
data/lita-datadog.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "lita-datadog"
3
- spec.version = "0.1.0"
3
+ spec.version = "0.2.0"
4
4
  spec.authors = ["Eric Sigler"]
5
5
  spec.email = ["me@esigler.com"]
6
6
  spec.description = %q{A Lita handler for interacting with Datadog}
@@ -16,6 +16,7 @@ Gem::Specification.new do |spec|
16
16
 
17
17
  spec.add_runtime_dependency "lita", ">= 3.0"
18
18
  spec.add_runtime_dependency "dogapi"
19
+ spec.add_runtime_dependency "chronic"
19
20
 
20
21
  spec.add_development_dependency "bundler", "~> 1.3"
21
22
  spec.add_development_dependency "rake"
@@ -1,8 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Lita::Handlers::Datadog, lita_handler: true do
4
- it { routes_command('graph metric:"system.load.1{*}"').to(:simple_metric) }
5
- it { routes_command('graph metric:"system.load.1{*},system.load.5{*}"').to(:simple_metric) }
4
+ EXAMPLE_IMAGE_URL = 'http://www.example.com/path/that/ends/in.png'
5
+ EXAMPLE_ERROR_MSG = 'Error requesting Datadog graph'
6
+
7
+ it { routes_command('graph metric:"system.load.1{*}"').to(:graph) }
8
+ it { routes_command('graph metric:"system.load.1{host:hostname01}"').to(:graph) }
9
+ it { routes_command('graph metric:"system.load.1{*},system.load.5{*}"').to(:graph) }
10
+ it { routes_command('graph metric:"system.load.1{*}" event:"sources:something"').to(:graph) }
6
11
 
7
12
  describe '.default_config' do
8
13
  it 'sets the api_key to nil' do
@@ -13,25 +18,51 @@ describe Lita::Handlers::Datadog, lita_handler: true do
13
18
  expect(Lita.config.handlers.datadog.application_key).to be_nil
14
19
  end
15
20
 
16
- it 'sets the default_timerange to 3600' do
17
- expect(Lita.config.handlers.datadog.default_timerange).to eq(3600)
21
+ it 'sets the timerange to 3600' do
22
+ expect(Lita.config.handlers.datadog.timerange).to eq(3600)
23
+ end
24
+
25
+ it 'sets the waittime to 1' do
26
+ expect(Lita.config.handlers.datadog.waittime).to eq(1)
18
27
  end
19
28
  end
20
29
 
21
- describe '#simple_metric' do
30
+ describe '#graph' do
22
31
  it 'with valid metric returns an image url' do
23
- response = { 'snapshot_url' => 'http://www.example.com/path/that/ends/in.png' }
32
+ response = { 'snapshot_url' => EXAMPLE_IMAGE_URL }
24
33
  allow_any_instance_of(Lita::Handlers::Datadog).to \
25
34
  receive(:graph_snapshot).with(any_args).and_return([200, response])
26
35
  send_command('graph metric:"system.load.1{*}"')
27
- expect(replies.last).to eq('http://www.example.com/path/that/ends/in.png')
36
+ expect(replies.last).to eq(EXAMPLE_IMAGE_URL)
28
37
  end
29
38
 
30
39
  it 'with invalid metric returns an error' do
31
40
  allow_any_instance_of(Lita::Handlers::Datadog).to \
32
41
  receive(:graph_snapshot).with(any_args).and_return([500, nil])
33
42
  send_command('graph metric:"omg.wtf.bbq{*}"')
34
- expect(replies.last).to eq('Error requesting Datadog graph')
43
+ expect(replies.last).to eq(EXAMPLE_ERROR_MSG)
44
+ end
45
+
46
+ it 'with valid metric and event returns an image url' do
47
+ response = { 'snapshot_url' => EXAMPLE_IMAGE_URL }
48
+ allow_any_instance_of(Lita::Handlers::Datadog).to \
49
+ receive(:graph_snapshot).with(any_args).and_return([200, response])
50
+ send_command('graph metric:"system.load.1{*}"')
51
+ expect(replies.last).to eq(EXAMPLE_IMAGE_URL)
52
+ end
53
+
54
+ it 'with an invalid metric returns an error' do
55
+ allow_any_instance_of(Lita::Handlers::Datadog).to \
56
+ receive(:graph_snapshot).with(any_args).and_return([500, nil])
57
+ send_command('graph metric:"omg.wtf.bbq{*}" event:"sources:sourcename"')
58
+ expect(replies.last).to eq(EXAMPLE_ERROR_MSG)
59
+ end
60
+
61
+ it 'with an invalid event returns an error' do
62
+ allow_any_instance_of(Lita::Handlers::Datadog).to \
63
+ receive(:graph_snapshot).with(any_args).and_return([500, nil])
64
+ send_command('graph metric:"system.load.1{*}" event:"omg:wtf"')
65
+ expect(replies.last).to eq(EXAMPLE_ERROR_MSG)
35
66
  end
36
67
  end
37
68
  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.1.0
4
+ version: 0.2.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-03-11 00:00:00.000000000 Z
11
+ date: 2014-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lita
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: chronic
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement