datadog 2.29.0 → 2.31.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 (214) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +87 -2
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +21 -12
  4. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +9 -7
  5. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +18 -0
  6. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  7. data/ext/datadog_profiling_native_extension/extconf.rb +6 -24
  8. data/ext/datadog_profiling_native_extension/heap_recorder.c +5 -6
  9. data/ext/datadog_profiling_native_extension/http_transport.c +51 -64
  10. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +0 -13
  11. data/ext/datadog_profiling_native_extension/profiling.c +3 -1
  12. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +24 -8
  13. data/ext/datadog_profiling_native_extension/setup_signal_handler.h +1 -3
  14. data/ext/datadog_profiling_native_extension/stack_recorder.c +29 -43
  15. data/ext/libdatadog_api/crashtracker.c +5 -8
  16. data/ext/libdatadog_api/crashtracker_report_exception.c +34 -144
  17. data/ext/libdatadog_api/datadog_ruby_common.c +18 -0
  18. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  19. data/ext/libdatadog_api/di.c +79 -0
  20. data/ext/libdatadog_api/extconf.rb +5 -20
  21. data/ext/libdatadog_api/init.c +5 -2
  22. data/ext/libdatadog_extconf_helpers.rb +57 -11
  23. data/lib/datadog/ai_guard/component.rb +2 -0
  24. data/lib/datadog/ai_guard/configuration/settings.rb +3 -0
  25. data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +41 -3
  26. data/lib/datadog/ai_guard/evaluation/content_builder.rb +31 -0
  27. data/lib/datadog/ai_guard/evaluation/content_part.rb +36 -0
  28. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +3 -1
  29. data/lib/datadog/ai_guard/evaluation/request.rb +14 -9
  30. data/lib/datadog/ai_guard/evaluation/result.rb +3 -1
  31. data/lib/datadog/ai_guard/evaluation.rb +36 -7
  32. data/lib/datadog/ai_guard.rb +26 -8
  33. data/lib/datadog/appsec/autoload.rb +1 -1
  34. data/lib/datadog/appsec/component.rb +11 -7
  35. data/lib/datadog/appsec/contrib/active_record/patcher.rb +3 -0
  36. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
  37. data/lib/datadog/appsec/contrib/excon/patcher.rb +2 -0
  38. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +1 -1
  39. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  40. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +1 -1
  41. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +10 -11
  42. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  43. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +25 -2
  44. data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
  45. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +2 -2
  46. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  47. data/lib/datadog/appsec/contrib/rails/patcher.rb +2 -2
  48. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +2 -0
  49. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
  50. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +3 -3
  51. data/lib/datadog/appsec/event.rb +1 -17
  52. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
  53. data/lib/datadog/appsec/instrumentation/gateway.rb +2 -15
  54. data/lib/datadog/appsec/monitor/gateway/watcher.rb +4 -2
  55. data/lib/datadog/appsec/utils/http/media_type.rb +1 -2
  56. data/lib/datadog/appsec/utils/http/url_encoded.rb +2 -2
  57. data/lib/datadog/appsec.rb +5 -9
  58. data/lib/datadog/core/configuration/base.rb +17 -5
  59. data/lib/datadog/core/configuration/components.rb +21 -8
  60. data/lib/datadog/core/configuration/config_helper.rb +9 -0
  61. data/lib/datadog/core/configuration/option.rb +32 -6
  62. data/lib/datadog/core/configuration/option_definition.rb +38 -12
  63. data/lib/datadog/core/configuration/options.rb +41 -7
  64. data/lib/datadog/core/configuration/settings.rb +42 -3
  65. data/lib/datadog/core/configuration/supported_configurations.rb +17 -0
  66. data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
  67. data/lib/datadog/core/contrib/rails/utils.rb +7 -3
  68. data/lib/datadog/core/crashtracking/component.rb +7 -15
  69. data/lib/datadog/core/environment/container.rb +2 -2
  70. data/lib/datadog/core/environment/ext.rb +1 -0
  71. data/lib/datadog/core/environment/identity.rb +25 -3
  72. data/lib/datadog/core/environment/process.rb +12 -0
  73. data/lib/datadog/core/metrics/client.rb +5 -5
  74. data/lib/datadog/core/process_discovery.rb +5 -0
  75. data/lib/datadog/core/remote/component.rb +38 -21
  76. data/lib/datadog/core/runtime/metrics.rb +2 -3
  77. data/lib/datadog/core/telemetry/component.rb +3 -0
  78. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +2 -3
  79. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
  80. data/lib/datadog/core/telemetry/event/app_started.rb +151 -169
  81. data/lib/datadog/core/telemetry/event.rb +1 -7
  82. data/lib/datadog/core/telemetry/ext.rb +1 -0
  83. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +5 -0
  84. data/lib/datadog/core/telemetry/worker.rb +20 -0
  85. data/lib/datadog/core/utils/base64.rb +1 -1
  86. data/lib/datadog/core/utils/only_once.rb +1 -1
  87. data/lib/datadog/core/utils/spawn_monkey_patch.rb +36 -0
  88. data/lib/datadog/core/workers/async.rb +1 -1
  89. data/lib/datadog/core/workers/interval_loop.rb +13 -6
  90. data/lib/datadog/core/workers/queue.rb +0 -4
  91. data/lib/datadog/core/workers/runtime_metrics.rb +9 -1
  92. data/lib/datadog/core.rb +0 -1
  93. data/lib/datadog/data_streams/pathway_context.rb +1 -1
  94. data/lib/datadog/data_streams/processor.rb +1 -0
  95. data/lib/datadog/di/boot.rb +3 -4
  96. data/lib/datadog/di/component.rb +20 -4
  97. data/lib/datadog/di/instrumenter.rb +20 -10
  98. data/lib/datadog/di/probe_manager.rb +79 -62
  99. data/lib/datadog/di/probe_notification_builder.rb +148 -33
  100. data/lib/datadog/di/probe_notifier_worker.rb +52 -6
  101. data/lib/datadog/di/probe_repository.rb +198 -0
  102. data/lib/datadog/di/remote.rb +5 -6
  103. data/lib/datadog/di/serializer.rb +127 -9
  104. data/lib/datadog/di/transport/http.rb +12 -3
  105. data/lib/datadog/di/transport/input.rb +46 -8
  106. data/lib/datadog/di.rb +81 -0
  107. data/lib/datadog/kit/enable_core_dumps.rb +1 -1
  108. data/lib/datadog/open_feature/configuration.rb +2 -0
  109. data/lib/datadog/open_feature/evaluation_engine.rb +1 -1
  110. data/lib/datadog/open_feature/exposures/reporter.rb +1 -1
  111. data/lib/datadog/open_feature/exposures/worker.rb +1 -1
  112. data/lib/datadog/open_feature/remote.rb +1 -1
  113. data/lib/datadog/open_feature/transport.rb +1 -1
  114. data/lib/datadog/opentelemetry/configuration/settings.rb +2 -0
  115. data/lib/datadog/profiling/collectors/code_provenance.rb +2 -3
  116. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +14 -1
  117. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  118. data/lib/datadog/profiling/component.rb +31 -1
  119. data/lib/datadog/profiling/http_transport.rb +5 -6
  120. data/lib/datadog/profiling/load_native_extension.rb +1 -1
  121. data/lib/datadog/profiling/profiler.rb +15 -12
  122. data/lib/datadog/profiling/scheduler.rb +2 -2
  123. data/lib/datadog/profiling/tasks/exec.rb +2 -2
  124. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  125. data/lib/datadog/profiling.rb +1 -2
  126. data/lib/datadog/single_step_instrument.rb +1 -1
  127. data/lib/datadog/tracing/buffer.rb +3 -3
  128. data/lib/datadog/tracing/component.rb +11 -0
  129. data/lib/datadog/tracing/configuration/settings.rb +2 -1
  130. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
  131. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +20 -0
  132. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -1
  133. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  134. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  135. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  136. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  137. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  138. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  139. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  140. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  141. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +1 -1
  142. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  143. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -1
  144. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  145. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -1
  146. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
  147. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -1
  148. data/lib/datadog/tracing/contrib/configurable.rb +18 -3
  149. data/lib/datadog/tracing/contrib/dalli/integration.rb +4 -1
  150. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -1
  151. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
  152. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  153. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -2
  154. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  155. data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -2
  156. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -2
  157. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  158. data/lib/datadog/tracing/contrib/faraday/middleware.rb +2 -2
  159. data/lib/datadog/tracing/contrib/grape/endpoint.rb +7 -7
  160. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
  161. data/lib/datadog/tracing/contrib/grape/patcher.rb +6 -1
  162. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
  163. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  164. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +5 -2
  165. data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
  166. data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -1
  167. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +5 -2
  168. data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
  169. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +5 -2
  170. data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
  171. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -1
  172. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +5 -1
  173. data/lib/datadog/tracing/contrib/karafka/ext.rb +1 -0
  174. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -1
  175. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +5 -2
  176. data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
  177. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +5 -1
  178. data/lib/datadog/tracing/contrib/rack/ext.rb +1 -0
  179. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +5 -2
  180. data/lib/datadog/tracing/contrib/rails/ext.rb +1 -0
  181. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  182. data/lib/datadog/tracing/contrib/rails/patcher.rb +0 -1
  183. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  184. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +2 -2
  185. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  186. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
  187. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  188. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +5 -1
  189. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  190. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +5 -1
  191. data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
  192. data/lib/datadog/tracing/contrib/status_range_matcher.rb +4 -0
  193. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  194. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +5 -1
  195. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +1 -0
  196. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  197. data/lib/datadog/tracing/event.rb +1 -1
  198. data/lib/datadog/tracing/metadata/ext.rb +4 -0
  199. data/lib/datadog/tracing/remote.rb +1 -1
  200. data/lib/datadog/tracing/sampling/ext.rb +2 -0
  201. data/lib/datadog/tracing/sampling/priority_sampler.rb +13 -0
  202. data/lib/datadog/tracing/sampling/rule.rb +1 -1
  203. data/lib/datadog/tracing/sampling/rule_sampler.rb +54 -25
  204. data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
  205. data/lib/datadog/tracing/span_operation.rb +1 -1
  206. data/lib/datadog/tracing/sync_writer.rb +0 -1
  207. data/lib/datadog/tracing/trace_operation.rb +50 -6
  208. data/lib/datadog/tracing/tracer.rb +25 -0
  209. data/lib/datadog/tracing/transport/io/client.rb +1 -1
  210. data/lib/datadog/tracing/transport/trace_formatter.rb +11 -0
  211. data/lib/datadog/tracing/writer.rb +0 -1
  212. data/lib/datadog/version.rb +1 -1
  213. metadata +15 -8
  214. data/lib/datadog/tracing/workers/trace_writer.rb +0 -204
