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
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'metastruct'
4
+
5
+ module Datadog
6
+ module Tracing
7
+ module Metadata
8
+ # Adds data storage for the `meta_struct` field.
9
+ #
10
+ # This field is used to send more complex data like an array of objects
11
+ # in MessagePack format to the agent, and has no size limitations.
12
+ #
13
+ # The agent fully supports meta_struct from version v7.35.0 (April 2022).
14
+ #
15
+ # On versions older than v7.35.0, sending traces containing meta_struct
16
+ # has no unexpected side-effects; traces are sent to the backend as expected,
17
+ # while the meta_struct field is stripped.
18
+ module MetastructTagging
19
+ # Set the given key / value tag pair on the metastruct.
20
+ #
21
+ # A valid example is:
22
+ #
23
+ # span.set_metastruct_tag('_dd.stack', [])
24
+ def set_metastruct_tag(key, value)
25
+ metastruct[key] = value
26
+ end
27
+
28
+ # Return the metastruct tag value for the given key,
29
+ # returns nil if the key doesn't exist.
30
+ def get_metastruct_tag(key)
31
+ metastruct[key]
32
+ end
33
+
34
+ private
35
+
36
+ def metastruct
37
+ @metastruct ||= Metastruct.new
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -2,6 +2,7 @@
2
2
 
3
3
  require_relative 'metadata/analytics'
4
4
  require_relative 'metadata/tagging'
5
+ require_relative 'metadata/metastruct_tagging'
5
6
  require_relative 'metadata/errors'
6
7
 
7
8
  module Datadog
@@ -10,6 +11,7 @@ module Datadog
10
11
  module Metadata
11
12
  def self.included(base)
12
13
  base.include(Metadata::Tagging)
14
+ base.include(Metadata::MetastructTagging)
13
15
  base.include(Metadata::Errors)
14
16
 
15
17
  # Additional extensions
@@ -9,6 +9,7 @@ module Datadog
9
9
  # {Datadog::Tracing::Sampling::RateSampler} is based on a sample rate.
10
10
  class RateSampler < Sampler
11
11
  KNUTH_FACTOR = 1111111111111111111
12
+ UINT64_MODULO = (1 << 64)
12
13
 
13
14
  # Initialize a {Datadog::Tracing::Sampling::RateSampler}.
14
15
  # This sampler keeps a random subset of the traces. Its main purpose is to
@@ -39,7 +40,7 @@ module Datadog
39
40
  end
40
41
 
41
42
  def sample?(trace)
42
- ((trace.id * KNUTH_FACTOR) % Tracing::Utils::EXTERNAL_MAX_ID) <= @sampling_id_threshold
43
+ ((trace.id * KNUTH_FACTOR) % UINT64_MODULO) <= @sampling_id_threshold
43
44
  end
44
45
 
45
46
  def sample!(trace)
@@ -24,7 +24,6 @@ module Datadog
24
24
  sample_rate: Span::Ext::DEFAULT_SAMPLE_RATE,
25
25
  rate_limit: Span::Ext::DEFAULT_MAX_PER_SECOND
26
26
  )
27
-
28
27
  @matcher = matcher
29
28
  @sample_rate = sample_rate
30
29
  @rate_limit = rate_limit
@@ -33,6 +33,9 @@ module Datadog
33
33
  :status,
34
34
  :trace_id
35
35
 
36
+ attr_reader \
37
+ :metastruct
38
+
36
39
  attr_writer \
37
40
  :duration
38
41
 
@@ -54,6 +57,7 @@ module Datadog
54
57
  id: nil,
55
58
  meta: nil,
56
59
  metrics: nil,
60
+ metastruct: nil,
57
61
  parent_id: 0,
58
62
  resource: name,
59
63
  service: nil,
@@ -76,6 +80,7 @@ module Datadog
76
80
 
77
81
  @meta = meta || {}
78
82
  @metrics = metrics || {}
83
+ @metastruct = metastruct || {}
79
84
  @status = status || 0
80
85
 
81
86
  # start_time and end_time track wall clock. In Ruby, wall clock
@@ -144,6 +149,7 @@ module Datadog
144
149
  error: @status,
145
150
  meta: @meta,
146
151
  metrics: @metrics,
152
+ meta_struct: @metastruct.to_h,
147
153
  name: @name,
148
154
  parent_id: @parent_id,
149
155
  resource: @resource,
@@ -185,12 +191,15 @@ module Datadog
185
191
  q.text "#{key} => #{value}"
186
192
  end
187
193
  end
188
- q.group(2, 'Metrics: [', ']') do
194
+ q.group(2, 'Metrics: [', "]\n") do
189
195
  q.breakable
190
196
  q.seplist @metrics.each do |key, value|
191
197
  q.text "#{key} => #{value}"
192
198
  end
193
199
  end
