ddtrace 1.12.1 → 1.18.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 (448) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +388 -10
  3. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +3 -5
  4. data/ext/ddtrace_profiling_native_extension/clock_id.h +0 -3
  5. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -22
  6. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +0 -1
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +41 -6
  8. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -0
  9. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +76 -24
  10. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +1 -1
  11. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +292 -27
  12. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +1 -1
  13. data/ext/ddtrace_profiling_native_extension/extconf.rb +40 -10
  14. data/ext/ddtrace_profiling_native_extension/http_transport.c +48 -16
  15. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +42 -0
  16. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +6 -0
  17. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +1 -1
  18. data/ext/ddtrace_profiling_native_extension/pid_controller.c +57 -0
  19. data/ext/ddtrace_profiling_native_extension/pid_controller.h +45 -0
  20. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +136 -32
  21. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +12 -0
  22. data/ext/ddtrace_profiling_native_extension/profiling.c +1 -2
  23. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +81 -50
  24. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +13 -3
  25. data/ext/ddtrace_profiling_native_extension/time_helpers.c +40 -4
  26. data/ext/ddtrace_profiling_native_extension/time_helpers.h +14 -0
  27. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  28. data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
  29. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  30. data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
  31. data/lib/datadog/appsec/assets.rb +8 -0
  32. data/lib/datadog/appsec/component.rb +21 -2
  33. data/lib/datadog/appsec/configuration/settings.rb +167 -189
  34. data/lib/datadog/appsec/configuration.rb +0 -79
  35. data/lib/datadog/appsec/contrib/auto_instrument.rb +2 -4
  36. data/lib/datadog/appsec/contrib/devise/event.rb +57 -0
  37. data/lib/datadog/appsec/contrib/devise/ext.rb +13 -0
  38. data/lib/datadog/appsec/contrib/devise/integration.rb +42 -0
  39. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +76 -0
  40. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +54 -0
  41. data/lib/datadog/appsec/contrib/devise/patcher.rb +45 -0
  42. data/lib/datadog/appsec/contrib/devise/resource.rb +35 -0
  43. data/lib/datadog/appsec/contrib/devise/tracking.rb +49 -0
  44. data/lib/datadog/appsec/contrib/rack/ext.rb +2 -1
  45. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +6 -2
  46. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  47. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +3 -8
  48. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +3 -6
  49. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +3 -6
  50. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  51. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +36 -17
  52. data/lib/datadog/appsec/contrib/rails/ext.rb +3 -2
  53. data/lib/datadog/appsec/contrib/rails/framework.rb +1 -3
  54. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  55. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -11
  56. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +3 -6
  57. data/lib/datadog/appsec/contrib/sinatra/ext.rb +2 -1
  58. data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -3
  59. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  60. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  61. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +3 -6
  62. data/lib/datadog/appsec/event.rb +106 -50
  63. data/lib/datadog/appsec/extensions.rb +1 -130
  64. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  65. data/lib/datadog/appsec/monitor/reactive/set_user.rb +3 -6
  66. data/lib/datadog/appsec/processor/actions.rb +49 -0
  67. data/lib/datadog/appsec/processor/rule_loader.rb +60 -0
  68. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  69. data/lib/datadog/appsec/processor.rb +35 -7
  70. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  71. data/lib/datadog/appsec/remote.rb +17 -11
  72. data/lib/datadog/appsec/response.rb +82 -4
  73. data/lib/datadog/appsec/sample_rate.rb +21 -0
  74. data/lib/datadog/appsec.rb +3 -4
  75. data/lib/datadog/core/backport.rb +51 -0
  76. data/lib/datadog/core/configuration/agent_settings_resolver.rb +38 -29
  77. data/lib/datadog/core/configuration/base.rb +6 -16
  78. data/lib/datadog/core/configuration/components.rb +15 -3
  79. data/lib/datadog/core/configuration/ext.rb +28 -5
  80. data/lib/datadog/core/configuration/option.rb +269 -21
  81. data/lib/datadog/core/configuration/option_definition.rb +73 -32
  82. data/lib/datadog/core/configuration/options.rb +27 -15
  83. data/lib/datadog/core/configuration/settings.rb +182 -102
  84. data/lib/datadog/core/configuration.rb +4 -0
  85. data/lib/datadog/core/diagnostics/environment_logger.rb +130 -234
  86. data/lib/datadog/core/environment/execution.rb +103 -0
  87. data/lib/datadog/core/environment/ext.rb +13 -11
  88. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  89. data/lib/datadog/core/environment/yjit.rb +58 -0
  90. data/lib/datadog/core/error.rb +1 -0
  91. data/lib/datadog/core/git/ext.rb +26 -22
  92. data/lib/datadog/core/logging/ext.rb +3 -1
  93. data/lib/datadog/core/metrics/ext.rb +7 -5
  94. data/lib/datadog/core/remote/client/capabilities.rb +6 -1
  95. data/lib/datadog/core/remote/client.rb +3 -0
  96. data/lib/datadog/core/remote/component.rb +27 -36
  97. data/lib/datadog/core/remote/configuration/content.rb +28 -1
  98. data/lib/datadog/core/remote/configuration/repository.rb +3 -1
  99. data/lib/datadog/core/remote/ext.rb +1 -1
  100. data/lib/datadog/core/remote/negotiation.rb +19 -6
  101. data/lib/datadog/core/remote/transport/config.rb +60 -0
  102. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  103. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  104. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  105. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  106. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  107. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  108. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  109. data/lib/datadog/core/remote/transport/http.rb +179 -0
  110. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  111. data/lib/datadog/core/remote/worker.rb +4 -1
  112. data/lib/datadog/core/runtime/ext.rb +22 -12
  113. data/lib/datadog/core/runtime/metrics.rb +43 -0
  114. data/lib/datadog/core/telemetry/client.rb +12 -2
  115. data/lib/datadog/core/telemetry/collector.rb +13 -4
  116. data/lib/datadog/core/telemetry/emitter.rb +4 -2
  117. data/lib/datadog/core/telemetry/event.rb +19 -4
  118. data/lib/datadog/core/telemetry/ext.rb +4 -1
  119. data/lib/datadog/core/telemetry/heartbeat.rb +2 -4
  120. data/lib/datadog/core/telemetry/http/ext.rb +10 -8
  121. data/lib/datadog/core/telemetry/http/transport.rb +2 -0
  122. data/lib/datadog/core/telemetry/v2/app_client_configuration_change.rb +41 -0
  123. data/lib/datadog/core/telemetry/v2/request.rb +29 -0
  124. data/lib/datadog/core/transport/ext.rb +47 -0
  125. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  126. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  127. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  128. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  129. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  130. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  131. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  132. data/lib/datadog/core/transport/http/env.rb +62 -0
  133. data/lib/datadog/core/transport/http/response.rb +60 -0
  134. data/lib/datadog/core/transport/parcel.rb +22 -0
  135. data/lib/datadog/core/transport/request.rb +17 -0
  136. data/lib/datadog/core/transport/response.rb +64 -0
  137. data/lib/datadog/core/utils/duration.rb +52 -0
  138. data/lib/datadog/core/utils/hash.rb +47 -0
  139. data/lib/datadog/core/utils/network.rb +1 -1
  140. data/lib/datadog/core/utils/safe_dup.rb +27 -20
  141. data/lib/datadog/core/utils.rb +1 -1
  142. data/lib/datadog/core/workers/async.rb +3 -2
  143. data/lib/datadog/core/workers/polling.rb +2 -2
  144. data/lib/datadog/kit/appsec/events.rb +139 -89
  145. data/lib/datadog/kit/enable_core_dumps.rb +5 -6
  146. data/lib/datadog/kit/identity.rb +80 -65
  147. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  148. data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
  149. data/lib/datadog/opentelemetry/sdk/span_processor.rb +48 -5
  150. data/lib/datadog/opentelemetry/sdk/trace/span.rb +167 -0
  151. data/lib/datadog/opentelemetry/trace.rb +58 -0
  152. data/lib/datadog/opentelemetry.rb +1 -0
  153. data/lib/datadog/opentracer/text_map_propagator.rb +2 -1
  154. data/lib/datadog/opentracer.rb +9 -0
  155. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +16 -17
  156. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +3 -1
  157. data/lib/datadog/profiling/collectors/thread_context.rb +17 -2
  158. data/lib/datadog/profiling/component.rb +69 -94
  159. data/lib/datadog/profiling/diagnostics/environment_logger.rb +39 -0
  160. data/lib/datadog/profiling/exporter.rb +5 -1
  161. data/lib/datadog/profiling/ext.rb +0 -12
  162. data/lib/datadog/profiling/flush.rb +7 -5
  163. data/lib/datadog/profiling/http_transport.rb +19 -6
  164. data/lib/datadog/profiling/load_native_extension.rb +7 -1
  165. data/lib/datadog/profiling/native_extension.rb +0 -21
  166. data/lib/datadog/profiling/profiler.rb +36 -13
  167. data/lib/datadog/profiling/scheduler.rb +16 -9
  168. data/lib/datadog/profiling.rb +16 -78
  169. data/lib/datadog/tracing/component.rb +70 -11
  170. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  171. data/lib/datadog/tracing/configuration/dynamic/option.rb +71 -0
  172. data/lib/datadog/tracing/configuration/dynamic.rb +64 -0
  173. data/lib/datadog/tracing/configuration/ext.rb +40 -32
  174. data/lib/datadog/tracing/configuration/http.rb +74 -0
  175. data/lib/datadog/tracing/configuration/settings.rb +134 -98
  176. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +9 -6
  177. data/lib/datadog/tracing/contrib/action_cable/ext.rb +20 -18
  178. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +9 -6
  179. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +20 -18
  180. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +9 -7
  181. data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -8
  182. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +9 -6
  183. data/lib/datadog/tracing/contrib/action_view/ext.rb +12 -10
  184. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +13 -7
  185. data/lib/datadog/tracing/contrib/active_job/ext.rb +25 -23
  186. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +1 -1
  187. data/lib/datadog/tracing/contrib/active_job/patcher.rb +1 -1
  188. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +9 -6
  189. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +12 -10
  190. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +18 -11
  191. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +9 -7
  192. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -6
  193. data/lib/datadog/tracing/contrib/active_record/ext.rb +17 -15
  194. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  195. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -202
  196. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  197. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +9 -7
  198. data/lib/datadog/tracing/contrib/active_support/ext.rb +18 -16
  199. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +14 -7
  200. data/lib/datadog/tracing/contrib/aws/ext.rb +37 -24
  201. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +16 -5
  202. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +3 -2
  203. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
  204. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +4 -2
  205. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
  206. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
  207. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +8 -1
  208. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  209. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  210. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +20 -7
  211. data/lib/datadog/tracing/contrib/dalli/ext.rb +26 -11
  212. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +17 -8
  213. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +13 -7
  214. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +16 -14
  215. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +14 -7
  216. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +21 -15
  217. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +104 -99
  218. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +16 -9
  219. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +48 -3
  220. data/lib/datadog/tracing/contrib/ethon/ext.rb +19 -11
  221. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +6 -3
  222. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +19 -10
  223. data/lib/datadog/tracing/contrib/excon/ext.rb +16 -8
  224. data/lib/datadog/tracing/contrib/excon/middleware.rb +25 -5
  225. data/lib/datadog/tracing/contrib/ext.rb +26 -1
  226. data/lib/datadog/tracing/contrib/extensions.rb +32 -0
  227. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +20 -10
  228. data/lib/datadog/tracing/contrib/faraday/ext.rb +16 -8
  229. data/lib/datadog/tracing/contrib/faraday/middleware.rb +21 -5
  230. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +8 -6
  231. data/lib/datadog/tracing/contrib/grape/ext.rb +16 -14
  232. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +8 -6
  233. data/lib/datadog/tracing/contrib/graphql/ext.rb +7 -5
  234. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +39 -9
  235. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +39 -20
  236. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +37 -18
  237. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  238. data/lib/datadog/tracing/contrib/grpc/ext.rb +16 -13
  239. data/lib/datadog/tracing/contrib/grpc/formatting.rb +127 -0
  240. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +3 -2
  241. data/lib/datadog/tracing/contrib/hanami/ext.rb +10 -8
  242. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +5 -8
  243. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +33 -11
  244. data/lib/datadog/tracing/contrib/http/ext.rb +16 -9
  245. data/lib/datadog/tracing/contrib/http/instrumentation.rb +27 -7
  246. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +33 -11
  247. data/lib/datadog/tracing/contrib/httpclient/ext.rb +17 -9
  248. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +22 -5
  249. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +33 -11
  250. data/lib/datadog/tracing/contrib/httprb/ext.rb +16 -9
  251. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +22 -5
  252. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +9 -6
  253. data/lib/datadog/tracing/contrib/kafka/ext.rb +42 -39
  254. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +3 -2
  255. data/lib/datadog/tracing/contrib/lograge/ext.rb +3 -1
  256. data/lib/datadog/tracing/contrib/lograge/instrumentation.rb +2 -17
  257. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +14 -7
  258. data/lib/datadog/tracing/contrib/mongodb/ext.rb +20 -16
  259. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +16 -5
  260. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +17 -14
  261. data/lib/datadog/tracing/contrib/mysql2/ext.rb +15 -10
  262. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +20 -6
  263. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +52 -0
  264. data/lib/datadog/tracing/contrib/opensearch/ext.rb +37 -0
  265. data/lib/datadog/tracing/contrib/opensearch/integration.rb +44 -0
  266. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +135 -0
  267. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +81 -0
  268. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +22 -14
  269. data/lib/datadog/tracing/contrib/pg/ext.rb +22 -19
  270. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +38 -5
  271. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +14 -7
  272. data/lib/datadog/tracing/contrib/presto/ext.rb +25 -20
  273. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +14 -5
  274. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +12 -10
  275. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  276. data/lib/datadog/tracing/contrib/qless/configuration/settings.rb +12 -8
  277. data/lib/datadog/tracing/contrib/qless/ext.rb +14 -12
  278. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +21 -12
  279. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +9 -7
  280. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -5
  281. data/lib/datadog/tracing/contrib/racecar/ext.rb +20 -18
  282. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +16 -12
  283. data/lib/datadog/tracing/contrib/rack/ext.rb +18 -16
  284. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -0
  285. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +63 -0
  286. data/lib/datadog/tracing/contrib/rack/middlewares.rb +8 -49
  287. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +19 -15
  288. data/lib/datadog/tracing/contrib/rails/ext.rb +7 -5
  289. data/lib/datadog/tracing/contrib/rails/log_injection.rb +7 -10
  290. data/lib/datadog/tracing/contrib/rails/patcher.rb +10 -41
  291. data/lib/datadog/tracing/contrib/rails/railtie.rb +3 -3
  292. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +13 -10
  293. data/lib/datadog/tracing/contrib/rake/ext.rb +14 -12
  294. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +17 -9
  295. data/lib/datadog/tracing/contrib/redis/ext.rb +22 -15
  296. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +3 -38
  297. data/lib/datadog/tracing/contrib/redis/tags.rb +16 -7
  298. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
  299. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +13 -7
  300. data/lib/datadog/tracing/contrib/resque/ext.rb +9 -7
  301. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +16 -9
  302. data/lib/datadog/tracing/contrib/rest_client/ext.rb +15 -8
  303. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +25 -5
  304. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +9 -6
  305. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +3 -2
  306. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +3 -1
  307. data/lib/datadog/tracing/contrib/semantic_logger/instrumentation.rb +4 -20
  308. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +9 -6
  309. data/lib/datadog/tracing/contrib/sequel/ext.rb +10 -8
  310. data/lib/datadog/tracing/contrib/sequel/utils.rb +7 -7
  311. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +14 -8
  312. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +14 -12
  313. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +18 -11
  314. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +32 -30
  315. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +11 -9
  316. data/lib/datadog/tracing/contrib/sinatra/env.rb +0 -17
  317. data/lib/datadog/tracing/contrib/sinatra/ext.rb +21 -19
  318. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -14
  319. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +14 -8
  320. data/lib/datadog/tracing/contrib/sneakers/ext.rb +1 -0
  321. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
  322. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +74 -10
  323. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +9 -6
  324. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +9 -6
  325. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +15 -13
  326. data/lib/datadog/tracing/contrib/utils/database.rb +5 -3
  327. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +11 -11
  328. data/lib/datadog/tracing/contrib.rb +1 -0
  329. data/lib/datadog/tracing/correlation.rb +29 -12
  330. data/lib/datadog/tracing/diagnostics/environment_logger.rb +165 -0
  331. data/lib/datadog/tracing/diagnostics/ext.rb +21 -19
  332. data/lib/datadog/tracing/distributed/b3_multi.rb +2 -2
  333. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  334. data/lib/datadog/tracing/distributed/datadog.rb +0 -1
  335. data/lib/datadog/tracing/distributed/propagation.rb +35 -34
  336. data/lib/datadog/tracing/distributed/trace_context.rb +52 -17
  337. data/lib/datadog/tracing/metadata/ext.rb +9 -6
  338. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  339. data/lib/datadog/tracing/remote.rb +78 -0
  340. data/lib/datadog/tracing/sampling/rule_sampler.rb +29 -0
  341. data/lib/datadog/tracing/span_operation.rb +3 -15
  342. data/lib/datadog/tracing/sync_writer.rb +3 -3
  343. data/lib/datadog/tracing/trace_digest.rb +31 -0
  344. data/lib/datadog/tracing/trace_operation.rb +16 -3
  345. data/lib/datadog/tracing/trace_segment.rb +5 -2
  346. data/lib/datadog/tracing/tracer.rb +12 -1
  347. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  348. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  349. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  350. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  351. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  352. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  353. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  354. data/lib/datadog/tracing/transport/http.rb +124 -0
  355. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  356. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  357. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  358. data/lib/datadog/tracing/transport/io.rb +30 -0
  359. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  360. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  361. data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
  362. data/lib/datadog/tracing/transport/traces.rb +224 -0
  363. data/lib/datadog/tracing/workers/trace_writer.rb +6 -4
  364. data/lib/datadog/tracing/workers.rb +4 -2
  365. data/lib/datadog/tracing/writer.rb +5 -2
  366. data/lib/ddtrace/transport/ext.rb +22 -14
  367. data/lib/ddtrace/version.rb +9 -12
  368. data/lib/ddtrace.rb +1 -1
  369. metadata +101 -93
  370. data/lib/datadog/ci/configuration/components.rb +0 -32
  371. data/lib/datadog/ci/configuration/settings.rb +0 -53
  372. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -33
  373. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -20
  374. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  375. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  376. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  377. data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
  378. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -33
  379. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  380. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -19
  381. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  382. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  383. data/lib/datadog/ci/ext/app_types.rb +0 -9
  384. data/lib/datadog/ci/ext/environment.rb +0 -575
  385. data/lib/datadog/ci/ext/settings.rb +0 -10
  386. data/lib/datadog/ci/ext/test.rb +0 -35
  387. data/lib/datadog/ci/extensions.rb +0 -19
  388. data/lib/datadog/ci/flush.rb +0 -38
  389. data/lib/datadog/ci/test.rb +0 -81
  390. data/lib/datadog/ci.rb +0 -20
  391. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  392. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  393. data/lib/datadog/core/configuration/option_set.rb +0 -10
  394. data/lib/datadog/core/transport/config.rb +0 -58
  395. data/lib/datadog/core/transport/http/api.rb +0 -57
  396. data/lib/datadog/core/transport/http/client.rb +0 -45
  397. data/lib/datadog/core/transport/http/config.rb +0 -268
  398. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  399. data/lib/datadog/core/transport/http.rb +0 -169
  400. data/lib/datadog/core/utils/object_set.rb +0 -43
  401. data/lib/datadog/core/utils/string_table.rb +0 -47
  402. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  403. data/lib/datadog/profiling/buffer.rb +0 -43
  404. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  405. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  406. data/lib/datadog/profiling/event.rb +0 -15
  407. data/lib/datadog/profiling/events/stack.rb +0 -82
  408. data/lib/datadog/profiling/old_recorder.rb +0 -107
  409. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  410. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  411. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  412. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  413. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  414. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  415. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  416. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  417. data/lib/datadog/profiling/pprof/template.rb +0 -118
  418. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  419. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  420. data/lib/datadog/tracing/contrib/sinatra/headers.rb +0 -35
  421. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  422. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  423. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  424. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  425. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  426. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  427. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  428. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  429. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  430. data/lib/ddtrace/transport/http/api.rb +0 -39
  431. data/lib/ddtrace/transport/http/builder.rb +0 -176
  432. data/lib/ddtrace/transport/http/client.rb +0 -52
  433. data/lib/ddtrace/transport/http/env.rb +0 -58
  434. data/lib/ddtrace/transport/http/response.rb +0 -58
  435. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  436. data/lib/ddtrace/transport/http/traces.rb +0 -144
  437. data/lib/ddtrace/transport/http.rb +0 -117
  438. data/lib/ddtrace/transport/io/client.rb +0 -85
  439. data/lib/ddtrace/transport/io/response.rb +0 -25
  440. data/lib/ddtrace/transport/io/traces.rb +0 -99
  441. data/lib/ddtrace/transport/io.rb +0 -28
  442. data/lib/ddtrace/transport/parcel.rb +0 -20
  443. data/lib/ddtrace/transport/request.rb +0 -15
  444. data/lib/ddtrace/transport/response.rb +0 -60
  445. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  446. data/lib/ddtrace/transport/statistics.rb +0 -75
  447. data/lib/ddtrace/transport/trace_formatter.rb +0 -198
  448. data/lib/ddtrace/transport/traces.rb +0 -216
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Environment
6
+ # Reports YJIT primitive runtime statistics.
7
+ module YJIT
8
+ module_function
9
+
10
+ # Inline code size
11
+ def inline_code_size
12
+ ::RubyVM::YJIT.runtime_stats[:inline_code_size]
13
+ end
14
+
15
+ # Outlined code size
16
+ def outlined_code_size
17
+ ::RubyVM::YJIT.runtime_stats[:outlined_code_size]
18
+ end
19
+
20
+ # GCed pages
21
+ def freed_page_count
22
+ ::RubyVM::YJIT.runtime_stats[:freed_page_count]
23
+ end
24
+
25
+ # GCed code size
26
+ def freed_code_size
27
+ ::RubyVM::YJIT.runtime_stats[:freed_code_size]
28
+ end
29
+
30
+ # Live pages
31
+ def live_page_count
32
+ ::RubyVM::YJIT.runtime_stats[:live_page_count]
33
+ end
34
+
35
+ # Code GC count
36
+ def code_gc_count
37
+ ::RubyVM::YJIT.runtime_stats[:code_gc_count]
38
+ end
39
+
40
+ # Size of memory region allocated for JIT code
41
+ def code_region_size
42
+ ::RubyVM::YJIT.runtime_stats[:code_region_size]
43
+ end
44
+
45
+ # Total number of object shapes
46
+ def object_shape_count
47
+ ::RubyVM::YJIT.runtime_stats[:object_shape_count]
48
+ end
49
+
50
+ def available?
51
+ defined?(::RubyVM::YJIT) \
52
+ && ::RubyVM::YJIT.enabled? \
53
+ && ::RubyVM::YJIT.respond_to?(:runtime_stats)
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -15,6 +15,7 @@ module Datadog
15
15
  when Array then new(*value)