@@ -161,6 +161,17 @@ module Datadog
161
161
  @sampler.sample!(trace)
162
162
  end
163
163
 
164
+ def reconsider_sample_resource!(trace)
165
+ return unless @sampler.respond_to?(:reconsider_sample_resource!)
166
+
167
+ @sampler.reconsider_sample_resource!(trace)
168
+ end
169
+
170
+ def resource_sampling?
171
+ @sampler.respond_to?(:resource_sampling?) &&
172
+ @sampler.resource_sampling?
173
+ end
174
+
164
175
  def update(*args, **kwargs)
165
176
  return unless @sampler.respond_to?(:update)
166
177
 
@@ -430,7 +430,7 @@ module Datadog
430
430
  rescue => e
431
431
  # `File#read` errors have clear and actionable messages, no need to add extra exception info.
432
432
  Datadog.logger.warn(
433
- "Cannot read span sampling rules file `#{rules_file}`: #{e.message}." \
433
+ "Cannot read span sampling rules file `#{rules_file}`: #{e.class}: #{e}." \
434
434
  'No span sampling rules will be applied.'
435
435
  )
436
436
  nil
@@ -481,6 +481,7 @@ module Datadog
481
481
  # @default `{}`
482
482
  # @return [Hash]
483
483
  option :writer_options do |o|