200
+ q.group(2, 'Metastruct: [', ']') do
201
+ metastruct.pretty_print(q)
202
+ end
194
203
  end
195
204
  end
196
205
 
@@ -33,7 +33,7 @@ module Datadog
33
33
 
34
34
  # OpenTelemetry SDK stores span event timestamps in nanoseconds (not seconds).
35
35
  # We will do the same here to avoid unnecessary conversions and inconsistencies.
36
- @time_unix_nano = time_unix_nano || (Time.now.to_r * 1_000_000_000).to_i
36
+ @time_unix_nano = time_unix_nano || (Core::Utils::Time.now.to_r * 1_000_000_000).to_i
37
37
  end
38
38
 
39
39
  # Converts the span event into a hash to be used by with the span tag serialization
@@ -56,7 +56,7 @@ module Datadog
56
56
  attr = {}
57
57
  @attributes.each do |key, value|
58
58
  attr[key] = if value.is_a?(Array)
59
- { type: ARRAY_TYPE, array_value: value.map { |v| serialize_native_attribute(v) } }
59
+ { type: ARRAY_TYPE, array_value: { values: value.map { |v| serialize_native_attribute(v) } } }
60
60
  else
61
61
  serialize_native_attribute(value)
62
62
  end
@@ -28,6 +28,7 @@ module Datadog
28
28
  # Span attributes
29
29
  # NOTE: In the future, we should drop the me
30
30
  attr_reader \
31
+ :logger,
31
32
  :end_time,
32
33
  :id,
33
34
  :name,
@@ -37,10 +38,12 @@ module Datadog
37
38
  :start_time,
38
39
  :trace_id,
39
40
  :type
41
+
40
42
  attr_accessor :links, :status, :span_events
41
43
 
42
44
  def initialize(
43
45
  name,
46
+ logger: Datadog.logger,
44
47
  events: nil,
45
48
  on_error: nil,
46
49
  parent_id: 0,
@@ -54,6 +57,8 @@ module Datadog
54
57
  span_events: nil,
55
58
  id: nil
56
59
  )
60
+ @logger = logger
61
+
57
62
  # Ensure dynamically created strings are UTF-8 encoded.
58
63
  #
59
64
  # All strings created in Ruby land are UTF-8. The only sources of non-UTF-8 string are:
@@ -90,11 +95,17 @@ module Datadog
90
95
  set_tags(tags) if tags
91
96
 
92
97
  # Some other SpanOperation-specific behavior
93
- @events = events || Events.new
98
+ @events = events || Events.new(logger: logger)
94
99
  @span = nil
95
100
 
96
- # Subscribe :on_error event
97
- @events.on_error.wrap_default(&on_error) if on_error.is_a?(Proc)
101
+ if on_error.nil?
102
+ # Nothing, default error handler is already set up.
103
+ elsif on_error.is_a?(Proc)
104
+ # Subscribe :on_error event
105
+ @events.on_error.wrap_default(&on_error)
106
+ else
107
+ logger.warn("on_error argument to SpanOperation ignored because is not a Proc: #{on_error}")
108
+ end
98
109
 
99
110
  # Start the span with start time, if given.
100
111
  start(start_time) if start_time
@@ -130,6 +141,10 @@ module Datadog
130
141
  @resource = resource.nil? ? nil : Core::Utils.utf8_encode(resource) # Allow this to be explicitly set to nil
131
142
  end
132
143
 
144
+ def get_collector_or_initialize
145
+ @collector ||= yield
146
+ end
147
+
133
148
  def measure
134
149
  raise ArgumentError, 'Must provide block to measure!' unless block_given?
135
150
  # TODO: Should we just invoke the block and skip tracing instead?
@@ -143,7 +158,7 @@ module Datadog
143
158
  begin
144
159
  start
145
160
  rescue StandardError => e
146
- Datadog.logger.debug { "Failed to start span: #{e}" }
161
+ logger.debug { "Failed to start span: #{e}" }
147
162
  ensure
148
163
  # We should yield to the provided block when possible, as this
149
164
  # block is application code that we don't want to hinder.
@@ -161,7 +176,7 @@ module Datadog
161
176
  # Stop the span first, so timing is a more accurate.
162
177
  # If the span failed to start, timing may be inaccurate,
163
178
  # but this is not really a serious concern.
164
- stop
179
+ stop(exception: e)
165
180
 
166
181
  # Trigger the on_error event
167
182
  events.on_error.publish(self, e)
@@ -202,7 +217,7 @@ module Datadog
202
217
  #
203
218
  # steep:ignore:start
204
219
  # Steep issue fixed in https://github.com/soutaro/steep/pull/1467
205
- def stop(stop_time = nil)
220
+ def stop(stop_time = nil, exception: nil)
206
221
  # A span should not be stopped twice. Note that this is not thread-safe,
