datadog 2.7.1 → 2.17.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 (417) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +310 -1
  3. data/ext/datadog_profiling_native_extension/clock_id.h +2 -2
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +66 -56
  5. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +16 -16
  8. data/ext/datadog_profiling_native_extension/collectors_stack.c +10 -10
  9. data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -2
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +314 -145
  11. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  13. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  14. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  15. data/ext/datadog_profiling_native_extension/extconf.rb +7 -8
  16. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +2 -0
  17. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +0 -8
  18. data/ext/datadog_profiling_native_extension/heap_recorder.c +61 -174
  19. data/ext/datadog_profiling_native_extension/heap_recorder.h +2 -2
  20. data/ext/datadog_profiling_native_extension/http_transport.c +64 -98
  21. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +68 -1
  22. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +10 -1
  23. data/ext/datadog_profiling_native_extension/profiling.c +19 -8
  24. data/ext/datadog_profiling_native_extension/ruby_helpers.c +8 -8
  25. data/ext/datadog_profiling_native_extension/stack_recorder.c +84 -131
  26. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -2
  27. data/ext/datadog_profiling_native_extension/time_helpers.h +1 -1
  28. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +47 -0
  29. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +31 -0
  30. data/ext/libdatadog_api/crashtracker.c +17 -15
  31. data/ext/libdatadog_api/crashtracker.h +5 -0
  32. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  33. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  34. data/ext/libdatadog_api/init.c +15 -0
  35. data/ext/libdatadog_api/library_config.c +122 -0
  36. data/ext/libdatadog_api/library_config.h +19 -0
  37. data/ext/libdatadog_api/macos_development.md +3 -3
  38. data/ext/libdatadog_api/process_discovery.c +117 -0
  39. data/ext/libdatadog_api/process_discovery.h +5 -0
  40. data/ext/libdatadog_extconf_helpers.rb +1 -1
  41. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  42. data/lib/datadog/appsec/actions_handler.rb +49 -0
  43. data/lib/datadog/appsec/anonymizer.rb +16 -0
  44. data/lib/datadog/appsec/api_security/lru_cache.rb +49 -0
  45. data/lib/datadog/appsec/api_security.rb +9 -0
  46. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  47. data/lib/datadog/appsec/assets/waf_rules/processors.json +239 -10
  48. data/lib/datadog/appsec/assets/waf_rules/recommended.json +355 -157
  49. data/lib/datadog/appsec/assets/waf_rules/scanners.json +926 -17
  50. data/lib/datadog/appsec/assets/waf_rules/strict.json +62 -32
  51. data/lib/datadog/appsec/autoload.rb +1 -1
  52. data/lib/datadog/appsec/component.rb +41 -33
  53. data/lib/datadog/appsec/compressed_json.rb +40 -0
  54. data/lib/datadog/appsec/configuration/settings.rb +152 -25
  55. data/lib/datadog/appsec/context.rb +74 -0
  56. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +92 -0
  57. data/lib/datadog/appsec/contrib/active_record/integration.rb +41 -0
  58. data/lib/datadog/appsec/contrib/active_record/patcher.rb +101 -0
  59. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  60. data/lib/datadog/appsec/contrib/devise/configuration.rb +52 -0
  61. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  62. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  63. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  64. data/lib/datadog/appsec/contrib/devise/patcher.rb +33 -25
  65. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  66. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  67. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +3 -3
  68. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  69. data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
  70. data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
  71. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +42 -0
  72. data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
  73. data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
  74. data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
  75. data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
  76. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +41 -0
  77. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +1 -7
  78. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +17 -30
  79. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  80. data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
  81. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  82. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
  83. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +78 -98
  84. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  85. data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
  86. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +10 -11
  87. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +52 -68
  88. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +16 -33
  89. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  90. data/lib/datadog/appsec/contrib/rails/patcher.rb +25 -38
  91. data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
  92. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
  93. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +38 -0
  94. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +31 -68
  95. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  96. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -31
  97. data/lib/datadog/appsec/event.rb +96 -135
  98. data/lib/datadog/appsec/ext.rb +12 -3
  99. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  100. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  101. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  102. data/lib/datadog/appsec/metrics/collector.rb +38 -0
  103. data/lib/datadog/appsec/metrics/exporter.rb +35 -0
  104. data/lib/datadog/appsec/metrics/telemetry.rb +23 -0
  105. data/lib/datadog/appsec/metrics.rb +13 -0
  106. data/lib/datadog/appsec/monitor/gateway/watcher.rb +52 -32
  107. data/lib/datadog/appsec/processor/rule_loader.rb +26 -31
  108. data/lib/datadog/appsec/processor/rule_merger.rb +7 -6
  109. data/lib/datadog/appsec/processor.rb +5 -4
  110. data/lib/datadog/appsec/remote.rb +26 -12
  111. data/lib/datadog/appsec/response.rb +19 -85
  112. data/lib/datadog/appsec/security_engine/result.rb +67 -0
  113. data/lib/datadog/appsec/security_engine/runner.rb +88 -0
  114. data/lib/datadog/appsec/security_engine.rb +9 -0
  115. data/lib/datadog/appsec/security_event.rb +39 -0
  116. data/lib/datadog/appsec/utils.rb +0 -2
  117. data/lib/datadog/appsec.rb +23 -10
  118. data/lib/datadog/auto_instrument.rb +3 -0
  119. data/lib/datadog/core/buffer/random.rb +18 -2
  120. data/lib/datadog/core/configuration/agent_settings_resolver.rb +42 -14
  121. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  122. data/lib/datadog/core/configuration/components.rb +76 -32
  123. data/lib/datadog/core/configuration/components_state.rb +23 -0
  124. data/lib/datadog/core/configuration/ext.rb +5 -1
  125. data/lib/datadog/core/configuration/option.rb +79 -43
  126. data/lib/datadog/core/configuration/option_definition.rb +6 -4
  127. data/lib/datadog/core/configuration/options.rb +3 -3
  128. data/lib/datadog/core/configuration/settings.rb +100 -41
  129. data/lib/datadog/core/configuration/stable_config.rb +23 -0
  130. data/lib/datadog/core/configuration.rb +43 -11
  131. data/lib/datadog/{tracing → core}/contrib/rails/utils.rb +1 -3
  132. data/lib/datadog/core/crashtracking/component.rb +4 -13
  133. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  134. data/lib/datadog/core/encoding.rb +17 -1
  135. data/lib/datadog/core/environment/agent_info.rb +78 -0
  136. data/lib/datadog/core/environment/cgroup.rb +10 -12
  137. data/lib/datadog/core/environment/container.rb +38 -40
  138. data/lib/datadog/core/environment/ext.rb +6 -6
  139. data/lib/datadog/core/environment/git.rb +1 -0
  140. data/lib/datadog/core/environment/identity.rb +3 -3
  141. data/lib/datadog/core/environment/platform.rb +3 -3
  142. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  143. data/lib/datadog/core/error.rb +11 -9
  144. data/lib/datadog/core/logger.rb +2 -2
  145. data/lib/datadog/core/metrics/client.rb +27 -27
  146. data/lib/datadog/core/metrics/logging.rb +5 -5
  147. data/lib/datadog/core/process_discovery.rb +32 -0
  148. data/lib/datadog/core/rate_limiter.rb +4 -2
  149. data/lib/datadog/core/remote/client/capabilities.rb +6 -0
  150. data/lib/datadog/core/remote/client.rb +107 -92
  151. data/lib/datadog/core/remote/component.rb +18 -19
  152. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  153. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  154. data/lib/datadog/core/remote/configuration/repository.rb +2 -1
  155. data/lib/datadog/core/remote/negotiation.rb +9 -9
  156. data/lib/datadog/core/remote/transport/config.rb +4 -3
  157. data/lib/datadog/core/remote/transport/http/api.rb +13 -18
  158. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  159. data/lib/datadog/core/remote/transport/http/config.rb +27 -55
  160. data/lib/datadog/core/remote/transport/http/negotiation.rb +8 -51
  161. data/lib/datadog/core/remote/transport/http.rb +25 -94
  162. data/lib/datadog/core/remote/transport/negotiation.rb +17 -4
  163. data/lib/datadog/core/remote/worker.rb +10 -7
  164. data/lib/datadog/core/runtime/metrics.rb +12 -5
  165. data/lib/datadog/core/telemetry/component.rb +84 -49
  166. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  167. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +65 -0
  168. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  169. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  170. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  171. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  172. data/lib/datadog/core/telemetry/event/app_started.rb +179 -0
  173. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  174. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  175. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  176. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  177. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  178. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  179. data/lib/datadog/core/telemetry/event.rb +17 -383
  180. data/lib/datadog/core/telemetry/ext.rb +1 -0
  181. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  182. data/lib/datadog/core/telemetry/logger.rb +1 -1
  183. data/lib/datadog/core/telemetry/logging.rb +2 -2
  184. data/lib/datadog/core/telemetry/metric.rb +28 -6
  185. data/lib/datadog/core/telemetry/request.rb +4 -4
  186. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  187. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  188. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  189. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  190. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  191. data/lib/datadog/core/telemetry/worker.rb +128 -25
  192. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  193. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
  194. data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +18 -1
  195. data/lib/datadog/core/transport/http/api/spec.rb +36 -0
  196. data/lib/datadog/{tracing → core}/transport/http/builder.rb +53 -31
  197. data/lib/datadog/core/transport/http.rb +75 -0
  198. data/lib/datadog/core/transport/response.rb +4 -0
  199. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  200. data/lib/datadog/core/utils/duration.rb +32 -32
  201. data/lib/datadog/core/utils/forking.rb +2 -2
  202. data/lib/datadog/core/utils/network.rb +6 -6
  203. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  204. data/lib/datadog/core/utils/time.rb +20 -0
  205. data/lib/datadog/core/utils/truncation.rb +21 -0
  206. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  207. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  208. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  209. data/lib/datadog/core/worker.rb +1 -1
  210. data/lib/datadog/core/workers/async.rb +29 -12
  211. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  212. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  213. data/lib/datadog/core.rb +8 -0
  214. data/lib/datadog/di/base.rb +115 -0
  215. data/lib/datadog/di/boot.rb +34 -0
  216. data/lib/datadog/di/code_tracker.rb +26 -15
  217. data/lib/datadog/di/component.rb +23 -14
  218. data/lib/datadog/di/configuration/settings.rb +25 -1
  219. data/lib/datadog/di/contrib/active_record.rb +1 -0
  220. data/lib/datadog/di/contrib/railtie.rb +15 -0
  221. data/lib/datadog/di/contrib.rb +28 -0
  222. data/lib/datadog/di/error.rb +5 -0
  223. data/lib/datadog/di/instrumenter.rb +111 -20
  224. data/lib/datadog/di/logger.rb +30 -0
  225. data/lib/datadog/di/preload.rb +18 -0
  226. data/lib/datadog/di/probe.rb +14 -7
  227. data/lib/datadog/di/probe_builder.rb +1 -0
  228. data/lib/datadog/di/probe_manager.rb +11 -5
  229. data/lib/datadog/di/probe_notification_builder.rb +34 -8
  230. data/lib/datadog/di/probe_notifier_worker.rb +52 -26
  231. data/lib/datadog/di/redactor.rb +0 -1
  232. data/lib/datadog/di/remote.rb +147 -0
  233. data/lib/datadog/di/serializer.rb +14 -7
  234. data/lib/datadog/di/transport/diagnostics.rb +62 -0
  235. data/lib/datadog/di/transport/http/api.rb +42 -0
  236. data/lib/datadog/di/transport/http/client.rb +47 -0
  237. data/lib/datadog/di/transport/http/diagnostics.rb +65 -0
  238. data/lib/datadog/di/transport/http/input.rb +67 -0
  239. data/lib/datadog/di/transport/http.rb +57 -0
  240. data/lib/datadog/di/transport/input.rb +62 -0
  241. data/lib/datadog/di/utils.rb +103 -0
  242. data/lib/datadog/di.rb +14 -76
  243. data/lib/datadog/error_tracking/collector.rb +87 -0
  244. data/lib/datadog/error_tracking/component.rb +167 -0
  245. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  246. data/lib/datadog/error_tracking/configuration.rb +11 -0
  247. data/lib/datadog/error_tracking/ext.rb +18 -0
  248. data/lib/datadog/error_tracking/extensions.rb +16 -0
  249. data/lib/datadog/error_tracking/filters.rb +77 -0
  250. data/lib/datadog/error_tracking.rb +18 -0
  251. data/lib/datadog/kit/appsec/events.rb +15 -3
  252. data/lib/datadog/kit/identity.rb +9 -5
  253. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  254. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  255. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  256. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  257. data/lib/datadog/opentelemetry.rb +2 -1
  258. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -1
  259. data/lib/datadog/profiling/collectors/info.rb +3 -0
  260. data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
  261. data/lib/datadog/profiling/component.rb +60 -76
  262. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  263. data/lib/datadog/profiling/exporter.rb +3 -4
  264. data/lib/datadog/profiling/ext.rb +0 -2
  265. data/lib/datadog/profiling/flush.rb +5 -8
  266. data/lib/datadog/profiling/http_transport.rb +6 -85
  267. data/lib/datadog/profiling/load_native_extension.rb +1 -33
  268. data/lib/datadog/profiling/scheduler.rb +8 -1
  269. data/lib/datadog/profiling/stack_recorder.rb +4 -4
  270. data/lib/datadog/profiling/tag_builder.rb +1 -5
  271. data/lib/datadog/profiling.rb +6 -2
  272. data/lib/datadog/tracing/analytics.rb +1 -1
  273. data/lib/datadog/tracing/component.rb +16 -12
  274. data/lib/datadog/tracing/configuration/ext.rb +8 -1
  275. data/lib/datadog/tracing/configuration/settings.rb +22 -10
  276. data/lib/datadog/tracing/context_provider.rb +1 -1
  277. data/lib/datadog/tracing/contrib/action_cable/integration.rb +5 -2
  278. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +6 -2
  279. data/lib/datadog/tracing/contrib/action_pack/integration.rb +5 -2
  280. data/lib/datadog/tracing/contrib/action_view/integration.rb +5 -2
  281. data/lib/datadog/tracing/contrib/active_job/integration.rb +5 -2
  282. data/lib/datadog/tracing/contrib/active_record/integration.rb +7 -3
  283. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +7 -2
  284. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +36 -1
  285. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  286. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +14 -4
  287. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -0
  288. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -2
  289. data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -2
  290. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  291. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -0
  292. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  293. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -0
  294. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  295. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +4 -0
  296. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -1
  297. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  298. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  299. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  300. data/lib/datadog/tracing/contrib/extensions.rb +29 -3
  301. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  302. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
  303. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
  304. data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
  305. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
  306. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  307. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  308. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  309. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  310. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  311. data/lib/datadog/tracing/contrib/http/integration.rb +3 -0
  312. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  313. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  314. data/lib/datadog/tracing/contrib/httprb/integration.rb +3 -0
  315. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -0
  316. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  317. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  318. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  319. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  320. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  321. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  322. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  323. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  324. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  325. data/lib/datadog/tracing/contrib/mongodb/integration.rb +3 -0
  326. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  327. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  328. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  329. data/lib/datadog/tracing/contrib/opensearch/integration.rb +3 -0
  330. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  331. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  332. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -0
  333. data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
  334. data/lib/datadog/tracing/contrib/rack/integration.rb +2 -2
  335. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
  336. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  337. data/lib/datadog/tracing/contrib/rails/framework.rb +2 -2
  338. data/lib/datadog/tracing/contrib/rails/patcher.rb +1 -1
  339. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -0
  340. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  341. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  342. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  343. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +1 -1
  344. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
  345. data/lib/datadog/tracing/contrib/support.rb +28 -0
  346. data/lib/datadog/tracing/contrib.rb +1 -0
  347. data/lib/datadog/tracing/correlation.rb +9 -2
  348. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  349. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  350. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  351. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  352. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  353. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  354. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  355. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  356. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  357. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  358. data/lib/datadog/tracing/metadata.rb +2 -0
  359. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  360. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  361. data/lib/datadog/tracing/span.rb +22 -5
  362. data/lib/datadog/tracing/span_event.rb +124 -4
  363. data/lib/datadog/tracing/span_operation.rb +52 -16
  364. data/lib/datadog/tracing/sync_writer.rb +9 -5
  365. data/lib/datadog/tracing/trace_digest.rb +9 -2
  366. data/lib/datadog/tracing/trace_operation.rb +44 -24
  367. data/lib/datadog/tracing/trace_segment.rb +6 -4
  368. data/lib/datadog/tracing/tracer.rb +60 -12
  369. data/lib/datadog/tracing/transport/http/api.rb +5 -4
  370. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  371. data/lib/datadog/tracing/transport/http/traces.rb +13 -44
  372. data/lib/datadog/tracing/transport/http.rb +13 -70
  373. data/lib/datadog/tracing/transport/serializable_trace.rb +31 -7
  374. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  375. data/lib/datadog/tracing/transport/traces.rb +47 -13
  376. data/lib/datadog/tracing/utils.rb +1 -1
  377. data/lib/datadog/tracing/workers/trace_writer.rb +8 -5
  378. data/lib/datadog/tracing/workers.rb +5 -4
  379. data/lib/datadog/tracing/writer.rb +10 -6
  380. data/lib/datadog/tracing.rb +16 -3
  381. data/lib/datadog/version.rb +2 -2
  382. data/lib/datadog.rb +2 -0
  383. metadata +143 -50
  384. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
  385. data/ext/datadog_profiling_loader/extconf.rb +0 -60
  386. data/lib/datadog/appsec/contrib/devise/event.rb +0 -57
  387. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -77
  388. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -54
  389. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  390. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  391. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
  392. data/lib/datadog/appsec/contrib/patcher.rb +0 -12
  393. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
  394. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
  395. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
  396. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
  397. data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -14
  398. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
  399. data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
  400. data/lib/datadog/appsec/processor/actions.rb +0 -49
  401. data/lib/datadog/appsec/processor/context.rb +0 -107
  402. data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
  403. data/lib/datadog/appsec/reactive/engine.rb +0 -47
  404. data/lib/datadog/appsec/reactive/operation.rb +0 -68
  405. data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
  406. data/lib/datadog/appsec/scope.rb +0 -58
  407. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  408. data/lib/datadog/core/crashtracking/agent_base_url.rb +0 -21
  409. data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
  410. data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
  411. data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
  412. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  413. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  414. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  415. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
  416. data/lib/datadog/di/transport.rb +0 -81
  417. data/lib/datadog/tracing/transport/http/api/spec.rb +0 -19