16
16
  when Exception then new(value.class, value.message, full_backtrace(value))
17
17
  when ContainsMessage then new(value.class, value.message)
18
+ when String then new(nil, value)
18
19
  else BlankError
19
20
  end
20
21
  end
@@ -1,32 +1,36 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datadog
2
4
  module Core
3
5
  module Git
4
6
  # Defines constants for Git tags
5
7
  module Ext
6
- TAG_BRANCH = 'git.branch'.freeze
7
- TAG_REPOSITORY_URL = 'git.repository_url'.freeze
8
- TAG_TAG = 'git.tag'.freeze
8
+ GIT_SHA_LENGTH = 40
9
+
10
+ TAG_BRANCH = 'git.branch'
11
+ TAG_REPOSITORY_URL = 'git.repository_url'
12
+ TAG_TAG = 'git.tag'
9
13
 
10
- TAG_COMMIT_AUTHOR_DATE = 'git.commit.author.date'.freeze
11
- TAG_COMMIT_AUTHOR_EMAIL = 'git.commit.author.email'.freeze
12
- TAG_COMMIT_AUTHOR_NAME = 'git.commit.author.name'.freeze
13
- TAG_COMMIT_COMMITTER_DATE = 'git.commit.committer.date'.freeze
14
- TAG_COMMIT_COMMITTER_EMAIL = 'git.commit.committer.email'.freeze
15
- TAG_COMMIT_COMMITTER_NAME = 'git.commit.committer.name'.freeze
16
- TAG_COMMIT_MESSAGE = 'git.commit.message'.freeze
17
- TAG_COMMIT_SHA = 'git.commit.sha'.freeze
14
+ TAG_COMMIT_AUTHOR_DATE = 'git.commit.author.date'
15
+ TAG_COMMIT_AUTHOR_EMAIL = 'git.commit.author.email'
16
+ TAG_COMMIT_AUTHOR_NAME = 'git.commit.author.name'
17
+ TAG_COMMIT_COMMITTER_DATE = 'git.commit.committer.date'
18
+ TAG_COMMIT_COMMITTER_EMAIL = 'git.commit.committer.email'
19
+ TAG_COMMIT_COMMITTER_NAME = 'git.commit.committer.name'
20
+ TAG_COMMIT_MESSAGE = 'git.commit.message'
21
+ TAG_COMMIT_SHA = 'git.commit.sha'
18
22
 
