ddtrace 0.32.0 → 0.33.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 (65) hide show
  1. checksums.yaml +5 -5
  2. data/.env +2 -0
  3. data/Appraisals +9 -6
  4. data/CHANGELOG.md +32 -1
  5. data/Rakefile +3 -2
  6. data/ddtrace.gemspec +2 -1
  7. data/docker-compose.yml +9 -0
  8. data/docs/GettingStarted.md +69 -6
  9. data/lib/ddtrace.rb +1 -0
  10. data/lib/ddtrace/configuration/option.rb +3 -2
  11. data/lib/ddtrace/configuration/option_definition.rb +1 -1
  12. data/lib/ddtrace/configuration/options.rb +5 -0
  13. data/lib/ddtrace/contrib/action_cable/integration.rb +2 -2
  14. data/lib/ddtrace/contrib/action_pack/integration.rb +2 -2
  15. data/lib/ddtrace/contrib/action_view/integration.rb +2 -2
  16. data/lib/ddtrace/contrib/active_model_serializers/integration.rb +3 -5
  17. data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +4 -5
  18. data/lib/ddtrace/contrib/active_record/integration.rb +2 -2
  19. data/lib/ddtrace/contrib/active_support/integration.rb +2 -2
  20. data/lib/ddtrace/contrib/aws/integration.rb +6 -2
  21. data/lib/ddtrace/contrib/aws/patcher.rb +8 -2
  22. data/lib/ddtrace/contrib/concurrent_ruby/integration.rb +6 -2
  23. data/lib/ddtrace/contrib/configurable.rb +30 -13
  24. data/lib/ddtrace/contrib/configuration/resolver.rb +7 -3
  25. data/lib/ddtrace/contrib/dalli/integration.rb +2 -2
  26. data/lib/ddtrace/contrib/delayed_job/integration.rb +6 -2
  27. data/lib/ddtrace/contrib/elasticsearch/integration.rb +2 -2
  28. data/lib/ddtrace/contrib/ethon/integration.rb +6 -2
  29. data/lib/ddtrace/contrib/excon/integration.rb +6 -2
  30. data/lib/ddtrace/contrib/faraday/integration.rb +2 -2
  31. data/lib/ddtrace/contrib/grape/integration.rb +3 -3
  32. data/lib/ddtrace/contrib/graphql/integration.rb +3 -5
  33. data/lib/ddtrace/contrib/grpc/integration.rb +2 -2
  34. data/lib/ddtrace/contrib/http/integration.rb +4 -0
  35. data/lib/ddtrace/contrib/mongodb/integration.rb +2 -2
  36. data/lib/ddtrace/contrib/mysql2/integration.rb +6 -2
  37. data/lib/ddtrace/contrib/patchable.rb +21 -4
  38. data/lib/ddtrace/contrib/presto/configuration/settings.rb +23 -0
  39. data/lib/ddtrace/contrib/presto/ext.rb +25 -0
  40. data/lib/ddtrace/contrib/presto/instrumentation.rb +107 -0
  41. data/lib/ddtrace/contrib/presto/integration.rb +36 -0
  42. data/lib/ddtrace/contrib/presto/patcher.rb +30 -0
  43. data/lib/ddtrace/contrib/racecar/integration.rb +3 -3
  44. data/lib/ddtrace/contrib/rack/integration.rb +6 -2
  45. data/lib/ddtrace/contrib/rails/integration.rb +6 -3
  46. data/lib/ddtrace/contrib/rake/integration.rb +6 -2
  47. data/lib/ddtrace/contrib/redis/configuration/resolver.rb +36 -0
  48. data/lib/ddtrace/contrib/redis/integration.rb +7 -3
  49. data/lib/ddtrace/contrib/redis/patcher.rb +11 -2
  50. data/lib/ddtrace/contrib/redis/vendor/resolver.rb +159 -0
  51. data/lib/ddtrace/contrib/resque/integration.rb +8 -2
  52. data/lib/ddtrace/contrib/rest_client/integration.rb +6 -2
  53. data/lib/ddtrace/contrib/sequel/integration.rb +6 -2
  54. data/lib/ddtrace/contrib/shoryuken/integration.rb +9 -7
  55. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +5 -0
  56. data/lib/ddtrace/contrib/sidekiq/ext.rb +2 -0
  57. data/lib/ddtrace/contrib/sidekiq/integration.rb +2 -2
  58. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +7 -3
  59. data/lib/ddtrace/contrib/sidekiq/tracing.rb +19 -2
  60. data/lib/ddtrace/contrib/sinatra/integration.rb +2 -2
  61. data/lib/ddtrace/contrib/sucker_punch/integration.rb +3 -3
  62. data/lib/ddtrace/runtime/metrics.rb +2 -2
  63. data/lib/ddtrace/sampling/rule_sampler.rb +16 -2
  64. data/lib/ddtrace/version.rb +1 -1
  65. metadata +12 -18
