ddtrace 0.36.0 → 0.41.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 (197) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +59 -1
  3. data/.gitignore +2 -0
  4. data/.gitlab-ci.yml +27 -0
  5. data/.simplecov +38 -0
  6. data/Appraisals +131 -6
  7. data/CHANGELOG.md +198 -1
  8. data/Rakefile +504 -467
  9. data/ddtrace.gemspec +7 -0
  10. data/docker-compose.yml +2 -2
  11. data/docs/DevelopmentGuide.md +16 -0
  12. data/docs/GettingStarted.md +192 -111
  13. data/lib/ddtrace.rb +4 -0
  14. data/lib/ddtrace/buffer.rb +154 -43
  15. data/lib/ddtrace/configuration.rb +39 -5
  16. data/lib/ddtrace/configuration/components.rb +4 -7
  17. data/lib/ddtrace/configuration/options.rb +3 -1
  18. data/lib/ddtrace/configuration/pin_setup.rb +3 -2
  19. data/lib/ddtrace/configuration/settings.rb +32 -4
  20. data/lib/ddtrace/contrib/action_cable/configuration/settings.rb +7 -2
  21. data/lib/ddtrace/contrib/action_cable/ext.rb +5 -2
  22. data/lib/ddtrace/contrib/action_pack/configuration/settings.rb +7 -2
  23. data/lib/ddtrace/contrib/action_pack/ext.rb +5 -2
  24. data/lib/ddtrace/contrib/action_view/configuration/settings.rb +7 -2
  25. data/lib/ddtrace/contrib/action_view/ext.rb +5 -2
  26. data/lib/ddtrace/contrib/active_model_serializers/configuration/settings.rb +7 -2
  27. data/lib/ddtrace/contrib/active_model_serializers/ext.rb +5 -2
  28. data/lib/ddtrace/contrib/active_record/configuration/settings.rb +7 -2
  29. data/lib/ddtrace/contrib/active_record/events/sql.rb +4 -0
  30. data/lib/ddtrace/contrib/active_record/ext.rb +5 -2
  31. data/lib/ddtrace/contrib/active_support/cache/redis.rb +1 -1
  32. data/lib/ddtrace/contrib/active_support/configuration/settings.rb +7 -2
  33. data/lib/ddtrace/contrib/active_support/ext.rb +5 -2
  34. data/lib/ddtrace/contrib/active_support/notifications/event.rb +3 -1
  35. data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +3 -3
  36. data/lib/ddtrace/contrib/aws/configuration/settings.rb +7 -2
  37. data/lib/ddtrace/contrib/aws/ext.rb +5 -2
  38. data/lib/ddtrace/contrib/aws/instrumentation.rb +4 -0
  39. data/lib/ddtrace/contrib/concurrent_ruby/configuration/settings.rb +5 -0
  40. data/lib/ddtrace/contrib/concurrent_ruby/context_composite_executor_service.rb +9 -3
  41. data/lib/ddtrace/contrib/concurrent_ruby/ext.rb +1 -0
  42. data/lib/ddtrace/contrib/configuration/settings.rb +19 -0
  43. data/lib/ddtrace/contrib/dalli/configuration/settings.rb +7 -2
  44. data/lib/ddtrace/contrib/dalli/ext.rb +5 -2
  45. data/lib/ddtrace/contrib/dalli/instrumentation.rb +4 -0
  46. data/lib/ddtrace/contrib/dalli/patcher.rb +1 -5
  47. data/lib/ddtrace/contrib/delayed_job/configuration/settings.rb +7 -2
  48. data/lib/ddtrace/contrib/delayed_job/ext.rb +5 -2
  49. data/lib/ddtrace/contrib/elasticsearch/configuration/settings.rb +7 -2
  50. data/lib/ddtrace/contrib/elasticsearch/ext.rb +5 -2
  51. data/lib/ddtrace/contrib/elasticsearch/patcher.rb +5 -2
  52. data/lib/ddtrace/contrib/ethon/configuration/settings.rb +7 -2
  53. data/lib/ddtrace/contrib/ethon/easy_patch.rb +4 -2
  54. data/lib/ddtrace/contrib/ethon/ext.rb +5 -2
  55. data/lib/ddtrace/contrib/ethon/multi_patch.rb +4 -0
  56. data/lib/ddtrace/contrib/excon/configuration/settings.rb +7 -2
  57. data/lib/ddtrace/contrib/excon/ext.rb +5 -2
  58. data/lib/ddtrace/contrib/excon/middleware.rb +4 -0
  59. data/lib/ddtrace/contrib/extensions.rb +11 -1
  60. data/lib/ddtrace/contrib/faraday/configuration/settings.rb +7 -2
  61. data/lib/ddtrace/contrib/faraday/ext.rb +5 -2
  62. data/lib/ddtrace/contrib/faraday/middleware.rb +9 -3
  63. data/lib/ddtrace/contrib/faraday/patcher.rb +13 -5
  64. data/lib/ddtrace/contrib/grape/configuration/settings.rb +7 -3
  65. data/lib/ddtrace/contrib/grape/endpoint.rb +6 -4
  66. data/lib/ddtrace/contrib/grape/ext.rb +5 -2
  67. data/lib/ddtrace/contrib/grape/patcher.rb +1 -1
  68. data/lib/ddtrace/contrib/graphql/configuration/settings.rb +7 -2
  69. data/lib/ddtrace/contrib/graphql/ext.rb +5 -2
  70. data/lib/ddtrace/contrib/graphql/patcher.rb +6 -3
  71. data/lib/ddtrace/contrib/grpc/configuration/settings.rb +7 -2
  72. data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +1 -1
  73. data/lib/ddtrace/contrib/grpc/datadog_interceptor/client.rb +5 -3
  74. data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +4 -0
  75. data/lib/ddtrace/contrib/grpc/ext.rb +5 -2
  76. data/lib/ddtrace/contrib/grpc/patcher.rb +1 -5
  77. data/lib/ddtrace/contrib/http/configuration/settings.rb +7 -2
  78. data/lib/ddtrace/contrib/http/ext.rb +5 -2
  79. data/lib/ddtrace/contrib/http/instrumentation.rb +16 -7
  80. data/lib/ddtrace/contrib/httprb/configuration/settings.rb +32 -0
  81. data/lib/ddtrace/contrib/httprb/ext.rb +17 -0
  82. data/lib/ddtrace/contrib/httprb/instrumentation.rb +163 -0
  83. data/lib/ddtrace/contrib/httprb/integration.rb +43 -0
  84. data/lib/ddtrace/contrib/httprb/patcher.rb +35 -0
  85. data/lib/ddtrace/contrib/kafka/configuration/settings.rb +30 -0
  86. data/lib/ddtrace/contrib/kafka/consumer_event.rb +14 -0
  87. data/lib/ddtrace/contrib/kafka/consumer_group_event.rb +14 -0
  88. data/lib/ddtrace/contrib/kafka/event.rb +51 -0
  89. data/lib/ddtrace/contrib/kafka/events.rb +44 -0
  90. data/lib/ddtrace/contrib/kafka/events/connection/request.rb +34 -0
  91. data/lib/ddtrace/contrib/kafka/events/consumer/process_batch.rb +41 -0
  92. data/lib/ddtrace/contrib/kafka/events/consumer/process_message.rb +39 -0
  93. data/lib/ddtrace/contrib/kafka/events/consumer_group/heartbeat.rb +39 -0
  94. data/lib/ddtrace/contrib/kafka/events/consumer_group/join_group.rb +29 -0
  95. data/lib/ddtrace/contrib/kafka/events/consumer_group/leave_group.rb +29 -0
  96. data/lib/ddtrace/contrib/kafka/events/consumer_group/sync_group.rb +29 -0
  97. data/lib/ddtrace/contrib/kafka/events/produce_operation/send_messages.rb +32 -0
  98. data/lib/ddtrace/contrib/kafka/events/producer/deliver_messages.rb +35 -0
  99. data/lib/ddtrace/contrib/kafka/ext.rb +41 -0
  100. data/lib/ddtrace/contrib/kafka/integration.rb +39 -0
  101. data/lib/ddtrace/contrib/kafka/patcher.rb +26 -0
  102. data/lib/ddtrace/contrib/mongodb/configuration/settings.rb +7 -2
  103. data/lib/ddtrace/contrib/mongodb/ext.rb +5 -2
  104. data/lib/ddtrace/contrib/mongodb/instrumentation.rb +1 -2
  105. data/lib/ddtrace/contrib/mongodb/subscribers.rb +4 -0
  106. data/lib/ddtrace/contrib/mysql2/configuration/settings.rb +7 -2
  107. data/lib/ddtrace/contrib/mysql2/ext.rb +5 -2
  108. data/lib/ddtrace/contrib/mysql2/instrumentation.rb +5 -1
  109. data/lib/ddtrace/contrib/patcher.rb +14 -8
  110. data/lib/ddtrace/contrib/presto/configuration/settings.rb +7 -2
  111. data/lib/ddtrace/contrib/presto/ext.rb +5 -2
  112. data/lib/ddtrace/contrib/presto/instrumentation.rb +3 -0
  113. data/lib/ddtrace/contrib/que/configuration/settings.rb +42 -0
  114. data/lib/ddtrace/contrib/que/ext.rb +30 -0
  115. data/lib/ddtrace/contrib/que/integration.rb +42 -0
  116. data/lib/ddtrace/contrib/que/patcher.rb +24 -0
  117. data/lib/ddtrace/contrib/que/tracer.rb +56 -0
  118. data/lib/ddtrace/contrib/racecar/configuration/settings.rb +7 -2
  119. data/lib/ddtrace/contrib/racecar/event.rb +4 -0
  120. data/lib/ddtrace/contrib/racecar/events.rb +2 -0
  121. data/lib/ddtrace/contrib/racecar/events/consume.rb +27 -0
  122. data/lib/ddtrace/contrib/racecar/ext.rb +6 -2
  123. data/lib/ddtrace/contrib/rack/configuration/settings.rb +7 -2
  124. data/lib/ddtrace/contrib/rack/ext.rb +5 -2
  125. data/lib/ddtrace/contrib/rack/middlewares.rb +17 -12
  126. data/lib/ddtrace/contrib/rails/configuration/settings.rb +10 -12
  127. data/lib/ddtrace/contrib/rails/ext.rb +6 -2
  128. data/lib/ddtrace/contrib/rails/framework.rb +14 -21
  129. data/lib/ddtrace/contrib/rails/log_injection.rb +81 -0
  130. data/lib/ddtrace/contrib/rails/middlewares.rb +7 -2
  131. data/lib/ddtrace/contrib/rails/patcher.rb +15 -0
  132. data/lib/ddtrace/contrib/rake/configuration/settings.rb +7 -3
  133. data/lib/ddtrace/contrib/rake/ext.rb +5 -2
  134. data/lib/ddtrace/contrib/redis/configuration/settings.rb +7 -2
  135. data/lib/ddtrace/contrib/redis/ext.rb +5 -2
  136. data/lib/ddtrace/contrib/redis/patcher.rb +1 -1
  137. data/lib/ddtrace/contrib/redis/tags.rb +4 -0
  138. data/lib/ddtrace/contrib/resque/configuration/settings.rb +7 -2
  139. data/lib/ddtrace/contrib/resque/ext.rb +5 -2
  140. data/lib/ddtrace/contrib/rest_client/configuration/settings.rb +7 -2
  141. data/lib/ddtrace/contrib/rest_client/ext.rb +5 -2
  142. data/lib/ddtrace/contrib/rest_client/request_patch.rb +6 -2
  143. data/lib/ddtrace/contrib/sequel/configuration/settings.rb +7 -2
  144. data/lib/ddtrace/contrib/sequel/database.rb +4 -2
  145. data/lib/ddtrace/contrib/sequel/dataset.rb +3 -2
  146. data/lib/ddtrace/contrib/sequel/ext.rb +6 -2
  147. data/lib/ddtrace/contrib/sequel/utils.rb +35 -6
  148. data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +7 -2
  149. data/lib/ddtrace/contrib/shoryuken/ext.rb +5 -2
  150. data/lib/ddtrace/contrib/sidekiq/configuration/settings.rb +7 -2
  151. data/lib/ddtrace/contrib/sidekiq/ext.rb +6 -2
  152. data/lib/ddtrace/contrib/sidekiq/patcher.rb +8 -1
  153. data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +1 -0
  154. data/lib/ddtrace/contrib/sinatra/configuration/settings.rb +7 -2
  155. data/lib/ddtrace/contrib/sinatra/env.rb +5 -4
  156. data/lib/ddtrace/contrib/sinatra/ext.rb +5 -2
  157. data/lib/ddtrace/contrib/sinatra/tracer.rb +21 -42
  158. data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +50 -23
  159. data/lib/ddtrace/contrib/sneakers/configuration/settings.rb +32 -0
  160. data/lib/ddtrace/contrib/sneakers/ext.rb +22 -0
  161. data/lib/ddtrace/contrib/sneakers/integration.rb +41 -0
  162. data/lib/ddtrace/contrib/sneakers/patcher.rb +24 -0
  163. data/lib/ddtrace/contrib/sneakers/tracer.rb +58 -0
  164. data/lib/ddtrace/contrib/sucker_punch/configuration/settings.rb +7 -2
  165. data/lib/ddtrace/contrib/sucker_punch/ext.rb +5 -2
  166. data/lib/ddtrace/contrib/sucker_punch/patcher.rb +1 -1
  167. data/lib/ddtrace/diagnostics/environment_logger.rb +278 -0
  168. data/lib/ddtrace/environment.rb +17 -3
  169. data/lib/ddtrace/ext/diagnostics.rb +3 -0
  170. data/lib/ddtrace/ext/environment.rb +2 -0
  171. data/lib/ddtrace/ext/integration.rb +8 -0
  172. data/lib/ddtrace/ext/runtime.rb +1 -0
  173. data/lib/ddtrace/ext/transport.rb +1 -0
  174. data/lib/ddtrace/logger.rb +1 -1
  175. data/lib/ddtrace/opentracer/distributed_headers.rb +1 -1
  176. data/lib/ddtrace/pin.rb +25 -2
  177. data/lib/ddtrace/pipeline/span_filter.rb +15 -15
  178. data/lib/ddtrace/propagation/grpc_propagator.rb +2 -2
  179. data/lib/ddtrace/runtime/metrics.rb +24 -6
  180. data/lib/ddtrace/sampler.rb +4 -2
  181. data/lib/ddtrace/span.rb +162 -27
  182. data/lib/ddtrace/tracer.rb +18 -12
  183. data/lib/ddtrace/transport/http.rb +15 -0
  184. data/lib/ddtrace/transport/http/adapters/net.rb +16 -2
  185. data/lib/ddtrace/transport/http/adapters/test.rb +6 -0
  186. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +4 -0
  187. data/lib/ddtrace/transport/http/statistics.rb +14 -1
  188. data/lib/ddtrace/transport/response.rb +11 -0
  189. data/lib/ddtrace/transport/traces.rb +7 -2
  190. data/lib/ddtrace/utils.rb +7 -3
  191. data/lib/ddtrace/version.rb +1 -1
  192. data/lib/ddtrace/workers/async.rb +2 -2
  193. data/lib/ddtrace/workers/loop.rb +1 -1
  194. data/lib/ddtrace/workers/polling.rb +1 -1
  195. data/lib/ddtrace/workers/trace_writer.rb +3 -0
  196. data/lib/ddtrace/writer.rb +33 -12
  197. metadata +138 -2
