datadog 2.12.1 → 2.19.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 (346) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +243 -2
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +63 -56
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +263 -76
  5. data/ext/datadog_profiling_native_extension/collectors_stack.h +20 -3
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +78 -26
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  8. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  9. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  10. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  11. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  12. data/ext/datadog_profiling_native_extension/extconf.rb +10 -0
  13. data/ext/datadog_profiling_native_extension/heap_recorder.c +247 -364
  14. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -6
  15. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  16. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +22 -0
  17. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +8 -5
  18. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +41 -21
  19. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +6 -4
  20. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  21. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -13
  22. data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -11
  23. data/ext/datadog_profiling_native_extension/stack_recorder.c +173 -76
  24. data/ext/libdatadog_api/crashtracker.c +11 -12
  25. data/ext/libdatadog_api/crashtracker.h +5 -0
  26. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  27. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  28. data/ext/libdatadog_api/extconf.rb +2 -2
  29. data/ext/libdatadog_api/init.c +15 -0
  30. data/ext/libdatadog_api/library_config.c +164 -0
  31. data/ext/libdatadog_api/library_config.h +25 -0
  32. data/ext/libdatadog_api/macos_development.md +3 -3
  33. data/ext/libdatadog_api/process_discovery.c +112 -0
  34. data/ext/libdatadog_api/process_discovery.h +5 -0
  35. data/ext/libdatadog_extconf_helpers.rb +2 -2
  36. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  37. data/lib/datadog/appsec/actions_handler.rb +24 -2
  38. data/lib/datadog/appsec/anonymizer.rb +16 -0
  39. data/lib/datadog/appsec/api_security/lru_cache.rb +56 -0
  40. data/lib/datadog/appsec/api_security/route_extractor.rb +71 -0
  41. data/lib/datadog/appsec/api_security/sampler.rb +59 -0
  42. data/lib/datadog/appsec/api_security.rb +23 -0
  43. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  44. data/lib/datadog/appsec/assets/waf_rules/recommended.json +257 -85
  45. data/lib/datadog/appsec/assets/waf_rules/strict.json +10 -78
  46. data/lib/datadog/appsec/autoload.rb +1 -1
  47. data/lib/datadog/appsec/component.rb +46 -61
  48. data/lib/datadog/appsec/compressed_json.rb +40 -0
  49. data/lib/datadog/appsec/configuration/settings.rb +153 -30
  50. data/lib/datadog/appsec/context.rb +7 -7
  51. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
  52. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  53. data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
  54. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  55. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  56. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  57. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  58. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  59. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  60. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  61. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  62. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  63. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  64. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  65. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
  66. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  67. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
  68. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
  69. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  70. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  71. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
  72. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  73. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +42 -30
  74. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
  75. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  76. data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
  77. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  78. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
  79. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
  80. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  81. data/lib/datadog/appsec/event.rb +96 -135
  82. data/lib/datadog/appsec/ext.rb +4 -2
  83. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  84. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  85. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  86. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  87. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  88. data/lib/datadog/appsec/processor/rule_loader.rb +30 -33
  89. data/lib/datadog/appsec/remote.rb +31 -59
  90. data/lib/datadog/appsec/response.rb +6 -6
  91. data/lib/datadog/appsec/security_engine/engine.rb +194 -0
  92. data/lib/datadog/appsec/security_engine/runner.rb +13 -14
  93. data/lib/datadog/appsec/security_event.rb +39 -0
  94. data/lib/datadog/appsec/utils.rb +0 -2
  95. data/lib/datadog/appsec.rb +5 -8
  96. data/lib/datadog/core/buffer/random.rb +18 -2
  97. data/lib/datadog/core/configuration/agent_settings.rb +52 -0
  98. data/lib/datadog/core/configuration/agent_settings_resolver.rb +4 -46
  99. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  100. data/lib/datadog/core/configuration/components.rb +48 -31
  101. data/lib/datadog/core/configuration/components_state.rb +23 -0
  102. data/lib/datadog/core/configuration/ext.rb +4 -0
  103. data/lib/datadog/core/configuration/option.rb +81 -45
  104. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  105. data/lib/datadog/core/configuration/options.rb +3 -3
  106. data/lib/datadog/core/configuration/settings.rb +109 -44
  107. data/lib/datadog/core/configuration/stable_config.rb +22 -0
  108. data/lib/datadog/core/configuration.rb +40 -16
  109. data/lib/datadog/core/crashtracking/component.rb +3 -10
  110. data/lib/datadog/core/crashtracking/tag_builder.rb +4 -22
  111. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  112. data/lib/datadog/core/encoding.rb +1 -1
  113. data/lib/datadog/core/environment/agent_info.rb +4 -3
  114. data/lib/datadog/core/environment/cgroup.rb +10 -12
  115. data/lib/datadog/core/environment/container.rb +38 -40
  116. data/lib/datadog/core/environment/ext.rb +6 -6
  117. data/lib/datadog/core/environment/git.rb +1 -0
  118. data/lib/datadog/core/environment/identity.rb +3 -3
  119. data/lib/datadog/core/environment/platform.rb +3 -3
  120. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  121. data/lib/datadog/core/error.rb +11 -9
  122. data/lib/datadog/core/logger.rb +2 -2
  123. data/lib/datadog/core/metrics/client.rb +20 -21
  124. data/lib/datadog/core/metrics/logging.rb +5 -5
  125. data/lib/datadog/core/process_discovery/tracer_memfd.rb +15 -0
  126. data/lib/datadog/core/process_discovery.rb +36 -0
  127. data/lib/datadog/core/rate_limiter.rb +4 -2
  128. data/lib/datadog/core/remote/client.rb +40 -32
  129. data/lib/datadog/core/remote/component.rb +6 -9
  130. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  131. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  132. data/lib/datadog/core/remote/configuration/repository.rb +14 -1
  133. data/lib/datadog/core/remote/negotiation.rb +9 -9
  134. data/lib/datadog/core/remote/transport/config.rb +4 -3
  135. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  136. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  137. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  138. data/lib/datadog/core/remote/transport/http.rb +22 -57
  139. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  140. data/lib/datadog/core/runtime/metrics.rb +12 -5
  141. data/lib/datadog/core/tag_builder.rb +56 -0
  142. data/lib/datadog/core/telemetry/component.rb +81 -52
  143. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  144. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +66 -0
  145. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  146. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  147. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  148. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  149. data/lib/datadog/core/telemetry/event/app_started.rb +287 -0
  150. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  151. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  152. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  153. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  154. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  155. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  156. data/lib/datadog/core/telemetry/event.rb +17 -472
  157. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  158. data/lib/datadog/core/telemetry/logger.rb +5 -4
  159. data/lib/datadog/core/telemetry/logging.rb +11 -5
  160. data/lib/datadog/core/telemetry/metric.rb +8 -8
  161. data/lib/datadog/core/telemetry/request.rb +4 -4
  162. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  163. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  164. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  165. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  166. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  167. data/lib/datadog/core/telemetry/worker.rb +90 -24
  168. data/lib/datadog/core/transport/http/adapters/net.rb +17 -2
  169. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  170. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  171. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  172. data/lib/datadog/core/transport/http/builder.rb +19 -17
  173. data/lib/datadog/core/transport/http/env.rb +8 -0
  174. data/lib/datadog/core/transport/http.rb +39 -2
  175. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  176. data/lib/datadog/core/utils/duration.rb +32 -32
  177. data/lib/datadog/core/utils/forking.rb +2 -2
  178. data/lib/datadog/core/utils/network.rb +6 -6
  179. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  180. data/lib/datadog/core/utils/time.rb +20 -0
  181. data/lib/datadog/core/utils/truncation.rb +21 -0
  182. data/lib/datadog/core/utils.rb +7 -0
  183. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  184. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  185. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  186. data/lib/datadog/core/worker.rb +1 -1
  187. data/lib/datadog/core/workers/async.rb +29 -12
  188. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  189. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  190. data/lib/datadog/core.rb +8 -0
  191. data/lib/datadog/di/boot.rb +34 -0
  192. data/lib/datadog/di/component.rb +0 -2
  193. data/lib/datadog/di/instrumenter.rb +48 -5
  194. data/lib/datadog/di/probe_notification_builder.rb +38 -43
  195. data/lib/datadog/di/probe_notifier_worker.rb +25 -17
  196. data/lib/datadog/di/remote.rb +2 -0
  197. data/lib/datadog/di/serializer.rb +10 -2
  198. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  199. data/lib/datadog/di/transport/http/api.rb +2 -12
  200. data/lib/datadog/di/transport/http/client.rb +4 -3
  201. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  202. data/lib/datadog/di/transport/http/input.rb +18 -35
  203. data/lib/datadog/di/transport/http.rb +14 -62
  204. data/lib/datadog/di/transport/input.rb +14 -5
  205. data/lib/datadog/di/utils.rb +5 -0
  206. data/lib/datadog/di.rb +0 -33
  207. data/lib/datadog/error_tracking/collector.rb +87 -0
  208. data/lib/datadog/error_tracking/component.rb +167 -0
  209. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  210. data/lib/datadog/error_tracking/configuration.rb +11 -0
  211. data/lib/datadog/error_tracking/ext.rb +18 -0
  212. data/lib/datadog/error_tracking/extensions.rb +16 -0
  213. data/lib/datadog/error_tracking/filters.rb +77 -0
  214. data/lib/datadog/error_tracking.rb +18 -0
  215. data/lib/datadog/kit/appsec/events/v2.rb +195 -0
  216. data/lib/datadog/kit/appsec/events.rb +12 -0
  217. data/lib/datadog/kit/identity.rb +5 -1
  218. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  219. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  220. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  221. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  222. data/lib/datadog/opentelemetry.rb +2 -1
  223. data/lib/datadog/profiling/collectors/code_provenance.rb +18 -9
  224. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -0
  225. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -0
  226. data/lib/datadog/profiling/collectors/info.rb +44 -0
  227. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  228. data/lib/datadog/profiling/component.rb +8 -9
  229. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  230. data/lib/datadog/profiling/exporter.rb +12 -7
  231. data/lib/datadog/profiling/ext.rb +0 -14
  232. data/lib/datadog/profiling/flush.rb +5 -8
  233. data/lib/datadog/profiling/http_transport.rb +7 -61
  234. data/lib/datadog/profiling/profiler.rb +2 -0
  235. data/lib/datadog/profiling/scheduler.rb +10 -2
  236. data/lib/datadog/profiling/sequence_tracker.rb +44 -0
  237. data/lib/datadog/profiling/stack_recorder.rb +9 -9
  238. data/lib/datadog/profiling/tag_builder.rb +7 -41
  239. data/lib/datadog/profiling/tasks/setup.rb +2 -0
  240. data/lib/datadog/profiling.rb +7 -2
  241. data/lib/datadog/single_step_instrument.rb +9 -0
  242. data/lib/datadog/tracing/analytics.rb +1 -1
  243. data/lib/datadog/tracing/component.rb +15 -12
  244. data/lib/datadog/tracing/configuration/ext.rb +7 -1
  245. data/lib/datadog/tracing/configuration/settings.rb +18 -2
  246. data/lib/datadog/tracing/context_provider.rb +1 -1
  247. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +15 -0
  248. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +19 -12
  249. data/lib/datadog/tracing/contrib/action_pack/ext.rb +2 -0
  250. data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
  251. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -2
  252. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  253. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  254. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  255. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +13 -0
  256. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  257. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  258. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  259. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  260. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  261. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  262. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  263. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  264. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  265. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  266. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  267. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  268. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  269. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  270. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  271. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  272. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  273. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  274. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  275. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  276. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  277. data/lib/datadog/tracing/contrib/lograge/patcher.rb +4 -2
  278. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  279. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  280. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  281. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -6
  282. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  283. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  284. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  285. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  286. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  287. data/lib/datadog/tracing/contrib/rails/patcher.rb +4 -1
  288. data/lib/datadog/tracing/contrib/rails/runner.rb +61 -40
  289. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  290. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  291. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  292. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  293. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -2
  294. data/lib/datadog/tracing/contrib/support.rb +28 -0
  295. data/lib/datadog/tracing/contrib.rb +1 -0
  296. data/lib/datadog/tracing/correlation.rb +9 -2
  297. data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -1
  298. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  299. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  300. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  301. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  302. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  303. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  304. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  305. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  306. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  307. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  308. data/lib/datadog/tracing/metadata.rb +2 -0
  309. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  310. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  311. data/lib/datadog/tracing/span.rb +10 -1
  312. data/lib/datadog/tracing/span_event.rb +2 -2
  313. data/lib/datadog/tracing/span_operation.rb +68 -16
  314. data/lib/datadog/tracing/sync_writer.rb +2 -3
  315. data/lib/datadog/tracing/trace_digest.rb +9 -2
  316. data/lib/datadog/tracing/trace_operation.rb +55 -27
  317. data/lib/datadog/tracing/trace_segment.rb +6 -4
  318. data/lib/datadog/tracing/tracer.rb +51 -7
  319. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  320. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  321. data/lib/datadog/tracing/transport/http/traces.rb +13 -41
  322. data/lib/datadog/tracing/transport/http.rb +11 -44
  323. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  324. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  325. data/lib/datadog/tracing/transport/traces.rb +26 -9
  326. data/lib/datadog/tracing/utils.rb +1 -1
  327. data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
  328. data/lib/datadog/tracing/writer.rb +2 -6
  329. data/lib/datadog/tracing.rb +16 -3
  330. data/lib/datadog/version.rb +2 -2
  331. data/lib/datadog.rb +8 -2
  332. metadata +88 -23
  333. data/lib/datadog/appsec/assets/waf_rules/processors.json +0 -92
  334. data/lib/datadog/appsec/assets/waf_rules/scanners.json +0 -114
  335. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  336. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  337. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  338. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  339. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  340. data/lib/datadog/appsec/processor/rule_merger.rb +0 -170
  341. data/lib/datadog/appsec/processor.rb +0 -107
  342. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  343. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  344. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  345. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  346. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../configuration/agent_settings_resolver'
