ddtrace 0.17.3 → 0.18.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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.env +2 -2
  3. data/Appraisals +4 -0
  4. data/CHANGELOG.md +21 -2
  5. data/Rakefile +31 -29
  6. data/docker-compose.yml +7 -7
  7. data/docs/GettingStarted.md +26 -2
  8. data/lib/ddtrace.rb +4 -0
  9. data/lib/ddtrace/augmentation.rb +13 -0
  10. data/lib/ddtrace/augmentation/method_wrapper.rb +20 -0
  11. data/lib/ddtrace/augmentation/method_wrapping.rb +38 -0
  12. data/lib/ddtrace/augmentation/shim.rb +102 -0
  13. data/lib/ddtrace/contrib/active_record/events/sql.rb +6 -2
  14. data/lib/ddtrace/contrib/active_record/patcher.rb +2 -0
  15. data/lib/ddtrace/contrib/active_record/patches/abstract_adapter.rb +72 -0
  16. data/lib/ddtrace/contrib/active_record/utils.rb +8 -18
  17. data/lib/ddtrace/contrib/aws/instrumentation.rb +15 -11
  18. data/lib/ddtrace/contrib/aws/patcher.rb +0 -11
  19. data/lib/ddtrace/contrib/configurable.rb +13 -9
  20. data/lib/ddtrace/contrib/rack/request_queue.rb +5 -1
  21. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +14 -0
  22. data/lib/ddtrace/contrib/shoryuken/ext.rb +18 -0
  23. data/lib/ddtrace/contrib/shoryuken/integration.rb +35 -0
  24. data/lib/ddtrace/contrib/shoryuken/patcher.rb +30 -0
  25. data/lib/ddtrace/contrib/shoryuken/tracer.rb +37 -0
  26. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +35 -0
  27. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +1 -0
  28. data/lib/ddtrace/contrib/sidekiq/ext.rb +2 -0
  29. data/lib/ddtrace/contrib/sidekiq/patcher.rb +9 -2
  30. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +50 -0
  31. data/lib/ddtrace/contrib/sidekiq/tracing.rb +38 -0
  32. data/lib/ddtrace/sync_writer.rb +2 -1
  33. data/lib/ddtrace/transport.rb +6 -3
  34. data/lib/ddtrace/utils/database.rb +7 -3
  35. data/lib/ddtrace/version.rb +2 -2
  36. data/lib/ddtrace/writer.rb +1 -4
  37. metadata +15 -3
  38. data/lib/ddtrace/contrib/sidekiq/tracer.rb +0 -72
@@ -18,9 +18,13 @@ module Datadog
18
18
  time_string = header.split('t=')[1]
19
19
  return if time_string.nil?
20
20
 
21
+ # Return nil if the time is clearly invalid
22
+ time_value = time_string.to_f
23
+ return if time_value.zero?
24
+
21
25
  # return the request_start only if it's lesser than
22
26
  # current time, to avoid significant clock skew
23
- request_start = Time.at(time_string.to_f)
27
+ request_start = Time.at(time_value)
24
28
  request_start.utc > now ? nil : request_start
25
29
  rescue StandardError => e
26
30
  # in case of an Exception we don't create a