19
- ENV_REPOSITORY_URL = 'DD_GIT_REPOSITORY_URL'.freeze
20
- ENV_COMMIT_SHA = 'DD_GIT_COMMIT_SHA'.freeze
21
- ENV_BRANCH = 'DD_GIT_BRANCH'.freeze
22
- ENV_TAG = 'DD_GIT_TAG'.freeze
23
- ENV_COMMIT_MESSAGE = 'DD_GIT_COMMIT_MESSAGE'.freeze
24
- ENV_COMMIT_AUTHOR_NAME = 'DD_GIT_COMMIT_AUTHOR_NAME'.freeze
25
- ENV_COMMIT_AUTHOR_EMAIL = 'DD_GIT_COMMIT_AUTHOR_EMAIL'.freeze
26
- ENV_COMMIT_AUTHOR_DATE = 'DD_GIT_COMMIT_AUTHOR_DATE'.freeze
27
- ENV_COMMIT_COMMITTER_NAME = 'DD_GIT_COMMIT_COMMITTER_NAME'.freeze
28
- ENV_COMMIT_COMMITTER_EMAIL = 'DD_GIT_COMMIT_COMMITTER_EMAIL'.freeze
29
- ENV_COMMIT_COMMITTER_DATE = 'DD_GIT_COMMIT_COMMITTER_DATE'.freeze
23
+ ENV_REPOSITORY_URL = 'DD_GIT_REPOSITORY_URL'
24
+ ENV_COMMIT_SHA = 'DD_GIT_COMMIT_SHA'
25
+ ENV_BRANCH = 'DD_GIT_BRANCH'
26
+ ENV_TAG = 'DD_GIT_TAG'
27
+ ENV_COMMIT_MESSAGE = 'DD_GIT_COMMIT_MESSAGE'
28
+ ENV_COMMIT_AUTHOR_NAME = 'DD_GIT_COMMIT_AUTHOR_NAME'
29
+ ENV_COMMIT_AUTHOR_EMAIL = 'DD_GIT_COMMIT_AUTHOR_EMAIL'
30
+ ENV_COMMIT_AUTHOR_DATE = 'DD_GIT_COMMIT_AUTHOR_DATE'
31
+ ENV_COMMIT_COMMITTER_NAME = 'DD_GIT_COMMIT_COMMITTER_NAME'
32
+ ENV_COMMIT_COMMITTER_EMAIL = 'DD_GIT_COMMIT_COMMITTER_EMAIL'
33
+ ENV_COMMIT_COMMITTER_DATE = 'DD_GIT_COMMIT_COMMITTER_DATE'
30
34
  end