3
+ require_relative '../../configuration/agent_settings'
4
4
  require_relative 'adapters/registry'
5
5
  require_relative 'api/map'
6
6
 
@@ -18,9 +18,10 @@ module Datadog
18
18
  :api_options,
19
19
  :default_adapter,
20
20
  :default_api,
21
- :default_headers
21
+ :default_headers,
22
+ :logger
22
23
 
23
- def initialize(api_instance_class:)
24
+ def initialize(api_instance_class:, logger: Datadog.logger)
24
25
  # Global settings
25
26
  @default_adapter = nil
26
27
  @default_headers = {}
@@ -33,25 +34,26 @@ module Datadog
33
34
  @api_options = {}
34
35
 
35
36
  @api_instance_class = api_instance_class
37
+ @logger = logger
36
38
 
37
39
  yield(self) if block_given?
38
40
  end
39
41
 
40
42
  def adapter(config, *args, **kwargs)
41
43
  @default_adapter = case config
42
- when Core::Configuration::AgentSettingsResolver::AgentSettings
43
- registry_klass = REGISTRY.get(config.adapter)
44
- raise UnknownAdapterError, config.adapter if registry_klass.nil?
45
-
46
- registry_klass.build(config)
47
- when Symbol
48
- registry_klass = REGISTRY.get(config)
49
- raise UnknownAdapterError, config if registry_klass.nil?
50
-
51
- registry_klass.new(*args, **kwargs)
52
- else
53
- config
54
- end
44
+ when Core::Configuration::AgentSettings
45
+ registry_klass = REGISTRY.get(config.adapter)
46
+ raise UnknownAdapterError, config.adapter if registry_klass.nil?
47
+
48
+ registry_klass.build(config)
49
+ when Symbol
50
+ registry_klass = REGISTRY.get(config)
51
+ raise UnknownAdapterError, config if registry_klass.nil?
52
+
53
+ registry_klass.new(*args, **kwargs)
54
+ else
55
+ config
56
+ end
55
57
  end