207
222
  # stop is called from multiple threads, a given span might be stopped
208
223
  # several times. Again, one should not do this, so this test is more a
@@ -220,7 +235,7 @@ module Datadog
220
235
  @duration_end = stop_time.nil? ? duration_marker : nil
221
236
 
222
237
  # Trigger after_stop event
223
- events.after_stop.publish(self)
238
+ events.after_stop.publish(self, exception)
224
239
 
225
240
  self
226
241
  end
@@ -236,6 +251,10 @@ module Datadog
236
251
  !@end_time.nil?
237
252
  end
238
253
 
254
+ def root?
255
+ parent_id == 0
256
+ end
257
+
239
258
  # for backwards compatibility
240
259
  def start_time=(time)
241
260
  time.tap { start(time) }
@@ -269,7 +288,8 @@ module Datadog
269
288
 
270
289
  def duration
271
290
  return @duration_end - @duration_start if @duration_start && @duration_end
272
- return @end_time - @start_time if @start_time && @end_time
291
+
292
+ @end_time - @start_time if @start_time && @end_time
273
293
  end
274
294
 
275
295
  def set_error(e)
@@ -277,6 +297,28 @@ module Datadog
277
297
  set_error_tags(e)
278
298
  end
279
299
 
300
+ # Record an exception during the execution of this span. Multiple exceptions
301
+ # can be recorded on a span.
302
+ #
303
+ # @param [Exception] exception The exception to record
304
+ # @param [optional Hash{String => String, Numeric, Boolean, Array<String, Numeric, Boolean>}]
305
+ # attributes One or more key:value pairs, where the keys must be
306
+ # strings and the values may be (array of) string, boolean or numeric
307
+ # type.
308
+ #
309
+ # @return [void]
310
+ def record_exception(exception, attributes: {})
311
+ exc = Core::Error.build_from(exception)
312
+
313
+ event_attributes = {
314
+ 'exception.type' => exc.type,
315
+ 'exception.message' => exc.message,
316
+ 'exception.stacktrace' => exc.backtrace,
317
+ }
318
+
319
+ @span_events << SpanEvent.new('exception', attributes: event_attributes.merge!(attributes)) # steep:ignore
320
+ end
321
+
280
322
  # Return a string representation of the span.
281
323
  def to_s
282
324
  "SpanOperation(name:#{@name},sid:#{@id},tid:#{@trace_id},pid:#{@parent_id})"
@@ -289,6 +331,7 @@ module Datadog
289
331
  id: @id,
290
332
  meta: meta,
291
333
  metrics: metrics,
334
+ metastruct: metastruct,
292
335
  name: @name,
293
336
  parent_id: @parent_id,
294
337
  resource: @resource,
@@ -328,12 +371,15 @@ module Datadog
328
371
  q.text "#{key} => #{value}"
329
372
  end
330
373
  end
331
- q.group(2, 'Metrics: [', ']') do
374
+ q.group(2, 'Metrics: [', "]\n") do
332
375
  q.breakable
333
376
  q.seplist metrics.each do |key, value|
334
377
  q.text "#{key} => #{value}"
335
378
  end
336
379
  end
380
+ q.group(2, 'Metastruct: [', ']') do
381
+ metastruct.pretty_print(q)
382
+ end
337
383
  end
338
384
  end
339
385
 
@@ -344,11 +390,13 @@ module Datadog
344
390
  DEFAULT_ON_ERROR = proc { |span_op, error| span_op.set_error(error) unless span_op.nil? }
345
391
 
346
392
  attr_reader \
393
+ :logger,
347
394
  :after_finish,
348
395
  :after_stop,
349
396
  :before_start
350
397
 
351
- def initialize(on_error: nil)
398
+ def initialize(logger: Datadog.logger, on_error: nil)
399
+ @logger = logger
352
400
  @after_finish = AfterFinish.new
353
401
  @after_stop = AfterStop.new
354
402
  @before_start = BeforeStart.new
@@ -357,7 +405,7 @@ module Datadog
357
405
  # This event is lazily initialized as error paths
358
406
  # are normally less common that non-error paths.
359
407
  def on_error
360
- @on_error ||= OnError.new(DEFAULT_ON_ERROR)
408
+ @on_error ||= OnError.new(DEFAULT_ON_ERROR, logger: logger)
361
409
  end
362
410
 
363
411
  # Triggered when the span is finished, regardless of error.
@@ -383,10 +431,13 @@ module Datadog
383
431
 
384
432
  # Triggered when the span raises an error during measurement.
385
433
  class OnError
386
- def initialize(default)
434
+ def initialize(default, logger: Datadog.logger)
387
435
  @handler = default
436
+ @logger = logger
388
437
  end
389
438
 
439
+ attr_reader :logger
440
+
390
441
  # Call custom error handler but fallback to default behavior on failure.
