ddtrace 0.32.0 → 0.33.0

Sign up to get free protection for your applications and to get access to all the features.
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