@@ -17,6 +17,11 @@ module Datadog
17
17
  o.lazy
18
18
  end
19
19
 
20
+ option :tag_args do |o|
21
+ o.default { env_to_bool(Ext::ENV_TAG_JOB_ARGS, false) }
22
+ o.lazy
23
+ end
24
+
20
25
  option :service_name, default: Ext::SERVICE_NAME
21
26
  option :client_service_name, default: Ext::CLIENT_SERVICE_NAME
22
27
  end
@@ -7,6 +7,7 @@ module Datadog
7
7
  CLIENT_SERVICE_NAME = 'sidekiq-client'.freeze
8
8
  ENV_ANALYTICS_ENABLED = 'DD_SIDEKIQ_ANALYTICS_ENABLED'.freeze
9
9
  ENV_ANALYTICS_SAMPLE_RATE = 'DD_SIDEKIQ_ANALYTICS_SAMPLE_RATE'.freeze
10
+ ENV_TAG_JOB_ARGS = 'DD_SIDEKIQ_TAG_JOB_ARGS'.freeze
10
11
  SERVICE_NAME = 'sidekiq'.freeze
11
12
  SPAN_PUSH = 'sidekiq.push'.freeze
12
13
  SPAN_JOB = 'sidekiq.job'.freeze
@@ -15,6 +16,7 @@ module Datadog
15
16
  TAG_JOB_QUEUE = 'sidekiq.job.queue'.freeze
16
17
  TAG_JOB_RETRY = 'sidekiq.job.retry'.freeze
17
18
  TAG_JOB_WRAPPER = 'sidekiq.job.wrapper'.freeze
19
+ TAG_JOB_ARGS = 'sidekiq.job.args'.freeze
18
20
  end
19
21
  end
20
22
  end
@@ -15,8 +15,8 @@ module Datadog
15
15
  Gem.loaded_specs['sidekiq'] && Gem.loaded_specs['sidekiq'].version
16
16
  end
17
17
 
18
- def self.present?
19
- super && defined?(::Sidekiq)
18
+ def self.loaded?
19
+ defined?(::Sidekiq)
20
20
  end
21
21
 
22
22
  def self.compatible?
@@ -16,7 +16,8 @@ module Datadog
16
16
  def call(worker, job, queue)
17
17
  resource = job_resource(job)
18
18
 
19
- service = service_from_worker_config(resource) || @sidekiq_service
19
+ service = worker_config(resource, :service_name) || @sidekiq_service
20
+ tag_args = worker_config(resource, :tag_args) || configuration[:tag_args]
20
21
 