@@ -4,8 +4,11 @@ module Datadog
4
4
  # Grape integration constants
5
5
  module Ext
6
6
  APP = 'grape'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_GRAPE_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_GRAPE_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_GRAPE_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_GRAPE_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_GRAPE_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_GRAPE_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_GRAPE_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'grape'.freeze
10
13
  SPAN_ENDPOINT_RENDER = 'grape.endpoint_render'.freeze
11
14
  SPAN_ENDPOINT_RUN = 'grape.endpoint_run'.freeze
@@ -34,7 +34,7 @@ module Datadog
34
34
  get_option(:service_name),
35
35
  app: Ext::APP,
36
36
  app_type: Datadog::Ext::AppTypes::WEB,
37
- tracer: get_option(:tracer)
37
+ tracer: -> { get_option(:tracer) }
38
38
  )
39
39
  pin.onto(::Grape)
40
40
  end
@@ -8,13 +8,18 @@ module Datadog
8
8
  module Configuration
9
9
  # Custom settings for the GraphQL integration
10
10
  class Settings < Contrib::Configuration::Settings
11
+ option :enabled do |o|
12
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
13
+ o.lazy
14
+ end
15
+
11
16
  option :analytics_enabled do |o|
12
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, nil) }
17
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], nil) }
13
18
  o.lazy