56
58
 
57
59
  def headers(values = {})
@@ -86,7 +88,7 @@ module Datadog
86
88
  def to_transport(klass)
87
89
  raise NoDefaultApiError if @default_api.nil?
88
90
 
89
- klass.new(to_api_instances, @default_api)
91
+ klass.new(to_api_instances, @default_api, logger: logger)
90
92
  end
91
93
 
92
94
  def to_api_instances
@@ -32,6 +32,14 @@ module Datadog
32
32
  self[:path] = value
33
33
  end
34
34
 
35
+ def query
36
+ self[:query]
37
+ end
38
+
39
+ def query=(value)
40
+ self[:query] = value
41
+ end
42
+
35
43
  def body
36
44
  self[:body]
37
45
  end
@@ -29,8 +29,45 @@ module Datadog
29
29
  # Helper function that delegates to Builder.new
30
30
  # but is under HTTP namespace so that client code requires this file
31
31
  # to get the adapters configured, and not the builder directly.
32
- def build(api_instance_class:, &block)
33
- Builder.new(api_instance_class: api_instance_class, &block)
32
+ def build(api_instance_class:, agent_settings:, logger: Datadog.logger, api_version: nil, headers: nil, &block)
33
+ Builder.new(api_instance_class: api_instance_class, logger: logger) do |transport|
34
+ transport.adapter(agent_settings)
35
+ transport.headers(default_headers)
36
+
37
+ # The caller must define APIs before we set the default API.
38
+ yield transport
39
+
40
+ # Apply any settings given by options
41
+ transport.default_api = api_version if api_version
42
+ transport.headers(headers) if headers
43
+ end
44
+ end
45
+
46
+ def default_headers
47
+ {
48
+ Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_TOP_LEVEL => '1',
49
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG =>
50
+ Datadog::Core::Environment::Ext::LANG,
51
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_VERSION =>
52
+ Datadog::Core::Environment::Ext::LANG_VERSION,
53
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER =>
54
+ Datadog::Core::Environment::Ext::LANG_INTERPRETER,
55
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR =>
56
+ Core::Environment::Ext::LANG_ENGINE,
57
+ Datadog::Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
58
+ Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
59
+ }.tap do |headers|
60
+ # Add container ID, if present.
61
+ if (container_id = Datadog::Core::Environment::Container.container_id)
62
+ headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CONTAINER_ID] = container_id
63
+ end
64
+ # TODO: inject configuration rather than reading from global here
65
+ unless Datadog.configuration.apm.tracing.enabled
66
+ # Sending this header to the agent will disable metrics computation (and billing) on the agent side
67
+ # by pretending it has already been done on the library side.
68
+ headers[Datadog::Core::Transport::Ext::HTTP::HEADER_CLIENT_COMPUTED_STATS] = 'yes'
69
+ end
70
+ end
34
71
  end