391
442
 
392
443
  # DEV: Revisit this before full 1.0 release.
@@ -400,9 +451,9 @@ module Datadog
400
451
  begin
401
452
  yield(op, error)
402
453
  rescue StandardError => e
403
- Datadog.logger.debug do
454
+ logger.debug do
404
455
  "Custom on_error handler #{@handler} failed, using fallback behavior. \
405
- Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
456
+ Cause: #{e.class}: #{e} Location: #{Array(e.backtrace).first}"
406
457
  end
407
458
 
408
459
  original.call(op, error) if original
@@ -414,8 +465,8 @@ module Datadog
414
465
  begin
415
466
  @handler.call(*args)
416
467
  rescue StandardError => e
417
- Datadog.logger.debug do
418
- "Error in on_error handler '#{@default}': #{e.class.name} #{e.message} at #{Array(e.backtrace).first}"
468
+ logger.debug do
469
+ "Error in on_error handler '#{@default}': #{e.class}: #{e} at #{Array(e.backtrace).first}"
419
470
  end
420
471
  end
421
472
 
@@ -456,6 +507,7 @@ module Datadog
456
507
  id: @id,
457
508
  meta: Core::Utils::SafeDup.frozen_or_dup(meta),
458
509
  metrics: Core::Utils::SafeDup.frozen_or_dup(metrics),
510
+ metastruct: Core::Utils::SafeDup.frozen_or_dup(metastruct),
459
511
  parent_id: @parent_id,
460
512
  resource: @resource,
461
513
  service: @service,
@@ -25,15 +25,14 @@ module Datadog
25
25
  # @param [Datadog::Tracing::Transport::Traces::Transport] transport a custom transport instance.
26
26
  # If provided, overrides `transport_options` and `agent_settings`.
27
27
  # @param [Hash<Symbol,Object>] transport_options options for the default transport instance.
28
- # @param [Datadog::Tracing::Configuration::AgentSettingsResolver::AgentSettings] agent_settings agent options for
28
+ # @param [Datadog::Tracing::Configuration::AgentSettings] agent_settings agent options for
29
29
  # the default transport instance.
30
30
  def initialize(transport: nil, transport_options: {}, agent_settings: nil, logger: Datadog.logger)
31
31
  @logger = logger
32
32
  @agent_settings = agent_settings
33
33
 
34
34
  @transport = transport || begin
35
- transport_options = transport_options.merge(agent_settings: agent_settings) if agent_settings
36
- Transport::HTTP.default(**transport_options)
35
+ Transport::HTTP.default(agent_settings: agent_settings, logger: logger, **transport_options)
37
36
  end
38
37
 
39
38
  @events = Writer::Events.new
@@ -80,6 +80,9 @@ module Datadog
80
80
  # This allows later propagation to include those unknown fields, as they can represent future versions of the spec
81
81
  # sending data through this service. This value ends in a trailing `;` to facilitate serialization.
82
82
  # @return [String]
83
+ # @!attribute [r] baggage
84
+ # The W3C "baggage" extracted from a distributed context. This field is a hash of key/value pairs.
85
+ # @return [Hash<String,String>]
83
86
  # TODO: The documentation for the last attribute above won't be rendered.
84
87
  # TODO: This might be a YARD bug as adding an attribute, making it now second-last attribute, renders correctly.
85
88
  attr_reader \
@@ -102,7 +105,8 @@ module Datadog
102
105
  :trace_flags,
103
106
  :trace_state,
104
107
  :trace_state_unknown_fields,
105
- :span_remote
108
+ :span_remote,
109
+ :baggage
106
110
 
107
111
  def initialize(
108
112
  span_id: nil,
@@ -124,7 +128,8 @@ module Datadog
124
128
  trace_flags: nil,
125
129
  trace_state: nil,
126
130
  trace_state_unknown_fields: nil,
127
- span_remote: true
131
+ span_remote: true,
132
+ baggage: nil
128
133
  )
129
134
  @span_id = span_id
130
135
  @span_name = span_name && span_name.dup.freeze
@@ -146,6 +151,7 @@ module Datadog
146
151
  @trace_state = trace_state && trace_state.dup.freeze
147
152
  @trace_state_unknown_fields = trace_state_unknown_fields && trace_state_unknown_fields.dup.freeze
148
153
  @span_remote = span_remote
154
+ @baggage = baggage && baggage.dup.freeze
149
155
  freeze
150
156
  end
151
157
 
@@ -177,6 +183,7 @@ module Datadog
177
183
  trace_state: trace_state,
178
184
  trace_state_unknown_fields: trace_state_unknown_fields,
179
185
  span_remote: span_remote,
186
+ baggage: baggage
180
187
  }.merge!(field_value_pairs)
181
188
  )
182
189
  end