@@ -13,13 +13,15 @@ module Datadog
13
13
  # to be side-effect free.
14
14
  #
15
15
  # @return [Boolean] whether a resource conforms with the current limit
16
- def allow?(size = 1); end
16
+ def allow?(size = 1)
17
+ end
17
18
 
18
19
  # The effective rate limiting ratio based on
19
20
  # recent calls to `allow?`.
20
21
  #
21
22
  # @return [Float] recent allowance ratio
22
- def effective_rate; end
23
+ def effective_rate
24
+ end
23
25
  end
24
26
 
25
27
  # Implementation of the Token Bucket metering algorithm
@@ -32,6 +32,12 @@ module Datadog
32
32
  register_receivers(Datadog::AppSec::Remote.receivers(@telemetry))
33
33
  end
34
34
 
35
+ if settings.respond_to?(:dynamic_instrumentation) && settings.dynamic_instrumentation.enabled
36
+ register_capabilities(Datadog::DI::Remote.capabilities)
37
+ register_products(Datadog::DI::Remote.products)
38
+ register_receivers(Datadog::DI::Remote.receivers(@telemetry))
39
+ end
40
+
35
41
  register_capabilities(Datadog::Tracing::Remote.capabilities)
36
42
  register_products(Datadog::Tracing::Remote.products)