31
35
  end
32
36
  end
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datadog
2
4
  module Core
3
5
  module Logging
4
6
  module Ext
5
7
  # The technology from which the log originated.
6
8
  # @see https://docs.datadoghq.com/api/latest/logs/#send-logs
7
- DD_SOURCE = 'ruby'.freeze
9
+ DD_SOURCE = 'ruby'
8
10
  end
9
11
  end
10
12
  end
@@ -1,15 +1,17 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Datadog
2
4
  module Core
3
5
  module Metrics
4
6
  # @public_api
5
7
  module Ext
6
- DEFAULT_HOST = '127.0.0.1'.freeze
8
+ DEFAULT_HOST = '127.0.0.1'
7
9
  DEFAULT_PORT = 8125
8
10
 
9
- TAG_LANG = 'language'.freeze
10
- TAG_LANG_INTERPRETER = 'language-interpreter'.freeze
11
- TAG_LANG_VERSION = 'language-version'.freeze
12
- TAG_TRACER_VERSION = 'tracer-version'.freeze
11
+ TAG_LANG = 'language'
12
+ TAG_LANG_INTERPRETER = 'language-interpreter'
13
+ TAG_LANG_VERSION = 'language-version'
14
+ TAG_TRACER_VERSION = 'tracer-version'
13
15
  end
