datadog 2.12.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 (302) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +154 -2
  3. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +16 -14
  4. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +1 -4
  5. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  6. data/ext/datadog_profiling_native_extension/encoded_profile.c +79 -0
  7. data/ext/datadog_profiling_native_extension/encoded_profile.h +8 -0
  8. data/ext/datadog_profiling_native_extension/extconf.rb +3 -0
  9. data/ext/datadog_profiling_native_extension/heap_recorder.c +8 -1
  10. data/ext/datadog_profiling_native_extension/http_transport.c +60 -94
  11. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +8 -0
  12. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  13. data/ext/datadog_profiling_native_extension/stack_recorder.c +23 -23
  14. data/ext/libdatadog_api/crashtracker.c +11 -12
  15. data/ext/libdatadog_api/crashtracker.h +5 -0
  16. data/ext/libdatadog_api/datadog_ruby_common.c +1 -4
  17. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  18. data/ext/libdatadog_api/init.c +15 -0
  19. data/ext/libdatadog_api/library_config.c +122 -0
  20. data/ext/libdatadog_api/library_config.h +19 -0
  21. data/ext/libdatadog_api/macos_development.md +3 -3
  22. data/ext/libdatadog_api/process_discovery.c +117 -0
  23. data/ext/libdatadog_api/process_discovery.h +5 -0
  24. data/ext/libdatadog_extconf_helpers.rb +1 -1
  25. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +89 -0
  26. data/lib/datadog/appsec/actions_handler.rb +24 -2
  27. data/lib/datadog/appsec/anonymizer.rb +16 -0
  28. data/lib/datadog/appsec/api_security/lru_cache.rb +49 -0
  29. data/lib/datadog/appsec/api_security.rb +9 -0
  30. data/lib/datadog/appsec/assets/waf_rules/README.md +50 -5
  31. data/lib/datadog/appsec/assets/waf_rules/processors.json +239 -10
  32. data/lib/datadog/appsec/assets/waf_rules/scanners.json +926 -17
  33. data/lib/datadog/appsec/autoload.rb +1 -1
  34. data/lib/datadog/appsec/component.rb +29 -20
  35. data/lib/datadog/appsec/compressed_json.rb +40 -0
  36. data/lib/datadog/appsec/configuration/settings.rb +93 -28
  37. data/lib/datadog/appsec/context.rb +1 -1
  38. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +10 -12
  39. data/lib/datadog/appsec/contrib/active_record/integration.rb +2 -2
  40. data/lib/datadog/appsec/contrib/active_record/patcher.rb +22 -22
  41. data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
  42. data/lib/datadog/appsec/contrib/devise/configuration.rb +7 -31
  43. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +78 -0
  44. data/lib/datadog/appsec/contrib/devise/ext.rb +22 -0
  45. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -2
  46. data/lib/datadog/appsec/contrib/devise/patcher.rb +34 -23
  47. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +102 -0
  48. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +69 -0
  49. data/lib/datadog/appsec/contrib/devise/{patcher/rememberable_patch.rb → patches/skip_signin_tracking_patch.rb} +2 -2
  50. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +106 -0
  51. data/lib/datadog/appsec/contrib/excon/integration.rb +1 -1
  52. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +9 -10
  53. data/lib/datadog/appsec/contrib/faraday/integration.rb +1 -1
  54. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +8 -9
  55. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +8 -9
  56. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -1
  57. data/lib/datadog/appsec/contrib/rack/ext.rb +34 -0
  58. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +49 -32
  59. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  60. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +19 -18
  61. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +11 -13
  62. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  63. data/lib/datadog/appsec/contrib/rails/patcher.rb +21 -21
  64. data/lib/datadog/appsec/contrib/rest_client/integration.rb +1 -1
  65. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +10 -11
  66. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -23
  67. data/lib/datadog/appsec/contrib/sinatra/integration.rb +1 -1
  68. data/lib/datadog/appsec/event.rb +96 -135
  69. data/lib/datadog/appsec/ext.rb +4 -2
  70. data/lib/datadog/appsec/instrumentation/gateway/argument.rb +7 -2
  71. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +24 -0
  72. data/lib/datadog/appsec/instrumentation/gateway.rb +17 -22
  73. data/lib/datadog/appsec/metrics/telemetry.rb +1 -1
  74. data/lib/datadog/appsec/monitor/gateway/watcher.rb +49 -14
  75. data/lib/datadog/appsec/processor/rule_loader.rb +26 -28
  76. data/lib/datadog/appsec/processor/rule_merger.rb +7 -6
  77. data/lib/datadog/appsec/processor.rb +1 -1
  78. data/lib/datadog/appsec/remote.rb +23 -11
  79. data/lib/datadog/appsec/response.rb +6 -6
  80. data/lib/datadog/appsec/security_engine/runner.rb +3 -3
  81. data/lib/datadog/appsec/security_event.rb +39 -0
  82. data/lib/datadog/appsec/utils.rb +0 -2
  83. data/lib/datadog/appsec.rb +1 -1
  84. data/lib/datadog/core/buffer/random.rb +18 -2
  85. data/lib/datadog/core/configuration/agent_settings_resolver.rb +5 -5
  86. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +176 -0
  87. data/lib/datadog/core/configuration/components.rb +50 -31
  88. data/lib/datadog/core/configuration/components_state.rb +23 -0
  89. data/lib/datadog/core/configuration/ext.rb +4 -0
  90. data/lib/datadog/core/configuration/option.rb +79 -43
  91. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  92. data/lib/datadog/core/configuration/options.rb +3 -3
  93. data/lib/datadog/core/configuration/settings.rb +68 -35
  94. data/lib/datadog/core/configuration/stable_config.rb +23 -0
  95. data/lib/datadog/core/configuration.rb +40 -16
  96. data/lib/datadog/core/crashtracking/component.rb +3 -10
  97. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  98. data/lib/datadog/core/encoding.rb +1 -1
  99. data/lib/datadog/core/environment/agent_info.rb +4 -3
  100. data/lib/datadog/core/environment/cgroup.rb +10 -12
  101. data/lib/datadog/core/environment/container.rb +38 -40
  102. data/lib/datadog/core/environment/ext.rb +6 -6
  103. data/lib/datadog/core/environment/git.rb +1 -0
  104. data/lib/datadog/core/environment/identity.rb +3 -3
  105. data/lib/datadog/core/environment/platform.rb +3 -3
  106. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  107. data/lib/datadog/core/error.rb +11 -9
  108. data/lib/datadog/core/logger.rb +2 -2
  109. data/lib/datadog/core/metrics/client.rb +20 -21
  110. data/lib/datadog/core/metrics/logging.rb +5 -5
  111. data/lib/datadog/core/process_discovery.rb +32 -0
  112. data/lib/datadog/core/rate_limiter.rb +4 -2
  113. data/lib/datadog/core/remote/client.rb +40 -32
  114. data/lib/datadog/core/remote/component.rb +6 -9
  115. data/lib/datadog/core/remote/configuration/digest.rb +7 -7
  116. data/lib/datadog/core/remote/configuration/path.rb +1 -1
  117. data/lib/datadog/core/remote/configuration/repository.rb +2 -1
  118. data/lib/datadog/core/remote/negotiation.rb +9 -9
  119. data/lib/datadog/core/remote/transport/config.rb +4 -3
  120. data/lib/datadog/core/remote/transport/http/client.rb +5 -4
  121. data/lib/datadog/core/remote/transport/http/config.rb +27 -37
  122. data/lib/datadog/core/remote/transport/http/negotiation.rb +7 -33
  123. data/lib/datadog/core/remote/transport/http.rb +22 -57
  124. data/lib/datadog/core/remote/transport/negotiation.rb +4 -3
  125. data/lib/datadog/core/runtime/metrics.rb +12 -5
  126. data/lib/datadog/core/telemetry/component.rb +78 -53
  127. data/lib/datadog/core/telemetry/emitter.rb +23 -11
  128. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +65 -0
  129. data/lib/datadog/core/telemetry/event/app_closing.rb +18 -0
  130. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +33 -0
  131. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +18 -0
  132. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +58 -0
  133. data/lib/datadog/core/telemetry/event/app_started.rb +179 -0
  134. data/lib/datadog/core/telemetry/event/base.rb +40 -0
  135. data/lib/datadog/core/telemetry/event/distributions.rb +18 -0
  136. data/lib/datadog/core/telemetry/event/generate_metrics.rb +43 -0
  137. data/lib/datadog/core/telemetry/event/log.rb +76 -0
  138. data/lib/datadog/core/telemetry/event/message_batch.rb +42 -0
  139. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +43 -0
  140. data/lib/datadog/core/telemetry/event.rb +17 -472
  141. data/lib/datadog/core/telemetry/http/adapters/net.rb +12 -97
  142. data/lib/datadog/core/telemetry/logger.rb +1 -1
  143. data/lib/datadog/core/telemetry/metric.rb +8 -8
  144. data/lib/datadog/core/telemetry/request.rb +4 -4
  145. data/lib/datadog/core/telemetry/transport/http/api.rb +43 -0
  146. data/lib/datadog/core/telemetry/transport/http/client.rb +49 -0
  147. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +92 -0
  148. data/lib/datadog/core/telemetry/transport/http.rb +63 -0
  149. data/lib/datadog/core/telemetry/transport/telemetry.rb +51 -0
  150. data/lib/datadog/core/telemetry/worker.rb +90 -24
  151. data/lib/datadog/core/transport/http/adapters/test.rb +2 -1
  152. data/lib/datadog/core/transport/http/api/instance.rb +17 -0
  153. data/lib/datadog/core/transport/http/api/spec.rb +17 -0
  154. data/lib/datadog/core/transport/http/builder.rb +18 -16
  155. data/lib/datadog/core/transport/http.rb +39 -2
  156. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +6 -6
  157. data/lib/datadog/core/utils/duration.rb +32 -32
  158. data/lib/datadog/core/utils/forking.rb +2 -2
  159. data/lib/datadog/core/utils/network.rb +6 -6
  160. data/lib/datadog/core/utils/only_once_successful.rb +16 -5
  161. data/lib/datadog/core/utils/time.rb +20 -0
  162. data/lib/datadog/core/utils/truncation.rb +21 -0
  163. data/lib/datadog/core/vendor/multipart-post/multipart/post/composite_read_io.rb +1 -1
  164. data/lib/datadog/core/vendor/multipart-post/multipart/post/multipartable.rb +8 -8
  165. data/lib/datadog/core/vendor/multipart-post/multipart/post/parts.rb +7 -7
  166. data/lib/datadog/core/worker.rb +1 -1
  167. data/lib/datadog/core/workers/async.rb +29 -12
  168. data/lib/datadog/core/workers/interval_loop.rb +12 -1
  169. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  170. data/lib/datadog/core.rb +8 -0
  171. data/lib/datadog/di/boot.rb +34 -0
  172. data/lib/datadog/di/component.rb +0 -2
  173. data/lib/datadog/di/probe_notification_builder.rb +1 -1
  174. data/lib/datadog/di/probe_notifier_worker.rb +16 -16
  175. data/lib/datadog/di/remote.rb +2 -0
  176. data/lib/datadog/di/transport/diagnostics.rb +4 -3
  177. data/lib/datadog/di/transport/http/api.rb +2 -12
  178. data/lib/datadog/di/transport/http/client.rb +4 -3
  179. data/lib/datadog/di/transport/http/diagnostics.rb +7 -34
  180. data/lib/datadog/di/transport/http/input.rb +7 -34
  181. data/lib/datadog/di/transport/http.rb +14 -62
  182. data/lib/datadog/di/transport/input.rb +4 -3
  183. data/lib/datadog/di/utils.rb +5 -0
  184. data/lib/datadog/di.rb +5 -32
  185. data/lib/datadog/error_tracking/collector.rb +87 -0
  186. data/lib/datadog/error_tracking/component.rb +167 -0
  187. data/lib/datadog/error_tracking/configuration/settings.rb +63 -0
  188. data/lib/datadog/error_tracking/configuration.rb +11 -0
  189. data/lib/datadog/error_tracking/ext.rb +18 -0
  190. data/lib/datadog/error_tracking/extensions.rb +16 -0
  191. data/lib/datadog/error_tracking/filters.rb +77 -0
  192. data/lib/datadog/error_tracking.rb +18 -0
  193. data/lib/datadog/kit/appsec/events.rb +12 -0
  194. data/lib/datadog/kit/identity.rb +5 -1
  195. data/lib/datadog/opentelemetry/api/baggage.rb +90 -0
  196. data/lib/datadog/opentelemetry/api/baggage.rbs +26 -0
  197. data/lib/datadog/opentelemetry/api/context.rb +16 -2
  198. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  199. data/lib/datadog/opentelemetry.rb +2 -1
  200. data/lib/datadog/profiling/collectors/code_provenance.rb +1 -1
  201. data/lib/datadog/profiling/collectors/info.rb +3 -0
  202. data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
  203. data/lib/datadog/profiling/encoded_profile.rb +11 -0
  204. data/lib/datadog/profiling/exporter.rb +3 -4
  205. data/lib/datadog/profiling/ext.rb +0 -2
  206. data/lib/datadog/profiling/flush.rb +5 -8
  207. data/lib/datadog/profiling/http_transport.rb +5 -59
  208. data/lib/datadog/profiling/scheduler.rb +8 -1
  209. data/lib/datadog/profiling/stack_recorder.rb +4 -4
  210. data/lib/datadog/profiling/tag_builder.rb +1 -5
  211. data/lib/datadog/profiling.rb +6 -2
  212. data/lib/datadog/tracing/analytics.rb +1 -1
  213. data/lib/datadog/tracing/component.rb +15 -12
  214. data/lib/datadog/tracing/configuration/ext.rb +7 -1
  215. data/lib/datadog/tracing/configuration/settings.rb +18 -2
  216. data/lib/datadog/tracing/context_provider.rb +1 -1
  217. data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
  218. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +4 -1
  219. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +33 -0
  220. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +4 -0
  221. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +2 -4
  222. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +10 -0
  223. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +5 -1
  224. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  225. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -5
  226. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -3
  227. data/lib/datadog/tracing/contrib/ext.rb +1 -0
  228. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -3
  229. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -1
  230. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +3 -0
  231. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +0 -15
  232. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +4 -1
  233. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -10
  234. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -16
  235. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +7 -15
  236. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +27 -0
  237. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +48 -0
  238. data/lib/datadog/tracing/contrib/karafka/ext.rb +27 -0
  239. data/lib/datadog/tracing/contrib/karafka/integration.rb +45 -0
  240. data/lib/datadog/tracing/contrib/karafka/monitor.rb +66 -0
  241. data/lib/datadog/tracing/contrib/karafka/patcher.rb +71 -0
  242. data/lib/datadog/tracing/contrib/karafka.rb +37 -0
  243. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +8 -0
  244. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  245. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +18 -1
  246. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +17 -0
  247. data/lib/datadog/tracing/contrib/opensearch/ext.rb +9 -0
  248. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +5 -1
  249. data/lib/datadog/tracing/contrib/patcher.rb +5 -2
  250. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  251. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -3
  252. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +6 -1
  253. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +3 -0
  254. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +1 -1
  255. data/lib/datadog/tracing/contrib/support.rb +28 -0
  256. data/lib/datadog/tracing/contrib.rb +1 -0
  257. data/lib/datadog/tracing/correlation.rb +9 -2
  258. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  259. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  260. data/lib/datadog/tracing/distributed/baggage.rb +131 -0
  261. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  262. data/lib/datadog/tracing/distributed/propagation.rb +25 -4
  263. data/lib/datadog/tracing/distributed/propagation_policy.rb +42 -0
  264. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  265. data/lib/datadog/tracing/metadata/ext.rb +5 -0
  266. data/lib/datadog/tracing/metadata/metastruct.rb +36 -0
  267. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +42 -0
  268. data/lib/datadog/tracing/metadata.rb +2 -0
  269. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -1
  270. data/lib/datadog/tracing/sampling/span/rule.rb +0 -1
  271. data/lib/datadog/tracing/span.rb +10 -1
  272. data/lib/datadog/tracing/span_event.rb +1 -1
  273. data/lib/datadog/tracing/span_operation.rb +46 -16
  274. data/lib/datadog/tracing/sync_writer.rb +1 -2
  275. data/lib/datadog/tracing/trace_digest.rb +9 -2
  276. data/lib/datadog/tracing/trace_operation.rb +44 -24
  277. data/lib/datadog/tracing/trace_segment.rb +6 -4
  278. data/lib/datadog/tracing/tracer.rb +45 -5
  279. data/lib/datadog/tracing/transport/http/api.rb +2 -10
  280. data/lib/datadog/tracing/transport/http/client.rb +5 -4
  281. data/lib/datadog/tracing/transport/http/traces.rb +13 -41
  282. data/lib/datadog/tracing/transport/http.rb +11 -44
  283. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  284. data/lib/datadog/tracing/transport/trace_formatter.rb +7 -0
  285. data/lib/datadog/tracing/transport/traces.rb +26 -9
  286. data/lib/datadog/tracing/utils.rb +1 -1
  287. data/lib/datadog/tracing/workers/trace_writer.rb +2 -6
  288. data/lib/datadog/tracing/writer.rb +2 -6
  289. data/lib/datadog/tracing.rb +16 -3
  290. data/lib/datadog/version.rb +2 -2
  291. data/lib/datadog.rb +2 -3
  292. metadata +80 -19
  293. data/lib/datadog/appsec/contrib/devise/event.rb +0 -54
  294. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +0 -72
  295. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +0 -47
  296. data/lib/datadog/appsec/contrib/devise/resource.rb +0 -35
  297. data/lib/datadog/appsec/contrib/devise/tracking.rb +0 -57
  298. data/lib/datadog/appsec/utils/trace_operation.rb +0 -15
  299. data/lib/datadog/core/telemetry/http/env.rb +0 -20
  300. data/lib/datadog/core/telemetry/http/ext.rb +0 -28
  301. data/lib/datadog/core/telemetry/http/response.rb +0 -70
  302. data/lib/datadog/core/telemetry/http/transport.rb +0 -90