14
19
  end
15
20
 
16
21
  option :analytics_sample_rate do |o|
17
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
22
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
18
23
  o.lazy
19
24
  end
20
25
 
@@ -4,8 +4,11 @@ module Datadog
4
4
  # GraphQL integration constants
5
5
  module Ext
6
6
  APP = 'ruby-graphql'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_GRAPHQL_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_GRAPHQL_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_GRAPHQL_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_GRAPHQL_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_GRAPHQL_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_GRAPHQL_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_GRAPHQL_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'ruby-graphql'.freeze
10
13
  end
11
14
  end
@@ -22,7 +22,6 @@ module Datadog
22
22
  end
23
23
 
24
24
  def patch_schema!(schema)
25
- tracer = get_option(:tracer)
26
25
  service_name = get_option(:service_name)
27
26
  analytics_enabled = Contrib::Analytics.enabled?(get_option(:analytics_enabled))
28
27
  analytics_sample_rate = get_option(:analytics_sample_rate)
@@ -30,7 +29,9 @@ module Datadog
30
29
  if schema.respond_to?(:use)
31
30
  schema.use(
32
31
  ::GraphQL::Tracing::DataDogTracing,
33
- tracer: tracer,
32
+ # By default, Tracing::DataDogTracing indirectly delegates the tracer instance
33
+ # to +Datadog.tracer+. If we provide a tracer argument here it will be eagerly cached,
34
+ # and Tracing::DataDogTracing will send traces to a stale tracer instance.
34
35
  service: service_name,
35
36
  analytics_enabled: analytics_enabled,
36
37
  analytics_sample_rate: analytics_sample_rate
@@ -39,7 +40,9 @@ module Datadog
39
40
  schema.define do
40
41
  use(
41
42
  ::GraphQL::Tracing::DataDogTracing,
42
- tracer: tracer,
43
+ # By default, Tracing::DataDogTracing indirectly delegates the tracer instance
44
+ # to +Datadog.tracer+. If we provide a tracer argument here it will be eagerly cached,
45
+ # and Tracing::DataDogTracing will send traces to a stale tracer instance.
43
46
  service: service_name,
44
47
  analytics_enabled: analytics_enabled,
45
48
  analytics_sample_rate: analytics_sample_rate
@@ -7,13 +7,18 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the gRPC integration
9
9
  class Settings < Contrib::Configuration::Settings
10
+ option :enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
12
+ o.lazy
13
+ end
14
+
10
15
  option :analytics_enabled do |o|
11
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
16
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
12
17
  o.lazy
13
18
  end
14
19
 
15
20
  option :analytics_sample_rate do |o|
16
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
21
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
17
22
  o.lazy
18
23
  end
19
24
 
@@ -38,7 +38,7 @@ module Datadog
38
38
  service_name,
39
39
  app: Ext::APP,
40
40
  app_type: Datadog::Ext::AppTypes::WEB,
41
- tracer: tracer
41
+ tracer: -> { datadog_configuration[:tracer] }
42
42
  ).tap do |pin|
43
43
  yield(pin) if block_given?
44
44
  pin.onto(self)
@@ -1,4 +1,5 @@
1
1
  require 'ddtrace/ext/http'
2
+ require 'ddtrace/ext/integration'
2
3
  require 'ddtrace/contrib/analytics'
3
4
  require 'ddtrace/contrib/grpc/ext'
4
5
 
@@ -30,9 +31,10 @@ module Datadog
30
31
  private
31
32
 
32
33
  def annotate!(span, metadata)
33
- metadata.each do |header, value|
34
- span.set_tag(header, value)
35
- end
34
+ span.set_tags(metadata)
35
+
36
+ # Tag as an external peer service
37
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
36
38
 
37
39
  # Set analytics sample rate
38
40
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
@@ -1,4 +1,5 @@
1
1
  require 'ddtrace/ext/http'
2
+ require 'ddtrace/ext/integration'
2
3
  require 'ddtrace/contrib/analytics'
3
4
  require 'ddtrace/contrib/grpc/ext'
4
5
 
@@ -46,6 +47,9 @@ module Datadog
46
47
  span.set_tag(header, value)
47
48
  end
48
49
 
50
+ # Tag as an external peer service
51
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
52
+
49
53
  # Set analytics sample rate
50
54
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
51
55
 
@@ -4,8 +4,11 @@ module Datadog
4
4
  # gRPC integration constants
5
5
  module Ext
6
6
  APP = 'grpc'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_GRPC_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_GRPC_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_GRPC_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_GRPC_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_GRPC_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_GRPC_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_GRPC_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'grpc'.freeze
10
13
  SPAN_CLIENT = 'grpc.client'.freeze
11
14
  SPAN_SERVICE = 'grpc.service'.freeze
@@ -29,7 +29,7 @@ module Datadog
29
29
  get_option(:service_name),
30
30
  app: Ext::APP,
31
31
  app_type: Datadog::Ext::AppTypes::WEB,
32
- tracer: get_option(:tracer)
32
+ tracer: -> { get_option(:tracer) }
33
33
  ).onto(::GRPC)