14
16
  end
15
17
  end
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../../../appsec/remote'
4
+ require_relative '../../../tracing/remote'
4
5
 
5
6
  module Datadog
6
7
  module Core
7
8
  module Remote
8
9
  class Client
9
- # Capbailities
10
+ # Capabilities
10
11
  class Capabilities
11
12
  attr_reader :products, :capabilities, :receivers, :base64_capabilities
12
13
 
@@ -28,6 +29,10 @@ module Datadog
28
29
  register_products(Datadog::AppSec::Remote.products)
29
30
  register_receivers(Datadog::AppSec::Remote.receivers)
30
31
  end
32
+
33
+ register_capabilities(Datadog::Tracing::Remote.capabilities)
34
+ register_products(Datadog::Tracing::Remote.products)
35
+ register_receivers(Datadog::Tracing::Remote.receivers)
31
36
  end
32
37
 
33
38
  def register_capabilities(capabilities)
@@ -10,6 +10,7 @@ module Datadog
10
10
  module Remote
11
11
  # Client communicates with the agent and sync remote configuration
12
12
  class Client
13
+ class TransportError < StandardError; end
13
14
  class SyncError < StandardError; end
14
15
 
15
16
  attr_reader :transport, :repository, :id, :dispatcher
@@ -107,6 +108,8 @@ module Datadog
107
108
  else