484
+ o.skip_telemetry true
484
485
  o.type :hash
485
486
  o.default({})
486
487
  end
@@ -43,7 +43,7 @@ module Datadog
43
43
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
44
44
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_CONTROLLER)
45
45
  rescue => e
46
- Datadog.logger.error(e.message)
46
+ Datadog.logger.error("#{e.class}: #{e}")
47
47
  Datadog::Core::Telemetry::Logger.report(e)
48
48
  end
49
49
 
@@ -88,7 +88,7 @@ module Datadog
88
88
  span.finish
89
89
  end
90
90
  rescue => e
91
- Datadog.logger.error(e.message)
91
+ Datadog.logger.error("#{e.class}: #{e}")
92
92
  Datadog::Core::Telemetry::Logger.report(e)
93
93
  end
94
94
 
@@ -76,6 +76,26 @@ module Datadog
76
76
  end
77
77
  end
78
78
  end
79
+
80
+ # Since Rails 8.1, `Router#find_routes` was removed by inlining its body into `recognize`.
81
+ # https://github.com/rails/rails/commit/e533a32ddf06668dfa3dfbe9b665607e235b06ac
82
+ module RecognizeRouter
83
+ def recognize(req)
84
+ # recognize modifies SCRIPT_NAME before yielding; capture it before super.
85
+ original_script_name = req.env[SCRIPT_NAME_KEY]
86
+
87
+ super do |route, parameters|
88
+ if Instrumentation.dispatcher_route?(route)
89
+ http_route = route.path.spec.to_s
90
+ http_route = http_route.delete_suffix(FORMAT_SUFFIX)
91
+
92
+ Instrumentation.set_http_route_tags(http_route, original_script_name)
93
+ end
94
+
95
+ yield route, parameters
96
+ end
97
+ end
98
+ end
79
99
  end
