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
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Telemetry
8
+ module Event
9
+ # Telemetry class for the 'generate-metrics' event
10
+ class GenerateMetrics < Base
11
+ attr_reader :namespace, :metric_series
12
+
13
+ def type
14
+ 'generate-metrics'
15
+ end
16
+
17
+ def initialize(namespace, metric_series)
18
+ super()
19
+ @namespace = namespace
20
+ @metric_series = metric_series
21
+ end
22
+
23
+ def payload
24
+ {
25
+ namespace: @namespace,
26
+ series: @metric_series.map(&:to_h)
27
+ }
28
+ end
29
+
30
+ def ==(other)
31
+ other.is_a?(GenerateMetrics) && other.namespace == @namespace && other.metric_series == @metric_series
32
+ end
33
+
34
+ alias_method :eql?, :==
35
+
36
+ def hash
37
+ [self.class, @namespace, @metric_series].hash
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Telemetry
8
+ module Event
9
+ # Telemetry class for the 'logs' event.
10
+ # Logs with the same content are deduplicated at flush time.
11
+ class Log < Base
12
+ LEVELS = {
13
+ error: 'ERROR',
14
+ warn: 'WARN',
15
+ }.freeze
16
+
17
+ LEVELS_STRING = LEVELS.values.freeze
18
+
19
+ attr_reader :message, :level, :stack_trace, :count
20
+
21
+ def type
22
+ 'logs'
23
+ end
24
+
25
+ # @param message [String] the log message
26
+ # @param level [Symbol, String] the log level. Either :error, :warn, 'ERROR', or 'WARN'.
27
+ # @param stack_trace [String, nil] the stack trace
28
+ # @param count [Integer] the number of times the log was emitted. Used for deduplication.
29
+ def initialize(message:, level:, stack_trace: nil, count: 1)
30
+ super()
31
+ @message = message
32
+ @stack_trace = stack_trace
33
+
34
+ if level.is_a?(String) && LEVELS_STRING.include?(level)
35
+ # String level is used during object copy for deduplication
36
+ @level = level
37
+ elsif level.is_a?(Symbol)
38
+ # Symbol level is used by the regular log emitter user
39
+ @level = LEVELS.fetch(level) { |k| raise ArgumentError, "Invalid log level :#{k}" }
40
+ else
41
+ raise ArgumentError, "Invalid log level #{level}"
42
+ end
43
+
44
+ @count = count
45
+ end
46
+
47
+ def payload
48
+ {
49
+ logs: [
50
+ {
51
+ message: @message,
52
+ level: @level,
53
+ stack_trace: @stack_trace,
54
+ count: @count,
55
+ }.compact
56
+ ]
57
+ }
58
+ end
59
+
60
+ # override equality to allow for deduplication
61
+ def ==(other)
62
+ other.is_a?(Log) &&
63
+ other.message == @message &&
64
+ other.level == @level && other.stack_trace == @stack_trace && other.count == @count
65
+ end
66
+
67
+ alias_method :eql?, :==
68
+
69
+ def hash
70
+ [self.class, @message, @level, @stack_trace, @count].hash
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Telemetry
6
+ module Event
7
+ # Telemetry class for the 'message-batch' event.
8
+ class MessageBatch < Base
9
+ attr_reader :events
10
+
11
+ def type
12
+ 'message-batch'
13
+ end
14
+
15
+ def initialize(events)
16
+ super()
17
+ @events = events
18
+ end
19
+
20
+ def payload
21
+ @events.map do |event|
22
+ {
23
+ request_type: event.type,
24
+ payload: event.payload,
25
+ }
26
+ end
27
+ end
28
+
29
+ def ==(other)
30
+ other.is_a?(MessageBatch) && other.events == @events
31
+ end
32
+
33
+ alias_method :eql?, :==
34
+
35
+ def hash
36
+ [self.class, @events].hash
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+
5
+ module Datadog
6
+ module Core
7
+ module Telemetry
8
+ module Event
9
+ # app-client-configuration-change event emitted instead of
10
+ # app-started event for telemetry startups other than the initial
11
+ # one in a process.
12
+ #
13
+ # dd-trace-rb generally creates a new component tree whenever
14
+ # the tracer is reconfigured via Datadog.configure (with some
15
+ # components potentially reused, if their configuration has not
16
+ # changed). Telemetry system tests on the other hand expect there
17
+ # to be one "tracer" per process, and do not permit multiple
18
+ # app-started events to be emitted.
19
+ #
20
+ # To resolve this conflict, we replace second and onward app-started
21
+ # events with app-client-configuration-change events.
22
+ # To avoid diffing configuration, we send all parameters that are
23
+ # sent in app-started event.
24
+ #
25
+ # It's a "quick fix" on top of a not-so-quick fix that omitted
26
+ # second and subsequent app-started (and app-closing) events in the
27
+ # first place, and only works with the existing hackery of app-started
28
+ # and app-closing events.
29
+ class SynthAppClientConfigurationChange < AppStarted
30
+ def type
31
+ 'app-client-configuration-change'
32
+ end
33
+
34
+ def payload
35
+ {
36
+ configuration: configuration,
37
+ }
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -6,8 +6,10 @@ require_relative '../utils/sequence'
6
6
  module Datadog
