datadog 2.18.0 → 2.20.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 (297) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +73 -1
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +51 -10
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +58 -49
  5. data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -1
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +5 -6
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -1
  8. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +37 -26
  9. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +0 -1
  10. data/ext/datadog_profiling_native_extension/ruby_helpers.h +1 -1
  11. data/ext/libdatadog_api/extconf.rb +3 -1
  12. data/ext/libdatadog_extconf_helpers.rb +13 -3
  13. data/lib/datadog/appsec/api_security/route_extractor.rb +7 -1
  14. data/lib/datadog/appsec/component.rb +3 -13
  15. data/lib/datadog/appsec/context.rb +23 -0
  16. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +2 -1
  17. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +2 -1
  18. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +0 -1
  19. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +0 -1
  20. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +14 -22
  21. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +23 -2
  22. data/lib/datadog/appsec/contrib/rails/patcher.rb +14 -26
  23. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +27 -0
  24. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +33 -0
  25. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +0 -1
  26. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +23 -0
  27. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +8 -18
  28. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +31 -0
  29. data/lib/datadog/appsec/event.rb +3 -18
  30. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +17 -1
  31. data/lib/datadog/appsec/metrics/collector.rb +7 -3
  32. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  33. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +28 -0
  34. data/lib/datadog/appsec/metrics.rb +1 -0
  35. data/lib/datadog/appsec/security_engine/engine.rb +14 -32
  36. data/lib/datadog/appsec/security_engine/result.rb +16 -0
  37. data/lib/datadog/appsec/security_engine/runner.rb +18 -4
  38. data/lib/datadog/appsec/thread_safe_ref.rb +61 -0
  39. data/lib/datadog/appsec/trace_keeper.rb +24 -0
  40. data/lib/datadog/appsec/utils/hash_coercion.rb +23 -0
  41. data/lib/datadog/appsec.rb +0 -7
  42. data/lib/datadog/auto_instrument_base.rb +2 -1
  43. data/lib/datadog/core/configuration/option.rb +29 -20
  44. data/lib/datadog/core/configuration/option_definition.rb +2 -2
  45. data/lib/datadog/core/configuration/options.rb +13 -7
  46. data/lib/datadog/core/configuration/settings.rb +20 -0
  47. data/lib/datadog/core/telemetry/component.rb +8 -4
  48. data/lib/datadog/core/telemetry/event/app_started.rb +21 -3
  49. data/lib/datadog/di/boot.rb +7 -0
  50. data/lib/datadog/di/component.rb +7 -0
  51. data/lib/datadog/di/instrumenter.rb +11 -18
  52. data/lib/datadog/di/probe_file_loader/railtie.rb +15 -0
  53. data/lib/datadog/di/probe_file_loader.rb +82 -0
  54. data/lib/datadog/di/probe_notification_builder.rb +21 -16
  55. data/lib/datadog/di/remote.rb +3 -5
  56. data/lib/datadog/di/serializer.rb +6 -2
  57. data/lib/datadog/di.rb +0 -7
  58. data/lib/datadog/kit/appsec/events/v2.rb +196 -0
  59. data/lib/datadog/kit/appsec/events.rb +11 -10
  60. data/lib/datadog/kit/identity.rb +17 -11
  61. data/lib/datadog/opentelemetry/api/baggage.rb +2 -2
  62. data/lib/datadog/opentelemetry/api/context.rb +10 -9
  63. data/lib/datadog/opentelemetry/sdk/propagator.rb +4 -4
  64. data/lib/datadog/opentelemetry/sdk/span_processor.rb +8 -8
  65. data/lib/datadog/opentelemetry/sdk/trace/span.rb +14 -10
  66. data/lib/datadog/opentelemetry/trace.rb +4 -4
  67. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +2 -0
  68. data/lib/datadog/profiling/collectors/info.rb +41 -0
  69. data/lib/datadog/profiling/component.rb +1 -0
  70. data/lib/datadog/profiling/exporter.rb +9 -3
  71. data/lib/datadog/profiling/sequence_tracker.rb +44 -0
  72. data/lib/datadog/profiling/tag_builder.rb +2 -0
  73. data/lib/datadog/profiling.rb +7 -8
  74. data/lib/datadog/single_step_instrument.rb +9 -0
  75. data/lib/datadog/tracing/analytics.rb +1 -1
  76. data/lib/datadog/tracing/buffer.rb +7 -7
  77. data/lib/datadog/tracing/configuration/dynamic.rb +4 -6
  78. data/lib/datadog/tracing/configuration/ext.rb +3 -2
  79. data/lib/datadog/tracing/configuration/settings.rb +17 -0
  80. data/lib/datadog/tracing/context.rb +2 -2
  81. data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
  82. data/lib/datadog/tracing/contrib/action_cable/integration.rb +1 -1
  83. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +1 -1
  84. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +4 -4
  85. data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
  86. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  87. data/lib/datadog/tracing/contrib/active_job/event.rb +8 -8
  88. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  89. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  90. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  91. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  92. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  93. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  94. data/lib/datadog/tracing/contrib/active_job/integration.rb +1 -1
  95. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  96. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +3 -3
  97. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +1 -2
  98. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  99. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  100. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +5 -5
  101. data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
  102. data/lib/datadog/tracing/contrib/active_record/utils.rb +15 -15
  103. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +13 -7
  104. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
  105. data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
  106. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -1
  107. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +7 -9
  108. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  109. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +2 -2
  110. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +3 -1
  111. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -1
  112. data/lib/datadog/tracing/contrib/aws/service/base.rb +2 -1
  113. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +1 -1
  114. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +1 -1
  115. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +1 -1
  116. data/lib/datadog/tracing/contrib/aws/service/s3.rb +1 -1
  117. data/lib/datadog/tracing/contrib/aws/service/sns.rb +1 -1
  118. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +1 -1
  119. data/lib/datadog/tracing/contrib/aws/service/states.rb +1 -1
  120. data/lib/datadog/tracing/contrib/aws/services.rb +7 -7
  121. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  122. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  123. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  124. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +1 -1
  125. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  126. data/lib/datadog/tracing/contrib/configurable.rb +6 -6
  127. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +4 -4
  128. data/lib/datadog/tracing/contrib/dalli/ext.rb +3 -2
  129. data/lib/datadog/tracing/contrib/dalli/integration.rb +1 -1
  130. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +1 -1
  131. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +3 -2
  132. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +4 -4
  133. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +51 -53
  134. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +5 -5
  135. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +2 -2
  136. data/lib/datadog/tracing/contrib/ethon/ext.rb +3 -2
  137. data/lib/datadog/tracing/contrib/ethon/integration.rb +1 -1
  138. data/lib/datadog/tracing/contrib/excon/ext.rb +3 -2
  139. data/lib/datadog/tracing/contrib/excon/integration.rb +1 -1
  140. data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -2
  141. data/lib/datadog/tracing/contrib/ext.rb +3 -3
  142. data/lib/datadog/tracing/contrib/extensions.rb +9 -9
  143. data/lib/datadog/tracing/contrib/faraday/ext.rb +3 -2
  144. data/lib/datadog/tracing/contrib/faraday/integration.rb +1 -1
  145. data/lib/datadog/tracing/contrib/faraday/middleware.rb +4 -2
  146. data/lib/datadog/tracing/contrib/grape/endpoint.rb +8 -8
  147. data/lib/datadog/tracing/contrib/grape/integration.rb +1 -1
  148. data/lib/datadog/tracing/contrib/graphql/integration.rb +1 -1
  149. data/lib/datadog/tracing/contrib/graphql/patcher.rb +2 -2
  150. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +24 -24
  151. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +8 -8
  152. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +3 -3
  153. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  154. data/lib/datadog/tracing/contrib/grpc/integration.rb +1 -1
  155. data/lib/datadog/tracing/contrib/hanami/ext.rb +2 -2
  156. data/lib/datadog/tracing/contrib/hanami/integration.rb +1 -1
  157. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
  158. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +9 -11
  159. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +4 -4
  160. data/lib/datadog/tracing/contrib/http/ext.rb +3 -2
  161. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -5
  162. data/lib/datadog/tracing/contrib/httpclient/ext.rb +3 -2
  163. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +3 -3
  164. data/lib/datadog/tracing/contrib/httpclient/integration.rb +1 -1
  165. data/lib/datadog/tracing/contrib/httprb/ext.rb +3 -2
  166. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -4
  167. data/lib/datadog/tracing/contrib/httprb/integration.rb +1 -1
  168. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
  169. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +1 -1
  170. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +1 -1
  171. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +1 -1
  172. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +1 -1
  173. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +1 -1
  174. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +1 -1
  175. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +1 -1
  176. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -1
  177. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -1
  178. data/lib/datadog/tracing/contrib/kafka/integration.rb +1 -1
  179. data/lib/datadog/tracing/contrib/karafka/monitor.rb +13 -13
  180. data/lib/datadog/tracing/contrib/karafka/patcher.rb +4 -4
  181. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +1 -1
  182. data/lib/datadog/tracing/contrib/lograge/integration.rb +1 -1
  183. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +1 -1
  184. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -1
  185. data/lib/datadog/tracing/contrib/mongodb/integration.rb +1 -1
  186. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  187. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +6 -6
  188. data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -1
  189. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
  190. data/lib/datadog/tracing/contrib/mysql2/integration.rb +1 -1
  191. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +1 -1
  192. data/lib/datadog/tracing/contrib/opensearch/ext.rb +3 -2
  193. data/lib/datadog/tracing/contrib/opensearch/integration.rb +1 -2
  194. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +68 -70
  195. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +5 -5
  196. data/lib/datadog/tracing/contrib/patcher.rb +7 -9
  197. data/lib/datadog/tracing/contrib/pg/integration.rb +1 -1
  198. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -1
  199. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
  200. data/lib/datadog/tracing/contrib/presto/integration.rb +1 -1
  201. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +1 -1
  202. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  203. data/lib/datadog/tracing/contrib/que/integration.rb +1 -1
  204. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -1
  205. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +2 -2
  206. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +1 -1
  207. data/lib/datadog/tracing/contrib/racecar/events/message.rb +2 -2
  208. data/lib/datadog/tracing/contrib/racecar/integration.rb +1 -1
  209. data/lib/datadog/tracing/contrib/rack/header_collection.rb +1 -1
  210. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +32 -32
  211. data/lib/datadog/tracing/contrib/rack/integration.rb +1 -1
  212. data/lib/datadog/tracing/contrib/rack/middlewares.rb +21 -17
  213. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  214. data/lib/datadog/tracing/contrib/rack/request_queue.rb +2 -2
  215. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +1 -1
  216. data/lib/datadog/tracing/contrib/rails/integration.rb +1 -1
  217. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  218. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  219. data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
  220. data/lib/datadog/tracing/contrib/rails/runner.rb +62 -40
  221. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  222. data/lib/datadog/tracing/contrib/rake/integration.rb +1 -1
  223. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
  224. data/lib/datadog/tracing/contrib/redis/ext.rb +3 -2
  225. data/lib/datadog/tracing/contrib/redis/integration.rb +2 -2
  226. data/lib/datadog/tracing/contrib/redis/patcher.rb +4 -4
  227. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  228. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  229. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +4 -4
  230. data/lib/datadog/tracing/contrib/registry.rb +1 -1
  231. data/lib/datadog/tracing/contrib/resque/integration.rb +1 -1
  232. data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -1
  233. data/lib/datadog/tracing/contrib/rest_client/ext.rb +3 -2
  234. data/lib/datadog/tracing/contrib/rest_client/integration.rb +1 -1
  235. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +3 -3
  236. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +1 -1
  237. data/lib/datadog/tracing/contrib/roda/integration.rb +1 -1
  238. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +1 -1
  239. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +1 -1
  240. data/lib/datadog/tracing/contrib/sequel/database.rb +5 -5
  241. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
  242. data/lib/datadog/tracing/contrib/sequel/integration.rb +1 -1
  243. data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
  244. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +1 -1
  245. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +1 -1
  246. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
  247. data/lib/datadog/tracing/contrib/sinatra/integration.rb +1 -1
  248. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +38 -40
  249. data/lib/datadog/tracing/contrib/sneakers/integration.rb +1 -1
  250. data/lib/datadog/tracing/contrib/stripe/integration.rb +1 -1
  251. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  252. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +1 -1
  253. data/lib/datadog/tracing/contrib/trilogy/ext.rb +1 -1
  254. data/lib/datadog/tracing/contrib/trilogy/integration.rb +1 -1
  255. data/lib/datadog/tracing/contrib/utils/quantization/hash.rb +11 -11
  256. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +6 -6
  257. data/lib/datadog/tracing/diagnostics/environment_logger.rb +8 -2
  258. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  259. data/lib/datadog/tracing/distributed/baggage.rb +73 -8
  260. data/lib/datadog/tracing/distributed/datadog.rb +4 -5
  261. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +11 -13
  262. data/lib/datadog/tracing/distributed/helpers.rb +1 -1
  263. data/lib/datadog/tracing/distributed/none.rb +4 -2
  264. data/lib/datadog/tracing/distributed/propagation.rb +4 -1
  265. data/lib/datadog/tracing/distributed/propagation_policy.rb +1 -1
  266. data/lib/datadog/tracing/distributed/trace_context.rb +22 -16
  267. data/lib/datadog/tracing/event.rb +5 -7
  268. data/lib/datadog/tracing/flush.rb +1 -1
  269. data/lib/datadog/tracing/metadata/analytics.rb +1 -1
  270. data/lib/datadog/tracing/metadata/tagging.rb +4 -4
  271. data/lib/datadog/tracing/pipeline/span_filter.rb +3 -1
  272. data/lib/datadog/tracing/pipeline/span_processor.rb +3 -1
  273. data/lib/datadog/tracing/pipeline.rb +1 -1
  274. data/lib/datadog/tracing/sampling/ext.rb +0 -2
  275. data/lib/datadog/tracing/sampling/rule_sampler.rb +30 -30
  276. data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
  277. data/lib/datadog/tracing/sampling/span/sampler.rb +0 -7
  278. data/lib/datadog/tracing/span.rb +1 -1
  279. data/lib/datadog/tracing/span_event.rb +10 -10
  280. data/lib/datadog/tracing/span_link.rb +12 -12
  281. data/lib/datadog/tracing/span_operation.rb +31 -11
  282. data/lib/datadog/tracing/trace_digest.rb +21 -23
  283. data/lib/datadog/tracing/trace_operation.rb +84 -88
  284. data/lib/datadog/tracing/trace_segment.rb +2 -2
  285. data/lib/datadog/tracing/tracer.rb +36 -38
  286. data/lib/datadog/tracing/transport/http/client.rb +1 -1
  287. data/lib/datadog/tracing/transport/http/traces.rb +2 -2
  288. data/lib/datadog/tracing/transport/io/client.rb +5 -5
  289. data/lib/datadog/tracing/transport/io/traces.rb +4 -4
  290. data/lib/datadog/tracing/transport/statistics.rb +1 -1
  291. data/lib/datadog/tracing/transport/traces.rb +5 -5
  292. data/lib/datadog/tracing/workers/trace_writer.rb +12 -12
  293. data/lib/datadog/tracing/workers.rb +2 -2
  294. data/lib/datadog/tracing.rb +2 -2
  295. data/lib/datadog/version.rb +1 -1
  296. data/lib/datadog.rb +7 -0
  297. metadata +17 -6
