ruby-dogstatsd 0.0.3
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 +7 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +54 -0
- data/README.md +0 -0
- data/lib/datadog-client.rb +1 -0
- data/lib/rails-middleware-datadog.rb +1 -0
- data/lib/rails/middleware/datadog.rb +46 -0
- data/lib/ruby/reporters/datadog.rb +58 -0
- data/lib/sidekiq-middleware-datadog.rb +1 -0
- data/lib/sidekiq/middleware/datadog.rb +109 -0
- data/lib/sinatra-middleware-datadog.rb +1 -0
- data/lib/sinatra/middleware/datadog.rb +8 -0
- data/ruby-dogstatsd.gemspec +29 -0
- data/spec/rails/middleware/datadog_spec.rb +71 -0
- data/spec/ruby/reporters/datadog_spec.rb +71 -0
- data/spec/sidekiq/datadog_spec.rb +70 -0
- data/spec/sinatra/datadog_spec.rb +0 -0
- data/spec/spec_helper.rb +42 -0
- metadata +164 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 1c11b919fdc1a1987265e34fece499d93e3f24882460c411f1659701e0921494
|
4
|
+
data.tar.gz: 99db0d36302f050f00afc5266eeb40832507f801b20c3f2fc76b07bfbd27b6d9
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 29103c292ddada1d9c8c70ff7660af08466aa7bff87fb69f7495bcc17bf8a58a74b2c5e3f41708c0ebfe1ff5b2997cc7f8bca42a9c7e8ce41049196b4b181ec0
|
7
|
+
data.tar.gz: cf164dc679d1782cca7979810f16980fcda0a53f04a2328f7f27df14d96a11f58b28541b4cc6e3dffe9e3411a7dca53bc06d80d4f330e3d4a404f94f90cc0f62
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
ruby-dogstatsd (0.1.0)
|
5
|
+
dogstatsd-ruby (>= 2.0.0)
|
6
|
+
sidekiq
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: https://rubygems.org/
|
10
|
+
specs:
|
11
|
+
concurrent-ruby (1.0.5)
|
12
|
+
connection_pool (2.2.1)
|
13
|
+
diff-lcs (1.3)
|
14
|
+
dogstatsd-ruby (3.3.0)
|
15
|
+
rack (2.0.5)
|
16
|
+
rack-protection (2.0.1)
|
17
|
+
rack
|
18
|
+
rake (12.3.1)
|
19
|
+
redis (4.0.1)
|
20
|
+
rspec (3.7.0)
|
21
|
+
rspec-core (~> 3.7.0)
|
22
|
+
rspec-expectations (~> 3.7.0)
|
23
|
+
rspec-mocks (~> 3.7.0)
|
24
|
+
rspec-core (3.7.1)
|
25
|
+
rspec-support (~> 3.7.0)
|
26
|
+
rspec-expectations (3.7.0)
|
27
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
28
|
+
rspec-support (~> 3.7.0)
|
29
|
+
rspec-mocks (3.7.0)
|
30
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
31
|
+
rspec-support (~> 3.7.0)
|
32
|
+
rspec-support (3.7.1)
|
33
|
+
sidekiq (5.1.3)
|
34
|
+
concurrent-ruby (~> 1.0)
|
35
|
+
connection_pool (~> 2.2, >= 2.2.0)
|
36
|
+
rack-protection (>= 1.5.0)
|
37
|
+
redis (>= 3.3.5, < 5)
|
38
|
+
|
39
|
+
PLATFORMS
|
40
|
+
ruby
|
41
|
+
|
42
|
+
DEPENDENCIES
|
43
|
+
bundler
|
44
|
+
rack
|
45
|
+
rake
|
46
|
+
rspec (~> 3.0)
|
47
|
+
ruby-dogstatsd!
|
48
|
+
sidekiq
|
49
|
+
|
50
|
+
RUBY VERSION
|
51
|
+
ruby 2.5.1p57
|
52
|
+
|
53
|
+
BUNDLED WITH
|
54
|
+
1.16.1
|
data/README.md
ADDED
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
require "ruby/reporters/datadog"
|
@@ -0,0 +1 @@
|
|
1
|
+
require "rails/middleware/datadog"
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module Rails
|
2
|
+
module Middleware
|
3
|
+
class Datadog
|
4
|
+
def initialize(app, opts={})
|
5
|
+
@app = app
|
6
|
+
|
7
|
+
statsd_host = opts[:statsd_host] || "localhost"
|
8
|
+
statsd_port = opts[:statsd_port] || 8125
|
9
|
+
namespace = opts[:statsd_prefix] || nil
|
10
|
+
|
11
|
+
@statsd = opts[:statsd] || Ruby::Reporters::Datadog.new(opts)
|
12
|
+
end
|
13
|
+
|
14
|
+
def call(env)
|
15
|
+
start_request_time = Time.now
|
16
|
+
status, header, body = @app.call(env)
|
17
|
+
end_request_time = Time.now
|
18
|
+
|
19
|
+
report_to_statsd(start_request_time, end_request_time, env, status)
|
20
|
+
|
21
|
+
[status, header, body]
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def extract_path_from_request(env)
|
26
|
+
env['PATH_INFO']
|
27
|
+
end
|
28
|
+
|
29
|
+
def extract_method_from_request(env)
|
30
|
+
env['REQUEST_METHOD']
|
31
|
+
end
|
32
|
+
|
33
|
+
def compute_elapsed_time_ms(start_request_time, end_request_time)
|
34
|
+
(end_request_time - start_request_time) * 1000
|
35
|
+
end
|
36
|
+
|
37
|
+
def report_to_statsd(start_request_time, end_request_time, env, status)
|
38
|
+
elapsed_time_ms = compute_elapsed_time_ms(start_request_time, end_request_time)
|
39
|
+
request_method = extract_method_from_request(env)
|
40
|
+
path = extract_path_from_request(env)
|
41
|
+
|
42
|
+
@statsd.response_time_ms(path, request_method, status, elapsed_time_ms)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'datadog/statsd'
|
2
|
+
|
3
|
+
module Ruby
|
4
|
+
module Reporters
|
5
|
+
class Datadog
|
6
|
+
attr_reader :statsd, :response_time_metric_name, :default_http_tags
|
7
|
+
|
8
|
+
def initialize(opts={})
|
9
|
+
statsd_host = opts[:statsd_host] || "localhost"
|
10
|
+
statsd_port = opts[:statsd_port] || 8125
|
11
|
+
namespace = opts[:statsd_prefix] || nil
|
12
|
+
|
13
|
+
@default_http_tags = ['type:http']
|
14
|
+
@response_time_metric_name = 'response_time_ms'
|
15
|
+
|
16
|
+
@statsd = opts[:statsd] || ::Datadog::Statsd.new(statsd_host, statsd_port, namespace: namespace)
|
17
|
+
end
|
18
|
+
|
19
|
+
def response_time_ms(path, method, status, value)
|
20
|
+
tags = [
|
21
|
+
"route:#{method.upcase} #{path}",
|
22
|
+
"status:#{status}",
|
23
|
+
"error:#{from_status_to_error(status)}"
|
24
|
+
]
|
25
|
+
|
26
|
+
histogram(response_time_metric_name, value, default_http_tags | tags)
|
27
|
+
end
|
28
|
+
|
29
|
+
def gauge(metric_name, value, tags)
|
30
|
+
statsd.gauge(
|
31
|
+
metric_name,
|
32
|
+
value,
|
33
|
+
tags: tags
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def increment(metric_name, tags)
|
38
|
+
statsd.increment(
|
39
|
+
metric_name,
|
40
|
+
tags: tags
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
def histogram(metric_name, value, tags)
|
45
|
+
statsd.histogram(
|
46
|
+
metric_name,
|
47
|
+
value,
|
48
|
+
tags:tags
|
49
|
+
)
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
def from_status_to_error(status)
|
54
|
+
status.to_i < 400 ? "false" : "true"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "sidekiq/middleware/datadog"
|
@@ -0,0 +1,109 @@
|
|
1
|
+
require 'datadog/statsd'
|
2
|
+
require 'socket'
|
3
|
+
require 'sidekiq'
|
4
|
+
|
5
|
+
module Sidekiq
|
6
|
+
module Middleware
|
7
|
+
class Datadog
|
8
|
+
attr_accessor :hostname, :statsd_host, :statsd_port, :statsd, :xalala
|
9
|
+
# Configure and install datadog instrumentation. Example:
|
10
|
+
#
|
11
|
+
# Sidekiq.configure_server do |config|
|
12
|
+
# config.server_middleware do |chain|
|
13
|
+
# chain.add Sidekiq::Middleware::Datadog
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
#
|
17
|
+
|
18
|
+
def initialize(opts)
|
19
|
+
statsd_host = opts[:statsd_host] || "localhost"
|
20
|
+
statsd_port = (opts[:statsd_port] || 8125).to_i
|
21
|
+
prefix = opts[:prefix] || ""
|
22
|
+
|
23
|
+
@metric_name = opts[:metric_name] || "worker"
|
24
|
+
@statsd = opts[:statsd] || ::Datadog::Statsd.new(statsd_host, statsd_port, namespace: prefix)
|
25
|
+
@tags = opts[:tags] || []
|
26
|
+
|
27
|
+
enrich_global_tags()
|
28
|
+
end
|
29
|
+
|
30
|
+
def call(worker, job, queue, *)
|
31
|
+
start = Time.now
|
32
|
+
|
33
|
+
begin
|
34
|
+
yield
|
35
|
+
record(worker, job, queue, start)
|
36
|
+
rescue => e
|
37
|
+
record(worker, job, queue, start, e)
|
38
|
+
raise
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def enrich_global_tags
|
44
|
+
env = Sidekiq.options[:environment] || ENV['RACK_ENV']
|
45
|
+
|
46
|
+
if env && @tags.none? {|t| t =~ /^env\:/ }
|
47
|
+
@tags.push("env:#{ENV['RACK_ENV']}")
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def pre_proccess_tags(tags, worker, job, name, queue, error)
|
52
|
+
tags = @tags.map do |tag|
|
53
|
+
case tag
|
54
|
+
when String
|
55
|
+
then tag
|
56
|
+
when Proc
|
57
|
+
then tag.call(worker, job, queue, error)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
tags.push "name:#{name}"
|
62
|
+
tags.push "queue:#{queue}" if queue
|
63
|
+
|
64
|
+
if error
|
65
|
+
kind = replace_hifen_to_underscore(error.class.name.sub(/Error$/, ''))
|
66
|
+
tags.push "error:true", "error_kind:#{kind}"
|
67
|
+
else
|
68
|
+
tags.push "error:false"
|
69
|
+
end
|
70
|
+
|
71
|
+
tags.compact
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
def record(worker, job, queue, start, error = nil)
|
76
|
+
end_time = Time.now
|
77
|
+
|
78
|
+
elapsed_time_ms = compute_elapsed_time_ms(end_time, start)
|
79
|
+
name = replace_hifen_to_underscore(job['wrapped'] || worker.class.to_s)
|
80
|
+
tags = pre_proccess_tags(@tags, worker, job, name, queue, error)
|
81
|
+
|
82
|
+
report_queue_processing_time(elapsed_time_ms, tags)
|
83
|
+
report_queue_length(queue, tags)
|
84
|
+
end
|
85
|
+
|
86
|
+
def replace_hifen_to_underscore(word)
|
87
|
+
word = word.to_s.gsub(/::/, '/')
|
88
|
+
word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
|
89
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
90
|
+
word.tr!("-", "_")
|
91
|
+
|
92
|
+
word.downcase
|
93
|
+
end
|
94
|
+
|
95
|
+
def compute_elapsed_time_ms(start_time, end_time)
|
96
|
+
(end_time - start_time) * 1000
|
97
|
+
end
|
98
|
+
|
99
|
+
def report_queue_length(queue_name, tags)
|
100
|
+
queue = queue_name ? Sidekiq::Queues[queue_name] : Sidekiq::Queues["default"]
|
101
|
+
@statsd.gauge "#{@metric_name}.queue_size", queue.size, :tags => tags
|
102
|
+
end
|
103
|
+
|
104
|
+
def report_queue_processing_time(value, tags)
|
105
|
+
@statsd.timing "#{@metric_name}.run_time_ms", value, :tags => tags
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "sinatra/middleware/datadog"
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib', __FILE__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "ruby-dogstatsd"
|
8
|
+
spec.version = "0.0.3"
|
9
|
+
spec.authors = ["Top Free Games"]
|
10
|
+
spec.email = ["backend@tfgco.com"]
|
11
|
+
spec.description = %q{Rails middleware report metrics to Datadog}
|
12
|
+
spec.summary = %q{Report basic metrics to datadog}
|
13
|
+
spec.homepage = "https://git.topfreegames.com/topfreegames/rails-datadog-middleware"
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(spec)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_runtime_dependency(%q<dogstatsd-ruby>, ">= 2.0.0")
|
22
|
+
spec.add_runtime_dependency(%q<sidekiq>)
|
23
|
+
|
24
|
+
spec.add_development_dependency(%q<rake>)
|
25
|
+
spec.add_development_dependency(%q<rack>)
|
26
|
+
spec.add_development_dependency(%q<bundler>)
|
27
|
+
spec.add_development_dependency(%q<rspec>, "~> 3.0")
|
28
|
+
spec.add_development_dependency(%q<sidekiq>)
|
29
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'sidekiq/testing'
|
3
|
+
require 'rack'
|
4
|
+
|
5
|
+
describe Rails::Middleware::Datadog do
|
6
|
+
class Datadog::Statsd
|
7
|
+
attr_accessor :socket
|
8
|
+
end
|
9
|
+
|
10
|
+
class Rails::Middleware::Datadog
|
11
|
+
def compute_elapsed_time_ms(start_request_time, end_request_time)
|
12
|
+
10
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe 'teste reporting pre-defined metrics' do
|
17
|
+
context 'using rails middleware with dafault statsd host and port' do
|
18
|
+
before(:all) do
|
19
|
+
@statsd = Ruby::Reporters::Datadog.new(namespace: "dd_statsd_test")
|
20
|
+
@statsd.statsd.socket = Mock::FakeUDPSocket.new
|
21
|
+
end
|
22
|
+
|
23
|
+
before(:each) do
|
24
|
+
@statsd.statsd.socket.buffer.clear()
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'successful request' do
|
28
|
+
let(:app) { lambda {|env| [200, {'Content-Type' => 'text/plain'}, ['OK']]} }
|
29
|
+
let(:middleware) { Rails::Middleware::Datadog.new(app, {statsd: @statsd}) }
|
30
|
+
|
31
|
+
it 'should report a response_time_ms with tag error:false and other tags' do
|
32
|
+
middleware.call env_for('http://sniper3d.tfgco.com/players')
|
33
|
+
|
34
|
+
expect(@statsd.statsd.socket.buffer).to eq([[
|
35
|
+
"response_time_ms:10|h|#type:http,route:GET /players,status:200,error:false"
|
36
|
+
]])
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'failed, returning 404' do
|
41
|
+
let(:app) { lambda {|env| [404, {'Content-Type' => 'text/plain'}, ['Not Found']]} }
|
42
|
+
let(:middleware) { Rails::Middleware::Datadog.new(app, {statsd: @statsd}) }
|
43
|
+
|
44
|
+
it 'should report a response_time_ms with tag error:false and other tags' do
|
45
|
+
middleware.call env_for('http://sniper3d.tfgco.com/players/xablau')
|
46
|
+
|
47
|
+
expect(@statsd.statsd.socket.buffer).to eq([[
|
48
|
+
"response_time_ms:10|h|#type:http,route:GET /players/xablau,status:404,error:true"
|
49
|
+
]])
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'failed, returning 503' do
|
54
|
+
let(:app) { lambda {|env| [503, {'Content-Type' => 'text/plain'}, ['Internal Server Error']]} }
|
55
|
+
let(:middleware) { Rails::Middleware::Datadog.new(app, {statsd: @statsd}) }
|
56
|
+
|
57
|
+
it 'should report a response_time_ms with tag error:false and other tags' do
|
58
|
+
middleware.call env_for('http://sniper3d.tfgco.com/players/xablau')
|
59
|
+
|
60
|
+
expect(@statsd.statsd.socket.buffer).to eq([[
|
61
|
+
"response_time_ms:10|h|#type:http,route:GET /players/xablau,status:503,error:true"
|
62
|
+
]])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def env_for(url, opts={})
|
69
|
+
Rack::MockRequest.env_for(url, opts)
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'sidekiq/testing'
|
3
|
+
|
4
|
+
describe Ruby::Reporters::Datadog do
|
5
|
+
class Datadog::Statsd
|
6
|
+
attr_accessor :socket
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'report metrics to dd-statsd' do
|
10
|
+
context 'using default values for host and port' do
|
11
|
+
before(:all) do
|
12
|
+
@statsd = Ruby::Reporters::Datadog.new(namespace: "dd_statsd_test")
|
13
|
+
@statsd.statsd.socket = Mock::FakeUDPSocket.new
|
14
|
+
end
|
15
|
+
|
16
|
+
before(:each) do
|
17
|
+
@statsd.statsd.socket.buffer.clear()
|
18
|
+
end
|
19
|
+
|
20
|
+
context 'exploring response_time_ms' do
|
21
|
+
context 'request failed, returning 404' do
|
22
|
+
it 'should report a response_time_ms with tag error:true' do
|
23
|
+
@statsd.response_time_ms("/root", "get", 404, 1230)
|
24
|
+
|
25
|
+
expect(@statsd.statsd.socket.buffer).to eq([[
|
26
|
+
"response_time_ms:1230|h|#type:http,route:GET /root,status:404,error:true"
|
27
|
+
]])
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'request failed, returning 503' do
|
32
|
+
it 'should report a response_time_ms with tag error:true' do
|
33
|
+
@statsd.response_time_ms("/root", "get", 503, 1230)
|
34
|
+
|
35
|
+
expect(@statsd.statsd.socket.buffer).to eq([[
|
36
|
+
"response_time_ms:1230|h|#type:http,route:GET /root,status:503,error:true"
|
37
|
+
]])
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'request succeeded, returning 200' do
|
42
|
+
it 'should report a response_time_ms with tag error:false' do
|
43
|
+
@statsd.response_time_ms("/root", "get", 200, 1230)
|
44
|
+
|
45
|
+
expect(@statsd.statsd.socket.buffer).to eq([[
|
46
|
+
"response_time_ms:1230|h|#type:http,route:GET /root,status:200,error:false"
|
47
|
+
]])
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context 'exploring native calls' do
|
53
|
+
it 'should report a gauge' do
|
54
|
+
@statsd.gauge("number-of-pitayas", 342, ['status:ready-for-consumption'])
|
55
|
+
|
56
|
+
expect(@statsd.statsd.socket.buffer).to eq([[
|
57
|
+
"number-of-pitayas:342|g|#status:ready-for-consumption"
|
58
|
+
]])
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'should increment a counter' do
|
62
|
+
@statsd.increment("number-of-pitayas", ['kind:juice'])
|
63
|
+
|
64
|
+
expect(@statsd.statsd.socket.buffer).to eq([[
|
65
|
+
"number-of-pitayas:1|c|#kind:juice"
|
66
|
+
]])
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'sidekiq/testing'
|
3
|
+
|
4
|
+
Sidekiq::Testing.fake!
|
5
|
+
|
6
|
+
describe Sidekiq::Middleware::Datadog do
|
7
|
+
class Datadog::Statsd
|
8
|
+
attr_accessor :socket
|
9
|
+
end
|
10
|
+
|
11
|
+
class Sidekiq::Middleware::Datadog
|
12
|
+
def compute_elapsed_time_ms(start_time, end_time)
|
13
|
+
21
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe 'reports metrics to dd-statsd when middleware gets called' do
|
18
|
+
before(:all) do
|
19
|
+
@statsd = Datadog::Statsd.new("localhost", 8125)
|
20
|
+
@statsd.socket = Mock::FakeUDPSocket.new
|
21
|
+
|
22
|
+
Sidekiq::Testing.server_middleware do |chain|
|
23
|
+
chain.add Sidekiq::Middleware::Datadog, hostname: "localhost", statsd: @statsd, tags: ["custom:tag", lambda{|w, *| "worker:0" }]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'enqueueing all two jobs' do
|
28
|
+
let(:worker) { Mock::Worker.new }
|
29
|
+
|
30
|
+
before(:context) do
|
31
|
+
@jobs = ['test-job-1', 'test-job-2']
|
32
|
+
@jobs.each { | job | Mock::Worker.perform_async(job) }
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should have two jobs at the queue' do
|
36
|
+
expect(Sidekiq::Queues["default"].size).to eq(@jobs.size)
|
37
|
+
end
|
38
|
+
|
39
|
+
context 'middleware gets called' do
|
40
|
+
before(:all) do
|
41
|
+
Mock::Worker.drain
|
42
|
+
end
|
43
|
+
|
44
|
+
it 'should have 0 jobs at the queue' do
|
45
|
+
expect(Sidekiq::Queues["default"].size).to eq(0)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should publish metrics from the fisrt job to dogstatd' do
|
49
|
+
expect(@statsd.socket.buffer[0]).to eq([
|
50
|
+
"worker.run_time_ms:21|ms|#custom:tag,worker:0,env:test,name:mock/worker,queue:default,error:false"
|
51
|
+
])
|
52
|
+
|
53
|
+
expect(@statsd.socket.buffer[1]).to eq([
|
54
|
+
"worker.queue_size:1|g|#custom:tag,worker:0,env:test,name:mock/worker,queue:default,error:false"
|
55
|
+
])
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'should publish metrics from the second job to dogstatd' do
|
59
|
+
expect(@statsd.socket.buffer[0]).to eq([
|
60
|
+
"worker.run_time_ms:21|ms|#custom:tag,worker:0,env:test,name:mock/worker,queue:default,error:false"
|
61
|
+
])
|
62
|
+
|
63
|
+
expect(@statsd.socket.buffer[1]).to eq([
|
64
|
+
"worker.queue_size:1|g|#custom:tag,worker:0,env:test,name:mock/worker,queue:default,error:false"
|
65
|
+
])
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
File without changes
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
ENV['RACK_ENV'] ||= 'test'
|
2
|
+
|
3
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
4
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
5
|
+
|
6
|
+
require 'sidekiq'
|
7
|
+
require 'sidekiq-middleware-datadog'
|
8
|
+
require 'rails-middleware-datadog'
|
9
|
+
require 'sinatra-middleware-datadog'
|
10
|
+
require 'datadog-client'
|
11
|
+
|
12
|
+
module Mock
|
13
|
+
class Worker
|
14
|
+
include Sidekiq::Worker
|
15
|
+
def perform(name)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
class FakeUDPSocket
|
20
|
+
attr_reader :buffer
|
21
|
+
|
22
|
+
def initialize
|
23
|
+
@buffer = []
|
24
|
+
end
|
25
|
+
|
26
|
+
def send(message, *)
|
27
|
+
@buffer.push [message]
|
28
|
+
end
|
29
|
+
|
30
|
+
def recv
|
31
|
+
@buffer.shift
|
32
|
+
end
|
33
|
+
|
34
|
+
def to_s
|
35
|
+
inspect
|
36
|
+
end
|
37
|
+
|
38
|
+
def inspect
|
39
|
+
"<FakeUDPSocket: #{@buffer.inspect}>"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
metadata
ADDED
@@ -0,0 +1,164 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ruby-dogstatsd
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Top Free Games
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2018-04-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dogstatsd-ruby
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: sidekiq
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rake
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rack
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
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'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: sidekiq
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: Rails middleware report metrics to Datadog
|
112
|
+
email:
|
113
|
+
- backend@tfgco.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- Gemfile
|
119
|
+
- Gemfile.lock
|
120
|
+
- README.md
|
121
|
+
- lib/datadog-client.rb
|
122
|
+
- lib/rails-middleware-datadog.rb
|
123
|
+
- lib/rails/middleware/datadog.rb
|
124
|
+
- lib/ruby/reporters/datadog.rb
|
125
|
+
- lib/sidekiq-middleware-datadog.rb
|
126
|
+
- lib/sidekiq/middleware/datadog.rb
|
127
|
+
- lib/sinatra-middleware-datadog.rb
|
128
|
+
- lib/sinatra/middleware/datadog.rb
|
129
|
+
- ruby-dogstatsd.gemspec
|
130
|
+
- spec/rails/middleware/datadog_spec.rb
|
131
|
+
- spec/ruby/reporters/datadog_spec.rb
|
132
|
+
- spec/sidekiq/datadog_spec.rb
|
133
|
+
- spec/sinatra/datadog_spec.rb
|
134
|
+
- spec/spec_helper.rb
|
135
|
+
homepage: https://git.topfreegames.com/topfreegames/rails-datadog-middleware
|
136
|
+
licenses:
|
137
|
+
- MIT
|
138
|
+
metadata: {}
|
139
|
+
post_install_message:
|
140
|
+
rdoc_options: []
|
141
|
+
require_paths:
|
142
|
+
- lib
|
143
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: '0'
|
148
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
requirements: []
|
154
|
+
rubyforge_project:
|
155
|
+
rubygems_version: 2.7.6
|
156
|
+
signing_key:
|
157
|
+
specification_version: 4
|
158
|
+
summary: Report basic metrics to datadog
|
159
|
+
test_files:
|
160
|
+
- spec/rails/middleware/datadog_spec.rb
|
161
|
+
- spec/ruby/reporters/datadog_spec.rb
|
162
|
+
- spec/sidekiq/datadog_spec.rb
|
163
|
+
- spec/sinatra/datadog_spec.rb
|
164
|
+
- spec/spec_helper.rb
|