7
7
  module Core
8
8
  module Telemetry
9
- # Collection of telemetry events
10
- class Event
9
+ # Collection of telemetry events.
10
+ #
11
+ # @api private
12
+ module Event
11
13
  extend Core::Utils::Forking
12
14
 
13
15
  # returns sequence that increments every time the configuration changes
@@ -15,477 +17,20 @@ module Datadog
15
17
  after_fork! { @sequence = Datadog::Core::Utils::Sequence.new(1) }
16
18
  @sequence ||= Datadog::Core::Utils::Sequence.new(1)
17
19
  end
18
-
19
- # Base class for all Telemetry V2 events.
20
- class Base
21
- # The type of the event.
22
- # It must be one of the stings defined in the Telemetry V2
23
- # specification for event names.
24
- def type
25
- raise NotImplementedError, 'Must be implemented by subclass'
26
- end
27
-
28
- # The JSON payload for the event.
29
- def payload
30
- {}
31
- end
32
-
33
- # Override equality to allow for deduplication
34
- # The basic implementation is to check if the other object is an instance of the same class.
35
- # This works for events that have no attributes.
36
- # For events with attributes, you should override this method to compare the attributes.
37
- def ==(other)
38
- other.is_a?(self.class)
39
- end
40
-
41
- # @see #==
42
- alias eql? ==
43
-
44
- # @see #==
45
- def hash
46
- self.class.hash
47
- end
48
- end
49
-
50
- # Telemetry class for the 'app-started' event
51
- class AppStarted < Base
52
- def type
53
- 'app-started'
54
- end
55
-
56
- def payload
57
- {
58
- products: products,
59
- configuration: configuration,
60
- install_signature: install_signature,
61
- # DEV: Not implemented yet
62
- # error: error, # Start-up errors
63
- }
64
- end
65
-
66
- private
67
-
68
- def products
69
- # @type var products: Hash[Symbol, Hash[Symbol, Object]]
70
- products = {
71
- appsec: {
72
- enabled: Datadog::AppSec.enabled?,
73
- },
74
- profiler: {
75
- enabled: Datadog::Profiling.enabled?,
76
- },
77
- # DEV: Not implemented yet
78
- # dynamic_instrumentation: {
79
- # enabled: true,
80
- # }
81
- }
82
-
83
- if (unsupported_reason = Datadog::Profiling.unsupported_reason)
84
- products[:profiler][:error] = {
85
- code: 1, # Error code. 0 if no error.
86
- message: unsupported_reason,
87
- }
88
- end
89
-
90
- products
91
- end
92
-
93
- TARGET_OPTIONS = %w[
94
- logger.level
95
- profiling.advanced.code_provenance_enabled
96
- profiling.advanced.endpoint.collection.enabled
97
- profiling.enabled
98
- runtime_metrics.enabled
99
- tracing.analytics.enabled
100
- tracing.propagation_style_extract
101
- tracing.propagation_style_inject
102
- tracing.enabled
103
- tracing.log_injection
104
- tracing.partial_flush.enabled
105
- tracing.partial_flush.min_spans_threshold
106
- tracing.report_hostname
107
- tracing.sampling.rate_limit
108
- ].freeze
109
-
110
- # rubocop:disable Metrics/AbcSize
111
- # rubocop:disable Metrics/MethodLength
112
- def configuration
113
- config = Datadog.configuration
114
- seq_id = Event.configuration_sequence.next
115
-
116
- list = [
117
- conf_value('DD_AGENT_HOST', config.agent.host, seq_id),
118
- conf_value('DD_AGENT_TRANSPORT', agent_transport(config), seq_id),
119
- conf_value('DD_TRACE_SAMPLE_RATE', to_value(config.tracing.sampling.default_rate), seq_id),
120
- conf_value(
121
- 'DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED',
122
- config.tracing.contrib.global_default_service_name.enabled,
123
- seq_id
124
- ),
125
- conf_value(
126
- 'DD_TRACE_PEER_SERVICE_DEFAULTS_ENABLED',
127
- config.tracing.contrib.peer_service_defaults,
128
- seq_id
129
- ),
130
- ]
131
-
132
- peer_service_mapping_str = ''
133
- unless config.tracing.contrib.peer_service_mapping.empty?
134
- peer_service_mapping = config.tracing.contrib.peer_service_mapping
135
- peer_service_mapping_str = peer_service_mapping.map { |key, value| "#{key}:#{value}" }.join(',')
136
- end
137
- list << conf_value('DD_TRACE_PEER_SERVICE_MAPPING', peer_service_mapping_str, seq_id)
138
-
139
- # Whitelist of configuration options to send in additional payload object
140
- TARGET_OPTIONS.each do |option|
141
- split_option = option.split('.')
142
- list << conf_value(option, to_value(config.dig(*split_option)), seq_id)
143
- end
144
-
145
- # Add some more custom additional payload values here
146
- list.push(
147
- conf_value('tracing.auto_instrument.enabled', !defined?(Datadog::AutoInstrument::LOADED).nil?, seq_id),
148
- conf_value(
149
- 'tracing.writer_options.buffer_size',
150
- to_value(config.tracing.writer_options[:buffer_size]),
151
- seq_id
152
- ),
153
- conf_value(
154
- 'tracing.writer_options.flush_interval',
155
- to_value(config.tracing.writer_options[:flush_interval]),
156
- seq_id
157
- ),
158
- conf_value(
159
- 'tracing.opentelemetry.enabled',
160
- !defined?(Datadog::OpenTelemetry::LOADED).nil?,
161
- seq_id
162
- ),
163
- )
164
- list << conf_value('logger.instance', config.logger.instance.class.to_s, seq_id) if config.logger.instance
165
- if config.respond_to?('appsec')
166
- list << conf_value('appsec.enabled', config.dig('appsec', 'enabled'), seq_id)
167
- list << conf_value('appsec.sca_enabled', config.dig('appsec', 'sca_enabled'), seq_id)
168
- end
169
- list << conf_value('ci.enabled', config.dig('ci', 'enabled'), seq_id) if config.respond_to?('ci')
170
-
171
- list.reject! { |entry| entry[:value].nil? }
172
- list
173
- end
174
- # rubocop:enable Metrics/AbcSize
175
- # rubocop:enable Metrics/MethodLength
176
-
177
- def agent_transport(config)
178
- adapter = Core::Configuration::AgentSettingsResolver.call(config).adapter
179
- if adapter == Datadog::Core::Transport::Ext::UnixSocket::ADAPTER
180
- 'UDS'
181
- else
182
- 'TCP'
183
- end
184
- end
185
-
186
- def conf_value(name, value, seq_id, origin = 'code')
187
- {
188
- name: name,
189
- value: value,
190
- origin: origin,
191
- seq_id: seq_id,
192
- }
193
- end
194
-
195
- def to_value(value)
196
- # TODO: Add float if telemetry starts accepting it
197
- case value
198
- when Integer, String, true, false, nil
199
- value
200
- else
201
- value.to_s
202
- end
203
- end
204
-
205
- def install_signature
206
- config = Datadog.configuration
207
- {
208
- install_id: config.dig('telemetry', 'install_id'),
209
- install_type: config.dig('telemetry', 'install_type'),
210
- install_time: config.dig('telemetry', 'install_time'),
211
- }
212
- end
213
- end
214
-
215
- # Telemetry class for the 'app-dependencies-loaded' event
216
- class AppDependenciesLoaded < Base
217
- def type
218
- 'app-dependencies-loaded'
219
- end
220
-
221
- def payload
222
- { dependencies: dependencies }
223
- end
224
-
225
- private
226
-
227
- def dependencies
228
- Gem.loaded_specs.collect do |name, gem|
229
- {
230
- name: name,
231
- version: gem.version.to_s,
232
- # hash: nil,
233
- }
234
- end
235
- end
236
- end
237
-
238
- # Telemetry class for the 'app-integrations-change' event
239
- class AppIntegrationsChange < Base
240
- def type
241
- 'app-integrations-change'
242
- end
243
-
244
- def payload
245
- { integrations: integrations }
246
- end
247
-
248
- private
249
-
250
- def integrations
251
- instrumented_integrations = Datadog.configuration.tracing.instrumented_integrations
252
- Datadog.registry.map do |integration|
253
- is_instrumented = instrumented_integrations.include?(integration.name)
254
-
255
- is_enabled = is_instrumented ? !!integration.klass.patcher.patch_successful : false
256
-
257
- version = integration.klass.class.version ? integration.klass.class.version.to_s : nil
258
-
259
- res = {
260
- name: integration.name.to_s,
261
- enabled: is_enabled,
262
- version: version,
263
- compatible: integration.klass.class.compatible?,
264
- error: (patch_error(integration) if is_instrumented && !is_enabled),
265
- # TODO: Track if integration is instrumented by manual configuration or by auto instrumentation
266
- # auto_enabled: is_enabled && ???,
267
- }
268
- res.reject! { |_, v| v.nil? }
269
- res
270
- end
271
- end
272
-
273
- def patch_error(integration)
274
- patch_error_result = integration.klass.patcher.patch_error_result
275
- return patch_error_result.compact.to_s if patch_error_result
276
-
277
- # If no error occurred during patching, but integration is still not instrumented
278
- "Available?: #{integration.klass.class.available?}" \
279
- ", Loaded? #{integration.klass.class.loaded?}" \
280
- ", Compatible? #{integration.klass.class.compatible?}" \
281
- ", Patchable? #{integration.klass.class.patchable?}"
282
- end
283
- end
284
-
285
- # Telemetry class for the 'app-client-configuration-change' event
286
- class AppClientConfigurationChange < Base
287
- attr_reader :changes, :origin
288
-
289
- def type
290
- 'app-client-configuration-change'
291
- end
292
-
293
- def initialize(changes, origin)
294
- super()
295
- @changes = changes
296
- @origin = origin
297
- end
298
-
299
- def payload
300
- { configuration: configuration }
301
- end
302
-
303
- def configuration
304
- config = Datadog.configuration
305
- seq_id = Event.configuration_sequence.next
306
-
307
- res = @changes.map do |name, value|
308
- {
309
- name: name,
310
- value: value,
311
- origin: @origin,
312
- seq_id: seq_id,
313
- }
314
- end
315
-
316
- unless config.dig('appsec', 'sca_enabled').nil?
317
- res << {
318
- name: 'appsec.sca_enabled',
319
- value: config.appsec.sca_enabled,
320
- origin: 'code',
321
- seq_id: seq_id,
322
- }
323
- end
324
-
325
- res
326
- end
327
-
328
- def ==(other)
329
- other.is_a?(AppClientConfigurationChange) && other.changes == @changes && other.origin == @origin
330
- end
331
-
332
- alias eql? ==
333
-
334
- def hash
335
- [self.class, @changes, @origin].hash
336
- end
337
- end
338
-
339
- # Telemetry class for the 'app-heartbeat' event
340
- class AppHeartbeat < Base
341
- def type
342
- 'app-heartbeat'
343
- end
344
- end
345
-
346
- # Telemetry class for the 'app-closing' event
347
- class AppClosing < Base
348
- def type
349
- 'app-closing'
350
- end
351
- end
352
-
353
- # Telemetry class for the 'generate-metrics' event
354
- class GenerateMetrics < Base
355
- attr_reader :namespace, :metric_series
356
-
357
- def type
358
- 'generate-metrics'
359
- end
360
-
361
- def initialize(namespace, metric_series)
362
- super()
363
- @namespace = namespace
364
- @metric_series = metric_series
365
- end
366
-
367
- def payload
368
- {
369
- namespace: @namespace,
370
- series: @metric_series.map(&:to_h)
371
- }
372
- end
373
-
374
- def ==(other)
375
- other.is_a?(GenerateMetrics) && other.namespace == @namespace && other.metric_series == @metric_series
376
- end
377
-
378
- alias eql? ==
379
-
380
- def hash
381
- [self.class, @namespace, @metric_series].hash
382
- end
383
- end
384
-
385
- # Telemetry class for the 'logs' event.
386
- # Logs with the same content are deduplicated at flush time.
387
- class Log < Base
388
- LEVELS = {
389
- error: 'ERROR',
390
- warn: 'WARN',
391
- }.freeze
392
-
393
- LEVELS_STRING = LEVELS.values.freeze
394
-
395
- attr_reader :message, :level, :stack_trace, :count
396
-
397
- def type
398
- 'logs'
399
- end
400
-
401
- # @param message [String] the log message
402
- # @param level [Symbol, String] the log level. Either :error, :warn, 'ERROR', or 'WARN'.
403
- # @param stack_trace [String, nil] the stack trace
404
- # @param count [Integer] the number of times the log was emitted. Used for deduplication.
405
- def initialize(message:, level:, stack_trace: nil, count: 1)
406
- super()
407
- @message = message
408
- @stack_trace = stack_trace
409
-
410
- if level.is_a?(String) && LEVELS_STRING.include?(level)
411
- # String level is used during object copy for deduplication
412
- @level = level
413
- elsif level.is_a?(Symbol)
414
- # Symbol level is used by the regular log emitter user
415
- @level = LEVELS.fetch(level) { |k| raise ArgumentError, "Invalid log level :#{k}" }
416
- else
417
- raise ArgumentError, "Invalid log level #{level}"
418
- end
419
-
420
- @count = count
421
- end
422
-
423
- def payload
424
- {
425
- logs: [
426
- {
427
- message: @message,
428
- level: @level,
429
- stack_trace: @stack_trace,
430
- count: @count,
431
- }.compact
432
- ]
433
- }
434
- end
435
-
436
- # override equality to allow for deduplication
437
- def ==(other)
438
- other.is_a?(Log) &&
439
- other.message == @message &&
440
- other.level == @level && other.stack_trace == @stack_trace && other.count == @count
441
- end
442
-
443
- alias eql? ==
444
-
445
- def hash
446
- [self.class, @message, @level, @stack_trace, @count].hash
447
- end
448
- end
449
-
450
- # Telemetry class for the 'distributions' event
451
- class Distributions < GenerateMetrics
452
- def type
453
- 'distributions'
454
- end
455
- end
456
-
457
- # Telemetry class for the 'message-batch' event
458
- class MessageBatch
459
- attr_reader :events
460
-
461
- def type
462
- 'message-batch'
463
- end
464
-
465
- def initialize(events)
466
- @events = events
467
- end
468
-
469
- def payload
470
- @events.map do |event|
471
- {
472
- request_type: event.type,
473
- payload: event.payload,
474
- }
475
- end
476
- end
477
-
478
- def ==(other)
479
- other.is_a?(MessageBatch) && other.events == @events
480
- end
481
-
482
- alias eql? ==
483
-
484
- def hash
485
- [self.class, @events].hash
486
- end
487
- end
488
20
  end
489
21
  end
490
22
  end
491
23
  end
24
+
25
+ require_relative 'event/base'
26
+ require_relative 'event/app_client_configuration_change'
27
+ require_relative 'event/app_closing'
28
+ require_relative 'event/app_dependencies_loaded'
29
+ require_relative 'event/app_heartbeat'
30
+ require_relative 'event/app_integrations_change'
31
+ require_relative 'event/app_started'
32
+ require_relative 'event/synth_app_client_configuration_change'
33
+ require_relative 'event/generate_metrics'
34
+ require_relative 'event/distributions'
35
+ require_relative 'event/log'
36
+ require_relative 'event/message_batch'