37
43
  register_receivers(Datadog::Tracing::Remote.receivers(@telemetry))
@@ -11,12 +11,14 @@ module Datadog
11
11
  # Client communicates with the agent and sync remote configuration
12
12
  class Client
13
13
  class TransportError < StandardError; end
14
+
14
15
  class SyncError < StandardError; end
15
16
 
16
- attr_reader :transport, :repository, :id, :dispatcher
17
+ attr_reader :transport, :repository, :id, :dispatcher, :logger
17
18
 
18
- def initialize(transport, capabilities, repository: Configuration::Repository.new)
19
+ def initialize(transport, capabilities, logger: Datadog.logger, repository: Configuration::Repository.new)
19
20
  @transport = transport
21
+ @logger = logger
20
22
 
21
23
  @repository = repository
22
24
  @id = SecureRandom.uuid
@@ -24,95 +26,101 @@ module Datadog
24
26
  @dispatcher = Dispatcher.new(@capabilities.receivers)
25
27
  end
26
28
 
27
- # rubocop:disable Metrics/AbcSize,Metrics/PerceivedComplexity,Metrics/MethodLength,Metrics/CyclomaticComplexity
28
29
  def sync
29
30
  # TODO: Skip sync if no capabilities are registered
30
31
  response = transport.send_config(payload)