108
109
  dispatcher.dispatch(changes, repository)
109
110
  end
111
+ elsif response.internal_error?
112
+ raise TransportError, response.to_s
110
113
  end
111
114
  end
112
115
  # rubocop:enable Metrics/AbcSize,Metrics/PerceivedComplexity,Metrics/MethodLength,Metrics/CyclomaticComplexity
@@ -3,7 +3,7 @@
3
3
  require_relative 'worker'
4
4
  require_relative 'client/capabilities'
5
5
  require_relative 'client'
6
- require_relative '../transport/http'
6
+ require_relative 'transport/http'
7
7
  require_relative '../remote'
8
8
  require_relative 'negotiation'
9
9
 
@@ -22,7 +22,7 @@ module Datadog
22
22
  transport_options[:agent_settings] = agent_settings if agent_settings
23
23
 
24
24
  negotiation = Negotiation.new(settings, agent_settings)
25
- transport_v7 = Datadog::Core::Transport::HTTP.v7(**transport_options.dup)
25
+ transport_v7 = Datadog::Core::Remote::Transport::HTTP.v7(**transport_options.dup)
26
26
 
27
27
  @barrier = Barrier.new(BARRIER_TIMEOUT)
28
28
 
@@ -45,6 +45,11 @@ module Datadog
45
45
  "remote worker client sync error: #{e.message} location: #{Array(e.backtrace).first}. skipping sync"
46
46
  end
47
47
  rescue StandardError => e
48
+ # In case of unexpected errors, reset the negotiation object
49
+ # given external conditions have changed and the negotiation
50
+ # negotiation object stores error logging state that should be reset.
51
+ negotiation = Negotiation.new(settings, agent_settings)
52
+
48
53
  Datadog.logger.error do
