ddtrace 0.22.0 → 0.23.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 (35) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +22 -2
  3. data/lib/ddtrace/analytics.rb +2 -1
  4. data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +0 -7
  5. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +3 -5
  6. data/lib/ddtrace/contrib/dalli/patcher.rb +0 -7
  7. data/lib/ddtrace/contrib/faraday/middleware.rb +0 -2
  8. data/lib/ddtrace/contrib/faraday/patcher.rb +0 -11
  9. data/lib/ddtrace/contrib/grape/patcher.rb +0 -7
  10. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +1 -4
  11. data/lib/ddtrace/contrib/grpc/patcher.rb +0 -7
  12. data/lib/ddtrace/contrib/racecar/patcher.rb +0 -8
  13. data/lib/ddtrace/contrib/rack/configuration/settings.rb +2 -10
  14. data/lib/ddtrace/contrib/rails/framework.rb +0 -7
  15. data/lib/ddtrace/contrib/rake/instrumentation.rb +2 -4
  16. data/lib/ddtrace/contrib/rake/patcher.rb +0 -7
  17. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +1 -4
  18. data/lib/ddtrace/contrib/shoryuken/tracer.rb +0 -10
  19. data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +0 -1
  20. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +0 -1
  21. data/lib/ddtrace/contrib/sidekiq/tracing.rb +0 -10
  22. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +1 -4
  23. data/lib/ddtrace/encoding.rb +0 -5
  24. data/lib/ddtrace/ext/forced_tracing.rb +9 -0
  25. data/lib/ddtrace/forced_tracing.rb +64 -0
  26. data/lib/ddtrace/opentracer/span.rb +8 -0
  27. data/lib/ddtrace/pin.rb +0 -2
  28. data/lib/ddtrace/span.rb +4 -1
  29. data/lib/ddtrace/sync_writer.rb +10 -6
  30. data/lib/ddtrace/tracer.rb +20 -11
  31. data/lib/ddtrace/transport.rb +2 -8
  32. data/lib/ddtrace/version.rb +1 -1
  33. data/lib/ddtrace/workers.rb +2 -28
  34. data/lib/ddtrace/writer.rb +13 -23
  35. metadata +5 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ca30d1de4944896da5082d6e5479437c7ec76ae8
4
- data.tar.gz: 1a9d2c6922699e01f6364039d5ff39530c7fb6fd
3
+ metadata.gz: 65dcbe210bf9b8f1824d9636e81c454feb1a606a
4
+ data.tar.gz: 846f031c64443dc6e2fe93572ef96f488dcafc8d
5
5
  SHA512:
6
- metadata.gz: '01378c87cbd74c47525e7b5eed4fa161305b3f7c1a0da54e6c105074806b5c32af84b27d69e7251ba39cc5d7040f4335f3eb878e30bd3a2f6cf08d317f75c4e8'
7
- data.tar.gz: e08463b5ad5f4a67af403558bcb5a51fe9a7a4451804037ac5db6203280cb263dde1e02d78c9fc4973e12a07aa44f6334b6b79f337bc34c7fc5d8eb0118b0182
6
+ metadata.gz: 1cd1b941a9b4e9d7c75b4212e1fe18a91afa0533446ab6363cee88da063e38a24199a6d33b6ede30eae3ea53f7eb890d60a9b51723274b4581edb15062e1d2df
7
+ data.tar.gz: 5a66c125f2985a3edf2938b5fc32b7c8e4cfb787a2ffde5a2a18b01d6c22500a0ec51a3f195ff4fe0bb68dba8d98dd94f518d8cade3e8551ed7508a42ba346d6
data/CHANGELOG.md CHANGED
@@ -4,6 +4,25 @@
4
4
 
5
5
  ## [Unreleased (beta)]
6
6
 