31
32
 
32
33
  if response.ok?
33
- # when response is completely empty, do nothing as in: leave as is
34
- if response.empty?
35
- Datadog.logger.debug { 'remote: empty response => NOOP' }
34
+ process_response(response)
35
+ elsif response.internal_error?
36
+ raise TransportError, response.to_s
37
+ end
38
+ end
36
39
 
37
- return
38
- end
40
+ private
39
41
 
40
- begin
41
- paths = response.client_configs.map do |path|
42
- Configuration::Path.parse(path)
43
- end
42
+ def process_response(response)
43
+ # when response is completely empty, do nothing as in: leave as is
44
+ if response.empty?
45
+ logger.debug { 'remote: empty response => NOOP' }
44
46
 
45
- targets = Configuration::TargetMap.parse(response.targets)
47
+ return
48
+ end
46
49
 
47
- contents = Configuration::ContentList.parse(response.target_files)
48
- rescue Remote::Configuration::Path::ParseError => e
49
- raise SyncError, e.message
50
+ begin
51
+ paths = response.client_configs.map do |path|
52
+ Configuration::Path.parse(path)
50
53
  end
51
54
 
52
- # To make sure steep does not complain
53
- return unless paths && targets && contents
55
+ targets = Configuration::TargetMap.parse(response.targets)
54
56
 