49
54
  "remote worker error: #{e.class.name} #{e.message} location: #{Array(e.backtrace).first}. "\
50
55
  'reseting client state'
@@ -62,13 +67,22 @@ module Datadog
62
67
  end
63
68
  end
64
69
 
65
- def barrier(kind)
70
+ # Starts the Remote Configuration worker without waiting for first run
71
+ def start
66
72
  @worker.start
73
+ end
67
74
 
68
- case kind
69
- when :once
70
- @barrier.wait_once
71
- end
75
+ # Is the Remote Configuration worker running?
76
+ def started?
77
+ @worker.started?
78
+ end
79
+
80
+ # If the worker is not initialized, initialize it.
81
+ #
82
+ # Then, waits for one client sync to be executed if `kind` is `:once`.
83
+ def barrier(_kind)
84
+ start
85
+ @barrier.wait_once
72
86
  end
73
87
 
74
88
  def shutdown!
@@ -105,18 +119,6 @@ module Datadog
105
119
  end
106
120
  end
107
121
 
108
- # Wait for next lift to happen
109
- def wait_next(timeout = nil)
110
- @mutex.lock
111
-
112
- timeout ||= @timeout
113
-
114
- # rbs/core has a bug, timeout type is incorrectly ?Integer
115
- @condition.wait(@mutex, _ = timeout)
116
- ensure
117
- @mutex.unlock
118
- end
119
-
120
122
  # Release all current waiters
121
123
  def lift
122
124
  @mutex.lock
@@ -130,26 +132,15 @@ module Datadog
130
132
  end
131
133
 
132
134
  class << self
135
+ # Because the agent might not be available yet, we can't perform agent-specific checks yet, as they
136
+ # would prevent remote configuration from ever running.
137
+ #
138
+ # Those checks are instead performed inside the worker loop.
139
+ # This allows users to upgrade their agent while keeping their application running.
133
140
  def build(settings, agent_settings)
134
141
  return unless settings.remote.enabled
135
142
 
136
- capabilities = Client::Capabilities.new(settings)
137
-
138
- return if capabilities.products.empty?
139
-
140
- negotiation = Negotiation.new(settings, agent_settings)
141
-
142
- unless negotiation.endpoint?('/v0.7/config')
143
- Datadog.logger.error do
144
- 'endpoint unavailable: disabling remote configuration for this process.'
145
- end
146
-
147
- return
148
- end
149
-
150
- Datadog.logger.debug { 'agent reachable and reports remote configuration endpoint' }
151
-
152
- new(settings, capabilities, agent_settings)
143
+ new(settings, Client::Capabilities.new(settings), agent_settings)
153
144
  end
154
145
  end
155
146
  end
@@ -18,12 +18,14 @@ module Datadog
18
18
  end
19
19
  end
20
20
 
21
- attr_reader :path, :data, :hashes
21
+ attr_reader :path, :data, :hashes, :apply_state, :apply_error
22
22
  attr_accessor :version
23
23
 
24
24
  def initialize(path:, data:)
25
25
  @path = path
26
26
  @data = data
27
+ @apply_state = ApplyState::UNACKNOWLEDGED
28
+ @apply_error = nil
27
29
  @hashes = {}
28
30
  @version = 0
29
31
  end
@@ -36,6 +38,31 @@ module Datadog
36
38
  @length ||= @data.size
37
39
  end
38
40
 
41
+ # Sets this configuration as successfully applied.
42
+ def applied
43
+ @apply_state = ApplyState::ACKNOWLEDGED
44
+ @apply_error = nil
45
+ end
46
+
47
+ # Sets this configuration as not successfully applied, with
48
+ # a message describing the error.
49
+ def errored(error_message)
50
+ @apply_state = ApplyState::ERROR
51
+ @apply_error = error_message
52
+ end
53
+
54
+ module ApplyState
55
+ # Default state of configurations.
56
+ # Set until the component consuming the configuration has acknowledged it was applied.
57
+ UNACKNOWLEDGED = 1
58
+
59
+ # Set when the configuration has been successfully applied.
60
+ ACKNOWLEDGED = 2
61
+
62
+ # Set when the configuration has been unsuccessfully applied.
63
+ ERROR = 3
64
+ end
65
+
39
66
  private
40
67
 
41
68
  def compute_and_store_hash(type)
@@ -94,7 +94,9 @@ module Datadog
94
94
  {
95
95
  id: content.path.config_id,
96
96
  version: content.version,
97
- product: content.path.product
97
+ product: content.path.product,
98
+ apply_state: content.apply_state,
99
+ apply_error: content.apply_error,
98
100
  }
99
101
  end
100
102
  end
@@ -5,7 +5,7 @@ module Datadog
5
5
  module Remote
6
6
  module Ext
7
7
  ENV_ENABLED = 'DD_REMOTE_CONFIGURATION_ENABLED'
8
- ENV_POLL_INTERVAL_SECONDS = 'DD_REMOTE_CONFIGURATION_POLL_INTERVAL_SECONDS'
8
+ ENV_POLL_INTERVAL_SECONDS = 'DD_REMOTE_CONFIG_POLL_INTERVAL_SECONDS'
9
9
  end
10
10
  end
11
11
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../transport/http'
3
+ require_relative 'transport/http'
4
4
 
5
5
  module Datadog
6
6
  module Core
@@ -11,32 +11,45 @@ module Datadog
11
11
  transport_options = {}
12
12
  transport_options[:agent_settings] = agent_settings if agent_settings
13
13
 