35
72
  end
36
73
  end
@@ -51,13 +51,13 @@ module Datadog
51
51
  def fork
52
52
  # If a block is provided, it must be wrapped to trigger callbacks.
53
53
  child_block = if block_given?
54
- proc do
55
- AtForkMonkeyPatch.run_at_fork_blocks(:child)
54
+ proc do
55
+ AtForkMonkeyPatch.run_at_fork_blocks(:child)
56
56
 
57
- # Invoke original block
58
- yield
59
- end
60
- end
57
+ # Invoke original block
58
+ yield
59
+ end
60
+ end
61
61
 
62
62
  # Start fork
63
63
  # If a block is provided, use the wrapped version.
@@ -7,42 +7,42 @@ module Datadog
7
7
  module Duration
8
8
  def self.call(value, base: :s)
9
9
  cast = if value.include?('.')
10
- method(:Float)
11
- else
12
- method(:Integer)
13
- end
10
+ method(:Float)
11
+ else
12
+ method(:Integer)
13
+ end
14
14
 
15
15
  scale = case base
16
- when :s
17
- 1_000_000_000
18
- when :ms
19
- 1_000_000
20
- when :us
21
- 1000
22
- when :ns
23
- 1
24
- else
25
- raise ArgumentError, "invalid base: #{base.inspect}"
26
- end
16
+ when :s
17
+ 1_000_000_000
18
+ when :ms
19
+ 1_000_000
20
+ when :us
21
+ 1000
22
+ when :ns
23
+ 1
24
+ else
25
+ raise ArgumentError, "invalid base: #{base.inspect}"
26
+ end
27
27
 
