ddtrace 0.22.0 → 0.23.0

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