34
34
  end
35
35
 
@@ -52,10 +52,6 @@ module Datadog
52
52
  Upgrade to the configuration API using the migration guide here:
53
53
  https://github.com/DataDog/dd-trace-rb/releases/tag/v0.11.0).freeze
54
54
 
55
- def tracer=(tracer)
56
- Datadog.configuration[:grpc][:tracer] = tracer
57
- end
58
-
59
55
  def service_name=(service_name)
60
56
  Datadog.configuration[:grpc][:service_name] = service_name
61
57
  end
@@ -7,13 +7,18 @@ module Datadog
7
7
  module Configuration
8
8
  # Custom settings for the HTTP integration
9
9
  class Settings < Contrib::Configuration::Settings
10
+ option :enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
12
+ o.lazy
13
+ end
14
+
10
15
  option :analytics_enabled do |o|
11
- o.default { env_to_bool(Ext::ENV_ANALYTICS_ENABLED, false) }
16
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
12
17
  o.lazy
13
18
  end
14
19
 
15
20
  option :analytics_sample_rate do |o|
16
- o.default { env_to_float(Ext::ENV_ANALYTICS_SAMPLE_RATE, 1.0) }
21
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
17
22
  o.lazy
18
23
  end
19
24
 
@@ -4,8 +4,11 @@ module Datadog
4
4
  # HTTP integration constants