28
28
  result = case value
29
- when /^(\d+(?:\.\d+)?)h$/
30
- cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 * 60 / scale
31
- when /^(\d+(?:\.\d+)?)m$/
32
- cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 / scale
33
- when /^(\d+(?:\.\d+)?)s$/
34
- cast.call(Regexp.last_match(1)) * 1_000_000_000 / scale
35
- when /^(\d+(?:\.\d+)?)ms$/
36
- cast.call(Regexp.last_match(1)) * 1_000_000 / scale
37
- when /^(\d+(?:\.\d+)?)us$/
38
- cast.call(Regexp.last_match(1)) * 1_000 / scale
39
- when /^(\d+(?:\.\d+)?)ns$/
40
- cast.call(Regexp.last_match(1)) / scale
41
- when /^(\d+(?:\.\d+)?)$/
42
- cast.call(Regexp.last_match(1))
43
- else
44
- raise ArgumentError, "invalid duration: #{value.inspect}"
45
- end
29
+ when /^(\d+(?:\.\d+)?)h$/
30
+ cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 * 60 / scale
31
+ when /^(\d+(?:\.\d+)?)m$/
32
+ cast.call(Regexp.last_match(1)) * 1_000_000_000 * 60 / scale
33
+ when /^(\d+(?:\.\d+)?)s$/
34
+ cast.call(Regexp.last_match(1)) * 1_000_000_000 / scale
35
+ when /^(\d+(?:\.\d+)?)ms$/
36
+ cast.call(Regexp.last_match(1)) * 1_000_000 / scale
37
+ when /^(\d+(?:\.\d+)?)us$/
38
+ cast.call(Regexp.last_match(1)) * 1_000 / scale
39
+ when /^(\d+(?:\.\d+)?)ns$/
40
+ cast.call(Regexp.last_match(1)) / scale
41
+ when /^(\d+(?:\.\d+)?)$/
42
+ cast.call(Regexp.last_match(1))
43
+ else
44
+ raise ArgumentError, "invalid duration: #{value.inspect}"
45
+ end
46
46
  # @type var result: Numeric
47
47
  result.round
48
48
  end
@@ -47,12 +47,12 @@ module Datadog
47
47
  # This wrapper prevents this by initializing the fork PID when the object is created.
48
48
  if RUBY_VERSION >= '3'
49
49
  def initialize(*args, **kwargs, &block)
50
- super(*args, **kwargs, &block)
50
+ super
51
51
  update_fork_pid!
52
52
  end
53
53
  else
54
54
  def initialize(*args, &block)
55
- super(*args, &block)
55
+ super
56
56
  update_fork_pid!
57
57
  end
58
58
  end
@@ -32,7 +32,7 @@ module Datadog
32
32
  def stripped_ip_from_request_headers(headers, ip_headers_to_check: DEFAULT_IP_HEADERS_NAMES)
33
33
  ip = ip_header(headers, ip_headers_to_check)
34
34
 
35
- ip ? ip.to_s : nil
35
+ ip&.to_s
36
36
  end
37
37
 
38
38
  # @param [String] IP value.
@@ -40,7 +40,7 @@ module Datadog
40
40
  # @return [nil] when no valid IP value found.
41
41
  def stripped_ip(ip)
42
42
  ip = ip_to_ipaddr(ip)
43
- ip ? ip.to_s : nil
43
+ ip&.to_s
44
44
  end
45
45
 
46
46
  private
@@ -52,10 +52,10 @@ module Datadog
52
52
  return unless ip
53
53
 
54
54
  clean_ip = if likely_ipv4?(ip)
55
- strip_ipv4_port(ip)
56
- else
57
- strip_zone_specifier(strip_ipv6_port(ip))
58
- end
55
+ strip_ipv4_port(ip)
56
+ else
57
+ strip_zone_specifier(strip_ipv6_port(ip))
58
+ end
59
59
 
60
60
  begin