@@ -22,9 +22,18 @@ module Datadog
22
22
  # Represents an Option precedence level.
23
23
  # Each precedence has a `numeric` value; higher values means higher precedence.
24
24
  # `name` is for inspection purposes only.
25
- Value = Struct.new(:numeric, :name, :origin) do
25
+
26
+ class Value
26
27
  include Comparable
27
28
 
29
+ attr_accessor :numeric, :name, :origin
30
+
31
+ def initialize(numeric, name, origin)
32
+ @numeric = numeric
33
+ @name = name
34
+ @origin = origin
35
+ end
36
+
28
37
  def <=>(other)
29
38
  return nil unless other.is_a?(Value)
30
39
 
@@ -172,20 +181,17 @@ module Datadog
172
181
  private
173
182
 
174
183
  def coerce_env_variable(value)
175
- return context_exec(value, &@definition.env_parser) if @definition.env_parser
184
+ env_parser = @definition.env_parser
185
+ return context_exec(value, &env_parser) if env_parser
176
186
 
177
187
  case @definition.type
178
188
  when :hash
179
189
  values = value.split(',') # By default we only want to support comma separated strings
180
190
 
181
- values.map! do |v|
191
+ values.each_with_object({}) do |v, hash| # $ Hash[String, String]
182
192
  v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