80
100
  end
81
101
  end
@@ -19,7 +19,9 @@ module Datadog
19
19
  end
20
20
 
21
21
  def patch
22
- if ::ActionPack.gem_version >= Gem::Version.new('7.1')
22
+ if ::ActionPack.gem_version >= Gem::Version.new('8.1')
23
+ ::ActionDispatch::Journey::Router.prepend(ActionDispatch::Instrumentation::Journey::RecognizeRouter)
24
+ elsif ::ActionPack.gem_version >= Gem::Version.new('7.1')
23
25
  ::ActionDispatch::Journey::Router.prepend(ActionDispatch::Instrumentation::Journey::LazyRouter)
24
26
  else
25
27
  ::ActionDispatch::Journey::Router.prepend(ActionDispatch::Instrumentation::Journey::Router)
@@ -47,7 +47,7 @@ module Datadog
47
47
 
48
48
  record_exception(span, payload)
49
49
  rescue => e
50
- Datadog.logger.debug(e.message)
50
+ Datadog.logger.debug { "#{e.class}: #{e}" }
51
51
  end
52
52
  end
53
53
  end
@@ -40,7 +40,7 @@ module Datadog
40
40
  set_common_tags(span, payload)
41
41
  span.set_tag(Ext::TAG_JOB_ERROR, payload[:error])
42
42
  rescue => e
43
- Datadog.logger.debug(e.message)
43
+ Datadog.logger.debug { "#{e.class}: #{e}" }
44
44
  end
45
45
  end
46
46
  end
@@ -39,7 +39,7 @@ module Datadog
39
39
 
40
40
  set_common_tags(span, payload)
41
41
  rescue => e
42
- Datadog.logger.debug(e.message)
42
+ Datadog.logger.debug { "#{e.class}: #{e}" }
43
43
  end
44
44
  end
45
45
  end
@@ -39,7 +39,7 @@ module Datadog
39
39
 
40
40
  set_common_tags(span, payload)
41
41
  rescue => e
42
- Datadog.logger.debug(e.message)
42
+ Datadog.logger.debug { "#{e.class}: #{e}" }
43
43
  end
44
44
  end
45
45
  end
@@ -41,7 +41,7 @@ module Datadog
41
41
  span.set_tag(Ext::TAG_JOB_ERROR, payload[:error])
42
42
  span.set_tag(Ext::TAG_JOB_RETRY_WAIT, payload[:wait])
43
43
  rescue => e
44
- Datadog.logger.debug(e.message)
44
+ Datadog.logger.debug { "#{e.class}: #{e}" }
45
45
  end
46
46
  end
47
47
  end
@@ -39,7 +39,7 @@ module Datadog
39
39
 
40
40
  set_common_tags(span, payload)
41
41
  rescue => e
42
- Datadog.logger.debug(e.message)
42
+ Datadog.logger.debug { "#{e.class}: #{e}" }
43
43
  end
44
44
  end
45
45
  end
@@ -40,7 +40,7 @@ module Datadog
40
40
  set_common_tags(span, payload)
41
41
  span.set_tag(Ext::TAG_JOB_ERROR, payload[:error])
42
42
  rescue => e
43
- Datadog.logger.debug(e.message)
43
+ Datadog.logger.debug { "#{e.class}: #{e}" }
44
44
  end
45
45
  end
46
46
  end
@@ -35,7 +35,7 @@ module Datadog
35
35
 
36
36
  set_common_tags(span, payload)
37
37
  rescue => e
38
- Datadog.logger.debug(e.message)
38
+ Datadog.logger.debug { "#{e.class}: #{e}" }
39
39
  end
40
40
  end
41
41
  end
@@ -37,7 +37,7 @@ module Datadog
37
37
 
38
38
  set_common_tags(span, payload)
39
39
  rescue => e
40
- Datadog.logger.debug(e.message)
40
+ Datadog.logger.debug { "#{e.class}: #{e}" }
41
41
  end
42
42
  end
43
43
  end
@@ -49,7 +49,7 @@ module Datadog
49
49
  span.set_tag(Ext::TAG_INSTANTIATION_CLASS_NAME, payload.fetch(:class_name))
50
50
  span.set_tag(Ext::TAG_INSTANTIATION_RECORD_COUNT, payload.fetch(:record_count))