61
61
  IPAddr.new(clean_ip)
@@ -5,14 +5,25 @@ require_relative 'only_once'
5
5
  module Datadog
6
6
  module Core
7
7
  module Utils
8
- # Helper class to execute something with only one success.
8
+ # Helper class to execute something with only one successful execution.
9
9
  #
10
- # This is useful for cases where we want to ensure that a block of code is only executed once, and only if it
11
- # succeeds. One such example is sending app-started telemetry event.
10
+ # If limit is not provided to the constructor, +run+ will execute the
11
+ # block an unlimited number of times until the block indicates that it
12
+ # executed successfully by returning a truthy value. After a block
13
+ # executes successfully, subsequent +run+ calls will not invoke the
14
+ # block.
12
15
  #
13
- # Successful execution is determined by the return value of the block: any truthy value is considered success.
16
+ # If a non-zero limit is provided to the constructor, +run+ will
17
+ # execute the block up to that many times, and will mark the instance
18
+ # of OnlyOneSuccessful as failed if none of the executions succeeded.
14
19
  #
15
- # Thread-safe when used correctly (e.g. be careful of races when lazily initializing instances of this class).
20
+ # One consumer of this class is sending the app-started telemetry event.
21
+ #
22
+ # Successful execution is determined by the return value of the block:
23
+ # any truthy value is considered success.
24
+ #
25
+ # This class is thread-safe (however, instances of it must also be
26
+ # created in a thread-safe manner).
16
27
  #
17
28
  # Note: In its current state, this class is not Ractor-safe.
18
29
  # In https://github.com/DataDog/dd-trace-rb/pull/1398#issuecomment-797378810 we have a discussion of alternatives,
@@ -31,6 +31,16 @@ module Datadog
31
31
  #
32
32
  # @param block [Proc] block that returns a `Time` object representing the current wall time
33
33
  def now_provider=(block)
34
+ class << self
35
+ # Avoid method redefinition warning.
36
+ # `rescue nil` is added in case customers remove the method
37
+ # themselves to squelch the warning.
38
+ begin
39
+ remove_method(:now)
40
+ rescue
41
+ nil
42
+ end
43
+ end
34
44
  define_singleton_method(:now, &block)
35
45
  end
36
46
 
@@ -43,6 +53,16 @@ module Datadog
43
53
  #
44
54
  # @param block [Proc] block that accepts unit and returns timestamp in the requested unit
45
55
  def get_time_provider=(block)
56
+ class << self
57
+ # Avoid method redefinition warning
58
+ # `rescue nil` is added in case customers remove the method
59
+ # themselves to squelch the warning.
60
+ begin
61
+ remove_method(:get_time)
62
+ rescue
63
+ nil
64
+ end
65
+ end
46
66
  define_singleton_method(:get_time, &block)
47
67
  end
48
68
 
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Utils
6
+ # Helper methods for truncating data
7
+ module Truncation
8
+ module_function
9
+
10
+ def truncate_in_middle(string, max_prefix_length, max_suffix_length)
11
+ max_length = max_prefix_length + 3 + max_suffix_length
12
+ if string.length > max_length
13
+ "#{string[0...max_prefix_length]}...#{string[-max_suffix_length..-1]}"
14
+ else
15
+ string
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -66,6 +66,13 @@ module Datadog
66
66
  placeholder
67
67
  end
68
68
 
69
+ def self.encode_tags(hash)
70
+ # Make sure everything is an utf-8 string, to avoid encoding issues in downstream
71
+ hash.each_with_object({}) do |(key, value), h|
72
+ h[utf8_encode(key)] = utf8_encode(value)
73
+ end
74
+ end
75
+
69
76
  # @!visibility private
70
77
  def self.without_warnings
71
78
  # This is typically used when monkey patching functions such as
@@ -108,7 +108,7 @@ module Datadog
108
108
  end
109
109
 
110
110
  def respond_to?(meth, include_all = false)
111
- @io.respond_to?(meth, include_all) || super(meth, include_all)
111
+ @io.respond_to?(meth, include_all) || super
112
112
  end
113
113
  end
114
114
  end
@@ -28,29 +28,29 @@ module Datadog
28
28
  "--#{SecureRandom.uuid}"
29
29
  end
30
30
 
31
- def initialize(path, params, headers={}, boundary = Multipartable.secure_boundary)
31
+ def initialize(path, params, headers = {}, boundary = Multipartable.secure_boundary)
32
32
  headers = headers.clone # don't want to modify the original variable
33
33
  parts_headers = headers.delete(:parts) || {}
34
34
  super(path, headers)
35
- parts = params.map do |k,v|
35
+ parts = params.map do |k, v|
36
36
  case v
37
37
  when Array
38
- v.map {|item| Parts::Part.new(boundary, "#{k}[]", item, parts_headers[k]) }
38
+ v.map { |item| Parts::Part.new(boundary, "#{k}[]", item, parts_headers[k]) }
39
39
  else