5
5
  module Ext
6
6
  APP = 'net/http'.freeze
7
- ENV_ANALYTICS_ENABLED = 'DD_HTTP_ANALYTICS_ENABLED'.freeze
8
- ENV_ANALYTICS_SAMPLE_RATE = 'DD_HTTP_ANALYTICS_SAMPLE_RATE'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_HTTP_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_HTTP_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_HTTP_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_HTTP_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_HTTP_ANALYTICS_SAMPLE_RATE'.freeze
9
12
  SERVICE_NAME = 'net/http'.freeze
10
13
  SPAN_REQUEST = 'http.request'.freeze
11
14
  end
@@ -2,6 +2,7 @@ require 'uri'
2
2
  require 'ddtrace/pin'
3
3
  require 'ddtrace/ext/app_types'
4
4
  require 'ddtrace/ext/http'
5
+ require 'ddtrace/ext/integration'
5
6
  require 'ddtrace/ext/net'
6
7
  require 'ddtrace/ext/distributed'
7
8
  require 'ddtrace/contrib/analytics'
@@ -83,6 +84,9 @@ module Datadog
83
84
  span.set_tag(Datadog::Ext::NET::TARGET_HOST, host)
84
85
  span.set_tag(Datadog::Ext::NET::TARGET_PORT, port.to_s)