14
- @transport_root = Datadog::Core::Transport::HTTP.root(**transport_options.dup)
14
+ @transport_root = Datadog::Core::Remote::Transport::HTTP.root(**transport_options.dup)
15
+ @logged = {}
15
16
  end
16
17
 
17
18
  def endpoint?(path)
18
19
  res = @transport_root.send_info
19
20
 
20
21
  if res.internal_error? && network_error?(res.error)
21
- Datadog.logger.error { "agent unreachable: cannot negotiate #{path}" }
22
+ unless @logged[:agent_unreachable]
23
+ Datadog.logger.error { "agent unreachable: cannot negotiate #{path}" }
24
+ @logged[:agent_unreachable] = true
25
+ end
22
26
 
23
27
  return false
24
28
  end
25
29
 
26
30
  if res.not_found?
27
- Datadog.logger.error { "agent reachable but has no /info endpoint: cannot negotiate #{path}" }
31
+ unless @logged[:no_info_endpoint]
32
+ Datadog.logger.error { "agent reachable but has no /info endpoint: cannot negotiate #{path}" }
33
+ @logged[:no_info_endpoint] = true
34
+ end
28
35
 
29
36
  return false
30
37
  end
31
38
 
32
39
  unless res.ok?
33
- Datadog.logger.error { "agent reachable but unexpected response: cannot negotiate #{path}" }
40
+ unless @logged[:unexpected_response]
41
+ Datadog.logger.error { "agent reachable but unexpected response: cannot negotiate #{path}" }
42
+ @logged[:unexpected_response] = true
43
+ end
34
44
 
35
45
  return false
36
46
  end
37
47
 
38
48
  unless res.endpoints.include?(path)
39
- Datadog.logger.error { "agent reachable but does not report #{path}" }
49
+ unless @logged[:no_config_endpoint]
50
+ Datadog.logger.error { "agent reachable but does not report #{path}" }
51
+ @logged[:no_config_endpoint] = true
52
+ end
40
53
 
41
54
  return false
42
55
  end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../core/transport/request'
4
+ require_relative '../../../core/transport/parcel'
5
+
6
+ module Datadog
7
+ module Core
8
+ module Remote
9
+ module Transport
10
+ module Config
11
+ # Data transfer object for encoded traces
12
+ class EncodedParcel
13
+ include Datadog::Core::Transport::Parcel
14
+
15
+ def count
16
+ data.length
17
+ end
18
+ end
19
+
20
+ # Config request
21
+ class Request < Datadog::Core::Transport::Request
22
+ end
23
+
24
+ # Config response
25
+ module Response
26
+ attr_reader :roots, :targets, :target_files, :client_configs
27
+
28
+ def empty?
29
+ @empty
30
+ end
31
+ end
32
+
33
+ # Config transport
34
+ class Transport
35
+ attr_reader :client, :apis, :default_api, :current_api_id
36
+
37
+ def initialize(apis, default_api)
38
+ @apis = apis
39
+
40
+ @client = HTTP::Client.new(current_api)
41
+ end
42
+
43
+ ##### there is only one transport! it's negotiation!
44
+ def send_config(payload)
45
+ json = JSON.dump(payload)
46
+ parcel = EncodedParcel.new(json)
47
+ request = Request.new(parcel)
48
+
49
+ @client.send_config_payload(request)
50
+ end
51
+
52
+ def current_api
53
+ @apis[HTTP::API::V7]
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Remote
6
+ module Transport
7
+ module HTTP
8
+ module API
9
+ # An API configured with adapter and routes
10
+ class Instance
11
+ attr_reader \
12
+ :adapter,
13
+ :headers,
14
+ :spec
15
+
16
+ def initialize(spec, adapter, options = {})
17
+ @spec = spec
18
+ @adapter = adapter
19
+ @headers = options.fetch(:headers, {})
20
+ end
21
+
22
+ def encoder
23
+ spec.encoder
24
+ end
25
+
26
+ def call(env)
27
+ # Add headers to request env, unless empty.
28
+ env.headers.merge!(headers) unless headers.empty?
29
+
30
+ # Send request env to the adapter.
31
+ adapter.call(env)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Remote
6
+ module Transport
7
+ module HTTP
8
+ module API
9
+ # Specification for an HTTP API
10
+ # Defines behaviors without specific configuration details.
11
+ class Spec
12
+ def initialize
13
+ yield(self) if block_given?
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../encoding'
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 '../../../../ddtrace/transport/http/api/spec'
17
+ require_relative 'api/spec'
18
+
19
+ # TODO: only needed for Negotiation::API::Endpoint
20
+ require_relative 'negotiation'
21
+
22
+ # TODO: only needed for Config::API::Endpoint
23
+ require_relative 'config'
24
+
25
+ module Datadog
26
+ module Core
27
+ module Remote
28
+ module Transport
29
+ module HTTP
30
+ # Namespace for API components
31
+ module API
32
+ # Default API versions
33
+ ROOT = 'root'
34
+ V7 = 'v0.7'
35
+
36
+ module_function
37
+
38
+ def defaults
39
+ Datadog::Core::Transport::HTTP::API::Map[
40
+ ROOT => Spec.new do |s|
41
+ s.info = Negotiation::API::Endpoint.new(
42
+ '/info',
43
+ )
44
+ end,
45
+ V7 => Spec.new do |s|
46
+ s.config = Config::API::Endpoint.new(
47
+ '/v0.7/config',
48
+ Core::Encoding::JSONEncoder,
49
+ )
50
+ end,
51
+ ]
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end