40
40
  Parts::Part.new(boundary, k, v, parts_headers[k])
41
41
  end
42
42
  end.flatten
43
43
  parts << Parts::EpiloguePart.new(boundary)
44
- ios = parts.map {|p| p.to_io }
45
- self.set_content_type(headers["Content-Type"] || "multipart/form-data",
46
- { "boundary" => boundary })
47
- self.content_length = parts.inject(0) {|sum,i| sum + i.length }
44
+ ios = parts.map { |p| p.to_io }
45
+ set_content_type(headers["Content-Type"] || "multipart/form-data",
46
+ {"boundary" => boundary})
47
+ self.content_length = parts.inject(0) { |sum, i| sum + i.length }
48
48
  self.body_stream = CompositeReadIO.new(*ios)
49
49
 
50
50
  @boundary = boundary
51
51
  end
52
52
 
53
- attr :boundary
53
+ attr_reader :boundary
54
54
  end
55
55
  end
56
56
  end
@@ -58,7 +58,7 @@ module Datadog
58
58
  part = ''
59
59
  part << "--#{boundary}\r\n"
60
60
  part << "Content-ID: #{headers["Content-ID"]}\r\n" if headers["Content-ID"]
61
- part << "Content-Disposition: form-data; name=\"#{name.to_s}\"\r\n"
61
+ part << "Content-Disposition: form-data; name=\"#{name}\"\r\n"
62
62
  part << "Content-Type: #{headers["Content-Type"]}\r\n" if headers["Content-Type"]
63
63
  part << "\r\n"
64
64
  part << "#{value}\r\n"
@@ -76,9 +76,9 @@ module Datadog
76
76
  # @param io [IO]
77
77
  # @param headers [Hash]
78
78
  def initialize(boundary, name, io, headers = {})
79
- file_length = io.respond_to?(:length) ? io.length : File.size(io.local_path)
79
+ file_length = io.respond_to?(:length) ? io.length : File.size(io.local_path)
80
80
  @head = build_head(boundary, name, io.original_filename, io.content_type, file_length,
81
- io.respond_to?(:opts) ? io.opts.merge(headers) : headers)
81
+ io.respond_to?(:opts) ? io.opts.merge(headers) : headers)
82
82
  @foot = "\r\n"
83
83
  @length = @head.bytesize + file_length + @foot.length
84
84
  @io = CompositeReadIO.new(StringIO.new(@head), io, StringIO.new(@foot))
@@ -98,16 +98,16 @@ module Datadog
98
98
 
99
99
  part = ''
100
100
  part << "--#{boundary}\r\n"
101
- part << "Content-Disposition: #{content_disposition}; name=\"#{name.to_s}\"; filename=\"#{filename}\"\r\n"
101
+ part << "Content-Disposition: #{content_disposition}; name=\"#{name}\"; filename=\"#{filename}\"\r\n"
102
102
  part << "Content-Length: #{content_len}\r\n"
103
103
  if content_id = opts.delete("Content-ID")
104
104
  part << "Content-ID: #{content_id}\r\n"
105
105
  end
106
106
 
107
- if opts["Content-Type"] != nil
108
- part << "Content-Type: " + opts["Content-Type"] + "\r\n"
107
+ part << if !opts["Content-Type"].nil?
108
+ "Content-Type: " + opts["Content-Type"] + "\r\n"
109
109
  else
110
- part << "Content-Type: #{type}\r\n"
110
+ "Content-Type: #{type}\r\n"
111
111
  end
112
112
 
113
113
  part << "Content-Transfer-Encoding: #{trans_encoding}\r\n"
@@ -12,7 +12,7 @@ module Datadog
12
12
  end
13
13
 
14
14
  def perform(*args)
15
- task.call(*args) unless task.nil?
15
+ task&.call(*args)
16
16
  end
17
17
 
18
18
  protected
@@ -47,6 +47,14 @@ module Datadog
47
47
  @run_async = false
48
48
  Datadog.logger.debug { "Forcibly terminating worker thread for: #{self}" }
49
49
  worker.terminate
50
+ # Wait for the worker thread to end
51
+ begin
52
+ Timeout.timeout(SHUTDOWN_TIMEOUT) do
53
+ worker.join
54
+ end
55
+ rescue Timeout::Error
56
+ Datadog.logger.debug { "Worker thread did not end after #{SHUTDOWN_TIMEOUT} seconds: #{self}" }
57
+ end
50
58
  true
51
59
  end
52
60
 
@@ -112,23 +120,33 @@ module Datadog
112
120
  @worker ||= nil
113
121
  end
114
122
 
123
+ # Returns true if worker thread is successfully started,
124
+ # false if it is not started. Reasons for not starting the worker
125
+ # thread: it is already running, or the process forked and fork
126
+ # policy is to stop the workers on fork (which means they are
127
+ # not started in children, really).
115
128
  def start_async(&block)
116
129
  mutex.synchronize do
117
- return if running?
130
+ return false if running?
118
131
 
