ddtrace 1.10.1 → 1.11.0.beta1

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 (352) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +70 -1
  3. data/README.md +8 -9
  4. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +76 -11
  5. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +26 -3
  6. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +3 -0
  7. data/lib/datadog/appsec/component.rb +40 -6
  8. data/lib/datadog/appsec/configuration/settings.rb +20 -4
  9. data/lib/datadog/appsec/configuration.rb +8 -0
  10. data/lib/datadog/appsec/contrib/auto_instrument.rb +2 -0
  11. data/lib/datadog/appsec/contrib/configuration/settings.rb +2 -0
  12. data/lib/datadog/appsec/contrib/integration.rb +2 -0
  13. data/lib/datadog/appsec/contrib/patcher.rb +2 -0
  14. data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +2 -0
  15. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +4 -15
  16. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +1 -1
  17. data/lib/datadog/appsec/contrib/rack/patcher.rb +2 -0
  18. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +6 -0
  19. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +17 -3
  20. data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +2 -0
  21. data/lib/datadog/appsec/contrib/rails/framework.rb +2 -0
  22. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +1 -1
  23. data/lib/datadog/appsec/contrib/rails/request.rb +2 -0
  24. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -0
  25. data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +2 -0
  26. data/lib/datadog/appsec/contrib/sinatra/framework.rb +2 -0
  27. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +1 -1
  28. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -0
  29. data/lib/datadog/appsec/extensions.rb +2 -0
  30. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +2 -4
  31. data/lib/datadog/appsec/processor/rule_loader.rb +63 -0
  32. data/lib/datadog/appsec/processor/rule_merger.rb +146 -0
  33. data/lib/datadog/appsec/processor.rb +15 -70
  34. data/lib/datadog/appsec/remote.rb +121 -0
  35. data/lib/datadog/appsec/utils/http.rb +2 -0
  36. data/lib/datadog/appsec/utils.rb +2 -0
  37. data/lib/datadog/appsec.rb +18 -4
  38. data/lib/datadog/ci/configuration/components.rb +2 -0
  39. data/lib/datadog/ci/configuration/settings.rb +2 -0
  40. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +2 -0
  41. data/lib/datadog/ci/contrib/cucumber/formatter.rb +2 -0
  42. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +2 -0
  43. data/lib/datadog/ci/contrib/cucumber/patcher.rb +2 -0
  44. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +2 -0
  45. data/lib/datadog/ci/contrib/rspec/patcher.rb +2 -0
  46. data/lib/datadog/ci/extensions.rb +2 -0
  47. data/lib/datadog/ci/flush.rb +2 -0
  48. data/lib/datadog/ci.rb +2 -0
  49. data/lib/datadog/core/buffer/cruby.rb +2 -0
  50. data/lib/datadog/core/buffer/random.rb +2 -0
  51. data/lib/datadog/core/buffer/thread_safe.rb +2 -0
  52. data/lib/datadog/core/chunker.rb +2 -0
  53. data/lib/datadog/core/configuration/agent_settings_resolver.rb +6 -6
  54. data/lib/datadog/core/configuration/components.rb +11 -14
  55. data/lib/datadog/core/configuration/dependency_resolver.rb +2 -0
  56. data/lib/datadog/core/configuration/option.rb +2 -0
  57. data/lib/datadog/core/configuration/option_definition.rb +2 -0
  58. data/lib/datadog/core/configuration/option_definition_set.rb +2 -0
  59. data/lib/datadog/core/configuration/option_set.rb +2 -0
  60. data/lib/datadog/core/configuration/settings.rb +68 -13
  61. data/lib/datadog/core/diagnostics/health.rb +2 -0
  62. data/lib/datadog/core/environment/class_count.rb +2 -0
  63. data/lib/datadog/core/environment/gc.rb +2 -0
  64. data/lib/datadog/core/environment/identity.rb +2 -0
  65. data/lib/datadog/core/environment/socket.rb +2 -0
  66. data/lib/datadog/core/environment/thread_count.rb +2 -0
  67. data/lib/datadog/core/environment/variable_helpers.rb +10 -2
  68. data/lib/datadog/core/environment/vm_cache.rb +2 -0
  69. data/lib/datadog/core/extensions.rb +2 -0
  70. data/lib/datadog/core/header_collection.rb +2 -0
  71. data/lib/datadog/core/metrics/helpers.rb +2 -0
  72. data/lib/datadog/core/metrics/metric.rb +2 -0
  73. data/lib/datadog/core/remote/client/capabilities.rb +57 -0
  74. data/lib/datadog/core/remote/client.rb +146 -0
  75. data/lib/datadog/core/remote/component.rb +150 -0
  76. data/lib/datadog/core/remote/configuration/content.rb +82 -0
  77. data/lib/datadog/core/remote/configuration/digest.rb +62 -0
  78. data/lib/datadog/core/remote/configuration/path.rb +90 -0
  79. data/lib/datadog/core/remote/configuration/repository.rb +278 -0
  80. data/lib/datadog/core/remote/configuration/target.rb +72 -0
  81. data/lib/datadog/core/remote/configuration.rb +18 -0
  82. data/lib/datadog/core/remote/dispatcher.rb +59 -0
  83. data/lib/datadog/core/remote/ext.rb +12 -0
  84. data/lib/datadog/core/remote/worker.rb +96 -0
  85. data/lib/datadog/core/remote.rb +24 -0
  86. data/lib/datadog/core/telemetry/collector.rb +8 -9
  87. data/lib/datadog/core/telemetry/heartbeat.rb +2 -0
  88. data/lib/datadog/core/telemetry/http/env.rb +2 -0
  89. data/lib/datadog/core/telemetry/http/transport.rb +2 -0
  90. data/lib/datadog/core/telemetry/v1/app_event.rb +2 -0
  91. data/lib/datadog/core/telemetry/v1/application.rb +7 -1
  92. data/lib/datadog/core/telemetry/v1/dependency.rb +7 -1
  93. data/lib/datadog/core/telemetry/v1/host.rb +9 -1
  94. data/lib/datadog/core/telemetry/v1/integration.rb +7 -1
  95. data/lib/datadog/core/telemetry/v1/product.rb +9 -1
  96. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +7 -1
  97. data/lib/datadog/core/transport/config.rb +58 -0
  98. data/lib/datadog/core/transport/http/api/instance.rb +37 -0
  99. data/lib/datadog/core/transport/http/api/spec.rb +19 -0
  100. data/lib/datadog/core/transport/http/api.rb +57 -0
  101. data/lib/datadog/core/transport/http/builder.rb +217 -0
  102. data/lib/datadog/core/transport/http/client.rb +45 -0
  103. data/lib/datadog/core/transport/http/config.rb +268 -0
  104. data/lib/datadog/core/transport/http/negotiation.rb +144 -0
  105. data/lib/datadog/core/transport/http.rb +169 -0
  106. data/lib/datadog/core/transport/negotiation.rb +60 -0
  107. data/lib/datadog/core/utils/compression.rb +2 -0
  108. data/lib/datadog/core/utils/hash.rb +32 -0
  109. data/lib/datadog/core/utils/object_set.rb +2 -0
  110. data/lib/datadog/core/utils/safe_dup.rb +20 -2
  111. data/lib/datadog/core/utils/sequence.rb +2 -0
  112. data/lib/datadog/core/utils/time.rb +2 -0
  113. data/lib/datadog/core/worker.rb +2 -0
  114. data/lib/datadog/core/workers/interval_loop.rb +2 -0
  115. data/lib/datadog/core/workers/queue.rb +2 -0
  116. data/lib/datadog/core/workers/runtime_metrics.rb +2 -0
  117. data/lib/datadog/kit.rb +2 -0
  118. data/lib/datadog/opentracer/binary_propagator.rb +2 -0
  119. data/lib/datadog/opentracer/carrier.rb +2 -0
  120. data/lib/datadog/opentracer/global_tracer.rb +2 -0
  121. data/lib/datadog/opentracer/propagator.rb +2 -0
  122. data/lib/datadog/opentracer/scope.rb +2 -0
  123. data/lib/datadog/opentracer/scope_manager.rb +2 -0
  124. data/lib/datadog/opentracer/span_context.rb +2 -0
  125. data/lib/datadog/opentracer/span_context_factory.rb +2 -0
  126. data/lib/datadog/opentracer/thread_local_scope.rb +2 -0
  127. data/lib/datadog/opentracer.rb +2 -0
  128. data/lib/datadog/profiling/backtrace_location.rb +2 -0
  129. data/lib/datadog/profiling/buffer.rb +2 -0
  130. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +19 -3
  131. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +2 -0
  132. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  133. data/lib/datadog/profiling/collectors/stack.rb +2 -0
  134. data/lib/datadog/profiling/collectors/thread_context.rb +2 -2
  135. data/lib/datadog/profiling/component.rb +103 -29
  136. data/lib/datadog/profiling/event.rb +2 -0
  137. data/lib/datadog/profiling/events/stack.rb +2 -0
  138. data/lib/datadog/profiling/ext.rb +28 -26
  139. data/lib/datadog/profiling/flush.rb +2 -0
  140. data/lib/datadog/profiling/native_extension.rb +2 -0
  141. data/lib/datadog/profiling/pprof/message_set.rb +2 -0
  142. data/lib/datadog/profiling/pprof/payload.rb +2 -0
  143. data/lib/datadog/profiling/pprof/string_table.rb +2 -0
  144. data/lib/datadog/profiling/preload.rb +2 -0
  145. data/lib/datadog/profiling/scheduler.rb +3 -1
  146. data/lib/datadog/profiling/stack_recorder.rb +0 -18
  147. data/lib/datadog/profiling/tag_builder.rb +2 -0
  148. data/lib/datadog/profiling/tasks/setup.rb +0 -26
  149. data/lib/datadog/profiling.rb +2 -1
  150. data/lib/datadog/tracing/analytics.rb +2 -0
  151. data/lib/datadog/tracing/configuration/ext.rb +7 -0
  152. data/lib/datadog/tracing/configuration/settings.rb +14 -0
  153. data/lib/datadog/tracing/context.rb +2 -0
  154. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -0
  155. data/lib/datadog/tracing/contrib/action_cable/event.rb +2 -0
  156. data/lib/datadog/tracing/contrib/action_cable/events.rb +2 -0
  157. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +2 -0
  158. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -0
  159. data/lib/datadog/tracing/contrib/action_mailer/event.rb +2 -0
  160. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -0
  161. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +2 -0
  162. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -24
  163. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -0
  164. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +14 -1
  165. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -0
  166. data/lib/datadog/tracing/contrib/action_view/event.rb +2 -0
  167. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -0
  168. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +2 -0
  169. data/lib/datadog/tracing/contrib/active_job/event.rb +2 -0
  170. data/lib/datadog/tracing/contrib/active_job/events.rb +2 -0
  171. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +2 -0
  172. data/lib/datadog/tracing/contrib/active_job/patcher.rb +2 -0
  173. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -0
  174. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +2 -0
  175. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -0
  176. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +2 -0
  177. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +2 -0
  178. data/lib/datadog/tracing/contrib/active_record/event.rb +2 -0
  179. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -0
  180. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -0
  181. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +2 -0
  182. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +2 -0
  183. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -0
  184. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +2 -0
  185. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +2 -0
  186. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -0
  187. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -0
  188. data/lib/datadog/tracing/contrib/analytics.rb +2 -0
  189. data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -0
  190. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +9 -1
  191. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +8 -2
  192. data/lib/datadog/tracing/contrib/aws/patcher.rb +2 -0
  193. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -0
  194. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +2 -0
  195. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +2 -0
  196. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +2 -0
  197. data/lib/datadog/tracing/contrib/configurable.rb +2 -0
  198. data/lib/datadog/tracing/contrib/configuration/resolver.rb +2 -0
  199. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +2 -0
  200. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -0
  201. data/lib/datadog/tracing/contrib/dalli/patcher.rb +2 -0
  202. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +2 -0
  203. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +2 -0
  204. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
  205. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +2 -0
  206. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -0
  207. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -0
  208. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +2 -0
  209. data/lib/datadog/tracing/contrib/ethon/patcher.rb +2 -0
  210. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +2 -0
  211. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -0
  212. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +2 -0
  213. data/lib/datadog/tracing/contrib/faraday/connection.rb +2 -0
  214. data/lib/datadog/tracing/contrib/faraday/rack_builder.rb +2 -0
  215. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +2 -0
  216. data/lib/datadog/tracing/contrib/grape/patcher.rb +2 -0
  217. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +2 -0
  218. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +2 -0
  219. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +2 -0
  220. data/lib/datadog/tracing/contrib/grpc/patcher.rb +2 -0
  221. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +2 -0
  222. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +2 -0
  223. data/lib/datadog/tracing/contrib/hanami/patcher.rb +2 -0
  224. data/lib/datadog/tracing/contrib/hanami/plugin.rb +2 -0
  225. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +2 -0
  226. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +2 -0
  227. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +2 -0
  228. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +2 -0
  229. data/lib/datadog/tracing/contrib/http/integration.rb +2 -0
  230. data/lib/datadog/tracing/contrib/http/patcher.rb +2 -0
  231. data/lib/datadog/tracing/contrib/http_annotation_helper.rb +2 -0
  232. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +2 -0
  233. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +2 -0
  234. data/lib/datadog/tracing/contrib/integration.rb +2 -0
  235. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -0
  236. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +2 -0
  237. data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +2 -0
  238. data/lib/datadog/tracing/contrib/kafka/event.rb +2 -0
  239. data/lib/datadog/tracing/contrib/kafka/events.rb +2 -0
  240. data/lib/datadog/tracing/contrib/kafka/patcher.rb +2 -0
  241. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -0
  242. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -0
  243. data/lib/datadog/tracing/contrib/lograge/patcher.rb +2 -0
  244. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -0
  245. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +2 -0
  246. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +2 -0
  247. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +2 -0
  248. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +2 -0
  249. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -0
  250. data/lib/datadog/tracing/contrib/patchable.rb +2 -0
  251. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +2 -0
  252. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +2 -0
  253. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -0
  254. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -0
  255. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +2 -0
  256. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +2 -0
  257. data/lib/datadog/tracing/contrib/qless/patcher.rb +2 -0
  258. data/lib/datadog/tracing/contrib/qless/tracer_cleaner.rb +2 -0
  259. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +2 -0
  260. data/lib/datadog/tracing/contrib/racecar/event.rb +2 -0
  261. data/lib/datadog/tracing/contrib/racecar/events.rb +2 -0
  262. data/lib/datadog/tracing/contrib/racecar/patcher.rb +2 -0
  263. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +9 -2
  264. data/lib/datadog/tracing/contrib/rails/framework.rb +2 -0
  265. data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -0
  266. data/lib/datadog/tracing/contrib/rails/utils.rb +3 -1
  267. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +2 -0
  268. data/lib/datadog/tracing/contrib/rake/patcher.rb +2 -0
  269. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -0
  270. data/lib/datadog/tracing/contrib/redis/tags.rb +2 -0
  271. data/lib/datadog/tracing/contrib/registerable.rb +2 -0
  272. data/lib/datadog/tracing/contrib/registry.rb +2 -0
  273. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +2 -0
  274. data/lib/datadog/tracing/contrib/resque/patcher.rb +2 -0
  275. data/lib/datadog/tracing/contrib/resque/resque_job.rb +2 -0
  276. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -0
  277. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -0
  278. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +2 -0
  279. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +34 -0
  280. data/lib/datadog/tracing/contrib/roda/ext.rb +18 -0
  281. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +76 -0
  282. data/lib/datadog/tracing/contrib/roda/integration.rb +45 -0
  283. data/lib/datadog/tracing/contrib/roda/patcher.rb +30 -0
  284. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -0
  285. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +3 -0
  286. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -0
  287. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -0
  288. data/lib/datadog/tracing/contrib/sequel/dataset.rb +2 -0
  289. data/lib/datadog/tracing/contrib/sequel/patcher.rb +2 -0
  290. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +2 -0
  291. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +2 -0
  292. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -0
  293. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +12 -3
  294. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +3 -0
  295. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +38 -0
  296. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +2 -0
  297. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
  298. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +2 -0
  299. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +2 -0
  300. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
  301. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +18 -2
  302. data/lib/datadog/tracing/contrib/sidekiq/{tracing.rb → utils.rb} +3 -1
  303. data/lib/datadog/tracing/contrib/sinatra/headers.rb +2 -0
  304. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +2 -0
  305. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +2 -0
  306. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +28 -0
  307. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -0
  308. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +2 -0
  309. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +2 -0
  310. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +2 -2
  311. data/lib/datadog/tracing/contrib.rb +3 -0
  312. data/lib/datadog/tracing/correlation.rb +10 -10
  313. data/lib/datadog/tracing/diagnostics/health.rb +2 -0
  314. data/lib/datadog/tracing/distributed/trace_context.rb +22 -15
  315. data/lib/datadog/tracing/flush.rb +2 -0
  316. data/lib/datadog/tracing/metadata/analytics.rb +2 -0
  317. data/lib/datadog/tracing/metadata/errors.rb +2 -0
  318. data/lib/datadog/tracing/metadata/ext.rb +6 -0
  319. data/lib/datadog/tracing/metadata.rb +2 -0
  320. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -0
  321. data/lib/datadog/tracing/pipeline/span_processor.rb +2 -0
  322. data/lib/datadog/tracing/propagation/http.rb +2 -0
  323. data/lib/datadog/tracing/runtime/metrics.rb +2 -0
  324. data/lib/datadog/tracing/sampling/all_sampler.rb +2 -0
  325. data/lib/datadog/tracing/sampling/matcher.rb +2 -0
  326. data/lib/datadog/tracing/sampling/priority_sampler.rb +2 -0
  327. data/lib/datadog/tracing/sampling/span/sampler.rb +2 -0
  328. data/lib/datadog/tracing/sync_writer.rb +2 -0
  329. data/lib/datadog/tracing/trace_digest.rb +2 -0
  330. data/lib/datadog/tracing/utils.rb +2 -0
  331. data/lib/datadog/tracing.rb +2 -0
  332. data/lib/ddtrace/auto_instrument.rb +2 -0
  333. data/lib/ddtrace/auto_instrument_base.rb +2 -0
  334. data/lib/ddtrace/transport/http/adapters/net.rb +12 -0
  335. data/lib/ddtrace/transport/http/adapters/registry.rb +2 -0
  336. data/lib/ddtrace/transport/http/api/endpoint.rb +2 -0
  337. data/lib/ddtrace/transport/http/api/fallbacks.rb +2 -0
  338. data/lib/ddtrace/transport/http/api/instance.rb +2 -0
  339. data/lib/ddtrace/transport/http/api/map.rb +2 -0
  340. data/lib/ddtrace/transport/http/api/spec.rb +2 -0
  341. data/lib/ddtrace/transport/http/env.rb +2 -0
  342. data/lib/ddtrace/transport/http/response.rb +2 -0
  343. data/lib/ddtrace/transport/io/response.rb +2 -0
  344. data/lib/ddtrace/transport/io/traces.rb +2 -0
  345. data/lib/ddtrace/transport/io.rb +2 -0
  346. data/lib/ddtrace/transport/parcel.rb +2 -0
  347. data/lib/ddtrace/transport/request.rb +3 -1
  348. data/lib/ddtrace/transport/statistics.rb +2 -0
  349. data/lib/ddtrace/transport/trace_formatter.rb +2 -0
  350. data/lib/ddtrace/version.rb +7 -5
  351. data/lib/ddtrace.rb +2 -0
  352. metadata +38 -4
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datadog
2
4
  module Core