55
- # TODO: sometimes it can strangely be so that paths.empty?
56
- # TODO: sometimes it can strangely be so that targets.empty?
57
+ contents = Configuration::ContentList.parse(response.target_files)
58
+ rescue Remote::Configuration::Path::ParseError => e
59
+ raise SyncError, e.message
60
+ end
57
61
 
58
- changes = repository.transaction do |current, transaction|
59
- # paths to be removed: previously applied paths minus ingress paths
60
- (current.paths - paths).each { |p| transaction.delete(p) }
62
+ # To make sure steep does not complain
63
+ return unless paths && targets && contents
61
64
 
62
- # go through each ingress path
63
- paths.each do |path|
64
- # match target with path
65
- target = targets[path]
65
+ # TODO: sometimes it can strangely be so that paths.empty?
66
+ # TODO: sometimes it can strangely be so that targets.empty?
66
67
 
67
- # abort entirely if matching target not found
68
- raise SyncError, "no target for path '#{path}'" if target.nil?
68
+ apply_config(paths, targets, contents)
69
+ end
69
70
 
70
- # new paths are not in previously applied paths
71
- new = !current.paths.include?(path)
71
+ def apply_config(paths, targets, contents)
72
+ changes = repository.transaction do |current, transaction|
73
+ # paths to be removed: previously applied paths minus ingress paths
74
+ (current.paths - paths).each { |p| transaction.delete(p) }
72
75
 
73
- # updated paths are in previously applied paths
74
- # but the content hash changed
75
- changed = current.paths.include?(path) && !current.contents.find_content(path, target)
76
+ # go through each ingress path
77
+ paths.each do |path|
78
+ # match target with path
79
+ target = targets[path]
76
80
 
77
- # skip if unchanged
78
- same = !new && !changed
81
+ # abort entirely if matching target not found
82
+ raise SyncError, "no target for path '#{path}'" if target.nil?
79
83
 
80
- next if same
84
+ # new paths are not in previously applied paths
85
+ new = !current.paths.include?(path)
81
86
 
82
- # match content with path and target
83
- content = contents.find_content(path, target)
87
+ # updated paths are in previously applied paths
88
+ # but the content hash changed
89
+ changed = current.paths.include?(path) && !current.contents.find_content(path, target)
84
90
 
85
- # abort entirely if matching content not found
86
- raise SyncError, "no valid content for target at path '#{path}'" if content.nil?
91
+ # skip if unchanged
92
+ same = !new && !changed
87
93
 
88
- # to be added or updated << config
89
- # TODO: metadata (hash, version, etc...)
90
- transaction.insert(path, target, content) if new
91
- transaction.update(path, target, content) if changed
92
- end
94
+ next if same
93
95
 
94
- # save backend opaque backend state
95
- transaction.set(opaque_backend_state: targets.opaque_backend_state)
96
- transaction.set(targets_version: targets.version)
96
+ # match content with path and target
97
+ content = contents.find_content(path, target)
97
98
 
98
- # upon transaction end, new list of applied config + metadata (add, change, remove) will be saved
99
- # TODO: also remove stale config (matching removed) from cache (client configs is exhaustive list of paths)
100
- end
99
+ # abort entirely if matching content not found
100
+ raise SyncError, "no valid content for target at path '#{path}'" if content.nil?
101
101
 
102
- if changes.empty?
103
- Datadog.logger.debug { 'remote: no changes' }
104
- else
105
- dispatcher.dispatch(changes, repository)
102
+ # to be added or updated << config
103
+ # TODO: metadata (hash, version, etc...)
104
+ transaction.insert(path, target, content) if new
105
+ transaction.update(path, target, content) if changed
106
106
  end
107
- elsif response.internal_error?
108
- raise TransportError, response.to_s
107
+
108
+ # save backend opaque backend state
109
+ transaction.set(opaque_backend_state: targets.opaque_backend_state)
110
+ transaction.set(targets_version: targets.version)
111
+
112
+ # upon transaction end, new list of applied config + metadata (add, change, remove) will be saved
113
+ # TODO: also remove stale config (matching removed) from cache (client configs is exhaustive list of paths)
109
114
  end
110
- end
111
- # rubocop:enable Metrics/AbcSize,Metrics/PerceivedComplexity,Metrics/MethodLength,Metrics/CyclomaticComplexity
112
115
 