51
51
  rescue => e
52
- Datadog.logger.error(e.message)
52
+ Datadog.logger.error("#{e.class}: #{e}")
53
53
  Datadog::Core::Telemetry::Logger.report(e)
54
54
  end
55
55
  end
@@ -69,7 +69,7 @@ module Datadog
69
69
  span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_HOST, config[:host]) if config[:host]
70
70
  span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_PORT, config[:port]) if config[:port]
71
71
  rescue => e
72
- Datadog.logger.error(e.message)
72
+ Datadog.logger.error("#{e.class}: #{e}")
73
73
  Datadog::Core::Telemetry::Logger.report(e)
74
74
  end
75
75
  end
@@ -77,7 +77,7 @@ module Datadog
77
77
  # in case.
78
78
  Datadog.logger.debug(
79
79
  "connection_id #{connection_id} does not represent a valid object. " \
80
- "Cause: #{e.class.name} #{e.message} Source: #{Array(e.backtrace).first}"
80
+ "Cause: #{e.class}: #{e} Source: #{Array(e.backtrace).first}"
81
81
  )
82
82
  end
83
83
  else
@@ -94,7 +94,7 @@ module Datadog
94
94
  set_cache_key(span, key, mapping[:multi_key])
95
95
  end
96
96
  rescue => e
97
- Datadog.logger.error(e.message)
97
+ Datadog.logger.error("#{e.class}: #{e}")
98
98
  Datadog::Core::Telemetry::Logger.report(e)
99
99
  end
100
100
 
@@ -125,7 +125,7 @@ module Datadog
125
125
  @block&.call(span, name, id, payload)
126
126
  rescue => e
127
127
  Datadog.logger.debug(
128
- "ActiveSupport::Notifications handler for '#{name}' failed: #{e.class.name} #{e.message}"
128
+ "ActiveSupport::Notifications handler for '#{name}' failed: #{e.class}: #{e}"
129
129
  )
130
130
  end
131
131
  end
@@ -147,7 +147,7 @@ module Datadog
147
147
  callback.call(event, key, *args)
148
148
  rescue => e
149
149
  Datadog.logger.debug(
150
- "ActiveSupport::Notifications '#{key}' callback for '#{event}' failed: #{e.class.name} #{e.message}"
150
+ "ActiveSupport::Notifications '#{key}' callback for '#{event}' failed: #{e.class}: #{e}"
151
151
  )
152
152
  end
153
153
  end
@@ -90,7 +90,7 @@ module Datadog
90
90
 
91
91
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
92
92
  rescue => e
93
- Datadog.logger.error(e.message)
93
+ Datadog.logger.error("#{e.class}: #{e}")
94
94
  Datadog::Core::Telemetry::Logger.report(e)
95
95
  end
96
96
  # rubocop:enable Metrics/MethodLength
@@ -45,8 +45,11 @@ module Datadog
45
45
  config = if matcher == :default
46
46
  default_configuration
47
47
  else
48
- # Get or add the configuration
49
- resolver.get(matcher) || resolver.add(matcher, new_configuration)
48
+ resolver.get(matcher) || begin
49
+ new_config = new_configuration
50
+ set_integration_settings_path!(new_config)
51
+ resolver.add(matcher, new_config)
52
+ end
50
53
  end
51
54
 
52
55
  # Apply the settings
@@ -67,11 +70,23 @@ module Datadog
67
70
  #
68
71
  # @return [Datadog::Tracing::Contrib::Configuration::Settings] the memoized integration-specific settings object
69
72
  def default_configuration
70
- @default_configuration ||= new_configuration
73
+ @default_configuration ||= begin
74
+ configuration = new_configuration
75
+ set_integration_settings_path!(configuration)
76
+ configuration
77
+ end
71
78
  end
72
79
 
73
80
  protected
74
81
 
82
+ def set_integration_settings_path!(configuration)
83
+ # name is called from Registerable::InstanceMethods#name
84
+ # which is set by register_as
85
+ return unless respond_to?(:name)
86
+
87
+ configuration.class.settings_path = "tracing.#{name}" if configuration.class.respond_to?(:settings_path=)
88
+ end
89
+
75
90
  # Returns a new configuration object for this integration.
76
91
  #
77
92
  # This method normally needs to be overridden for each integration
@@ -14,6 +14,7 @@ module Datadog
14
14
 
15
15
  MINIMUM_VERSION = Gem::Version.new('2.0.0')
16
16
  DALLI_PROTOCOL_BINARY_VERSION = Gem::Version.new('3.0.0')