85
86
 
87
+ # Tag as an external peer service
88
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
89
+
86
90
  # Set analytics sample rate
87
91
  set_analytics_sample_rate(span, request_options)
88
92
  end
@@ -111,9 +115,12 @@ module Datadog
111
115
  service = config[:service_name]
112
116
  tracer = config[:tracer]
113
117
 
114
- @datadog_pin ||= begin
115
- Datadog::Pin.new(service, app: Ext::APP, app_type: Datadog::Ext::AppTypes::WEB, tracer: tracer)
116
- end
118
+ @datadog_pin ||= Datadog::Pin.new(
119
+ service,
120
+ app: Ext::APP,
121
+ app_type: Datadog::Ext::AppTypes::WEB,
122
+ tracer: -> { config[:tracer] }
123
+ )
117
124
 
118
125
  # this shockingly poor code exists to solve the case where someone
119
126
  # calls datadog_pin on this object before running a request, which
@@ -136,10 +143,12 @@ module Datadog
136
143
  def default_datadog_pin
137
144
  config = Datadog.configuration[:http]
138
145
  service = config[:service_name]
139
- tracer = config[:tracer]
140
- @default_datadog_pin ||= begin
141
- Datadog::Pin.new(service, app: Ext::APP, app_type: Datadog::Ext::AppTypes::WEB, tracer: tracer)
142
- end
146
+ @default_datadog_pin ||= Datadog::Pin.new(
147
+ service,
148
+ app: Ext::APP,
149
+ app_type: Datadog::Ext::AppTypes::WEB,
150
+ tracer: -> { config[:tracer] }
151
+ )
143
152
  end