@@ -1,108 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../response'
3
+ # datadog-ci-rb versions 1.15.0 and lower require this file and guard
4
+ # the require with a rescue of StandardError. Unfortunately LoadError,
5
+ # which would be raised if the file is missing, is not a subclass of
6
+ # StandardError and thus would not be caught by the rescue.
7
+ # We provide this file with a dummy class in it to avoid exceptions
8
+ # in datadog-ci-rb until version 2.0 is released.
9
+ #
10
+ # Note that datadog-ci-rb patches telemetry transport to be "real" even when
11
+ # webmock is used; this patching won't work with datadog-ci-rb versions
12
+ # 1.15.0 and older and dd-trace-rb 2.16.0 and newer. There will be no
13
+ # errors/exceptions reported but telemetry events will not be sent.
4
14
 
5
15
  module Datadog
6
16
  module Core
7
17
  module Telemetry
8
18
  module Http
9
19
  module Adapters
10
- # Class defining methods to make http requests via NET
11
- class Net
12
- attr_reader \
13
- :hostname,
14
- :port,
15
- :timeout,
16
- :ssl
17
-
18
- DEFAULT_TIMEOUT = 2
19
-
20
- def initialize(hostname:, port: nil, timeout: DEFAULT_TIMEOUT, ssl: true)
21
- @hostname = hostname
22
- @port = port
23
- @timeout = timeout
24
- @ssl = ssl.nil? ? true : ssl
25
- end
26
-
27
- def open(&block)
28
- req = ::Net::HTTP.new(@hostname, @port)
29
-
30
- req.use_ssl = @ssl
31
- req.open_timeout = req.read_timeout = @timeout
32
-
33
- req.start(&block)
34
- end
35
-
36
- def post(env)
37
- post = ::Net::HTTP::Post.new(env.path, env.headers)
38
- post.body = env.body
39
-
40
- http_response = open do |http|
41
- http.request(post)
42
- end
43
-
44
- Response.new(http_response)
45
- rescue StandardError => e
46
- Datadog.logger.debug("Unable to send telemetry event to agent: #{e}")
47
- Telemetry::Http::InternalErrorResponse.new(e)
48
- end
49
-
50
- # Data structure for an HTTP Response
51
- class Response
52
- include Datadog::Core::Telemetry::Http::Response
53
-
54
- attr_reader :http_response
55
-
56
- def initialize(http_response)
57
- @http_response = http_response
58
- end
59
-
60
- def payload
61
- return super if http_response.nil?
62
-
63
- http_response.body
64
- end
65
-
66
- def code
67
- return super if http_response.nil?
68
-
69
- http_response.code.to_i
70
- end
71
-
72
- def ok?
73
- return super if http_response.nil?
74
-
75
- code.between?(200, 299)
76
- end
77
-
78
- def unsupported?
79
- return super if http_response.nil?
80
-
81
- code == 415
82
- end
83
-
84
- def not_found?
85
- return super if http_response.nil?
86
-
87
- code == 404
88
- end
89
-
90
- def client_error?
91
- return super if http_response.nil?
92
-
93
- code.between?(400, 499)
94
- end
95
-
96
- def server_error?
97
- return super if http_response.nil?
98
-
99
- code.between?(500, 599)
100
- end
101
-
102
- def inspect
103
- "#{super}, http_response:#{http_response}"
104
- end
105
- end
20
+ class Net # rubocop:disable Lint/EmptyClass
106
21
  end