17
+ DALLI_PROTOCOL_META_VERSION = Gem::Version.new('5.0.0')
17
18
 
18
19
  # @public_api Changing the integration name or integration options can cause breaking changes
19
20
  register_as :dalli, auto_patch: true
@@ -31,7 +32,9 @@ module Datadog
31
32
  end
32
33
 
33
34
  def self.dalli_class
34
- if version >= DALLI_PROTOCOL_BINARY_VERSION
35
+ if version >= DALLI_PROTOCOL_META_VERSION
36
+ ::Dalli::Protocol::Meta
37
+ elsif version >= DALLI_PROTOCOL_BINARY_VERSION
35
38
  ::Dalli::Protocol::Binary
36
39
  else
37
40
  ::Dalli::Server
@@ -98,7 +98,7 @@ module Datadog
98
98
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
99
99
  rescue => e
100
100
  # TODO: Refactor the code to streamline the execution without ensure
101
- Datadog.logger.error(e.message)
101
+ Datadog.logger.error("#{e.class}: #{e}")
102
102
  Datadog::Core::Telemetry::Logger.report(e)
103
103
  ensure
104
104
  # the call is still executed
@@ -30,7 +30,11 @@ module Datadog
30
30
  o.default 1.0
31
31
  end
32
32
 
33
- option :distributed_tracing, default: true, type: :bool
33
+ option :distributed_tracing do |o|
34
+ o.type :bool
35
+ o.env Ext::ENV_DISTRIBUTED_TRACING
36
+ o.default true
37
+ end
34
38
 
35
39
  option :split_by_domain, default: false, type: :bool
36
40
 
@@ -8,6 +8,7 @@ module Datadog
8
8
  # @public_api Changing resource names, tag names, or environment variables creates breaking changes.
9
9
  module Ext
10
10
  ENV_ENABLED = 'DD_TRACE_ETHON_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_ETHON_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_ETHON_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_ETHON_PEER_SERVICE'
13
14
 
@@ -33,8 +33,11 @@ module Datadog
33
33
  o.default 1.0
34
34
  end
35
35
 
36
- option :distributed_tracing, default: true, type: :bool
37
-
36
+ option :distributed_tracing do |o|
37
+ o.type :bool
38
+ o.env Ext::ENV_DISTRIBUTED_TRACING
39
+ o.default true
40
+ end
38
41
  option :on_error do |o|
39
42
  o.type :proc, nilable: true
40
43
  end
@@ -8,6 +8,7 @@ module Datadog
8
8
  # @public_api Changing resource names, tag names, or environment variables creates breaking changes.
9
9
  module Ext
10
10
  ENV_ENABLED = 'DD_TRACE_EXCON_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_EXCON_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_EXCON_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_EXCON_PEER_SERVICE'
13
14
 
@@ -40,7 +40,7 @@ module Datadog
40
40
  span
41
41
  end
42
42
  rescue => e
43
- Datadog.logger.debug(e.message)
43
+ Datadog.logger.debug { "#{e.class}: #{e}" }
44
44
  end
45
45
 
46
46
  @stack.request_call(datum)
@@ -180,7 +180,7 @@ module Datadog
180
180
  end
181
181
  end
182
182
  rescue => e
183
- Datadog.logger.debug(e.message)
183
+ Datadog.logger.debug { "#{e.class}: #{e}" }
184
184
  end
185
185
 
186
186
  def propagate!(trace, span, datum)
@@ -32,8 +32,11 @@ module Datadog
32
32
  o.default 1.0
33
33
  end
34
34
 
35
- option :distributed_tracing, default: true, type: :bool
36
-
35
+ option :distributed_tracing do |o|
36
+ o.type :bool
37
+ o.env Ext::ENV_DISTRIBUTED_TRACING
38
+ o.default true
39
+ end
37
40
  option :on_error do |o|
38
41
  o.type :proc, nilable: true
39
42
  end
@@ -8,6 +8,7 @@ module Datadog
8
8
  # @public_api Changing resource names, tag names, or environment variables creates breaking changes.
9
9
  module Ext
10
10
  ENV_ENABLED = 'DD_TRACE_FARADAY_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_FARADAY_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_FARADAY_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_FARADAY_PEER_SERVICE'
13
14
  ENV_ERROR_STATUS_CODES = 'DD_TRACE_FARADAY_ERROR_STATUS_CODES'
@@ -83,7 +83,7 @@ module Datadog
83
83
 
84
84
  Contrib::SpanAttributeSchema.set_peer_service!(span, Ext::PEER_SERVICE_SOURCES)