21
22
  @tracer.trace(Ext::SPAN_JOB, service: service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
22
23
  span.resource = resource
@@ -29,6 +30,9 @@ module Datadog
29
30
  span.set_tag(Ext::TAG_JOB_QUEUE, job['queue'])
30
31
  span.set_tag(Ext::TAG_JOB_WRAPPER, job['class']) if job['wrapped']
31
32
  span.set_tag(Ext::TAG_JOB_DELAY, 1000.0 * (Time.now.utc.to_f - job['enqueued_at'].to_f))
33
+ if tag_args && !job['args'].nil? && !job['args'].empty?
34
+ span.set_tag(Ext::TAG_JOB_ARGS, job['args'])
35
+ end
32
36
 
33
37
  yield
34
38
  end
@@ -40,7 +44,7 @@ module Datadog
40
44
  Datadog.configuration[:sidekiq]
41
45
  end
42
46
 
43
- def service_from_worker_config(resource)
47
+ def worker_config(resource, key)
44
48
  # Try to get the Ruby class from the resource name.
45
49
  worker_klass = begin
46
50
  Object.const_get(resource)
@@ -49,7 +53,7 @@ module Datadog
49
53
  end
50
54
 
51
55
  if worker_klass.respond_to?(:datadog_tracer_config)
52
- worker_klass.datadog_tracer_config[:service_name]
56
+ worker_klass.datadog_tracer_config[key]
53
57
  end
54
58
  end
55
59
  end
@@ -1,6 +1,8 @@
1
1
  require 'ddtrace/ext/app_types'
2
2
  require 'ddtrace/contrib/sidekiq/ext'
3
3
 
4
+ require 'yaml'
5
+
4
6
  module Datadog
5
7
  module Contrib
6
8
  module Sidekiq
@@ -17,10 +19,25 @@ module Datadog
17
19
  # primarily to support `ActiveJob`.
18
20
  def job_resource(job)
19
21
  if job['wrapped']
20
- job['wrapped']
22
+ job['wrapped'].to_s
23
+ elsif job['class'] == 'Sidekiq::Extensions::DelayedClass'
24
+ delay_extension_class(job).to_s
21
25
  else
22
- job['class']
26
+ job['class'].to_s
23
27
  end
28
+ rescue => e
29
+ Datadog::Logger.log.debug { "Error retrieving Sidekiq job class name (jid:#{job['jid']}): #{e}" }
30
+
31
+ job['class'].to_s
32
+ end
33
+
34
+ #
35
+ def delay_extension_class(job)
36
+ clazz, method = YAML.parse(job['args'].first).children.first.children
37
+
38
+ method = method.value[1..-1] # Remove leading `:` from method symbol
39
+
40
+ "#{clazz.value}.#{method}"
24
41
  end
25
42
  end
26
43
  end
@@ -15,8 +15,8 @@ module Datadog
15
15
  Gem.loaded_specs['sinatra'] && Gem.loaded_specs['sinatra'].version
16
16
  end
17
17
 
18
- def self.present?
19
- super && defined?(::Sinatra)
18
+ def self.loaded?
19
+ defined?(::Sinatra)
20
20
  end
21
21
 
22
22
  def self.compatible?
@@ -15,12 +15,12 @@ module Datadog
15
15
  Gem.loaded_specs['sucker_punch'] && Gem.loaded_specs['sucker_punch'].version
16
16
  end
17
17
 
18
- def self.present?
19
- super && defined?(::SuckerPunch)
18
+ def self.loaded?
19
+ defined?(::SuckerPunch)
20
20
  end
21
21
 
22
22
  def self.compatible?
23
- super && Gem::Version.new(::SuckerPunch::VERSION) >= Gem::Version.new('2.0.0')
23
+ super && version >= Gem::Version.new('2.0.0')
24
24
  end
25
25
 
26
26
  def default_configuration
@@ -19,7 +19,7 @@ module Datadog
19
19
  end
20
20
 
21
21
  def associate_with_span(span)
22
- return if span.nil?
22
+ return if !enabled? || span.nil?
23
23
 
24
24
  # Register service as associated with metrics
25
25
  register_service(span.service) unless span.service.nil?
@@ -30,7 +30,7 @@ module Datadog
30
30
 
31
31
  # Associate service with runtime metrics
32
32
  def register_service(service)
33
- return if service.nil?
33
+ return if !enabled? || service.nil?
34
34
 
35
35
  service = service.to_s
36
36
 
@@ -16,6 +16,8 @@ module Datadog
16
16
  class RuleSampler
17
17
  extend Forwardable
18
18
 
19
+ AGENT_RATE_METRIC_KEY = '_dd.agent_psr'.freeze
20
+
19
21
  attr_reader :rules, :rate_limiter, :default_sampler
20
22
 
21
23
  # @param rules [Array<Rule>] ordered list of rules to be applied to a span
@@ -68,14 +70,26 @@ module Datadog
68
70
  end
69
71
 
70
72
  def sample!(span)
71
- sampled = sample_span(span) { |s| @default_sampler.sample!(s) }
73
+ sampled = sample_span(span) do |s|
74
+ @default_sampler.sample!(s).tap do
75
+ # We want to make sure the span is tagged with the agent-derived
76
+ # service rate. Retrieve this from the rate by service sampler.
77
+ # Only do this if it was set by a RateByServiceSampler.
78
+ if @default_sampler.is_a?(RateByServiceSampler)
79
+ s.set_metric(AGENT_RATE_METRIC_KEY, @default_sampler.sample_rate(span))
80
+ end
81
+ end
82
+ end
72
83
 
73
84
  sampled.tap do
74
85
  span.sampled = sampled
75
86
  end
76
87
  end
77
88
 
78
- def_delegators :@default_sampler, :update
89
+ def update(*args)
90
+ return false unless @default_sampler.respond_to?(:update)
91
+ @default_sampler.update(*args)
92
+ end
79
93
 
80
94
  private
81
95
 
@@ -1,7 +1,7 @@
1
1
  module Datadog
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 32
4
+ MINOR = 33
5
5
  PATCH = 0
6
6
  PRE = nil
7
7
 
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.32.0
4
+ version: 0.33.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: 2020-01-22 00:00:00.000000000 Z
11
+ date: 2020-02-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -290,20 +290,6 @@ dependencies:
290
290
  - - "~>"
291
291
  - !ruby/object:Gem::Version
292
292
  version: 0.4.9.2
293
- - !ruby/object:Gem::Dependency
294
- name: warning
295
- requirement: !ruby/object:Gem::Requirement
296
- requirements:
297
- - - ">="
298
- - !ruby/object:Gem::Version
299
- version: '0'
300
- type: :development
301
- prerelease: false
302
- version_requirements: !ruby/object:Gem::Requirement
303
- requirements:
304
- - - ">="
305
- - !ruby/object:Gem::Version
306
- version: '0'
307
293
  description: |
308
294
  ddtrace is Datadog’s tracing client for Ruby. It is used to trace requests
309
295
  as they flow across web servers, databases and microservices so that developers
@@ -512,6 +498,11 @@ files:
512
498
  - lib/ddtrace/contrib/mysql2/patcher.rb
513
499
  - lib/ddtrace/contrib/patchable.rb
514
500
  - lib/ddtrace/contrib/patcher.rb
501
+ - lib/ddtrace/contrib/presto/configuration/settings.rb
502
+ - lib/ddtrace/contrib/presto/ext.rb
503
+ - lib/ddtrace/contrib/presto/instrumentation.rb
504
+ - lib/ddtrace/contrib/presto/integration.rb
505
+ - lib/ddtrace/contrib/presto/patcher.rb
515
506
  - lib/ddtrace/contrib/racecar/configuration/settings.rb
516
507
  - lib/ddtrace/contrib/racecar/event.rb
517
508
  - lib/ddtrace/contrib/racecar/events.rb
@@ -539,12 +530,14 @@ files:
539
530
  - lib/ddtrace/contrib/rake/instrumentation.rb
540
531
  - lib/ddtrace/contrib/rake/integration.rb
541
532
  - lib/ddtrace/contrib/rake/patcher.rb
533
+ - lib/ddtrace/contrib/redis/configuration/resolver.rb
542
534
  - lib/ddtrace/contrib/redis/configuration/settings.rb
543
535
  - lib/ddtrace/contrib/redis/ext.rb
544
536
  - lib/ddtrace/contrib/redis/integration.rb
545
537
  - lib/ddtrace/contrib/redis/patcher.rb
546
538
  - lib/ddtrace/contrib/redis/quantize.rb
547
539
  - lib/ddtrace/contrib/redis/tags.rb
540
+ - lib/ddtrace/contrib/redis/vendor/resolver.rb
548
541
  - lib/ddtrace/contrib/registerable.rb
549
542
  - lib/ddtrace/contrib/registry.rb
550
543
  - lib/ddtrace/contrib/resque/configuration/settings.rb
@@ -714,9 +707,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
714
707
  requirements:
715
708
  - - ">="
716
709
  - !ruby/object:Gem::Version
717
- version: '0'
710
+ version: 2.0.0
718
711
  requirements: []
719
- rubygems_version: 3.0.6
712
+ rubyforge_project:
713
+ rubygems_version: 2.6.14
720
714
  signing_key:
721
715
  specification_version: 4
722
716
  summary: Datadog tracing code for your Ruby applications