metriks-addons 3.1.4 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ad4e956a6fd668b75db1e1a0aaa5ce393f1794c1
4
- data.tar.gz: b2fad9c2404f245fb75171eb2af41ddb96173c37
3
+ metadata.gz: 4db1c3d87383debd88414081ffbd778182284f39
4
+ data.tar.gz: 837248d062520be4f17924116f4c4a497cb5ae6a
5
5
  SHA512:
6
- metadata.gz: 061e8b73b199cf750b416c1fea947c642b863a4007e5328c2de8c16a86e5dc0a9f2cf7a7e0a4514c50caac0c7cfac527b6b704d18a30754b50a6b4dc1ab90353
7
- data.tar.gz: c200a04e9fae2dc94225c7e3ac15f617513c7e54935d8299be26e3e90b10e9543af96eb8a6b92f0663e96bfd2102c5e598723dc38ed74a118f668909ea02c78c
6
+ metadata.gz: a04a7d5cdcd2f1781ede3a8402ee11aaf61413520beab7bb9bc870a34d8d8f482c5cbb5ac3d378415f3806d16197ad5be6787df4ecd51b621b81a1758feb6dc9
7
+ data.tar.gz: 51dda187346fa9b97d5c0fd795af600e6ee06d187182b00081d01009459554a2ac6a7e2826908583f5cce0f102a4a3f37a2ffd696d27a333f70c71da85a0dff7
data/Gemfile CHANGED
@@ -16,6 +16,10 @@
16
16
  source 'https://rubygems.org'
17
17
 
18
18
  gemspec
19
+
20
+ gem 'activesupport', '~> 4.2.7' if RUBY_VERSION < '2.2.0'
21
+ gem 'signalfx', '~> 0.1.0' if RUBY_VERSION < '2.2.0'
22
+
19
23
  group :test do
20
24
  gem "rake"
21
25
  gem "rspec"
@@ -16,7 +16,8 @@
16
16
  require_relative 'metriks-addons/opentsdb_reporter'
17
17
  require_relative 'metriks-addons/signalfx_reporter'
18
18
  require_relative 'metriks-addons/cloudwatch_reporter'
19
+ require_relative 'metriks-addons/datadog_reporter'
19
20
 
20
21
  module MetriksAddons
21
- VERSION = '3.1.4'
22
+ VERSION = '3.2.0'
22
23
  end
@@ -0,0 +1,122 @@
1
+ ##
2
+ # Copyright (c) 2015. Qubole Inc
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ ##
15
+
16
+ require 'metriks/time_tracker'
17
+ require 'logger'
18
+ require 'dogapi'
19
+ require_relative 'base_reporter'
20
+
21
+ module MetriksAddons
22
+ class DatadogApiReporter < BaseReporter
23
+ attr_accessor :client, :prefix, :source, :tags, :logger
24
+
25
+ def initialize(key, host_name, tags, options = {})
26
+ super(options)
27
+ @key = key
28
+ @tags = tags
29
+
30
+ @prefix = options[:prefix]
31
+ @client = Dogapi::Client.new(key)
32
+ end
33
+
34
+ def submit(datapoints)
35
+ return if datapoints.empty?
36
+
37
+ log "debug", "Datapoints for Datadog: #{datapoints.inspect}"
38
+ size = {}
39
+ response = @client.batch_metrics do
40
+ datapoints.each do |type, data|
41
+ size[type] = 0
42
+ data.each do |metric_name, points|
43
+ size[type] += points.size
44
+ if type == 'counter'
45
+ @client.emit_points(metric_name, points, :type => 'counter', :tags => @tags)
46
+ else
47
+ @client.emit_points(metric_name, points, :tags => @tags)
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ log "debug", "Sent #{datapoints.size} metrics to Datadog"
54
+ log "debug", "Response is: #{response}"
55
+ end
56
+
57
+ def get_datapoints
58
+ seconds = @time_tracker.now_floored
59
+ time = Time.at(seconds)
60
+
61
+ datapoints = {}
62
+ counter = {}
63
+ gauge = {}
64
+ log "debug", "Registry: #{@registry}"
65
+ @registry.each do |name, metric|
66
+ next if name.nil? || name.empty?
67
+ name = name.to_s.gsub(/ +/, '_')
68
+ if @prefix
69
+ name = "#{@prefix}.#{name}"
70
+ end
71
+
72
+ case metric
73
+ when Metriks::Meter
74
+ counter = counter.merge(create_datapoints name, metric, time, [
75
+ :count
76
+ ])
77
+ when Metriks::Counter
78
+ counter = counter.merge(create_datapoints name, metric, time, [
79
+ :count
80
+ ])
81
+ when Metriks::Gauge
82
+ gauge = gauge.merge(create_datapoints name, metric, time, [
83
+ :value
84
+ ])
85
+ when Metriks::Timer
86
+ counter = counter.merge(create_datapoints name, metric, time, [
87
+ :count
88
+ ])
89
+ gauge = gauge.merge(create_datapoints name, metric, time, [
90
+ :min, :max, :mean
91
+ ])
92
+ end
93
+ end
94
+
95
+ datapoints['counter'] = counter if counter.any?
96
+ datapoints['gauge'] = gauge if gauge.any?
97
+ datapoints
98
+ end
99
+
100
+ def create_datapoints(base_name, metric, time, keys, snapshot_keys = [])
101
+ datapoints = {}
102
+
103
+ keys.flatten.each do |key|
104
+ name = key.to_s.gsub(/^get_/, '')
105
+ metric_name = "#{base_name}.#{name}"
106
+ value = metric.send(key)
107
+ datapoints[metric_name] = [[time, value]]
108
+ end
109
+
110
+ unless snapshot_keys.empty?
111
+ snapshot = metric.snapshot
112
+ snapshot_keys.flatten.each do |key|
113
+ name = key.to_s.gsub(/^get_/, '')
114
+ metric_name = "#{base_name}.#{name}"
115
+ value = snapshot.send(key)
116
+ datapoints[metric_name] = [[time, value]]
117
+ end
118
+ end
119
+ datapoints
120
+ end
121
+ end
122
+ end
@@ -28,13 +28,13 @@ Gem::Specification.new do |s|
28
28
  ## If your rubyforge_project name is different, then edit it and comment out