119
132
  if forked?
120
133
  case fork_policy
121
134
  when FORK_POLICY_STOP
122
135
  stop_fork
136
+ false
123
137
  when FORK_POLICY_RESTART
138
+ # restart_after_fork should return true
124
139
  restart_after_fork(&block)
125
140
  end
126
141
  elsif !run_async?
142
+ # start_worker should return true
127
143
  start_worker(&block)
128
144
  end
129
145
  end
130
146
  end
131
147
 
148
+ # Returns true if worker thread is successfully started,
149
+ # which should generally be always.
132
150
  def start_worker
133
151
  @run_async = true
134
152
  @pid = Process.pid
@@ -136,22 +154,21 @@ module Datadog
136
154
  Datadog.logger.debug { "Starting thread for: #{self}" }
137
155
 
138
156
  @worker = ::Thread.new do
139
- begin
140
- yield
141
- # rubocop:disable Lint/RescueException
142
- rescue Exception => e
143
- @error = e
144
- Datadog.logger.debug(
145
- "Worker thread error. Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
146
- )
147
- raise
148
- end
157
+ yield
158
+ # rubocop:disable Lint/RescueException
159
+ rescue Exception => e
160
+ @error = e
161
+ Datadog.logger.debug(
162
+ "Worker thread error. Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
163
+ )
164
+ raise
165
+
149
166
  # rubocop:enable Lint/RescueException
150
167
  end
151
168
  @worker.name = self.class.name
152
169
  @worker.thread_variable_set(:fork_safe, true)
153
170
 
154
- nil
171
+ true
155
172
  end
156
173
 
157
174
  def stop_fork
@@ -21,7 +21,18 @@ module Datadog
21
21
  # Methods that must be prepended
22
22
  module PrependedMethods
23
23
  def perform(*args)
24
- perform_loop { super(*args) }
24
+ perform_loop do
25
+ @in_iteration = true
26
+ begin
27
+ super(*args)
28
+ ensure
29
+ @in_iteration = false
30
+ end
31
+ end
32
+ end
33
+
34
+ def in_iteration?
35
+ defined?(@in_iteration) && @in_iteration
25
36
  end
26
37
  end
27
38
 
@@ -20,8 +20,8 @@ module Datadog
20
20
  attr_reader \
21
21
  :metrics
22
22
 
23
- def initialize(options = {})
24
- @metrics = options.fetch(:metrics) { Core::Runtime::Metrics.new(logger: options[:logger]) }
23
+ def initialize(telemetry:, **options)
24
+ @metrics = options.fetch(:metrics) { Core::Runtime::Metrics.new(logger: options[:logger], telemetry: telemetry) }
25
25
 
26
26
  # Workers::Async::Thread settings
27
27
  self.fork_policy = options.fetch(:fork_policy, Workers::Async::Thread::FORK_POLICY_STOP)
data/lib/datadog/core.rb CHANGED
@@ -11,6 +11,14 @@ module Datadog
11
11
  # for higher-level features.
12
12
  module Core
13
13
  extend Core::Deprecations
14
+
15
+ LIBDATADOG_API_FAILURE =
16
+ begin
17
+ require "libdatadog_api.#{RUBY_VERSION[/\d+.\d+/]}_#{RUBY_PLATFORM}"
18
+ nil
19
+ rescue LoadError => e
20
+ e.message
21
+ end
14
22
  end
15
23
 
16
24
  extend Core::Extensions
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'logger'
4
+ require_relative 'base'
5
+ require_relative 'error'
6
+ require_relative 'code_tracker'
7
+ require_relative 'component'
8
+ require_relative 'instrumenter'
9
+ require_relative 'probe'
10
+ require_relative 'probe_builder'
11
+ require_relative 'probe_manager'
12
+ require_relative 'probe_notification_builder'
13
+ require_relative 'probe_notifier_worker'
14
+ require_relative 'redactor'
15
+ require_relative 'serializer'
16
+ require_relative 'transport/http'
17
+ require_relative 'utils'
18
+
19
+ if %w[1 true yes].include?(ENV['DD_DYNAMIC_INSTRUMENTATION_ENABLED']) # steep:ignore
20
+ # For initial release of Dynamic Instrumentation, activate code tracking
21
+ # only if DI is explicitly requested in the environment.
22
+ # Code tracking is required for line probes to work; see the comments
23
+ # above for the implementation of the method.
24
+ #
25
+ # If DI is enabled programmatically, the application can (and must,
26
+ # for line probes to work) activate tracking in an initializer.
27
+ # We seem to have Datadog.logger here already
28
+ Datadog.logger.debug("di: activating code tracking")
29
+ Datadog::DI.activate_tracking
30
+ end
31
+
32
+ require_relative 'contrib'
33
+
34
+ Datadog::DI::Contrib.load_now_or_later
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../core'
4
-
5
3
  module Datadog
6
4
  module DI
7
5
  # Component for dynamic instrumentation.