193
+ next if v.empty?
183
194
 
184
- v.empty? ? nil : v
185
- end
186
-
187
- values.compact!
188
- values.each.with_object({}) do |v, hash|
189
195
  pair = v.split(':', 2)
190
196
  hash[pair[0]] = pair[1]
191
197
  end
@@ -196,14 +202,12 @@ module Datadog
196
202
  when :array
197
203
  values = value.split(',')
198
204
 
199
- values.map! do |v|
205
+ values.each_with_object([]) do |v, arr| # $ Array[String]
200
206
  v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
207
+ next if v.empty?
201
208
 
202
- v.empty? ? nil : v
209
+ arr << v
203
210
  end
204
-
205
- values.compact!
206
- values
207
211
  when :bool
208
212
  string_value = value.strip
209
213
  string_value = string_value.downcase
@@ -329,18 +333,22 @@ module Datadog
329
333
  resolved_env = nil
330
334
 
331
335
  if definition.env
332
- Array(definition.env).each do |env|
333
- next if env_vars[env].nil?
336
+ # @type var env_and_aliases: Array[String]
337
+ env_and_aliases = Array(definition.env)
338
+ env_and_aliases.each do |env|
339
+ env_value = env_vars[env]
340
+ next if env_value.nil?
334
341
 
335
342
  resolved_env = env