29
29
  ## the sub! line in the Rakefile
30
30
  s.name = 'metriks-addons'
31
- s.version = '3.1.4'
32
- s.date = '2015-12-28'
31
+ s.version = '3.2.0'
32
+ s.date = '2017-01-30'
33
33
 
34
34
  ## Make sure your summary is short. The description may be as long
35
35
  ## as you like.
36
36
  s.summary = "Reporters for Metriks."
37
- s.description = "OpenTSDB and SignalFX reporter for Metriks."
37
+ s.description = "OpenTSDB, SignalFX and DatadogApi reporter for Metriks."
38
38
 
39
39
  ## List the primary authors. If there are a bunch of authors, it's probably
40
40
  ## better to set the email to an email list or something. If you don't have
@@ -64,6 +64,7 @@ Gem::Specification.new do |s|
64
64
  s.add_runtime_dependency 'metriks', '~> 0.9', '>= 0.9.9.7'
65
65
  s.add_runtime_dependency 'rest-client', '>= 1.6.7'
66
66
  s.add_runtime_dependency 'signalfx', '>= 0.1.0'
67
+ s.add_runtime_dependency 'dogapi', '1.23.0'
67
68
 
68
69
  ## List your development dependencies here. Development dependencies are
69
70
  ## those that are only needed during development
@@ -82,10 +83,12 @@ Gem::Specification.new do |s|
82
83
  lib/metriks-addons.rb
83
84
  lib/metriks-addons/base_reporter.rb
84
85
  lib/metriks-addons/cloudwatch_reporter.rb
86
+ lib/metriks-addons/datadog_reporter.rb
85
87
  lib/metriks-addons/opentsdb_reporter.rb
86
88
  lib/metriks-addons/signalfx_reporter.rb
87
89
  metriks-addons.gemspec
88
90
  spec/cloudwatch_spec.rb
91
+ spec/datadog_api_spec.rb
89
92
  spec/opentsdb_spec.rb
90
93
  spec/signalfx_spec.rb
91
94
  ]
