ddtrace 0.22.0 → 0.23.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -2
- data/lib/ddtrace/analytics.rb +2 -1
- data/lib/ddtrace/contrib/active_model_serializers/patcher.rb +0 -7
- data/lib/ddtrace/contrib/active_record/configuration/settings.rb +3 -5
- data/lib/ddtrace/contrib/dalli/patcher.rb +0 -7
- data/lib/ddtrace/contrib/faraday/middleware.rb +0 -2
- data/lib/ddtrace/contrib/faraday/patcher.rb +0 -11
- data/lib/ddtrace/contrib/grape/patcher.rb +0 -7
- data/lib/ddtrace/contrib/graphql/configuration/settings.rb +1 -4
- data/lib/ddtrace/contrib/grpc/patcher.rb +0 -7
- data/lib/ddtrace/contrib/racecar/patcher.rb +0 -8
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +2 -10
- data/lib/ddtrace/contrib/rails/framework.rb +0 -7
- data/lib/ddtrace/contrib/rake/instrumentation.rb +2 -4
- data/lib/ddtrace/contrib/rake/patcher.rb +0 -7
- data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +1 -4
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +0 -10
- data/lib/ddtrace/contrib/sidekiq/client_tracer.rb +0 -1
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +0 -1
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +0 -10
- data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +1 -4
- data/lib/ddtrace/encoding.rb +0 -5
- data/lib/ddtrace/ext/forced_tracing.rb +9 -0
- data/lib/ddtrace/forced_tracing.rb +64 -0
- data/lib/ddtrace/opentracer/span.rb +8 -0
- data/lib/ddtrace/pin.rb +0 -2
- data/lib/ddtrace/span.rb +4 -1
- data/lib/ddtrace/sync_writer.rb +10 -6
- data/lib/ddtrace/tracer.rb +20 -11
- data/lib/ddtrace/transport.rb +2 -8
- data/lib/ddtrace/version.rb +1 -1
- data/lib/ddtrace/workers.rb +2 -28
- data/lib/ddtrace/writer.rb +13 -23
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 65dcbe210bf9b8f1824d9636e81c454feb1a606a
|
4
|
+
data.tar.gz: 846f031c64443dc6e2fe93572ef96f488dcafc8d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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.
|
771
|
-
[Unreleased (beta)]: https://github.com/DataDog/dd-trace-rb/compare/v0.
|
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
|
data/lib/ddtrace/analytics.rb
CHANGED
@@ -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
|
-
|
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,
|
21
|
-
|
22
|
-
|
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
|
@@ -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
|
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
|
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
|
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
|
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
|
@@ -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
|
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
|
data/lib/ddtrace/encoding.rb
CHANGED
@@ -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,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
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)
|
data/lib/ddtrace/sync_writer.rb
CHANGED
@@ -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)
|
data/lib/ddtrace/tracer.rb
CHANGED
@@ -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, :
|
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
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
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
|
384
|
-
@services = {}
|
393
|
+
@writer.write(trace)
|
385
394
|
end
|
386
395
|
|
387
396
|
private :write, :guess_context_and_parent
|
data/lib/ddtrace/transport.rb
CHANGED
@@ -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
|
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
|
-
|
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)
|
data/lib/ddtrace/version.rb
CHANGED
data/lib/ddtrace/workers.rb
CHANGED
@@ -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
|
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?
|
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
|
data/lib/ddtrace/writer.rb
CHANGED
@@ -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
|
43
|
+
# one worker for traces
|
47
44
|
@worker = nil
|
48
45
|
end
|
49
46
|
|
50
|
-
# spawns
|
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
|
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.
|
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-
|
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.
|
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
|