336
- value = coerce_env_variable(env_vars[env])
343
+ value = coerce_env_variable(env_value)
337
344
  break
338
345
  end
339
346
  end
340
347
 
341
- if value.nil? && definition.deprecated_env && env_vars[definition.deprecated_env]
348
+ deprecated_env = definition.deprecated_env ? env_vars[definition.deprecated_env] : nil
349
+ if value.nil? && deprecated_env
342
350
  resolved_env = definition.deprecated_env
343
- value = coerce_env_variable(env_vars[definition.deprecated_env])
351
+ value = coerce_env_variable(deprecated_env)
344
352
 
345
353
  Datadog::Core.log_deprecation do
346
354
  "#{definition.deprecated_env} #{source} is deprecated, use #{definition.env} instead."
@@ -349,9 +357,10 @@ module Datadog
349
357
 
350
358
  [value, resolved_env]
351
359
  rescue ArgumentError
360
+ env_value = resolved_env ? env_vars[resolved_env] : nil
352
361
  raise ArgumentError,
353
- "Expected #{source} #{resolved_env} to be a #{@definition.type}, " \
354
- "but '#{env_vars[resolved_env]}' was provided"
362
+ "Expected #{source} #{resolved_env} to be a #{definition.type}, " \
363
+ "but '#{env_value}' was provided"
355
364
  end
356
365
 
357
366
  # Anchor object that represents a value that is not set.
@@ -22,7 +22,7 @@ module Datadog
22
22
  :type,
23
23
  :type_options
24
24
 
25
- def initialize(name, meta = {}, &block)
25
+ def initialize(name, meta, &block)
26
26
  @default = meta[:default]
27
27
  @default_proc = meta[:default_proc]
28
28
  @env = meta[:env]
@@ -44,7 +44,7 @@ module Datadog
44
44
  # Acts as DSL for building OptionDefinitions
45
45
  # @public_api
46
46
  class Builder
47
- class InvalidOptionError < StandardError; end
47
+ InvalidOptionError = Class.new(StandardError)
48
48
 
49
49
  attr_reader \
50
50
  :helpers
@@ -40,14 +40,19 @@ module Datadog
40
40
 
41
41
  def default_helpers(name)
42
42
  option_name = name.to_sym
43
-
43
+ # @type var opt_getter: Configuration::OptionDefinition::helper_proc
44
+ opt_getter = proc do
45
+ # These Procs uses `get/set_option`, but we only add them to the OptionDefinition helpers here.
46
+ # Steep is right that these methods are not defined, but we only run these Procs in instance context.
47
+ get_option(option_name) # steep:ignore NoMethod
48
+ end
49
+ # @type var opt_setter: Configuration::OptionDefinition::helper_proc
50
+ opt_setter = proc do |value|
51
+ set_option(option_name, value) # steep:ignore NoMethod
52
+ end
44
53
  {
45
- option_name.to_sym => proc do
46
- get_option(option_name)
47
- end,
48
- :"#{option_name}=" => proc do |value|
49
- set_option(option_name, value)
50
- end
54
+ option_name.to_sym => opt_getter,
55
+ :"#{option_name}=" => opt_setter
51
56
  }
