metriks-addons 3.1.4 → 3.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: 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.