107
22
  end
108
23
  end
@@ -35,7 +35,7 @@ module Datadog
35
35
  # The downside is: this leaves us unable to report telemetry during component initialization.
36
36
  components = Datadog.send(:components, allow_initialization: false)
37
37
 
38
- if components && components.telemetry
38
+ if components&.telemetry
39
39
  components.telemetry
40
40
  else
41
41
  Datadog.logger.warn(
@@ -20,7 +20,7 @@ module Datadog
20
20
  end
21
21
 
22
22
  def id
23
- @id ||= "#{type}::#{name}::#{tags.join(',')}"
23
+ @id ||= "#{type}::#{name}::#{tags.join(",")}"
24
24
  end
25
25
 
26
26
  def track(value)
@@ -47,7 +47,7 @@ module Datadog
47
47
  values == other.values && tags == other.tags && common == other.common && type == other.type
48
48
  end
49
49
 
50
- alias eql? ==
50
+ alias_method :eql?, :==
51
51
 
52
52
  def hash
53
53
  [self.class, name, values, tags, common, type].hash
@@ -88,7 +88,7 @@ module Datadog
88
88
  super && interval == other.interval
89
89
  end
90
90
 
91
- alias eql? ==
91
+ alias_method :eql?, :==
92
92
 
93
93
  def hash
94
94
  [super, interval].hash
@@ -108,9 +108,9 @@ module Datadog
108
108
  value = value.to_i
109
109
 
110
110
  if values.empty?
111
- values << [Time.now.to_i, value]
111
+ values << [Core::Utils::Time.now.to_i, value]
112
112
  else
113
- values[0][0] = Time.now.to_i
113
+ values[0][0] = Core::Utils::Time.now.to_i
114
114
  values[0][1] += value
115
115
  end
116
116
  nil
@@ -129,9 +129,9 @@ module Datadog
129
129
 
130
130
  def track(value)
131
131
  if values.empty?
132
- values << [Time.now.to_i, value]
132
+ values << [Core::Utils::Time.now.to_i, value]
133
133
  else
134
- values[0][0] = Time.now.to_i
134
+ values[0][0] = Core::Utils::Time.now.to_i
135
135
  values[0][1] = value
136
136
  end
137
137
  nil
@@ -155,7 +155,7 @@ module Datadog
155
155
 
156
156
  def track(value = 1.0)
157
157
  @value += value
158
- @values = [[Time.now.to_i, @value / interval]]
158
+ @values = [[Core::Utils::Time.now.to_i, @value / interval]]
159
159
  nil
160
160
  end
161
161
  end
@@ -11,17 +11,17 @@ module Datadog
11
11
  class << self
12
12
  using Core::Utils::Hash::Refinement
13
13
 
14
- def build_payload(event, seq_id)
14
+ def build_payload(event, seq_id, api_version: 'v2', debug: false)
15
15
  hash = {
16
- api_version: Http::Ext::API_VERSION,
16
+ api_version: api_version,
17
17
  application: application,
18
- debug: false,
18
+ debug: debug,
19
19
  host: host,
20
20
  payload: event.payload,
21
21
  request_type: event.type,
22
22
  runtime_id: Core::Environment::Identity.id,
23
23
  seq_id: seq_id,
24
- tracer_time: Time.now.to_i,
24
+ tracer_time: Core::Utils::Time.now.to_i,
25
25
  }
26
26
  hash.compact!
27
27
  hash
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../encoding'
4
+ require_relative '../../../transport/http/api/map'
5
+ require_relative '../../../transport/http/api/instance'
6
+ require_relative '../../../transport/http/api/spec'
7
+ require_relative 'telemetry'
8
+
9
+ module Datadog
10
+ module Core
11
+ module Telemetry
12
+ module Transport
13
+ module HTTP
14
+ # Namespace for API components
15
+ module API
16
+ # Default API versions
17
+ AGENT_TELEMETRY = 'agent_telemetry'
18
+ AGENTLESS_TELEMETRY = 'agentless_telemetry'
19
+
20
+ module_function
21
+
22
+ def defaults
23
+ Datadog::Core::Transport::HTTP::API::Map[
24
+ AGENT_TELEMETRY => Telemetry::API::Spec.new do |s|
25
+ s.telemetry = Telemetry::API::Endpoint.new(
26
+ '/telemetry/proxy/api/v2/apmtelemetry',
27
+ Core::Encoding::JSONEncoder,
28
+ )
29
+ end,
30
+ AGENTLESS_TELEMETRY => Telemetry::API::Spec.new do |s|
31
+ s.telemetry = Telemetry::API::Endpoint.new(
32
+ '/api/v2/apmtelemetry',
33
+ Core::Encoding::JSONEncoder,
34
+ )
35
+ end,
36
+ ]
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,49 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../transport/http/env'
4
+ require_relative '../../../transport/http/response'
5
+
6
+ # TODO: Decouple transport/http/client
7
+ #
8
+ # The standard one does `include Transport::HTTP::Statistics` and performs
9
+ # stats updates, which may or may not be desirable in general.
10
+
11
+ module Datadog
12
+ module Core
13
+ module Telemetry
14
+ module Transport
15
+ module HTTP
16
+ # Routes, encodes, and sends DI data to the trace agent via HTTP.
17
+ class Client
18
+ attr_reader :api, :logger
19
+
20
+ def initialize(api, logger:)
21
+ @api = api
22
+ @logger = logger
23
+ end
24
+
25
+ def send_request(request, &block)
26
+ # Build request into env
27
+ env = build_env(request)
28
+
29
+ # Get responses from API
30
+ yield(api, env)
31
+ rescue => e
32
+ message =
33
+ "Internal error during #{self.class.name} request. Cause: #{e.class.name} #{e.message} " \
34
+ "Location: #{Array(e.backtrace).first}"
35
+
36
+ logger.debug(message)
37
+
38
+ Datadog::Core::Transport::InternalErrorResponse.new(e)
39
+ end
40
+
41
+ def build_env(request)
42
+ Datadog::Core::Transport::HTTP::Env.new(request)
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../../transport/http/api/endpoint'
4
+ require_relative '../../../transport/http/api/instance'
5
+ require_relative '../../../transport/http/api/spec'
6
+ require_relative '../../../transport/request'
7
+ require_relative 'client'
8
+
9
+ module Datadog
10
+ module Core
11
+ module Telemetry
12
+ module Transport
13
+ module HTTP
14
+ module Telemetry
15
+ module Client
16
+ def send_telemetry_payload(request)
17
+ send_request(request) do |api, env| # steep:ignore
18
+ api.send_telemetry(env)
19
+ end
20
+ end
21
+ end
22
+
23
+ module API
24
+ class Instance < Core::Transport::HTTP::API::Instance
25
+ def send_telemetry(env)
26
+ raise Core::Transport::HTTP::API::Instance::EndpointNotSupportedError.new('telemetry', self) unless spec.is_a?(Telemetry::API::Spec)
27
+
28
+ spec.send_telemetry(env) do |request_env|
29
+ call(request_env)
30
+ end
31
+ end
32
+ end
33
+
34
+ class Spec < Core::Transport::HTTP::API::Spec
35
+ attr_accessor :telemetry
36
+
37
+ def send_telemetry(env, &block)
38
+ raise Core::Transport::HTTP::API::Spec::EndpointNotDefinedError.new('telemetry', self) if telemetry.nil?
39
+
40
+ telemetry.call(env, &block)
41
+ end
42
+ end
43
+
44
+ class Endpoint < Datadog::Core::Transport::HTTP::API::Endpoint
45
+ HEADER_CONTENT_TYPE = 'Content-Type'
46
+
47
+ attr_reader \
48
+ :encoder
49
+
50
+ def initialize(path, encoder)
51
+ super(:post, path)
52
+ @encoder = encoder
53
+ end
54
+
55
+ def call(env, &block)
56
+ # Encode body & type
57
+ env.headers[HEADER_CONTENT_TYPE] = encoder.content_type
58
+ env.headers.update(headers(
59
+ request_type: env.request.request_type,
60
+ api_key: env.request.api_key,
61
+ ))
62
+ env.body = env.request.parcel.data
63
+
64
+ super
65
+ end
66
+
67
+ def headers(request_type:, api_key:, api_version: 'v2')
68
+ {
69
+ Core::Transport::Ext::HTTP::HEADER_DD_INTERNAL_UNTRACED_REQUEST => '1',
70
+ # Provided by encoder
71
+ # 'Content-Type' => 'application/json',
72
+ 'DD-Telemetry-API-Version' => api_version,
73
+ 'DD-Telemetry-Request-Type' => request_type,
74
+ 'DD-Client-Library-Language' => Core::Environment::Ext::LANG,
75
+ 'DD-Client-Library-Version' => Core::Environment::Identity.gem_datadog_version_semver2,
76
+
77
+ # Enable debug mode for telemetry
78
+ # 'DD-Telemetry-Debug-Enabled' => 'true',
79
+ }.tap do |result|
80
+ result['DD-API-KEY'] = api_key unless api_key.nil?
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+
87
+ HTTP::Client.include(Telemetry::Client)
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'telemetry'
4
+ require_relative 'http/api'
5
+ require_relative '../../transport/http'
6
+
7
+ module Datadog
8
+ module Core
9
+ module Telemetry
10
+ module Transport
11
+ # Namespace for HTTP transport components
12
+ module HTTP
13
+ module_function
14
+
15
+ # Builds a new Transport::HTTP::Client with default settings
16
+ # Pass a block to override any settings.
17
+ def agentless_telemetry(
18
+ agent_settings:,
19
+ logger:,
20
+ api_key: nil,
21
+ api_version: nil,
22
+ headers: nil
23
+ )
24
+ Core::Transport::HTTP.build(api_instance_class: Telemetry::API::Instance,
25
+ logger: logger,
26
+ agent_settings: agent_settings,
27
+ api_version: api_version,
28
+ headers: headers) do |transport|
29
+ apis = API.defaults
30
+
31
+ transport.api API::AGENTLESS_TELEMETRY, apis[API::AGENTLESS_TELEMETRY]
32
+
33
+ # Call block to apply any customization, if provided
34
+ yield(transport) if block_given?
35
+ end.to_transport(Core::Telemetry::Transport::Telemetry::Transport).tap do |transport|
36
+ transport.api_key = api_key
37
+ end
38
+ end
39
+
40
+ # Builds a new Transport::HTTP::Client with default settings
41
+ # Pass a block to override any settings.
42
+ def agent_telemetry(
43
+ agent_settings:,
44
+ logger:,
45
+ api_version: nil,
46
+ headers: nil
47
+ )
48
+ Core::Transport::HTTP.build(api_instance_class: Telemetry::API::Instance,
49
+ logger: logger,
50
+ agent_settings: agent_settings, api_version: api_version, headers: headers) do |transport|
51
+ apis = API.defaults
52
+
53
+ transport.api API::AGENT_TELEMETRY, apis[API::AGENT_TELEMETRY]
54
+
55
+ # Call block to apply any customization, if provided
56
+ yield(transport) if block_given?
57
+ end.to_transport(Core::Telemetry::Transport::Telemetry::Transport)
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../../transport/parcel'
4
+ require_relative 'http/client'
5
+ require_relative 'http/telemetry'
6
+
7
+ module Datadog
8
+ module Core
9
+ module Telemetry
10
+ module Transport
11
+ module Telemetry
12
+ class EncodedParcel
13
+ include Datadog::Core::Transport::Parcel
14
+ end
15
+
16
+ class Request < Datadog::Core::Transport::Request
17
+ attr_reader :request_type
18
+ attr_reader :api_key
19
+
20
+ def initialize(request_type, parcel, api_key)
21
+ @request_type = request_type
22
+ super(parcel)
23
+ @api_key = api_key
24
+ end
25
+ end
26
+
27
+ class Transport
28
+ attr_reader :client, :apis, :default_api, :current_api_id, :logger
29
+ attr_accessor :api_key
30
+
31
+ def initialize(apis, default_api, logger:)
32
+ @apis = apis
33
+ @logger = logger
34
+
35
+ @client = HTTP::Client.new(@apis[default_api], logger: logger)
36
+ end
37
+
38
+ def send_telemetry(request_type:, payload:)
39
+ json = JSON.dump(payload)
40
+ parcel = EncodedParcel.new(json)
41
+ request = Request.new(request_type, parcel, api_key)
42
+
43
+ @client.send_telemetry_payload(request)
44
+ # Perform no error checking here
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end