52
57
  end
53
58
 
@@ -113,6 +118,7 @@ module Datadog
113
118
 
114
119
  assert_valid_option!(name)
115
120
  definition = self.class.options[name]
121
+ # @type self: Configuration::Options::GenericSettingsClass
116
122
  options[name] = definition.build(self)
117
123
  end
118
124
 
@@ -554,6 +554,26 @@ module Datadog
554
554
  o.env 'DD_PROFILING_NATIVE_FILENAMES_ENABLED'
555
555
  o.default true
556
556
  end
557
+
558
+ # Controls if the profiler should sample directly from the signal handler.
559
+ # Sampling directly from the signal handler improves accuracy of the data collected.
560
+ #
561
+ # We recommend using this setting with Ruby 3.2.5+ / Ruby 3.3.4+ and above
562
+ # as they include additional safety measures added in https://github.com/ruby/ruby/pull/11036.
563
+ # We have not validated it thoroughly with earlier versions, but in practice it should work on Ruby 3.0+
564
+ # (the key change was https://github.com/ruby/ruby/pull/3296).
565
+ #
566
+ # Enabling this on Ruby 2 is not recommended as it may cause VM crashes and/or incorrect data.
567
+ #
568
+ # @default true on Ruby 3.2.5+ / Ruby 3.3.4+, false on older Rubies
569
+ option :sighandler_sampling_enabled do |o|
570
+ o.type :bool
571
+ o.env 'DD_PROFILING_SIGHANDLER_SAMPLING_ENABLED'
572
+ o.default do
573
+ Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3.2.5') &&
574
+ !(RUBY_VERSION.start_with?('3.3.') && Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.3.4'))
575
+ end
576
+ end
557
577
  end
558
578
 
559
579
  # @public_api
@@ -62,7 +62,9 @@ module Datadog
62
62
  return unless @enabled
63
63
 
64
64
  @transport = if settings.telemetry.agentless_enabled
65
- agent_settings = Core::Configuration::AgentlessSettingsResolver.call(
65
+ # We don't touch the `agent_settings` since we still want the telemetry payloads to refer to the original
66
+ # settings, even though the telemetry itself may be using a different path.
67
+ telemetry_specific_agent_settings = Core::Configuration::AgentlessSettingsResolver.call(
66
68
  settings,
67
69
  host_prefix: 'instrumentation-telemetry-intake',
68
70
  url_override: settings.telemetry.agentless_url_override,
@@ -70,7 +72,7 @@ module Datadog
70
72
  logger: logger,
71
73
  )
72
74
  Telemetry::Transport::HTTP.agentless_telemetry(
73
- agent_settings: agent_settings,
75
+ agent_settings: telemetry_specific_agent_settings,
74
76
  logger: logger,
75
77
  # api_key should have already validated to be
76
78
  # not nil by +build+ method above.
@@ -96,6 +98,8 @@ module Datadog
96
98
  logger: logger,
97
99
  shutdown_timeout: settings.telemetry.shutdown_timeout_seconds,
98
100
  )
101
+
102
+ @agent_settings = agent_settings
99
103
  end
100
104
 
101
105
  def disable!
@@ -107,9 +111,9 @@ module Datadog
107
111
  return if !@enabled
108
112
 
109
113
  initial_event = if initial_event_is_change
110
- Event::SynthAppClientConfigurationChange.new
114
+ Event::SynthAppClientConfigurationChange.new(agent_settings: @agent_settings)
111
115
  else
112
- Event::AppStarted.new
116
+ Event::AppStarted.new(agent_settings: @agent_settings)
113
117
  end
114
118
 
115
119
  @worker.start(initial_event)
@@ -8,6 +8,10 @@ module Datadog
8
8
  module Event
9
9
  # Telemetry class for the 'app-started' event
10
10
  class AppStarted < Base
11
+ def initialize(agent_settings:)
12
+ @agent_settings = agent_settings
13
+ end
14
+
11
15
  def type
12
16
  'app-started'
13
17
  end
@@ -96,7 +100,7 @@ module Datadog
96
100
  ),
97
101
 
98
102
  # Mix of env var, programmatic and default config, so we use unknown
99
- conf_value('DD_AGENT_TRANSPORT', agent_transport(config), seq_id, 'unknown'),
103
+ conf_value('DD_AGENT_TRANSPORT', agent_transport, seq_id, 'unknown'),
100
104
 
101
105
  # writer_options is defined as an option that has a Hash value.
102
106
  conf_value(
@@ -162,6 +166,20 @@ module Datadog
162
166
  )
163
167
  end
164
168
 
169
+ instrumentation_source = if Datadog.const_defined?(:SingleStepInstrument, false) &&
170
+ Datadog::SingleStepInstrument.const_defined?(:LOADED, false) &&
171
+ Datadog::SingleStepInstrument::LOADED
172
+ 'ssi'
173
+ else
174
+ 'manual'
175
+ end
176
+ # Track ssi configurations
177
+ list.push(
178
+ conf_value('instrumentation_source', instrumentation_source, seq_id, 'code'),
179
+ conf_value('DD_INJECT_FORCE', Core::Environment::VariableHelpers.env_to_bool('DD_INJECT_FORCE', false), seq_id, 'env_var'),
180
+ conf_value('DD_INJECTION_ENABLED', ENV['DD_INJECTION_ENABLED'] || '', seq_id, 'env_var'),
181
+ )
182
+
165
183
  # Add some more custom additional payload values here
166
184
  if config.logger.instance
167
185
  list << conf_value(
@@ -200,8 +218,8 @@ module Datadog
200
218
  # standard:enable Metrics/AbcSize
201
219
  # standard:enable Metrics/MethodLength
202
220
 
203
- def agent_transport(config)
204
- adapter = Core::Configuration::AgentSettingsResolver.call(config).adapter
221
+ def agent_transport
222
+ adapter = @agent_settings.adapter
205
223
  if adapter == Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
206
224
  'UDS'
207
225
  else
@@ -32,3 +32,10 @@ end
32
32
  require_relative 'contrib'
33
33
 
34
34
  Datadog::DI::Contrib.load_now_or_later
35
+
36
+ if %w[1 true yes].include?(ENV['DD_DYNAMIC_INSTRUMENTATION_ENABLED']) # steep:ignore
37
+ if ENV['DD_DYNAMIC_INSTRUMENTATION_PROBE_FILE']
38
+ require_relative 'probe_file_loader'
39
+ Datadog::DI::ProbeFileLoader.load_now_or_later
40
+ end
41
+ end
@@ -112,6 +112,13 @@ module Datadog
112
112
  probe_manager.close
113
113
  probe_notifier_worker.stop
114
114
  end
115
+
116
+ def parse_probe_spec_and_notify(probe_spec)
117
+ probe = ProbeBuilder.build_from_remote_config(probe_spec)
118
+ payload = probe_notification_builder.build_received(probe)
119
+ probe_notifier_worker.add_status(payload)
120
+ probe
121
+ end
115
122
  end
116
123
  end
117
124
  end
@@ -121,9 +121,8 @@ module Datadog
121
121
  if rate_limiter.nil? || rate_limiter.allow?
122
122
  # Arguments may be mutated by the method, therefore
123
123
  # they need to be serialized prior to method invocation.
124
- entry_args = if probe.capture_snapshot?
125
- instance_vars = Instrumenter.get_instance_variables(self)
126
- serializer.serialize_args(args, kwargs, instance_vars,
124
+ serialized_entry_args = if probe.capture_snapshot?
125
+ serializer.serialize_args(args, kwargs, self,
127
126
  depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
128
127
  attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
129
128
  end
@@ -160,9 +159,10 @@ module Datadog
160
159
  caller_locs = method_frame + caller_locations # steep:ignore
161
160
  # TODO capture arguments at exit
162
161
  # & is to stop steep complaints, block is always present here.
163
- block&.call(probe: probe, rv: rv, duration: duration, caller_locations: caller_locs,
164
- instance_vars: probe.capture_snapshot? ? Instrumenter.get_instance_variables(self) : nil,
165
- serialized_entry_args: entry_args)
162
+ block&.call(probe: probe, rv: rv,
163
+ duration: duration, caller_locations: caller_locs,
164
+ target_self: self,
165
+ serialized_entry_args: serialized_entry_args)
166
166
  rv
167
167
  else
168
168
  # stop standard from trying to mess up my code
@@ -311,19 +311,20 @@ module Datadog
311
311
  probe.file == tp.path || probe.file_matches?(tp.path)
312
312
  )
313
313
  if rate_limiter.nil? || rate_limiter.allow?
314
- locals = if probe.capture_snapshot?
314
+ serialized_locals = if probe.capture_snapshot?
315
315
  serializer.serialize_vars(Instrumenter.get_local_variables(tp),
316
316
  depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
317
317
  attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)
318
318
  end
319
- instance_vars = if probe.capture_snapshot?
320
- serializer.serialize_vars(Instrumenter.get_instance_variables(tp.self),
319
+ if probe.capture_snapshot?
320
+ serializer.serialize_value(tp.self,
321
321
  depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
322
322
  attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)
323
323
  end
324
324
  # & is to stop steep complaints, block is always present here.
325
325
  block&.call(probe: probe,
326
- locals: locals, instance_vars: instance_vars,
326
+ serialized_locals: serialized_locals,
327
+ target_self: tp.self,
327
328
  path: tp.path, caller_locations: caller_locations)
328
329
  end
329
330
  end
@@ -397,14 +398,6 @@ module Datadog
397
398
  end
398
399
 
399
400
  class << self
400
- def get_instance_variables(object)
401
- {}.tap do |hash|
402
- object.instance_variables.each do |var|
403
- hash[var] = object.instance_variable_get(var)
404
- end
405
- end
406
- end
407
-
408
401
  def get_local_variables(trace_point)
409
402
  # binding appears to be constructed on access, therefore
410
403
  # 1) we should attempt to cache it and
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module DI
5
+ module ProbeFileLoader
6
+ # Railtie class initializes dynamic instrumentation contrib code
7
+ # in Rails environments.
8
+ class Railtie < Rails::Railtie
9
+ initializer 'datadog.dynamic_instrumentation.load_probe_file' do |app| # steep:ignore
10
+ ProbeFileLoader.load_now
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'json'
4
+
5
+ module Datadog
6
+ module DI
7
+ module ProbeFileLoader
8
+ module_function def load_now_or_later
9
+ if Datadog::Core::Contrib::Rails::Utils.railtie_supported?
10
+ Datadog.logger.debug('di: loading probe_file_loader/railtie')
11
+ require_relative 'probe_file_loader/railtie'
12
+ else
13
+ load_now
14
+ end
15
+ end
16
+
17
+ # This method can be called more than once, to attempt to load
18
+ # DI components that depend on third-party libraries after additional
19
+ # dependencies are loaded (or potentially loaded).
20
+ module_function def load_now
21
+ should_propagate = false
22
+
23
+ probe_file_path = ENV['DD_DYNAMIC_INSTRUMENTATION_PROBE_FILE']
24
+ if probe_file_path.nil? || probe_file_path.empty?
25
+ return
26
+ end
27
+
28
+ # We want to initialize the component tree here if it was not already
29
+ # initialized.
30
+ component = Datadog::DI.component
31
+ return unless component
32
+
33
+ begin
34
+ probe_specs = File.open(probe_file_path) do |f|
35
+ # The probe file should contain an array, JSON.parse does not work
36
+ JSON.load(f) # standard:disable Security/JSONLoad
37
+ end
38
+
39
+ probe_specs.each do |probe_spec|
40
+ probe = component.parse_probe_spec_and_notify(probe_spec)
41
+ component.logger.debug { "di: received #{probe.type} probe at #{probe.location} (#{probe.id}) via probe file: #{probe_file_path}" }
42
+
43
+ begin
44
+ component.probe_manager.add_probe(probe)
45
+ rescue DI::Error::DITargetNotInRegistry => exc
46
+ component.telemetry&.report(exc, description: "Line probe is targeting a loaded file that is not in code tracker")
47
+
48
+ payload = component.probe_notification_builder.build_errored(probe, exc)
49
+ component.probe_notifier_worker.add_status(payload)
50
+ rescue => exc
51
+ raise if component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
52
+
53
+ component.logger.debug { "di: unhandled exception adding #{probe.type} probe at #{probe.location} (#{probe.id}) in DI probe file loader: #{exc.class}: #{exc}" }
54
+ component.telemetry&.report(exc, description: "Unhandled exception adding probe in DI probe file loader")
55
+
56
+ # TODO test this path
57
+ payload = component.probe_notification_builder.build_errored(probe, exc)
58
+ component.probe_notifier_worker.add_status(payload)
59
+ end
60
+ end
61
+ rescue => exc
62
+ if component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
63
+ should_propagate = true
64
+ raise
65
+ end
66
+
67
+ component.logger.debug { "di: unhandled exception handling a probe in DI probe file loader: #{exc.class}: #{exc}" }
68
+ component.telemetry&.report(exc, description: "Unhandled exception handling probe in DI probe file loader")
69
+ end
70
+ rescue
71
+ # We should generally never get here, but if component tree
72
+ # initialization fails for some unexpected reason, don't nuke
73
+ # the customer application.
74
+ #
75
+ # For the same reason, we do not check
76
+ # component.settings.dynamic_instrumentation.internal.propagate_all_exceptions
77
+ # here again, but rely on the local variable storing that value.
78
+ raise if should_propagate
79
+ end
80
+ end
81
+ end
82
+ end
@@ -42,9 +42,9 @@ module Datadog
42
42
  # path is the actual path of the instrumented file.
43
43
  def build_executed(probe,
44
44
  path: nil, rv: nil, duration: nil, caller_locations: nil,
45
- locals: nil, args: nil, kwargs: nil, instance_vars: nil,
45
+ serialized_locals: nil, args: nil, kwargs: nil, target_self: nil,
46
46
  serialized_entry_args: nil)
47
- build_snapshot(probe, rv: rv, locals: locals,
47
+ build_snapshot(probe, rv: rv, serialized_locals: serialized_locals,
48
48
  # Actual path of the instrumented file.
49
49
  path: path,
50
50
  duration: duration,
@@ -52,14 +52,23 @@ module Datadog
52
52
  # this should be all frames for enriched probes and no frames for
53
53
  # non-enriched probes?
54
54
  caller_locations: caller_locations,
55
- args: args, kwargs: kwargs, instance_vars: instance_vars,
55
+ args: args, kwargs: kwargs,
56
+ target_self: target_self,
56
57
  serialized_entry_args: serialized_entry_args)
57
58
  end
58
59
 
59
- def build_snapshot(probe, rv: nil, locals: nil, path: nil,
60
+ def build_snapshot(probe, rv: nil, serialized_locals: nil, path: nil,
61
+ # In Ruby everything is a method, therefore we should always have
62
+ # a target self. However, if we are not capturing a snapshot,
63
+ # there is no need to pass in the target self.
64
+ target_self: nil,
60
65
  duration: nil, caller_locations: nil,
61
- args: nil, kwargs: nil, instance_vars: nil,
66
+ args: nil, kwargs: nil,
62
67
  serialized_entry_args: nil)
68
+ if probe.capture_snapshot? && !target_self
69
+ raise ArgumentError, "Asked to build snapshot with snapshot capture but target_self is nil"
70
+ end
71
+
63
72
  # TODO also verify that non-capturing probe does not pass
64
73
  # snapshot or vars/args into this method
65
74
  captures = if probe.capture_snapshot?
@@ -68,25 +77,18 @@ module Datadog
68
77
  "@return": serializer.serialize_value(rv,
69
78
  depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
70
79
  attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count),
80
+ self: serializer.serialize_value(target_self),
71
81
  }
72
- if instance_vars
73
- return_arguments.update(
74
- serializer.serialize_vars(instance_vars,
75
- depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
76
- attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count,)
77
- )
78
- end
79
82
  {
80
83
  entry: {
81
84
  # standard:disable all
82
85
  arguments: if serialized_entry_args
83
86
  serialized_entry_args
84
87
  else
85
- (args || kwargs) && serializer.serialize_args(args, kwargs, instance_vars,
88
+ (args || kwargs) && serializer.serialize_args(args, kwargs, target_self,
86
89
  depth: probe.max_capture_depth || settings.dynamic_instrumentation.max_capture_depth,
87
90
  attribute_count: probe.max_capture_attribute_count || settings.dynamic_instrumentation.max_capture_attribute_count)
88
91
  end,
89
- throwable: nil,
90
92
  # standard:enable all
91
93
  },
92
94
  return: {
@@ -96,8 +98,11 @@ module Datadog
96
98
  }
97
99
  elsif probe.line?
98
100
  {
99
- lines: locals && {
100
- probe.line_no => {locals: locals.merge(instance_vars || {})},
101
+ lines: serialized_locals && {
102
+ probe.line_no => {
103
+ locals: serialized_locals,
104
+ arguments: {self: serializer.serialize_value(target_self)},
105
+ },
101
106
  },
102
107
  }
103
108
  end
@@ -43,6 +43,8 @@ module Datadog
43
43
  if component
44
44
 
45
45
  probe_manager = component.probe_manager
46
+ probe_notification_builder = component.probe_notification_builder
47
+ probe_notifier_worker = component.probe_notifier_worker
46
48
 
47
49
  current_probe_ids = {}
48
50
  repository.contents.each do |content|
@@ -50,11 +52,7 @@ module Datadog
50
52
  when PRODUCT
51
53
  begin
52
54
  probe_spec = parse_content(content)
53
- probe = ProbeBuilder.build_from_remote_config(probe_spec)
54
- probe_notification_builder = component.probe_notification_builder
55
- payload = probe_notification_builder.build_received(probe)
56
- probe_notifier_worker = component.probe_notifier_worker
57
- probe_notifier_worker.add_status(payload)
55
+ probe = component.parse_probe_spec_and_notify(probe_spec)
58
56
  component.logger.debug { "di: received #{probe.type} probe at #{probe.location} (#{probe.id}) via RC" }
59
57
 
60
58
  begin
@@ -36,6 +36,10 @@ module Datadog
36
36
  # efficient but there would be additional overhead from passing this
37
37
  # parameter all the time and the API would get more complex.
38
38
  #
39
+ # Note: "self" cannot be used as a parameter name in Ruby, therefore
40
+ # there should never be a conflict between instance variable
41
+ # serialization and method parameters.
42
+ #
39
43
  # @api private
40
44
  class Serializer
41
45
  # Third-party library integration / custom serializers.
@@ -86,7 +90,7 @@ module Datadog
86
90
  # Instance variables are technically a hash just like kwargs,
87
91
  # we take them as a separate parameter to avoid a hash merge
88
92
  # in upstream code.
89
- def serialize_args(args, kwargs, instance_vars,
93
+ def serialize_args(args, kwargs, target_self,
90
94
  depth: settings.dynamic_instrumentation.max_capture_depth,
91
95
  attribute_count: settings.dynamic_instrumentation.max_capture_attribute_count)
92
96
  counter = 0
@@ -95,7 +99,7 @@ module Datadog
95
99
  # Conversion to symbol is needed here to put args ahead of
96
100
  # kwargs when they are merged below.
97
101
  c[:"arg#{counter}"] = value
98
- end.update(kwargs).update(instance_vars)
102
+ end.update(kwargs).update(self: target_self)
99
103
  serialize_vars(combined, depth: depth, attribute_count: attribute_count)
100
104
  end
101
105
 
data/lib/datadog/di.rb CHANGED
@@ -19,7 +19,6 @@ module Datadog
19
19
  Extensions.activate!
20
20
 
21
21
  class << self
22
-
23
22
  # This method is called from DI Remote handler to issue DI operations
24
23
  # to the probe manager (add or remove probes).
25
24
  #
@@ -35,9 +34,3 @@ module Datadog
35
34
  end
36
35
  end
37
36
  end
38
-
39
- # Line probes will not work on Ruby < 2.6 because of lack of :script_compiled
40
- # trace point. Activate DI automatically on supported Ruby versions but
41
- # always load its settings so that, for example, turning DI off when
42
- # we are on Ruby 2.5 does not produce exceptions.
43
- require_relative 'di/boot' if RUBY_VERSION >= '2.6' && RUBY_ENGINE != 'jruby'