7
+ ## [0.23.0] - 2019-04-30
8
+
9
+ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.23.0
10
+
11
+ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.22.0...v0.23.0
12
+
13
+ ### Added
14
+
15
+ - Error status support via tags for OpenTracing (#739)
16
+ - Forced sampling support via tags (#720)
17
+
18
+ ### Fixed
19
+
20
+ - Wrong return values for Rake integration (#742) (@Redapted)
21
+
22
+ ### Removed
23
+
24
+ - Obsolete service telemetry (#738)
25
+
7
26
  ## [0.22.0] - 2019-04-15
8
27
 
9
28
  Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.22.0
@@ -767,8 +786,9 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
767
786
 
768
787
  Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
769
788
 
770
- [Unreleased (stable)]: https://github.com/DataDog/dd-trace-rb/compare/v0.22.0...master
771
- [Unreleased (beta)]: https://github.com/DataDog/dd-trace-rb/compare/v0.22.0...0.23-dev
789
+ [Unreleased (stable)]: https://github.com/DataDog/dd-trace-rb/compare/v0.23.0...master
790
+ [Unreleased (beta)]: https://github.com/DataDog/dd-trace-rb/compare/v0.23.0...0.24-dev
791
+ [0.23.0]: https://github.com/DataDog/dd-trace-rb/compare/v0.22.0...v0.23.0
772
792
  [0.22.0]: https://github.com/DataDog/dd-trace-rb/compare/v0.21.2...v0.22.0
773
793
  [0.21.2]: https://github.com/DataDog/dd-trace-rb/compare/v0.21.1...v0.21.2
774
794
  [0.21.1]: https://github.com/DataDog/dd-trace-rb/compare/v0.21.0...v0.21.1
@@ -29,7 +29,8 @@ module Datadog
29
29
  def self.included(base)
30
30
  base.class_eval do
31
31
  alias_method :set_tag_without_analytics, :set_tag
32
- remove_method :set_tag
32
+ # DEV: When we stack multiple extensions the method might already be removed
33
+ remove_method :set_tag if method_defined?(:set_tag)
33
34
  end
34
35
  end
35
36
 
@@ -21,13 +21,6 @@ module Datadog
21
21
  begin
22
22
  # Subscribe to ActiveModelSerializers events
23
23
  Events.subscribe!
24
-
25
- # Set service info
26
- get_option(:tracer).set_service_info(
27
- get_option(:service_name),
28
- Ext::APP,
29
- Datadog::Ext::AppTypes::WEB
30
- )
31
24
  rescue StandardError => e
32
25
  Datadog::Tracer.log.error("Unable to apply ActiveModelSerializers integration: #{e}")
33
26
  end
@@ -17,11 +17,9 @@ module Datadog
17
17
  lazy: true
18
18
 
19
19
  option :orm_service_name
20
- option :service_name, depends_on: [:tracer] do |value|
21
- (value || Utils.adapter_name).tap do |service_name|
22
- tracer.set_service_info(service_name, Ext::APP, Datadog::Ext::AppTypes::DB)
23
- end
24
- end
20
+ option :service_name,
21
+ default: -> { Utils.adapter_name },
22
+ lazy: true
25
23
 
26
24
  option :tracer, default: Datadog.tracer do |value|
27
25
  value.tap do
@@ -21,13 +21,6 @@ module Datadog
21
21
  begin
22
22
  add_pin!
23
23
  ::Dalli::Server.send(:include, Instrumentation)
24
-
25
- # TODO: When Dalli pin is removed, set service info.
26
- # get_option(:tracer).set_service_info(
27
- # get_option(:service_name),
28
- # Ext::APP,
29
- # Datadog::Ext::AppTypes::CACHE
30
- # )
31
24
  rescue StandardError => e
32
25
  Datadog::Tracer.log.error("Unable to apply Dalli integration: #{e}")
33
26
  end
@@ -82,8 +82,6 @@ module Datadog
82
82
 
83
83
  def setup_service!
84
84
  return if options[:service_name] == datadog_configuration[:service_name]
85
-
86
- Patcher.register_service(options[:service_name])
87
85
  end
88
86
  end
89
87
  end
@@ -22,9 +22,6 @@ module Datadog
22
22
 
23
23
  add_pin!
24
24
  add_middleware!
25
-
26
- # TODO: When Faraday pin is removed, set service info.
27
- # register_service(get_option(:service_name))
28
25
  rescue StandardError => e
29
26
  Datadog::Tracer.log.error("Unable to apply Faraday integration: #{e}")
30
27
  end
@@ -45,14 +42,6 @@ module Datadog
45
42
  ::Faraday::Middleware.register_middleware(ddtrace: Middleware)
46
43
  end
47
44
 
48
- def register_service(name)
49
- get_option(:tracer).set_service_info(
50
- name,
51
- Ext::APP,
52
- Datadog::Ext::AppTypes::WEB
53
- )
54
- end
55
-
56
45
  def get_option(option)
57
46
  Datadog.configuration[:faraday].get_option(option)
58
47
  end
@@ -26,13 +26,6 @@ module Datadog
26
26
 
27
27
  add_pin!
28
28
 
29
- # TODO: When Grape pin is removed, set service info.
30
- # get_option(:tracer).set_service_info(
31
- # get_option(:service_name),
32
- # Ext::APP,
33
- # Datadog::Ext::AppTypes::WEB
34
- # )
35
-
36
29
  # Subscribe to ActiveSupport events
37
30
  Datadog::Contrib::Grape::Endpoint.subscribe
38
31
  rescue StandardError => e
@@ -17,10 +17,7 @@ module Datadog
17
17
  lazy: true
18
18
 
19
19
  option :schemas
20
- option :service_name, default: Ext::SERVICE_NAME, depends_on: [:tracer] do |value|
21
- get_option(:tracer).set_service_info(value, Ext::APP, Datadog::Ext::AppTypes::WEB)
22
- value
23
- end
20
+ option :service_name, default: Ext::SERVICE_NAME
24
21
  end
25
22
  end
26
23
  end
@@ -23,13 +23,6 @@ module Datadog
23
23
 
24
24
  add_pin!
25
25
 
26
- # TODO: When GRPC pin is removed, set service info.
27
- # get_option(:tracer).set_service_info(
28
- # get_option(:service_name),
29
- # Ext::APP,
30
- # Datadog::Ext::AppTypes::WEB
31
- # )
32
-
33
26
  prepend_interceptor
34
27
  rescue StandardError => e
35
28
  Datadog::Tracer.log.error("Unable to apply gRPC integration: #{e}")
@@ -21,14 +21,6 @@ module Datadog
21
21
  begin
22
22
  # Subscribe to Racecar events
23
23
  Events.subscribe!
24
-
25
- # Set service info
26
- configuration = Datadog.configuration[:racecar]
27
- configuration[:tracer].set_service_info(
28
- configuration[:service_name],
29
- Ext::APP,
30
- Datadog::Ext::AppTypes::WORKER
31
- )
32
24
  rescue StandardError => e
33
25
  Datadog::Tracer.log.error("Unable to apply Racecar integration: #{e}")
34
26
  end
@@ -29,17 +29,9 @@ module Datadog
29
29
  option :quantize, default: {}
30
30
  option :request_queuing, default: false
31
31
 
32
- option :service_name, default: Ext::SERVICE_NAME, depends_on: [:tracer] do |value|
33
- get_option(:tracer).set_service_info(value, Ext::APP, Datadog::Ext::AppTypes::WEB)
34
- value
35
- end
32
+ option :service_name, default: Ext::SERVICE_NAME
36
33
 
37
- option :web_service_name, default: Ext::WEBSERVER_SERVICE_NAME, depends_on: [:tracer, :request_queuing] do |value|
38
- if get_option(:request_queuing)
39
- get_option(:tracer).set_service_info(value, Ext::WEBSERVER_APP, Datadog::Ext::AppTypes::WEB)
40
- end
41
- value
42
- end
34
+ option :web_service_name, default: Ext::WEBSERVER_SERVICE_NAME
43
35
  end
44
36
  end
45
37
  end
@@ -26,7 +26,6 @@ module Datadog
26
26
 
27
27
  activate_rack!(config)
28
28
  activate_active_record!(config)
29
- set_service_info!(config)
30
29
 
31
30
  # By default, default service would be guessed from the script
32
31
  # being executed, but here we know better, get it from Rails config.
@@ -64,12 +63,6 @@ module Datadog
64
63
  tracer: config[:tracer]
65
64
  )
66
65
  end
67
-
68
- def self.set_service_info!(config)
69
- tracer = config[:tracer]
70
- tracer.set_service_info(config[:controller_service], Ext::APP, Datadog::Ext::AppTypes::WEB)
71
- tracer.set_service_info(config[:cache_service], Ext::APP, Datadog::Ext::AppTypes::CACHE)
72
- end
73
66
  end
74
67
  end
75
68
  end
@@ -16,8 +16,7 @@ module Datadog
16
16
  return super unless enabled?
17
17
 
18
18
  tracer.trace(Ext::SPAN_INVOKE, span_options) do |span|
19
- super
20
- annotate_invoke!(span, args)
19
+ super.tap { annotate_invoke!(span, args) }
21
20
  end
22
21
  ensure
23
22
  shutdown_tracer!
@@ -27,8 +26,7 @@ module Datadog
27
26
  return super unless enabled?
28
27
 
29
28
  tracer.trace(Ext::SPAN_EXECUTE, span_options) do |span|
30
- super
31
- annotate_execute!(span, args)
29
+ super.tap { annotate_execute!(span, args) }
32
30
  end
33
31
  ensure
34
32
  shutdown_tracer!
@@ -21,13 +21,6 @@ module Datadog
21
21
  begin
22
22
  # Add instrumentation patch to Rake task
23
23
  ::Rake::Task.send(:include, Instrumentation)
24
-
25
- # Set service info
26
- get_option(:tracer).set_service_info(
27
- get_option(:service_name),
28
- Ext::APP,
29
- Datadog::Ext::AppTypes::WORKER
30
- )
31
24
  rescue StandardError => e
32
25
  Datadog::Tracer.log.error("Unable to apply Rake integration: #{e}")
33
26
  end
@@ -16,10 +16,7 @@ module Datadog
16
16
  lazy: true
17
17
 
18
18
  option :distributed_tracing, default: true
19
- option :service_name, default: Ext::SERVICE_NAME, depends_on: [:tracer] do |value|
20
- get_option(:tracer).set_service_info(value, Ext::APP, Datadog::Ext::AppTypes::WEB)
21
- value
22
- end
19
+ option :service_name, default: Ext::SERVICE_NAME
23
20
  end
24
21
  end
25
22
  end
@@ -8,7 +8,6 @@ module Datadog
8
8
  def initialize(options = {})
9
9
  @tracer = options[:tracer] || configuration[:tracer]
10
10
  @shoryuken_service = options[:service_name] || configuration[:service_name]
11
- set_service_info(@shoryuken_service)
12
11
  end
13
12
 
14
13
  def call(worker_instance, queue, sqs_msg, body)
@@ -40,15 +39,6 @@ module Datadog
40
39
  def configuration
41
40
  Datadog.configuration[:shoryuken]
42
41
  end
43
-
44
- def set_service_info(service)
45
- return if @tracer.nil? || @tracer.services[service]
46
- @tracer.set_service_info(
47
- service,
48
- Ext::APP,
49
- Datadog::Ext::AppTypes::WORKER
50
- )
51
- end
52
42
  end
53
43
  end
54
44
  end
@@ -11,7 +11,6 @@ module Datadog
11
11
  def initialize(options = {})
12
12
  super
13
13
  @sidekiq_service = options[:client_service_name] || configuration[:client_service_name]
14
- set_service_info(@sidekiq_service)
15
14
  end
16
15
 
17
16
  # Client middleware arguments are documented here:
@@ -17,7 +17,6 @@ module Datadog
17
17
  resource = job_resource(job)
18
18
 
19
19
  service = service_from_worker_config(resource) || @sidekiq_service
20
- set_service_info(service)
21
20
 
22
21
  @tracer.trace(Ext::SPAN_JOB, service: service, span_type: Datadog::Ext::AppTypes::WORKER) do |span|
23
22
  span.resource = resource
@@ -22,16 +22,6 @@ module Datadog
22
22
  job['class']
23
23
  end
24
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
25
  end
36
26
  end
37
27
  end
@@ -24,10 +24,7 @@ module Datadog
24
24
  option :headers, default: DEFAULT_HEADERS
25
25
  option :resource_script_names, default: false
26
26
 
27
- option :service_name, default: Ext::SERVICE_NAME, depends_on: [:tracer] do |value|
28
- get_option(:tracer).set_service_info(value, Ext::APP, Datadog::Ext::AppTypes::WEB)
29
- value
30
- end
27
+ option :service_name, default: Ext::SERVICE_NAME
31
28
  end
32
29
  end
33
30
  end
@@ -21,11 +21,6 @@ module Datadog
21
21
  encode(to_send)
22
22
  end
23
23
 
24
- # Encodes services hash
25
- def encode_services(services)
26
- encode(services)
27
- end
28
-
29
24
  # Defines the underlying format used during traces or services encoding.
30
25
  # This method must be implemented and should only be used by the internal functions.
31
26
  def encode(_)
@@ -0,0 +1,9 @@
1
+ module Datadog
2
+ module Ext
3
+ # Defines constants for forced tracing
4
+ module ForcedTracing
5
+ TAG_KEEP = 'manual.drop'.freeze
6
+ TAG_DROP = 'manual.keep'.freeze
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,64 @@
1
+ require 'ddtrace/ext/forced_tracing'
2
+ require 'ddtrace/ext/priority'
3
+
4
+ module Datadog
5
+ # Defines analytics behavior
6
+ module ForcedTracing
7
+ class << self
8
+ def keep(span)
9
+ return if span.nil? || span.context.nil?
10
+ span.context.sampling_priority = Datadog::Ext::Priority::USER_KEEP
11
+ end
12
+
13
+ def drop(span)
14
+ return if span.nil? || span.context.nil?
15
+ span.context.sampling_priority = Datadog::Ext::Priority::USER_REJECT
16
+ end
17
+ end
18
+
19
+ # Extension for Datadog::Span
20
+ module Span
21
+ def self.included(base)
22
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.0.0')
23
+ base.class_eval do
24
+ # Instance methods
25
+ include InstanceMethodsCompatibility
26
+ include InstanceMethods
27
+ end
28
+ else
29
+ base.send(:prepend, InstanceMethods)
30
+ end
31
+ end
32
+
33
+ # Compatibility shim for Rubies not supporting `.prepend`
34
+ # NOTE: This patching strategy only works because it has been applied after
35
+ # Datadog::Analytics::Span. Any changes will likely break this.
36
+ module InstanceMethodsCompatibility
37
+ def self.included(base)
38
+ base.send(:alias_method, :set_tag_without_forced_tracing, :set_tag)
39
+
40
+ define_method :set_tag do |*args, &block|
41
+ set_tag_without_forced_tracing(*args, &block)
42
+ end
43
+ end
44
+ end
45
+
46
+ # Instance methods
47
+ module InstanceMethods
48
+ def set_tag(key, value)
49
+ # Configure sampling priority if they give us a forced tracing tag
50
+ # DEV: Do not set if the value they give us is explicitly "false"
51
+ case key
52
+ when Ext::ForcedTracing::TAG_KEEP
53
+ ForcedTracing.keep(self) unless value == false
54
+ when Ext::ForcedTracing::TAG_DROP
55
+ ForcedTracing.drop(self) unless value == false
56
+ else
57
+ # Otherwise, set the tag normally.
58
+ super if defined?(super)
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -29,6 +29,14 @@ module Datadog
29
29
  # @param value [String, Numeric, Boolean] the value of the tag. If it's not
30
30
  # a String, Numeric, or Boolean it will be encoded with to_s
31
31
  def set_tag(key, value)
32
+ # Special cases to convert opentracing tags to datadog tags
33
+ case key
34
+ when 'error'
35
+ # Opentracing supports and `error: <bool>` tag, we need to convert to span status
36
+ # DEV: Do not return, we want to still set the `error` tag as they requested
37
+ datadog_span.status = value ? Datadog::Ext::Errors::STATUS : 0
38
+ end
39
+
32
40
  tap { datadog_span.set_tag(key, value) }
33
41
  end
34
42
 
data/lib/ddtrace/pin.rb CHANGED
@@ -57,8 +57,6 @@ module Datadog
57
57
  end
58
58
 
59
59
  def service_name=(name)
60
- tracer.set_service_info(name, app, app_type) if name && app && app_type
61
-
62
60
  @service_name = name
63
61
  end
64
62
 
data/lib/ddtrace/span.rb CHANGED
@@ -3,7 +3,9 @@ require 'thread'
3
3
 
4
4
  require 'ddtrace/utils'
5
5
  require 'ddtrace/ext/errors'
6
+ require 'ddtrace/ext/priority'
6
7
  require 'ddtrace/analytics'
8
+ require 'ddtrace/forced_tracing'
7
9
 
8
10
  module Datadog
9
11
  # Represents a logical unit of work in the system. Each trace consists of one or more spans.
@@ -73,7 +75,7 @@ module Datadog
73
75
  # must be strings. A valid example is:
74
76
  #
75
77
  # span.set_tag('http.method', request.method)
76
- def set_tag(key, value)
78
+ def set_tag(key, value = nil)
77
79
  @meta[key] = value.to_s
78
80
  rescue StandardError => e
79
81
  Datadog::Tracer.log.debug("Unable to set the tag #{key}, ignoring it. Caused by: #{e}")
@@ -256,3 +258,4 @@ end
256
258
 
257
259
  # Include extensions after Span (for Ruby 1.9 compatibility)
258
260
  Datadog::Span.send(:include, Datadog::Analytics::Span)
261
+ Datadog::Span.send(:include, Datadog::ForcedTracing::Span)
@@ -10,9 +10,17 @@ module Datadog
10
10
  end
11
11
  end
12
12
 
13
- def write(trace, services)
13
+ def write(trace, services = nil)
14
+ unless services.nil?
15
+ Datadog::Patcher.do_once('SyncWriter#write') do
16
+ Datadog::Tracer.log.warn(%(
17
+ write: Writing services has been deprecated and no longer need to be provided.
18
+ write(traces, services) can be updted to write(traces)
19
+ ))
20
+ end
21
+ end
22
+
14
23
  perform_concurrently(
15
- proc { flush_services(services) },
16
24
  proc { flush_trace(trace) }
17
25
  )
18
26
  rescue => e
@@ -25,10 +33,6 @@ module Datadog
25
33
  tasks.map { |task| Thread.new(&task) }.each(&:join)
26
34
  end
27
35
 
28
- def flush_services(services)
29
- transport.send(:services, services)
30
- end
31
-
32
36
  def flush_trace(trace)
33
37
  processed_traces = Pipeline.process!([trace])
34
38
  transport.send(:traces, processed_traces)
@@ -20,7 +20,7 @@ module Datadog
20
20
  # of these function calls and sub-requests would be encapsulated within a single trace.
21
21
  # rubocop:disable Metrics/ClassLength
22
22
  class Tracer
23
- attr_reader :sampler, :services, :tags, :provider
23
+ attr_reader :sampler, :tags, :provider
24
24
  attr_accessor :enabled, :writer
25
25
  attr_writer :default_service
26
26
 
@@ -67,6 +67,15 @@ module Datadog
67
67
  log.level == Logger::DEBUG
68
68
  end
69
69
 
70
+ def services
71
+ # Only log each deprecation warning once (safeguard against log spam)
72
+ Datadog::Patcher.do_once('Tracer#set_service_info') do
73
+ Datadog::Tracer.log.warn('services: Usage of Tracer.services has been deprecated')
74
+ end
75
+
76
+ {}
77
+ end
78
+
70
79
  # Shorthand that calls the `shutdown!` method of a registered worker.
71
80
  # It's useful to ensure that the Trace Buffer is properly flushed before
72
81
  # shutting down the application.
@@ -110,7 +119,6 @@ module Datadog
110
119
  @context_flush = options[:partial_flush] ? Datadog::ContextFlush.new(options) : nil
111
120
 
112
121
  @mutex = Mutex.new
113
- @services = {}
114
122
  @tags = {}
115
123
  end
116
124
 
@@ -162,14 +170,16 @@ module Datadog
162
170
  # Set the information about the given service. A valid example is:
163
171
  #
164
172
  # tracer.set_service_info('web-application', 'rails', 'web')
173
+ #
174
+ # set_service_info is deprecated, no service information needs to be tracked
165
175
  def set_service_info(service, app, app_type)
166
- @services[service] = {
167
- 'app' => app,
168
- 'app_type' => app_type
169
- }
170
-
171
- return unless Datadog::Tracer.debug_logging
172
- Datadog::Tracer.log.debug("set_service_info: service: #{service} app: #{app} type: #{app_type}")
176
+ # Only log each deprecation warning once (safeguard against log spam)
177
+ Datadog::Patcher.do_once('Tracer#set_service_info') do
178
+ Datadog::Tracer.log.warn(%(
179
+ set_service_info: Usage of set_service_info has been deprecated,
180
+ service information no longer needs to be reported to the trace agent.
181
+ ))
182
+ end
173
183
  end
174
184
 
175
185
  # A default value for service. One should really override this one
@@ -380,8 +390,7 @@ module Datadog
380
390
  Datadog::Tracer.log.debug(str)
381
391
  end
382
392
 
383
- @writer.write(trace, @services)
384
- @services = {}
393
+ @writer.write(trace)
385
394
  end
386
395
 
387
396
  private :write, :guess_context_and_parent
@@ -11,7 +11,7 @@ module Datadog
11
11
  # rubocop:disable Metrics/ClassLength
12
12
  class HTTPTransport
13
13
  attr_accessor :hostname, :port
14
- attr_reader :traces_endpoint, :services_endpoint
14
+ attr_reader :traces_endpoint
15
15
 
16
16
  DEFAULT_AGENT_HOST = '127.0.0.1'.freeze
17
17
  DEFAULT_TRACE_AGENT_PORT = '8126'.freeze
@@ -27,21 +27,18 @@ module Datadog
27
27
  V4 = 'v0.4'.freeze => {
28
28
  version: V4,
29
29
  traces_endpoint: '/v0.4/traces'.freeze,
30
- services_endpoint: '/v0.4/services'.freeze,
31
30
  encoder: Encoding::MsgpackEncoder,
32
31
  fallback: 'v0.3'.freeze
33
32
  }.freeze,
34
33
  V3 = 'v0.3'.freeze => {
35
34
  version: V3,
36
35
  traces_endpoint: '/v0.3/traces'.freeze,
37
- services_endpoint: '/v0.3/services'.freeze,
38
36
  encoder: Encoding::MsgpackEncoder,
39
37
  fallback: 'v0.2'.freeze
40
38
  }.freeze,
41
39
  V2 = 'v0.2'.freeze => {
42
40
  version: V2,
43
41
  traces_endpoint: '/v0.2/traces'.freeze,
44
- services_endpoint: '/v0.2/services'.freeze,
45
42
  encoder: Encoding::JSONEncoder
46
43
  }.freeze
47
44
  }.freeze
@@ -78,10 +75,7 @@ module Datadog
78
75
  def send(endpoint, data)
79
76
  case endpoint
80
77
  when :services
81
- payload = @encoder.encode_services(data)
82
- status_code = post(@api[:services_endpoint], payload) do |response|
83
- process_callback(:services, response)
84
- end
78
+ return nil
85
79
  when :traces
86
80
  count = data.length
87
81
  payload = @encoder.encode_traces(data)
@@ -1,7 +1,7 @@
1
1
  module Datadog
2
2
  module VERSION
3
3
  MAJOR = 0
4
- MINOR = 22
4
+ MINOR = 23
5
5
  PATCH = 0
6
6
  PRE = nil
7
7
 
@@ -16,7 +16,6 @@ module Datadog
16
16
  SHUTDOWN_TIMEOUT = 1
17
17
 
18
18
  attr_reader \
19
- :service_buffer,
20
19
  :trace_buffer
21
20
 
22
21
  def initialize(options = {})
@@ -24,7 +23,6 @@ module Datadog
24
23
 
25
24
  # Callbacks
26
25
  @trace_task = options[:on_trace]
27
- @service_task = options[:on_service]
28
26
  @runtime_metrics_task = options[:on_runtime_metrics]
29
27
 
30
28
  # Intervals
@@ -35,7 +33,6 @@ module Datadog
35
33
  # Buffers
36
34
  buffer_size = options.fetch(:buffer_size, 100)
37
35
  @trace_buffer = TraceBuffer.new(buffer_size)
38
- @service_buffer = TraceBuffer.new(buffer_size)
39
36
 
40
37
  # Threading
41
38
  @shutdown = ConditionVariable.new
@@ -60,21 +57,6 @@ module Datadog
60
57
  end
61
58
  end
62
59
 
63
- # Callback function that process traces and executes the +send_services()+ method.
64
- def callback_services
65
- return true if @service_buffer.empty?
66
-
67
- begin
68
- services = @service_buffer.pop()
69
- @service_task.call(services[0], @transport) unless @service_task.nil?
70
- rescue StandardError => e
71
- # ensures that the thread will not die because of an exception.
72
- # TODO[manu]: findout the reason and reschedule the send if it's not
73
- # a fatal exception
74
- Datadog::Tracer.log.error("Error during services flush: dropped #{services.length} items. Cause: #{e}")
75
- end
76
- end
77
-
78
60
  def callback_runtime_metrics
79
61
  @runtime_metrics_task.call unless @runtime_metrics_task.nil?
80
62
  rescue StandardError => e
@@ -91,13 +73,12 @@ module Datadog
91
73
  end
92
74
  end
93
75
 
94
- # Closes all available queues and waits for the trace and service buffer to flush
76
+ # Closes all available queues and waits for the trace buffer to flush
95
77
  def stop
96
78
  @mutex.synchronize do
97
79
  return unless @run
98
80
 
99
81
  @trace_buffer.close
100
- @service_buffer.close
101
82
  @run = false
102
83
  @shutdown.signal
103
84
  end
@@ -117,12 +98,6 @@ module Datadog
117
98
  @trace_buffer.push(trace)
118
99
  end
119
100
 
120
- # Enqueue an item in the service internal buffer. This operation is thread-safe.
121
- def enqueue_service(service)
122
- return if service == {} # no use to send this, not worth it
123
- @service_buffer.push(service)
124
- end
125
-
126
101
  private
127
102
 
128
103
  alias flush_data callback_traces
@@ -131,11 +106,10 @@ module Datadog
131
106
  loop do
132
107
  @back_off = flush_data ? @flush_interval : [@back_off * BACK_OFF_RATIO, BACK_OFF_MAX].min
133
108
 
134
- callback_services
135
109
  callback_runtime_metrics
136
110
 
137
111
  @mutex.synchronize do
138
- return if !@run && @trace_buffer.empty? && @service_buffer.empty?
112
+ return if !@run && @trace_buffer.empty?
139
113
  @shutdown.wait(@mutex, @back_off) if @run # do not wait when shutting down
140
114
  end
141
115
  end
@@ -34,31 +34,25 @@ module Datadog
34
34
  Runtime::Metrics.new
35
35
  end
36
36
 
37
- @services = {}
38
-
39
37
  # handles the thread creation after an eventual fork
40
38
  @mutex_after_fork = Mutex.new
41
39
  @pid = nil
42
40
 
43
41
  @traces_flushed = 0
44
- @services_flushed = 0
45
42
 
46
- # one worker for both services and traces, each have their own queues
43
+ # one worker for traces
47
44
  @worker = nil
48
45
  end
49
46
 
50
- # spawns two different workers for spans and services;
51
- # they share the same transport which is thread-safe
47
+ # spawns a worker for spans; they share the same transport which is thread-safe
52
48
  def start
53
49
  @pid = Process.pid
54
50
  @trace_handler = ->(items, transport) { send_spans(items, transport) }
55
- @service_handler = ->(items, transport) { send_services(items, transport) }
56
51
  @runtime_metrics_handler = -> { send_runtime_metrics }
57
52
  @worker = Datadog::Workers::AsyncTransport.new(
58
53
  transport: @transport,
59
54
  buffer_size: @buff_size,
60
55
  on_trace: @trace_handler,
61
- on_service: @service_handler,
62
56
  on_runtime_metrics: @runtime_metrics_handler,
63
57
  interval: @flush_interval
64
58
  )
@@ -66,7 +60,7 @@ module Datadog
66
60
  @worker.start()
67
61
  end
68
62
 
69
- # stops both workers for spans and services.
63
+ # stops worker for spans.
70
64
  def stop
71
65
  @worker.stop()
72
66
  @worker = nil
@@ -83,17 +77,6 @@ module Datadog
83
77
  status
84
78
  end
85
79
 
86
- # flush services to the trace-agent, handles services only
87
- def send_services(services, transport)
88
- return true if services.empty?
89
-
90
- code = transport.send(:services, services)
91
- status = !transport.server_error?(code)
92
- @services_flushed += 1 if status
93
-
94
- status
95
- end
96
-
97
80
  def send_runtime_metrics
98
81
  return unless Datadog.configuration.runtime_metrics_enabled
99
82
 
@@ -101,7 +84,16 @@ module Datadog
101
84
  end
102
85
 
103
86
  # enqueue the trace for submission to the API
104
- def write(trace, services)
87
+ def write(trace, services = nil)
88
+ unless services.nil?
89
+ Datadog::Patcher.do_once('Writer#write') do
90
+ Datadog::Tracer.log.warn(%(
91
+ write: Writing services has been deprecated and no longer need to be provided.
92
+ write(traces, services) can be updted to write(traces)
93
+ ))
94
+ end
95
+ end
96
+
105
97
  # In multiprocess environments, the main process initializes the +Writer+ instance and if
106
98
  # the process forks (i.e. a web server like Unicorn or Puma with multiple workers) the new
107
99
  # processes will share the same +Writer+ until the first write (COW). Because of that,
@@ -122,14 +114,12 @@ module Datadog
122
114
  runtime_metrics.associate_with_span(trace.first) unless trace.empty?
123
115
 
124
116
  @worker.enqueue_trace(trace)
125
- @worker.enqueue_service(services)
126
117
  end
127
118
 
128
119
  # stats returns a dictionary of stats about the writer.
129
120
  def stats
130
121
  {
131
122
  traces_flushed: @traces_flushed,
132
- services_flushed: @services_flushed,
133
123
  transport: @transport.stats
134
124
  }
135
125
  end
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.22.0
4
+ version: 0.23.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: 2019-04-15 00:00:00.000000000 Z
11
+ date: 2019-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -523,12 +523,14 @@ files:
523
523
  - lib/ddtrace/ext/app_types.rb
524
524
  - lib/ddtrace/ext/distributed.rb
525
525
  - lib/ddtrace/ext/errors.rb
526
+ - lib/ddtrace/ext/forced_tracing.rb
526
527
  - lib/ddtrace/ext/http.rb
527
528
  - lib/ddtrace/ext/metrics.rb
528
529
  - lib/ddtrace/ext/net.rb
529
530
  - lib/ddtrace/ext/priority.rb
530
531
  - lib/ddtrace/ext/runtime.rb
531
532
  - lib/ddtrace/ext/sql.rb
533
+ - lib/ddtrace/forced_tracing.rb
532
534
  - lib/ddtrace/logger.rb
533
535
  - lib/ddtrace/metrics.rb
534
536
  - lib/ddtrace/monkey.rb
@@ -598,7 +600,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
598
600
  version: '0'
599
601
  requirements: []
600
602
  rubyforge_project:
601
- rubygems_version: 2.5.2.3
603
+ rubygems_version: 2.6.14
602
604
  signing_key:
603
605
  specification_version: 4
604
606
  summary: Datadog tracing code for your Ruby applications