85
85
  rescue => e
86
- Datadog.logger.error(e.message)
86
+ Datadog.logger.error("#{e.class}: #{e}")
87
87
  Datadog::Core::Telemetry::Logger.report(e)
88
88
  end
89
89
  # rubocop:enable Metrics/AbcSize
@@ -98,7 +98,7 @@ module Datadog
98
98
  Datadog.configuration.tracing.header_tags.response_tags(env[:response_headers])
99
99
  )
100
100
  rescue => e
101
- Datadog.logger.error(e.message)
101
+ Datadog.logger.error("#{e.class}: #{e}")
102
102
  Datadog::Core::Telemetry::Logger.report(e)
103
103
  end
104
104
  # rubocop:enable Metrics/AbcSize
@@ -77,7 +77,7 @@ module Datadog
77
77
 
78
78
  Thread.current[KEY_RUN] = true
79
79
  rescue => e
80
- Datadog.logger.error(e.message)
80
+ Datadog.logger.error("#{e.class}: #{e}")
81
81
  Datadog::Core::Telemetry::Logger.report(e)
82
82
  end
83
83
 
@@ -121,7 +121,7 @@ module Datadog
121
121
  span.finish(finish)
122
122
  end
123
123
  rescue => e
124
- Datadog.logger.error(e.message)
124
+ Datadog.logger.error("#{e.class}: #{e}")
125
125
  Datadog::Core::Telemetry::Logger.report(e)
126
126
  end
127
127
 
@@ -165,7 +165,7 @@ module Datadog
165
165
 
166
166
  Thread.current[KEY_RENDER] = true
167
167
  rescue => e
168
- Datadog.logger.error(e.message)
168
+ Datadog.logger.error("#{e.class}: #{e}")
169
169
  Datadog::Core::Telemetry::Logger.report(e)
170
170
  end
171
171
 
@@ -190,7 +190,7 @@ module Datadog
190
190
  span.finish(finish)
191
191
  end
192
192
  rescue => e
193
- Datadog.logger.error(e.message)
193
+ Datadog.logger.error("#{e.class}: #{e}")
194
194
  Datadog::Core::Telemetry::Logger.report(e)
195
195
  end
196
196
 
@@ -229,7 +229,7 @@ module Datadog
229
229
  span.finish(finish)
230
230
  end
231
231
  rescue => e
232
- Datadog.logger.error(e.message)
232
+ Datadog.logger.error("#{e.class}: #{e}")
233
233
  Datadog::Core::Telemetry::Logger.report(e)
234
234
  end
235
235
 
@@ -253,10 +253,10 @@ module Datadog
253
253
  end
254
254
 
255
255
  def api_view(api)
256
- # If the API inherits from Grape::API in version >= 1.2.0
256
+ # If the API inherits from Grape::API in version >= 1.2.0 and version <= 2.3.0
257
257
  # then the API will be an instance and the name must be derived from the base.
258
258
  # See https://github.com/ruby-grape/grape/issues/1825
259
- if defined?(::Grape::API::Instance) && api <= ::Grape::API::Instance
259
+ if defined?(::Grape::API::Instance) && api <= ::Grape::API::Instance && api.respond_to?(:base)
260
260
  api.base.to_s
261
261
  else
262
262
  api.to_s
@@ -6,13 +6,8 @@ module Datadog
6
6
  module Grape
7
7
  # Instrumentation for Grape::Endpoint
8
8
  module Instrumentation
9
- def self.included(base)
10
- base.singleton_class.prepend(ClassMethods)
11
- base.prepend(InstanceMethods)
12
- end
13
-
14
- # ClassMethods - implementing instrumentation
15
- module ClassMethods
9
+ # GenerateApiMethodPatch - class method instrumentation for endpoint render (Grape < 3.0.0)
10
+ module GenerateApiMethodPatch
16
11
  def generate_api_method(*params, &block)
17
12
  method_api = super
18
13
 
@@ -23,7 +18,17 @@ module Datadog
23
18
  end
24
19
  end
25
20
 
26
- # InstanceMethods - implementing instrumentation
21
+ # ExecutePatch - instance method instrumentation for endpoint render (Grape >= 3.0.0)
22
+ module ExecutePatch
23
+ def execute(*args)
24
+ return unless @source
25
+
26
+ ::ActiveSupport::Notifications.instrument('endpoint_render.grape.start_render')
27
+ super
28
+ end
29
+ end
30
+
31
+ # InstanceMethods - instance method instrumentation for endpoint run
27
32
  module InstanceMethods
28
33
  def run(*args)