144
153
 
145
154
  private
@@ -0,0 +1,32 @@
1
+ require 'ddtrace/contrib/configuration/settings'
2
+ require 'ddtrace/contrib/httprb/ext'
3
+
4
+ module Datadog
5
+ module Contrib
6
+ module Httprb
7
+ module Configuration
8
+ # Custom settings for the Httprb integration
9
+ class Settings < Contrib::Configuration::Settings
10
+ option :enabled do |o|
11
+ o.default { env_to_bool(Ext::ENV_ENABLED, true) }
12
+ o.lazy
13
+ end
14
+
15
+ option :analytics_enabled do |o|
16
+ o.default { env_to_bool([Ext::ENV_ANALYTICS_ENABLED, Ext::ENV_ANALYTICS_ENABLED_OLD], false) }
17
+ o.lazy
18
+ end
19
+
20
+ option :analytics_sample_rate do |o|
21
+ o.default { env_to_float([Ext::ENV_ANALYTICS_SAMPLE_RATE, Ext::ENV_ANALYTICS_SAMPLE_RATE_OLD], 1.0) }
22
+ o.lazy
23
+ end
24
+
25
+ option :distributed_tracing, default: true
26
+ option :service_name, default: Ext::SERVICE_NAME
27
+ option :split_by_domain, default: false
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ module Datadog
2
+ module Contrib
3
+ module Httprb
4
+ # Httprb integration constants
5
+ module Ext
6
+ APP = 'httprb'.freeze
7
+ ENV_ENABLED = 'DD_TRACE_HTTPRB_ENABLED'.freeze
8
+ ENV_ANALYTICS_ENABLED = 'DD_TRACE_HTTPRB_ANALYTICS_ENABLED'.freeze
9
+ ENV_ANALYTICS_ENABLED_OLD = 'DD_HTTPRB_ANALYTICS_ENABLED'.freeze
10
+ ENV_ANALYTICS_SAMPLE_RATE = 'DD_TRACE_EHTTPRB_ANALYTICS_SAMPLE_RATE'.freeze
11
+ ENV_ANALYTICS_SAMPLE_RATE_OLD = 'DD_HTTPRB_ANALYTICS_SAMPLE_RATE'.freeze
12
+ SERVICE_NAME = 'httprb'.freeze
13
+ SPAN_REQUEST = 'httprb.request'.freeze
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,163 @@
1
+ require 'ddtrace/ext/app_types'
2
+ require 'ddtrace/ext/http'
3
+ require 'ddtrace/ext/net'
4
+ require 'ddtrace/ext/distributed'
5
+ require 'ddtrace/contrib/analytics'
6
+ require 'ddtrace/propagation/http_propagator'
7
+ require 'ddtrace/contrib/http_annotation_helper'
8
+
9
+ module Datadog
10
+ module Contrib
11
+ module Httprb
12
+ # Instrumentation for Httprb
13
+ module Instrumentation
14
+ def self.included(base)
15
+ base.send(:prepend, InstanceMethods)
16
+ end
17
+
18
+ # Instance methods for configuration
19
+ # rubocop:disable Metrics/ModuleLength
20
+ module InstanceMethods
21
+ include Datadog::Contrib::HttpAnnotationHelper
22
+
23
+ def perform(req, options)
24
+ host = req.uri.host if req.respond_to?(:uri) && req.uri
25
+ request_options = datadog_configuration(host)
26
+ pin = datadog_pin(request_options)
27
+
28
+ return super(req, options) unless pin && pin.tracer
29
+
30
+ pin.tracer.trace(Ext::SPAN_REQUEST, on_error: method(:annotate_span_with_error!)) do |span|
31
+ begin
32
+ request_options[:service_name] = pin.service_name
33
+ span.service = service_name(host, request_options)
34
+ span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND
35
+
36
+ if pin.tracer.enabled && !should_skip_distributed_tracing?(pin)
37
+ Datadog::HTTPPropagator.inject!(span.context, req)
38
+ end
39
+
40
+ # Add additional request specific tags to the span.
41
+ annotate_span_with_request!(span, req, request_options)
42
+ rescue StandardError => e
43
+ logger.error("error preparing span for http.rb request: #{e}, Soure: #{e.backtrace}")
44
+ ensure
45
+ res = super(req, options)
46
+ end
47
+
48
+ # Add additional response specific tags to the span.
49
+ annotate_span_with_response!(span, res)
50
+
51
+ res
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def annotate_span_with_request!(span, req, req_options)
58
+ if req.verb && req.verb.is_a?(String) || req.verb.is_a?(Symbol)
59
+ http_method = req.verb.to_s.upcase
60
+ span.resource = http_method
61
+ span.set_tag(Datadog::Ext::HTTP::METHOD, http_method)
62
+ else
63
+ logger.debug("service #{req_options[:service_name]} span #{Ext::SPAN_REQUEST} missing request verb")
64
+ end
65
+
66
+ if req.uri
67
+ uri = req.uri
68
+ span.set_tag(Datadog::Ext::HTTP::URL, uri.path)
69
+ span.set_tag(Datadog::Ext::NET::TARGET_HOST, uri.host)
70
+ span.set_tag(Datadog::Ext::NET::TARGET_PORT, uri.port)
71
+ else
72
+ logger.debug("service #{req_options[:service_name]} span #{Ext::SPAN_REQUEST} missing uri")
73
+ end
74
+
75
+ # Tag as an external peer service
76
+ span.set_tag(Datadog::Ext::Integration::TAG_PEER_SERVICE, span.service)
77
+
78
+ set_analytics_sample_rate(span, req_options)
79
+ end
80
+
81
+ def annotate_span_with_response!(span, response)
82
+ return unless response && response.code
83
+
84
+ span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.code)
85
+
86
+ case response.code.to_i
87
+ when 400...599
88
+ # https://github.com/DataDog/dd-trace-rb/issues/1116
89
+ # parsing the response body message will alter downstream application behavior
90
+ span.set_error(["Error #{response.code}", 'Error'])
91
+ end
92
+ end
93
+
94
+ def annotate_span_with_error!(span, error)
95
+ span.set_error(error)
96
+ end
97
+
98
+ def datadog_pin(config = Datadog.configuration[:httprb])
99
+ service = config[:service_name]
100
+ tracer = config[:tracer]
101
+
102
+ @datadog_pin ||= begin
103
+ Datadog::Pin.new(
104
+ service,
105
+ app: Ext::APP,
106
+ app_type: Datadog::Ext::AppTypes::WEB,
107
+ tracer: -> { config[:tracer] }
108
+ )
109
+ end
110
+
111
+ if @datadog_pin.service_name == default_datadog_pin.service_name && @datadog_pin.service_name != service
112
+ @datadog_pin.service = service
113
+ end
114
+ if @datadog_pin.tracer == default_datadog_pin.tracer && @datadog_pin.tracer != tracer
115
+ @datadog_pin.tracer = tracer
116
+ end
117
+
118
+ @datadog_pin
119
+ end
120
+
121
+ def default_datadog_pin
122
+ config = Datadog.configuration[:httprb]
123
+ service = config[:service_name]
124
+
125
+ @default_datadog_pin ||= begin
126
+ Datadog::Pin.new(
127
+ service,
128
+ app: Ext::APP,
129
+ app_type: Datadog::Ext::AppTypes::WEB,
130
+ tracer: -> { config[:tracer] }
131
+ )
132
+ end
133
+ end
134
+
135
+ def datadog_configuration(host = :default)
136
+ Datadog.configuration[:httprb, host]
137
+ end
138
+
139
+ def analytics_enabled?(request_options)
140
+ Contrib::Analytics.enabled?(request_options[:analytics_enabled])
141
+ end
142
+
143
+ def logger
144
+ Datadog.logger
145
+ end
146
+
147
+ def should_skip_distributed_tracing?(pin)
148
+ if pin.config && pin.config.key?(:distributed_tracing)
149
+ return !pin.config[:distributed_tracing]
150
+ end
151
+
152
+ !Datadog.configuration[:httprb][:distributed_tracing]
153
+ end
154
+
155
+ def set_analytics_sample_rate(span, request_options)
156
+ return unless analytics_enabled?(request_options)
157
+ Contrib::Analytics.set_sample_rate(span, request_options[:analytics_sample_rate])
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end