@@ -0,0 +1,87 @@
1
+ ##
2
+ # Copyright (c) 2015. Qubole Inc
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+ ##
15
+
16
+ require 'webmock/rspec'
17
+ require 'metriks'
18
+ require 'metriks-addons/datadog_reporter'
19
+
20
+ describe "Smoke test" do
21
+ before(:all) do
22
+ stub_request(:any, "http://localhost:4242")
23
+ end
24
+
25
+ before(:each) do
26
+ @registry = Metriks::Registry.new
27
+ @reporter = MetriksAddons::DatadogApiReporter.new(
28
+ "123456789",
29
+ "127.0.0.1",
30
+ [{:env => "test"}],
31
+ { :registry => @registry})
32
+ end
33
+
34
+ after(:each) do
35
+ @reporter.stop
36
+ @registry.stop
37
+ end
38
+
39
+ it "meter" do
40
+ @registry.meter('meter.testing').mark
41
+ datapoints = @reporter.get_datapoints
42
+ expect(datapoints['counter'].size).to eql(1)
43
+ expect(datapoints['counter']).to have_key("meter.testing.count")
44
+ expect(datapoints['counter']["meter.testing.count"][0][1]).to eql(1)
45
+ expect(datapoints['counter']["meter.testing.count"][0][0]).not_to be_nil
46
+ end
47
+
48
+ it "counters" do
49
+ @registry.counter('counter.testing').increment
50
+ datapoints = @reporter.get_datapoints
51
+ expect(datapoints['counter'].size).to eql(1)
52
+ expect(datapoints['counter']).to have_key("counter.testing.count")
53
+ expect(datapoints['counter']["counter.testing.count"][0][1]).to eql(1)
54
+ expect(datapoints['counter']["counter.testing.count"][0][0]).not_to be_nil
55
+ end
56
+
57
+ it "timer" do
58
+ @registry.timer('timer.testing').update(1.5)
59
+ datapoints = @reporter.get_datapoints
60
+ expect(datapoints['counter'].size).to eql(1)
61
+ expect(datapoints['gauge'].size).to eql(3)
62
+ expect(datapoints['counter']).to have_key("timer.testing.count")
63
+ expect(datapoints['counter']['timer.testing.count'][0][1]).to eql(1)
64
+ expect(datapoints['counter']['timer.testing.count'][0][0]).not_to be_nil
65
+
66
+ expect(datapoints['gauge']).to have_key("timer.testing.min")
67
+ expect(datapoints['gauge']['timer.testing.min'][0][1]).not_to be_nil
68
+ expect(datapoints['gauge']['timer.testing.min'][0][0]).not_to be_nil
69
+
70
+ expect(datapoints['gauge']).to have_key("timer.testing.max")
71
+ expect(datapoints['gauge']['timer.testing.max'][0][1]).not_to be_nil
72
+ expect(datapoints['gauge']['timer.testing.max'][0][0]).not_to be_nil
73
+
74
+ expect(datapoints['gauge']).to have_key("timer.testing.mean")
75
+ expect(datapoints['gauge']['timer.testing.mean'][0][1]).not_to be_nil
76
+ expect(datapoints['gauge']['timer.testing.mean'][0][0]).not_to be_nil
77
+ end
78
+
79
+ it "gauges" do
80
+ @registry.gauge('gauge.testing') { 123 }
81
+ datapoints = @reporter.get_datapoints
82
+ expect(datapoints['gauge'].size).to eql(1)
83
+ expect(datapoints['gauge']).to have_key("gauge.testing.value")
84
+ expect(datapoints['gauge']['gauge.testing.value'][0][1]).to eql(123)
85
+ expect(datapoints['gauge']['gauge.testing.value'][0][0]).not_to be_nil
86
+ end
87
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: metriks-addons
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.4
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rajat Venkatesh
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-28 00:00:00.000000000 Z
11
+ date: 2017-01-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: metriks
@@ -58,6 +58,20 @@ dependencies:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
60
  version: 0.1.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: dogapi
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - '='
66
+ - !ruby/object:Gem::Version
67
+ version: 1.23.0
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - '='
73
+ - !ruby/object:Gem::Version
74
+ version: 1.23.0
61
75
  - !ruby/object:Gem::Dependency
62
76
  name: mocha
63
77
  requirement: !ruby/object:Gem::Requirement
@@ -72,7 +86,7 @@ dependencies:
72
86
  - - "~>"
73
87
  - !ruby/object:Gem::Version
74
88
  version: '0.10'
75
- description: OpenTSDB and SignalFX reporter for Metriks.
89
+ description: OpenTSDB, SignalFX and DatadogApi reporter for Metriks.
76
90
  email: rvenkatesh@qubole.com
77
91
  executables: []
78
92
  extensions: []
@@ -88,10 +102,12 @@ files:
88
102
  - lib/metriks-addons.rb
89
103
  - lib/metriks-addons/base_reporter.rb
90
104
  - lib/metriks-addons/cloudwatch_reporter.rb
105
+ - lib/metriks-addons/datadog_reporter.rb
91
106
  - lib/metriks-addons/opentsdb_reporter.rb
92
107
  - lib/metriks-addons/signalfx_reporter.rb
93
108
  - metriks-addons.gemspec
94
109
  - spec/cloudwatch_spec.rb
110
+ - spec/datadog_api_spec.rb
95
111
  - spec/opentsdb_spec.rb
96
112
  - spec/signalfx_spec.rb
97
113
  homepage: https://github.com/vrajat/metriks-addons
@@ -114,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
130
  version: '0'
115
131
  requirements: []
116
132
  rubyforge_project:
117
- rubygems_version: 2.4.6
133
+ rubygems_version: 2.4.8
118
134
  signing_key:
119
135
  specification_version: 2
120
136
  summary: Reporters for Metriks.