29
34
  ::ActiveSupport::Notifications.instrument('endpoint_run.grape.start_process', endpoint: self, env: env)
@@ -21,7 +21,12 @@ module Datadog
21
21
 
22
22
  def patch
23
23
  # Patch endpoints
24
- ::Grape::Endpoint.include(Instrumentation)
24
+ ::Grape::Endpoint.prepend(Instrumentation::InstanceMethods)
25
+ if target_version < Gem::Version.new('3.0.0')
26
+ ::Grape::Endpoint.singleton_class.prepend(Instrumentation::GenerateApiMethodPatch)
27
+ else
28
+ ::Grape::Endpoint.prepend(Instrumentation::ExecutePatch)
29
+ end
25
30
 
26
31
  # Subscribe to ActiveSupport events
27
32
  Endpoint.subscribe
@@ -30,8 +30,11 @@ module Datadog
30
30
  o.default 1.0
31
31
  end
32
32
 
33
- option :distributed_tracing, default: true, type: :bool
34
-
33
+ option :distributed_tracing do |o|
34
+ o.type :bool
35
+ o.env Ext::ENV_DISTRIBUTED_TRACING
36
+ o.default true
37
+ end
35
38
  option :service_name do |o|
36
39
  o.type :string, nilable: true
37
40
  o.default do
@@ -8,6 +8,7 @@ module Datadog
8
8
  # @public_api Changing resource names, tag names, or environment variables creates breaking changes.
9
9
  module Ext
10
10
  ENV_ENABLED = 'DD_TRACE_GRPC_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_GRPC_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_GRPC_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_GRPC_PEER_SERVICE'
13
14
  # @!visibility private
@@ -32,8 +32,11 @@ module Datadog
32
32
  o.default 1.0
33
33
  end
34
34
 
35
- option :distributed_tracing, default: true, type: :bool
36
-
35
+ option :distributed_tracing do |o|
36
+ o.type :bool
37
+ o.env Ext::ENV_DISTRIBUTED_TRACING
38
+ o.default true
39
+ end
37
40
  option :service_name do |o|
38
41
  o.type :string, nilable: true
39
42
  o.default do
@@ -8,6 +8,7 @@ module Datadog
8
8
  # @public_api Changing resource names, tag names, or environment variables creates breaking changes.
9
9
  module Ext
10
10
  ENV_ENABLED = 'DD_TRACE_HTTP_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_HTTP_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_NET_HTTP_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_NET_HTTP_PEER_SERVICE'
13
14
  # @!visibility private
@@ -37,7 +37,7 @@ module Datadog
37
37
 
38
38
  if Tracing::Distributed::PropagationPolicy.enabled?(
39
39
  pin_config: client_config,
40
- global_config: Datadog.configuration.tracing[:http],
40
+ global_config: request_options,
41
41
  trace: trace
42
42
  )
43
43
  Contrib::HTTP.inject(trace, req)
@@ -32,8 +32,11 @@ module Datadog
32
32
  o.default 1.0
33
33
  end
34
34
 
35
- option :distributed_tracing, default: true, type: :bool
36
-
35
+ option :distributed_tracing do |o|
36
+ o.type :bool
37
+ o.env Ext::ENV_DISTRIBUTED_TRACING
38
+ o.default true
39
+ end
37
40
  option :service_name do |o|
38
41
  o.default do
39
42
  Contrib::SpanAttributeSchema.fetch_service_name(
@@ -8,6 +8,7 @@ module Datadog
8
8
  # @public_api Changing resource names, tag names, or environment variables creates breaking changes.
9
9
  module Ext
10
10
  ENV_ENABLED = 'DD_TRACE_HTTPCLIENT_ENABLED'
11
+ ENV_DISTRIBUTED_TRACING = 'DD_TRACE_HTTPCLIENT_DISTRIBUTED_TRACING'
11
12
  ENV_SERVICE_NAME = 'DD_TRACE_HTTPCLIENT_SERVICE_NAME'
12
13
  ENV_PEER_SERVICE = 'DD_TRACE_HTTPCLIENT_PEER_SERVICE'
13
14
 
@@ -32,8 +32,11 @@ module Datadog
32
32
  o.default 1.0
33
33
  end
34
34
 
35
- option :distributed_tracing, default: true, type: :bool
36
-
35
+ option :distributed_tracing do |o|
36
+ o.type :bool
37
+ o.env Ext::ENV_DISTRIBUTED_TRACING
38
+ o.default true
39
+ end
37
40
  option :service_name do |o|
38
41
  o.default do
39
42
  Contrib::SpanAttributeSchema.fetch_service_name(