113
- private
116
+ if changes.empty?
117
+ logger.debug { 'remote: no changes' }
118
+ else
119
+ dispatcher.dispatch(changes, repository)
120
+ end
121
+ end
114
122
 
115
- def payload # rubocop:disable Metrics/MethodLength
123
+ def payload # standard:disable Metrics/MethodLength
116
124
  state = repository.state
117
125
 
118
126
  client_tracer_tags = [
@@ -127,12 +135,19 @@ module Datadog
127
135
  "ruby.runtime.engine.name:#{RUBY_ENGINE}",
128
136
  "ruby.runtime.engine.version:#{ruby_engine_version}",
129
137
  "ruby.rubygems.platform.local:#{Gem::Platform.local}",
130
- "ruby.gem.libddwaf.version:#{gem_spec('libddwaf').version}",
131
- "ruby.gem.libddwaf.platform:#{gem_spec('libddwaf').platform}",
132
- "ruby.gem.libdatadog.version:#{gem_spec('libdatadog').version}",
133
- "ruby.gem.libdatadog.platform:#{gem_spec('libdatadog').platform}",
138
+ "ruby.gem.libddwaf.version:#{gem_spec("libddwaf").version}",
139
+ "ruby.gem.libddwaf.platform:#{gem_spec("libddwaf").platform}",
140
+ "ruby.gem.libdatadog.version:#{gem_spec("libdatadog").version}",
141
+ "ruby.gem.libdatadog.platform:#{gem_spec("libdatadog").platform}",
134
142
  ]
135
143
 