3
5
  module Metrics
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../appsec/remote'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Remote
8
+ class Client
9
+ # Capbailities
10
+ class Capabilities
11
+ attr_reader :products, :capabilities, :receivers, :base64_capabilities
12
+
13
+ def initialize(settings)
14
+ @capabilities = []
15
+ @products = []
16
+ @receivers = []
17
+
18
+ register(settings)
19
+
20
+ @base64_capabilities = capabilities_to_base64
21
+ end
22
+
23
+ private
24
+
25
+ def register(settings)
26
+ if settings.appsec.enabled
27
+ register_capabilities(Datadog::AppSec::Remote.capabilities)
28
+ register_products(Datadog::AppSec::Remote.products)
29
+ register_receivers(Datadog::AppSec::Remote.receivers)
30
+ end
31
+ end
32
+
33
+ def register_capabilities(capabilities)
34
+ @capabilities.concat(capabilities)
35
+ end
36
+
37
+ def register_receivers(receivers)
38
+ @receivers.concat(receivers)
39
+ end
40
+
41
+ def register_products(products)
42
+ @products.concat(products)
43
+ end
44
+
45
+ def capabilities_to_base64
46
+ return '' if capabilities.empty?
47
+
48
+ cap_to_hexs = capabilities.reduce(:|).to_s(16).tap { |s| s.size.odd? && s.prepend('0') }.scan(/\h\h/)
49
+ binary = cap_to_hexs.each_with_object([]) { |hex, acc| acc << hex }.map { |e| e.to_i(16) }.pack('C*')
50
+
51
+ Base64.encode64(binary).chomp
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,146 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'securerandom'
4
+
5
+ require_relative 'configuration'
6
+ require_relative 'dispatcher'
7
+
8
+ module Datadog
9
+ module Core
10
+ module Remote
11
+ # Client communicates with the agent and sync remote configuration
12
+ class Client
13
+ class SyncError < StandardError; end
14
+
15
+ attr_reader :transport, :repository, :id, :dispatcher
16
+
17
+ def initialize(transport, capabilities, repository: Configuration::Repository.new)
18
+ @transport = transport
19
+
20
+ @repository = repository
21
+ @id = SecureRandom.uuid
22
+ @dispatcher = Dispatcher.new
23
+ @capabilities = capabilities
24
+
25
+ @capabilities.receivers.each do |receiver|
26
+ dispatcher.receivers << receiver
27
+ end
28
+ end
29
+
30
+ # rubocop:disable Metrics/AbcSize,Metrics/PerceivedComplexity
31
+ def sync
32
+ # TODO: Skip sync if no capabilities are registered
33
+ response = transport.send_config(payload)
34
+
35
+ if response.ok?
36
+ # when response is completely empty, do nothing as in: leave as is
37
+ if response.empty?
38
+ Datadog.logger.debug { 'remote: empty response => NOOP' }
39
+
40
+ return
41
+ end
42
+
43
+ paths = response.client_configs.map do |path|
44
+ Configuration::Path.parse(path)
45
+ end
46
+
47
+ targets = Configuration::TargetMap.parse(response.targets)
48
+
49
+ contents = Configuration::ContentList.parse(response.target_files)
50
+
51
+ # TODO: sometimes it can strangely be so that paths.empty?
52
+ # TODO: sometimes it can strangely be so that targets.empty?
53
+
54
+ changes = repository.transaction do |current, transaction|
55
+ # paths to be removed: previously applied paths minus ingress paths
56
+ (current.paths - paths).each { |p| transaction.delete(p) }
57
+
58
+ # go through each ingress path
59
+ paths.each do |path|
60
+ # match target with path
61
+ target = targets[path]
62
+
63
+ # abort entirely if matching target not found
64
+ raise SyncError, "no target for path '#{path}'" if target.nil?
65
+
66
+ # new paths are not in previously applied paths
67
+ new = !current.paths.include?(path)
68
+
69
+ # updated paths are in previously applied paths
70
+ # but the content hash changed
71
+ changed = current.paths.include?(path) && !current.contents.find_content(path, target)
72
+
73
+ # skip if unchanged
74
+ same = !new && !changed
75
+
76
+ next if same
77
+
78
+ # match content with path and target
79
+ content = contents.find_content(path, target)
80
+
81
+ # abort entirely if matching content not found
82
+ raise SyncError, "no valid content for target at path '#{path}'" if content.nil?
83
+
84
+ # to be added or updated << config
85
+ # TODO: metadata (hash, version, etc...)
86
+ transaction.insert(path, target, content) if new
87
+ transaction.update(path, target, content) if changed
88
+ end
89
+
90
+ # save backend opaque backend state
91
+ transaction.set(opaque_backend_state: targets.opaque_backend_state)
92
+ transaction.set(targets_version: targets.version)
93
+
94
+ # upon transaction end, new list of applied config + metadata (add, change, remove) will be saved
95
+ # TODO: also remove stale config (matching removed) from cache (client configs is exhaustive list of paths)
96
+ end
97
+
98
+ if changes.empty?
99
+ Datadog.logger.debug { 'remote: no changes' }
100
+ else
101
+ dispatcher.dispatch(changes, repository)
102
+ end
103
+ else
104
+ raise SyncError, "unexpected transport response: #{response.inspect}"
105
+ end
106
+ end
107
+ # rubocop:enable Metrics/AbcSize,Metrics/PerceivedComplexity
108
+
109
+ private
110
+
111
+ def payload
112
+ state = repository.state
113
+
114
+ {
115
+ client: {
116
+ state: {
117
+ root_version: state.root_version,
118
+ targets_version: state.targets_version,
119
+ config_states: state.config_states,
120
+ has_error: state.has_error,
121
+ error: state.error,
122
+ backend_client_state: state.opaque_backend_state,
123
+ },
124
+ id: id,
125
+ products: @capabilities.products,
126
+ is_tracer: true,
127
+ is_agent: false,
128
+ client_tracer: {
129
+ runtime_id: Core::Environment::Identity.id,
130
+ language: Core::Environment::Identity.lang,
131
+ tracer_version: Core::Environment::Identity.tracer_version,
132
+ service: Datadog.configuration.service,
133
+ env: Datadog.configuration.env,
134
+ # app_version: app_version, # TODO: I don't know what this is
135
+ tags: [], # TODO: add nice tags!
136
+ },
137
+ # base64 is needed otherwise the Go agent fails with an unmarshal error
138
+ capabilities: @capabilities.base64_capabilities
139
+ },
140
+ cached_target_files: state.cached_target_files,
141
+ }
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'worker'
4
+ require_relative 'client/capabilities'
5
+ require_relative 'client'
6
+ require_relative '../transport/http'
7
+ require_relative '../remote'
8
+
9
+ module Datadog
10
+ module Core
11
+ module Remote
12
+ # Configures the HTTP transport to communicate with the agent
13
+ # to fetch and sync the remote configuration
14
+ class Component
15
+ BARRIER_TIMEOUT = 1.0 # second
16
+
17
+ attr_reader :client
18
+
19
+ def initialize(settings, agent_settings)
20
+ transport_options = {}
21
+ transport_options[:agent_settings] = agent_settings if agent_settings
22
+
23
+ transport_v7 = Datadog::Core::Transport::HTTP.v7(**transport_options.dup)
24
+
25
+ capabilities = Client::Capabilities.new(settings)
26
+
27
+ @barrier = Barrier.new(BARRIER_TIMEOUT)
28
+
29
+ @client = Client.new(transport_v7, capabilities)
30
+ @worker = Worker.new(interval: settings.remote.poll_interval_seconds) do
31
+ begin
32
+ @client.sync
33
+ rescue StandardError => e
34
+ Datadog.logger.error do
35
+ "remote worker error: #{e.class.name} #{e.message} location: #{Array(e.backtrace).first}"
36
+ end
37
+
38
+ # client state is unknown, state might be corrupted
39
+ @client = Client.new(transport_v7, capabilities)
40
+
41
+ # TODO: bail out if too many errors?
42
+ end
43
+
44
+ @barrier.lift
45
+ end
46
+ end
47
+
48
+ def barrier(kind)
49
+ @worker.start
50
+
51
+ case kind
52
+ when :once
53
+ @barrier.wait_once
54
+ end
55
+ end
56
+
57
+ def shutdown!
58
+ @worker.stop
59
+ end
60
+
61
+ # Barrier provides a mechanism to fence execution until a condition happens
62
+ class Barrier
63
+ def initialize(timeout = nil)
64
+ @once = false
65
+ @timeout = timeout
66
+
67
+ @mutex = Mutex.new
68
+ @condition = ConditionVariable.new
69
+ end
70
+
71
+ # Wait for first lift to happen, otherwise don't wait
72
+ def wait_once(timeout = nil)
73
+ # TTAS (Test and Test-And-Set) optimisation
74
+ # Since @once only ever goes from false to true, this is semantically valid
75
+ return if @once
76
+
77
+ begin
78
+ @mutex.lock
79
+
80
+ return if @once
81
+
82
+ timeout ||= @timeout
83
+
84
+ # rbs/core has a bug, timeout type is incorrectly ?Integer
85
+ @condition.wait(@mutex, _ = timeout)
86
+ ensure
87
+ @mutex.unlock
88
+ end
89
+ end
90
+
91
+ # Wait for next lift to happen
92
+ def wait_next(timeout = nil)
93
+ @mutex.lock
94
+
95
+ timeout ||= @timeout
96
+
97
+ # rbs/core has a bug, timeout type is incorrectly ?Integer
98
+ @condition.wait(@mutex, _ = timeout)
99
+ ensure
100
+ @mutex.unlock
101
+ end
102
+
103
+ # Release all current waiters
104
+ def lift
105
+ @mutex.lock
106
+
107
+ @once ||= true
108
+
109
+ @condition.broadcast
110
+ ensure
111
+ @mutex.unlock
112
+ end
113
+ end
114
+
115
+ class << self
116
+ def build(settings, agent_settings)
117
+ return unless settings.remote.enabled
118
+
119
+ transport_options = {}
120
+ transport_options[:agent_settings] = agent_settings if agent_settings
121
+
122
+ transport_root = Datadog::Core::Transport::HTTP.root(**transport_options.dup)
123
+
124
+ res = transport_root.send_info
125
+ if res.ok?
126
+ if res.endpoints.include?('/v0.7/config')
127
+ Datadog.logger.debug { 'agent reachable and reports remote configuration endpoint' }
128
+ else
129
+ Datadog.logger.error do
130
+ 'agent reachable but does not report remote configuration endpoint: ' \
131
+ 'disabling remote configuration for this process.'
132
+ end
133
+
134
+ return
135
+ end
136
+ else
137
+ Datadog.logger.error do
138
+ 'agent unreachable: disabling remote configuration for this process.'
139
+ end
140
+
141
+ return
142
+ end
143
+
144
+ new(settings, agent_settings)
145
+ end
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,82 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'path'
4
+ require_relative 'digest'
5
+
6
+ module Datadog
7
+ module Core
8
+ module Remote
9
+ class Configuration
10
+ # Content stores the information associated with a specific Configuration::Path
11
+ class Content
12
+ class << self
13
+ def parse(hash)
14
+ path = Path.parse(hash[:path])
15
+ data = hash[:content]
16
+
17
+ new(path: path, data: data)
18
+ end
19
+ end
20
+
21
+ attr_reader :path, :data, :hashes
22
+
23
+ def initialize(path:, data:)
24
+ @path = path
25
+ @data = data
26
+ @hashes = {}
27
+ end
28
+
29
+ def hexdigest(type)
30
+ @hashes[type] || compute_and_store_hash(type)
31
+ end
32
+
33
+ def length
34
+ @length ||= @data.size
35
+ end
36
+
37
+ private
38
+
39
+ def compute_and_store_hash(type)
40
+ @hashes[type] = Digest.hexdigest(type, @data)
41
+ end
42
+
43
+ private_class_method :new
44
+ end
45
+
46
+ # ContentList stores a list of Conetnt instances
47
+ # It provides convinient methods for finding content base on Configuration::Path and Configuration::Target
48
+ class ContentList < Array
49
+ class << self
50
+ def parse(array)
51
+ new.concat(array.map { |c| Content.parse(c) })
52
+ end
53
+ end
54
+
55
+ def find_content(path, target)
56
+ find { |c| c.path.eql?(path) && target.check(c) }
57
+ end
58
+
59
+ def [](path)
60
+ find { |c| c.path.eql?(path) }
61
+ end
62
+
63
+ def []=(path, content)
64
+ map! { |c| c.path.eql?(path) ? content : c }
65
+ end
66
+
67
+ def delete(path)
68
+ idx = index { |e| e.path.eql?(path) }
69
+
70
+ return if idx.nil?
71
+
72
+ delete_at(idx)
73
+ end
74
+
75
+ def paths
76
+ map(&:path).uniq
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Remote
8
+ class Configuration
9
+ # Represent a list of Configuration::Digest
10
+ class DigestList < Array
11
+ class << self
12
+ def parse(hash)
13
+ new.concat(hash.map { |type, hexdigest| Digest.new(type, hexdigest) })
14
+ end
15
+ end
16
+
17
+ def check(content)
18
+ map { |digest| digest.check(content) }.reduce(:&)
19
+ end
20
+ end
21
+
22
+ # Stores and validates different cryptographic hash functions
23
+ class Digest
24
+ class InvalidHashTypeError < StandardError; end
25
+ attr_reader :type, :hexdigest
26
+
27
+ DIGEST_CHUNK = 1024
28
+
29
+ class << self
30
+ def hexdigest(type, data)
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
39
+
40
+ while (buf = data.read(DIGEST_CHUNK))
41
+ d.update(buf)
42
+ end
43
+
44
+ d.hexdigest
45
+ ensure
46
+ data.rewind
47
+ end
48
+ end
49
+
50
+ def initialize(type, hexdigest)
51
+ @type = type.to_sym
52
+ @hexdigest = hexdigest
53
+ end
54
+
55
+ def check(content)
56
+ content.hexdigest(@type) == hexdigest
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Remote
6
+ class Configuration
7
+ # Path stores path information
8
+ class Path
9
+ class ParseError < StandardError; end
10
+
11
+ class << self
12
+ RE = %r{
13
+ ^
14
+ (?<source>
15
+ datadog/(?<org_id>\d+)
16
+ |
17
+ employee
18
+ )
19
+ /
20
+ (?<product>[^/]+)
21
+ /
22
+ (?<config_id>[^/]+)
23
+ /
24
+ (?<name>[^/]+)
25
+ $
26
+ }mx.freeze
27
+
28
+ def parse(path)
29
+ m = RE.match(path)
30
+
31
+ raise ParseError, "could not parse: #{path.inspect}" if m.nil?
32
+
33
+ org_id = m['org_id'] ? m['org_id'].to_i : nil
34
+
35
+ source = m['source']
36
+ raise ParseError, 'missing source value' unless source
37
+
38
+ source = source.delete("/#{org_id}") if org_id
39
+
40
+ product = m['product']
41
+ raise ParseError, 'missing product value' unless product
42
+
43
+ config_id = m['config_id']
44
+ raise ParseError, 'missing config_id value' unless config_id
45
+
46
+ name = m['name']
47
+ raise ParseError, 'missing name value' unless name
48
+
49
+ new(source: source, org_id: org_id, product: product, config_id: config_id, name: name)
50
+ end
51
+ end
52
+
53
+ attr_reader :source, :org_id, :product, :config_id, :name
54
+
55
+ def initialize(source:, product:, config_id:, name:, org_id: nil)
56
+ @source = source
57
+ @org_id = org_id
58
+ @product = product
59
+ @config_id = config_id
60
+ @name = name
61
+ end
62
+
63
+ private_class_method :new
64
+
65
+ def to_s
66
+ if org_id
67
+ "#{source}/#{org_id}/#{product}/#{config_id}/#{name}"
68
+ else
69
+ "#{source}/#{product}/#{config_id}/#{name}"
70
+ end
71
+ end
72
+
73
+ def ==(other)
74
+ return false unless other.is_a?(Path)
75
+
76
+ to_s == other.to_s
77
+ end
78
+
79
+ def hash
80
+ to_s.hash
81
+ end
82
+
83
+ def eql?(other)
84
+ hash == other.hash
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end