@@ -0,0 +1,14 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module Shoryuken
6
+ module Configuration
7
+ # Default settings for the Shoryuken integration
8
+ class Settings < Contrib::Configuration::Settings
9
+ option :service_name, default: Ext::SERVICE_NAME
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,18 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Shoryuken
4
+ # Shoryuken integration constants
5
+ module Ext
6
+ APP = 'shoryuken'.freeze
7
+ SERVICE_NAME = 'shoryuken'.freeze
8
+
9
+ SPAN_JOB = 'shoryuken.job'.freeze
10
+
11
+ TAG_JOB_ID = 'shoryuken.id'.freeze
12
+ TAG_JOB_QUEUE = 'shoryuken.queue'.freeze
13
+ TAG_JOB_ATTRIBUTES = 'shoryuken.attributes'.freeze
14
+ TAG_JOB_BODY = 'shoryuken.body'.freeze
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,35 @@
1
+ require 'ddtrace/contrib/integration'
2
+ require 'ddtrace/contrib/shoryuken/ext'
3
+ require 'ddtrace/contrib/shoryuken/configuration/settings'
4
+ require 'ddtrace/contrib/shoryuken/patcher'
5
+
6
+ module Datadog
7
+ module Contrib
8
+ module Shoryuken
9
+ # Description of Shoryuken integration
10
+ class Integration
11
+ include Contrib::Integration
12
+
13
+ register_as :shoryuken
14
+
15
+ class << self
16
+ def version
17
+ Gem.loaded_specs['shoryuken'] && Gem.loaded_specs['shoryuken'].version
18
+ end
19
+
20
+ def present?
21
+ super && defined?(::Shoryuken)
22
+ end
23
+ end
24
+
25
+ def default_configuration
26
+ Configuration::Settings.new
27
+ end
28
+
29
+ def patcher
30
+ Patcher
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,30 @@
1
+ require 'ddtrace/contrib/shoryuken/tracer'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module Shoryuken
6
+ # Patcher enables patching of 'shoryuken' module.
7
+ module Patcher
8
+ include Contrib::Patcher
9
+
10
+ module_function
11
+
12
+ def patched?
13
+ done?(:shoryuken)
14
+ end
15
+
16
+ def patch
17
+ do_once(:shoryuken) do
18
+ begin
19
+ ::Shoryuken.server_middleware do |chain|
20
+ chain.add Shoryuken::Tracer
21
+ end
22
+ rescue StandardError => e
23
+ Datadog::Tracer.log.error("Unable to apply Shoryuken integration: #{e}")
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,37 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Shoryuken
4
+ # Tracer is a Shoryuken server-side middleware which traces executed jobs
5
+ class Tracer
6
+ def initialize(options = {})
7
+ @tracer = options[:tracer] || Datadog.configuration[:shoryuken][:tracer]
8
+ @shoryuken_service = options[:service_name] || Datadog.configuration[:shoryuken][:service_name]
9
+ set_service_info(@shoryuken_service)
10
+ end
11
+
12
+ def call(worker_instance, queue, sqs_msg, body)
13
+ @tracer.trace(Ext::SPAN_JOB, service: @shoryuken_service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
14
+ span.resource = worker_instance.class.name
15
+ span.set_tag(Ext::TAG_JOB_ID, sqs_msg.message_id)
16
+ span.set_tag(Ext::TAG_JOB_QUEUE, queue)
17
+ span.set_tag(Ext::TAG_JOB_ATTRIBUTES, sqs_msg.attributes) if sqs_msg.respond_to?(:attributes)
18
+ span.set_tag(Ext::TAG_JOB_BODY, body)
19
+
20
+ yield
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def set_service_info(service)
27
+ return if @tracer.services[service]
28
+ @tracer.set_service_info(
29
+ service,
30
+ Ext::APP,
31
+ Datadog::Ext::AppTypes::WORKER
32
+ )
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ require 'ddtrace/contrib/sidekiq/tracing'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module Sidekiq
6
+ # Tracer is a Sidekiq client-side middleware which traces job enqueues/pushes
7
+ class ClientTracer
8
+ include Tracing
9
+
10
+ def initialize(options = {})
11
+ super
12
+ @sidekiq_service = options[:client_service_name] || Datadog.configuration[:sidekiq][:client_service_name]
13
+ end
14
+
15
+ # Client middleware arguments are documented here:
16
+ # https://github.com/mperham/sidekiq/wiki/Middleware#client-middleware
17
+ def call(worker_class, job, queue, redis_pool)
18
+ service = @sidekiq_service
19
+ set_service_info(service)
20
+
21
+ resource = job_resource(job)
22
+
23
+ @tracer.trace(Ext::SPAN_PUSH, service: service) do |span|
24
+ span.resource = resource
25
+ span.set_tag(Ext::TAG_JOB_ID, job['jid'])
26
+ span.set_tag(Ext::TAG_JOB_QUEUE, job['queue'])
27
+ span.set_tag(Ext::TAG_JOB_WRAPPER, job['class']) if job['wrapped']
28
+
29
+ yield
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -8,6 +8,7 @@ module Datadog
8
8
  # Custom settings for the Sidekiq integration
9
9
  class Settings < Contrib::Configuration::Settings
10
10
  option :service_name, default: Ext::SERVICE_NAME
11
+ option :client_service_name, default: Ext::CLIENT_SERVICE_NAME
11
12
  end
12
13
  end
13
14
  end
@@ -5,7 +5,9 @@ module Datadog
5
5
  module Ext
6
6
  APP = 'sidekiq'.freeze
7
7
  SERVICE_NAME = 'sidekiq'.freeze
8
+ CLIENT_SERVICE_NAME = 'sidekiq-client'.freeze
8
9
 
10
+ SPAN_PUSH = 'sidekiq.push'.freeze
9
11
  SPAN_JOB = 'sidekiq.job'.freeze
10
12
 
11
13
  TAG_JOB_DELAY = 'sidekiq.job.delay'.freeze
@@ -16,10 +16,17 @@ module Datadog
16
16
  def patch
17
17
  do_once(:sidekiq) do
18
18
  begin
19
- require 'ddtrace/contrib/sidekiq/tracer'
19
+ require 'ddtrace/contrib/sidekiq/client_tracer'
20
+ ::Sidekiq.configure_client do |config|
21
+ config.client_middleware do |chain|
22
+ chain.add(Sidekiq::ClientTracer)
23
+ end
24
+ end
25
+
26
+ require 'ddtrace/contrib/sidekiq/server_tracer'
20
27
  ::Sidekiq.configure_server do |config|
21
28
  config.server_middleware do |chain|
22
- chain.add(Sidekiq::Tracer)
29
+ chain.add(Sidekiq::ServerTracer)
23
30
  end
24
31
  end
25
32
  rescue StandardError => e
@@ -0,0 +1,50 @@
1
+ require 'ddtrace/contrib/sidekiq/tracing'
2
+
3
+ module Datadog
4
+ module Contrib
5
+ module Sidekiq
6
+ # Tracer is a Sidekiq server-side middleware which traces executed jobs
7
+ class ServerTracer
8
+ include Tracing
9
+
10
+ def initialize(options = {})
11
+ super
12
+ @sidekiq_service = options[:service_name] || Datadog.configuration[:sidekiq][:service_name]
13
+ end
14
+
15
+ def call(worker, job, queue)
16
+ resource = job_resource(job)
17
+
18
+ service = service_from_worker_config(resource) || @sidekiq_service
19
+ set_service_info(service)
20
+
21
+ @tracer.trace(Ext::SPAN_JOB, service: service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
22
+ span.resource = resource
23
+ span.set_tag(Ext::TAG_JOB_ID, job['jid'])
24
+ span.set_tag(Ext::TAG_JOB_RETRY, job['retry'])
25
+ span.set_tag(Ext::TAG_JOB_QUEUE, job['queue'])
26
+ span.set_tag(Ext::TAG_JOB_WRAPPER, job['class']) if job['wrapped']
27
+ span.set_tag(Ext::TAG_JOB_DELAY, 1000.0 * (Time.now.utc.to_f - job['enqueued_at'].to_f))
28
+
29
+ yield
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def service_from_worker_config(resource)
36
+ # Try to get the Ruby class from the resource name.
37
+ worker_klass = begin
38
+ Object.const_get(resource)
39
+ rescue NameError
40
+ nil
41
+ end
42
+
43
+ if worker_klass.respond_to?(:datadog_tracer_config)
44
+ worker_klass.datadog_tracer_config[:service_name]
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,38 @@
1
+ require 'ddtrace/ext/app_types'
2
+ require 'ddtrace/contrib/sidekiq/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module Sidekiq
7
+ # Common functionality used by both client-side and server-side tracers.
8
+ module Tracing
9
+ def initialize(options = {})
10
+ @tracer = options[:tracer] || Datadog.configuration[:sidekiq][:tracer]
11
+ end
12
+
13
+ protected
14
+
15
+ # If class is wrapping something else, the interesting resource info
16
+ # is the underlying, wrapped class, and not the wrapper. This is
17
+ # primarily to support `ActiveJob`.
18
+ def job_resource(job)
19
+ if job['wrapped']
20
+ job['wrapped']
21
+ else
22
+ job['class']
23
+ end
24
+ end
25
+
26
+ def set_service_info(service)
27
+ # Ensure the tracer knows about this service.
28
+ return if @tracer.services[service]
29
+ @tracer.set_service_info(
30
+ service,
31
+ Ext::APP,
32
+ Datadog::Ext::AppTypes::WORKER
33
+ )
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -5,7 +5,8 @@ module Datadog
5
5
 
6
6
  def initialize(options = {})
7
7
  @transport = options.fetch(:transport) do
8
- HTTPTransport.new(Writer::HOSTNAME, Writer::PORT)
8
+ transport_options = options.fetch(:transport_options, {})
9
+ HTTPTransport.new(transport_options)
9
10
  end
10
11
  end
11
12
 
@@ -13,6 +13,9 @@ module Datadog
13
13
  attr_accessor :hostname, :port
14
14
  attr_reader :traces_endpoint, :services_endpoint
15
15
 
16
+ DEFAULT_AGENT_HOST = '127.0.0.1'.freeze
17
+ DEFAULT_TRACE_AGENT_PORT = '8126'.freeze
18
+
16
19
  # seconds before the transport timeout
17
20
  TIMEOUT = 1
18
21
 
@@ -45,11 +48,11 @@ module Datadog
45
48
 
46
49
  private_constant :API
47
50
 
48
- def initialize(hostname, port, options = {})
51
+ def initialize(options = {})
49
52
  api_version = options.fetch(:api_version, V3)
50
53
 
51
- @hostname = hostname
52
- @port = port
54
+ @hostname = options[:hostname] || ENV['DD_AGENT_HOST'] || DEFAULT_AGENT_HOST
55
+ @port = options[:port] || ENV['DD_TRACE_AGENT_PORT'] || DEFAULT_TRACE_AGENT_PORT
53
56
  @api = API.fetch(api_version)
54
57
  @encoder = options[:encoder] || @api[:encoder]
55
58
  @response_callback = options[:response_callback]
@@ -2,16 +2,20 @@ module Datadog
2
2
  module Utils
3
3
  # Common database-related utility functions.
4
4
  module Database
5
+ VENDOR_DEFAULT = 'defaultdb'.freeze
6
+ VENDOR_POSTGRES = 'postgres'.freeze
7
+ VENDOR_SQLITE = 'sqlite'.freeze
8
+
5
9
  module_function
6
10
 
7
11
  def normalize_vendor(vendor)
8
12
  case vendor
9
13
  when nil
10
- 'defaultdb'
14
+ VENDOR_DEFAULT
11
15
  when 'postgresql'
12
- 'postgres'
16
+ VENDOR_POSTGRES
13
17
  when 'sqlite3'
14
- 'sqlite'
18
+ VENDOR_SQLITE
15
19
  else
16
20
  vendor
17
21
  end
@@ -1,8 +1,8 @@
1
1
  module Datadog
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 17
5
- PATCH = 3
4
+ MINOR = 18
5
+ PATCH = 0
6
6
  PRE = nil
7
7
 
8
8
  STRING = [MAJOR, MINOR, PATCH, PRE].compact.join('.')
@@ -7,9 +7,6 @@ module Datadog
7
7
  class Writer
8
8
  attr_reader :transport, :worker, :priority_sampler
9
9
 
10
- HOSTNAME = '127.0.0.1'.freeze
11
- PORT = '8126'.freeze
12
-
13
10
  def initialize(options = {})
14
11
  # writer and transport parameters
15
12
  @buff_size = options.fetch(:buffer_size, 100)
@@ -24,7 +21,7 @@ module Datadog
24
21
 
25
22
  # transport and buffers
26
23
  @transport = options.fetch(:transport) do
27
- HTTPTransport.new(HOSTNAME, PORT, transport_options)
24
+ HTTPTransport.new(transport_options)
28
25
  end
29
26
 
30
27
  @services = {}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ddtrace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.3
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-29 00:00:00.000000000 Z
11
+ date: 2018-12-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -283,6 +283,10 @@ files:
283
283
  - docker-compose.yml
284
284
  - docs/GettingStarted.md
285
285
  - lib/ddtrace.rb
286
+ - lib/ddtrace/augmentation.rb
287
+ - lib/ddtrace/augmentation/method_wrapper.rb
288
+ - lib/ddtrace/augmentation/method_wrapping.rb
289
+ - lib/ddtrace/augmentation/shim.rb
286
290
  - lib/ddtrace/buffer.rb
287
291
  - lib/ddtrace/configurable.rb
288
292
  - lib/ddtrace/configuration.rb
@@ -308,6 +312,7 @@ files:
308
312
  - lib/ddtrace/contrib/active_record/ext.rb
309
313
  - lib/ddtrace/contrib/active_record/integration.rb
310
314
  - lib/ddtrace/contrib/active_record/patcher.rb
315
+ - lib/ddtrace/contrib/active_record/patches/abstract_adapter.rb
311
316
  - lib/ddtrace/contrib/active_record/utils.rb
312
317
  - lib/ddtrace/contrib/active_support/notifications/event.rb
313
318
  - lib/ddtrace/contrib/active_support/notifications/subscriber.rb
@@ -452,11 +457,18 @@ files:
452
457
  - lib/ddtrace/contrib/sequel/integration.rb
453
458
  - lib/ddtrace/contrib/sequel/patcher.rb
454
459
  - lib/ddtrace/contrib/sequel/utils.rb
460
+ - lib/ddtrace/contrib/shoryuken/configuration/settings.rb
461
+ - lib/ddtrace/contrib/shoryuken/ext.rb
462
+ - lib/ddtrace/contrib/shoryuken/integration.rb
463
+ - lib/ddtrace/contrib/shoryuken/patcher.rb
464
+ - lib/ddtrace/contrib/shoryuken/tracer.rb
465
+ - lib/ddtrace/contrib/sidekiq/client_tracer.rb
455
466
  - lib/ddtrace/contrib/sidekiq/configuration/settings.rb
456
467
  - lib/ddtrace/contrib/sidekiq/ext.rb
457
468
  - lib/ddtrace/contrib/sidekiq/integration.rb
458
469
  - lib/ddtrace/contrib/sidekiq/patcher.rb
459
- - lib/ddtrace/contrib/sidekiq/tracer.rb
470
+ - lib/ddtrace/contrib/sidekiq/server_tracer.rb
471
+ - lib/ddtrace/contrib/sidekiq/tracing.rb
460
472
  - lib/ddtrace/contrib/sinatra/configuration/settings.rb
461
473
  - lib/ddtrace/contrib/sinatra/env.rb
462
474
  - lib/ddtrace/contrib/sinatra/ext.rb