144
+ if (git_repository_url = Core::Environment::Git.git_repository_url)
145
+ client_tracer_tags << "git.repository_url:#{git_repository_url}"
146
+ end
147
+ if (git_commit_sha = Core::Environment::Git.git_commit_sha)
148
+ client_tracer_tags << "git.commit.sha:#{git_commit_sha}"
149
+ end
150
+
136
151
  client_tracer = {
137
152
  runtime_id: Core::Environment::Identity.id,
138
153
  language: Core::Environment::Identity.lang,
@@ -188,37 +203,37 @@ module Datadog
188
203
  return @native_platform unless @native_platform.nil?
189
204
 
190
205
  os = if RUBY_ENGINE == 'jruby'
191
- os_name = java.lang.System.get_property('os.name')
206
+ os_name = java.lang.System.get_property('os.name')
192
207
 
193
- case os_name
194
- when /linux/i then 'linux'
195
- when /mac/i then 'darwin'
196
- else os_name
197
- end
198
- else
199
- Gem::Platform.local.os
200
- end
208
+ case os_name
209
+ when /linux/i then 'linux'
210
+ when /mac/i then 'darwin'
211
+ else os_name
212
+ end
213
+ else
214
+ Gem::Platform.local.os
215
+ end
201
216
 
202
217
  version = if os != 'linux'
203
- nil
204
- elsif RUBY_PLATFORM =~ /linux-(.+)$/
205
- # Old rubygems don't handle non-gnu linux correctly
206
- Regexp.last_match(1)
207
- else
208
- 'gnu'
209
- end
218
+ nil
219
+ elsif RUBY_PLATFORM =~ /linux-(.+)$/
220
+ # Old rubygems don't handle non-gnu linux correctly
221
+ Regexp.last_match(1)
222
+ else
223
+ 'gnu'
224
+ end
210
225
 
211
226
  cpu = if RUBY_ENGINE == 'jruby'
212
- os_arch = java.lang.System.get_property('os.arch')
213
-
214
- case os_arch
215
- when 'amd64' then 'x86_64'
216
- when 'aarch64' then os == 'darwin' ? 'arm64' : 'aarch64'
217
- else os_arch
218
- end
219
- else
220
- Gem::Platform.local.cpu
221
- end
227
+ os_arch = java.lang.System.get_property('os.arch')
228
+
229
+ case os_arch
230
+ when 'amd64' then 'x86_64'
231
+ when 'aarch64' then (os == 'darwin') ? 'arm64' : 'aarch64'
232
+ else os_arch
233
+ end
234
+ else
235
+ Gem::Platform.local.cpu
236
+ end
222
237
 
223
238
  @native_platform = [cpu, os, version].compact.join('-')
224
239
  end
@@ -13,22 +13,21 @@ module Datadog
13
13
  # Configures the HTTP transport to communicate with the agent
14
14
  # to fetch and sync the remote configuration
15
15
  class Component
16
- attr_reader :client, :healthy
16
+ attr_reader :logger, :client, :healthy
17
17
 
18
- def initialize(settings, capabilities, agent_settings)
19
- transport_options = {}
20
- transport_options[:agent_settings] = agent_settings if agent_settings
18
+ def initialize(settings, capabilities, agent_settings, logger:)
19
+ @logger = logger
21
20
 
22
- negotiation = Negotiation.new(settings, agent_settings)
23
- transport_v7 = Datadog::Core::Remote::Transport::HTTP.v7(**transport_options.dup)
21
+ negotiation = Negotiation.new(settings, agent_settings, logger: logger)
22
+ transport_v7 = Datadog::Core::Remote::Transport::HTTP.v7(agent_settings: agent_settings, logger: logger)
24
23
 
25
24
  @barrier = Barrier.new(settings.remote.boot_timeout_seconds)
26
25
 
27
- @client = Client.new(transport_v7, capabilities)
26
+ @client = Client.new(transport_v7, capabilities, logger: logger)
28
27
  @healthy = false
29
- Datadog.logger.debug { "new remote configuration client: #{@client.id}" }
28
+ logger.debug { "new remote configuration client: #{@client.id}" }
30
29
 
31
- @worker = Worker.new(interval: settings.remote.poll_interval_seconds) do
30
+ @worker = Worker.new(interval: settings.remote.poll_interval_seconds, logger: logger) do
32
31
  unless @healthy || negotiation.endpoint?('/v0.7/config')
33
32
  @barrier.lift
34
33
 
@@ -40,25 +39,25 @@ module Datadog
40
39
  @healthy ||= true
41
40
  rescue Client::SyncError => e
42
41
  # Transient errors due to network or agent. Logged the error but not via telemetry
43
- Datadog.logger.error do
42
+ logger.error do
44
43
  "remote worker client sync error: #{e.message} location: #{Array(e.backtrace).first}. skipping sync"
45
44
  end
46
- rescue StandardError => e
45
+ rescue => e
47
46
  # In case of unexpected errors, reset the negotiation object
48
47
  # given external conditions have changed and the negotiation
49
48
  # negotiation object stores error logging state that should be reset.
50
- negotiation = Negotiation.new(settings, agent_settings)
49
+ negotiation = Negotiation.new(settings, agent_settings, logger: logger)
51
50
 
52
51
  # Transient errors due to network or agent. Logged the error but not via telemetry
53
- Datadog.logger.error do
54
- "remote worker error: #{e.class.name} #{e.message} location: #{Array(e.backtrace).first}. "\
55
- 'reseting client state'
52
+ logger.error do
53
+ "remote worker error: #{e.class.name} #{e.message} location: #{Array(e.backtrace).first}. " \
54
+ 'resetting client state'
56
55
  end
57
56
 
58
57
  # client state is unknown, state might be corrupted
59
- @client = Client.new(transport_v7, capabilities)
58
+ @client = Client.new(transport_v7, capabilities, logger: logger)
60
59
  @healthy = false
61
- Datadog.logger.debug { "new remote configuration client: #{@client.id}" }
60
+ logger.debug { "new remote configuration client: #{@client.id}" }
62
61
 
63
62
  # TODO: bail out if too many errors?
64
63
  end
@@ -152,10 +151,10 @@ module Datadog
152
151
  #
153
152
  # Those checks are instead performed inside the worker loop.
154
153
  # This allows users to upgrade their agent while keeping their application running.
155
- def build(settings, agent_settings, telemetry:)
154
+ def build(settings, agent_settings, logger:, telemetry:)
156
155
  return unless settings.remote.enabled
157
156
 
158
- new(settings, Client::Capabilities.new(settings, telemetry), agent_settings)
157
+ new(settings, Client::Capabilities.new(settings, telemetry), agent_settings, logger: logger)
159
158
  end
160
159
  end
161
160
  end
@@ -29,13 +29,13 @@ module Datadog
29
29
  class << self
30
30
  def hexdigest(type, data)
31
31
  d = case type
32
- when :sha256
33
- ::Digest::SHA256.new
34
- when :sha512
35
- ::Digest::SHA512.new
36
- else
37
- raise InvalidHashTypeError, type
38
- end
32
+ when :sha256
33
+ ::Digest::SHA256.new
34
+ when :sha512
35
+ ::Digest::SHA512.new
36
+ else
37
+ raise InvalidHashTypeError, type
38
+ end
39
39
 
40
40
  while (buf = data.read(DIGEST_CHUNK))
41
41
  d.update(buf)
@@ -30,7 +30,7 @@ module Datadog
30
30
 
31
31
  raise ParseError, "could not parse: #{path.inspect}" if m.nil?
32
32
 
33
- org_id = m['org_id'] ? m['org_id'].to_i : nil
33
+ org_id = m['org_id']&.to_i
34
34
 
35
35
  source = m['source']
36
36
  raise ParseError, 'missing source value' unless source
@@ -272,7 +272,8 @@ module Datadog
272
272
 
273
273
  return deleted(path, previous) if previous && content.nil?
274
274
  return inserted(path, content) if content && previous.nil?
275
- return updated(path, content, previous) if content && previous
275
+
276
+ updated(path, content, previous) if content && previous
276
277
  end
277
278
 
278
279
  def deleted(path, previous)
@@ -7,11 +7,11 @@ module Datadog
7
7
  module Remote
8
8
  # Endpoint negotiation
9
9
  class Negotiation
10
- def initialize(_settings, agent_settings, suppress_logging: {})
11
- transport_options = {}
12
- transport_options[:agent_settings] = agent_settings if agent_settings
10
+ attr_reader :logger
13
11
 
14
- @transport_root = Datadog::Core::Remote::Transport::HTTP.root(**transport_options.dup)
12
+ def initialize(_settings, agent_settings, logger: Datadog.logger, suppress_logging: {})
13
+ @logger = logger
14
+ @transport_root = Datadog::Core::Remote::Transport::HTTP.root(agent_settings: agent_settings, logger: logger)
15
15
  @logged = suppress_logging
16
16
  end
17
17
 
@@ -20,7 +20,7 @@ module Datadog
20
20
 
21
21
  if res.internal_error? && network_error?(res.error)
22
22
  unless @logged[:agent_unreachable]
23
- Datadog.logger.warn { "agent unreachable: cannot negotiate #{path}" }
23
+ logger.warn { "agent unreachable: cannot negotiate #{path}" }
24
24
  @logged[:agent_unreachable] = true
25
25
  end
26
26
 
@@ -29,7 +29,7 @@ module Datadog
29
29
 
30
30
  if res.not_found?
31
31
  unless @logged[:no_info_endpoint]
32
- Datadog.logger.warn { "agent reachable but has no /info endpoint: cannot negotiate #{path}" }
32
+ logger.warn { "agent reachable but has no /info endpoint: cannot negotiate #{path}" }
33
33
  @logged[:no_info_endpoint] = true
34
34
  end
35
35
 
@@ -38,7 +38,7 @@ module Datadog
38
38
 
39
39
  unless res.ok?
40
40
  unless @logged[:unexpected_response]
41
- Datadog.logger.warn { "agent reachable but unexpected response: cannot negotiate #{path}" }
41
+ logger.warn { "agent reachable but unexpected response: cannot negotiate #{path}" }
42
42
  @logged[:unexpected_response] = true
43
43
  end
44
44
 
@@ -47,14 +47,14 @@ module Datadog
47
47
 
48
48
  unless res.endpoints.include?(path)
49
49
  unless @logged[:no_config_endpoint]
50
- Datadog.logger.warn { "agent reachable but does not report #{path}" }
50
+ logger.warn { "agent reachable but does not report #{path}" }
51
51
  @logged[:no_config_endpoint] = true
52
52
  end
53
53
 
54
54
  return false
55
55
  end
56
56
 
57
- Datadog.logger.debug { "agent reachable and reports #{path}" }
57
+ logger.debug { "agent reachable and reports #{path}" }
58
58
 
59
59
  true
60
60
  end
@@ -32,12 +32,13 @@ module Datadog
32
32
 
33
33
  # Config transport
34
34
  class Transport
35
- attr_reader :client, :apis, :default_api, :current_api_id
35
+ attr_reader :client, :apis, :default_api, :current_api_id, :logger
36
36
 
37
- def initialize(apis, default_api)
37
+ def initialize(apis, default_api, logger: Datadog.logger)
38
38
  @apis = apis
39
+ @logger = logger
39
40
 
40
- @client = HTTP::Client.new(current_api)
41
+ @client = HTTP::Client.new(current_api, logger: logger)
41
42
  end
42
43
 
43
44
  ##### there is only one transport! it's negotiation!
@@ -2,24 +2,9 @@
2
2
 
3
3
  require_relative '../../../encoding'
4
4
  require_relative '../../../transport/http/api/map'
5
-
6
- # TODO: Decouple standard transport/http/api/instance
7
- #
8
- # Separate classes are needed because transport/http/traces includes
9
- # Trace::API::Instance which closes over and uses a single spec, which is
10
- # negotiated as either /v3 or /v4 for the whole API at the spec level, but we
11
- # need an independent toplevel path at the endpoint level.
12
- #
13
- # Separate classes are needed because of `include Trace::API::Instance`.
14
- #
15
- # Below should be:
16
- # require_relative '../../../../datadog/core/transport/http/api/spec'
17
- require_relative 'api/spec'
18
-
19
- # TODO: only needed for Negotiation::API::Endpoint
5
+ require_relative '../../../transport/http/api/instance'
6
+ require_relative '../../../transport/http/api/spec'
20
7
  require_relative 'negotiation'
21
-
22
- # TODO: only needed for Config::API::Endpoint
23
8
  require_relative 'config'
24
9
 
25
10
  module Datadog
@@ -36,7 +21,7 @@ module Datadog
36
21
  module_function
37
22
 
38
23
  def defaults
39
- Datadog::Core::Transport::HTTP::API::Map[
24
+ Core::Transport::HTTP::API::Map[
40
25
  ROOT => Spec.new do |s|
41
26
  s.info = Negotiation::API::Endpoint.new(
42
27
  '/info',
@@ -50,6 +35,16 @@ module Datadog
50
35
  end,
51
36
  ]
52
37
  end
38
+
39
+ class Instance < Core::Transport::HTTP::API::Instance
40
+ include Config::API::Instance
41
+ include Negotiation::API::Instance
42
+ end
43
+
44
+ class Spec < Core::Transport::HTTP::API::Spec
45
+ include Config::API::Spec
46
+ include Negotiation::API::Spec
47
+ end
53
48
  end
54
49
  end
55
50
  end
@@ -15,10 +15,11 @@ module Datadog
15
15
  module HTTP
16
16
  # Routes, encodes, and sends tracer data to the trace agent via HTTP.
17
17
  class Client
18
- attr_reader :api
18
+ attr_reader :api, :logger
19
19
 
20
- def initialize(api)
20
+ def initialize(api, logger: Datadog.logger)
21
21
  @api = api
22
+ @logger = logger
22
23
  end
23
24
 
24
25
  def send_request(request, &block)
@@ -27,12 +28,12 @@ module Datadog
27
28
 
28
29
  # Get responses from API
29
30
  yield(api, env)
30
- rescue StandardError => e
31
+ rescue => e
31
32
  message =
32
33
  "Internal error during #{self.class.name} request. Cause: #{e.class.name} #{e.message} " \
33
34
  "Location: #{Array(e.backtrace).first}"
34
35
 
35
- Datadog.logger.debug(message)
36
+ logger.debug(message)
36
37
 
37
38
  Datadog::Core::Transport::InternalErrorResponse.new(e)
38
39
  end