datadog 2.46.0 → 2.48.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 (286) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +56 -2
  3. data/LICENSE-3rdparty.csv +1 -0
  4. data/ext/datadog_profiling_native_extension/collectors_stack.c +143 -86
  5. data/ext/datadog_profiling_native_extension/collectors_stack.h +9 -1
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +6 -1
  7. data/ext/datadog_profiling_native_extension/extconf.rb +7 -13
  8. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -3
  9. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +67 -14
  10. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +8 -1
  11. data/ext/datadog_profiling_native_extension/profiling.c +1 -1
  12. data/ext/libdatadog_api/extconf.rb +9 -7
  13. data/ext/libdatadog_api/trace_exporter.c +34 -7
  14. data/ext/libdatadog_extconf_helpers.rb +2 -2
  15. data/lib/datadog/ai_guard/component.rb +1 -1
  16. data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +1 -9
  17. data/lib/datadog/ai_guard/contrib/rails/patcher.rb +1 -1
  18. data/lib/datadog/ai_guard/contrib/ruby_llm/message_adapter.rb +1 -1
  19. data/lib/datadog/ai_guard/contrib/ruby_llm/redaction_change_set.rb +3 -3
  20. data/lib/datadog/ai_guard/evaluation/client.rb +3 -3
  21. data/lib/datadog/ai_guard/evaluation.rb +2 -2
  22. data/lib/datadog/ai_guard/http_client.rb +3 -2
  23. data/lib/datadog/ai_guard/redaction.rb +1 -1
  24. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +1 -1
  25. data/lib/datadog/appsec/assets/waf_rules/README.md +3 -3
  26. data/lib/datadog/appsec/assets/waf_rules/recommended.json +5366 -1517
  27. data/lib/datadog/appsec/assets/waf_rules/strict.json +2 -2
  28. data/lib/datadog/appsec/autoload.rb +1 -1
  29. data/lib/datadog/appsec/component.rb +1 -1
  30. data/lib/datadog/appsec/compressed_json.rb +1 -1
  31. data/lib/datadog/appsec/configuration.rb +3 -3
  32. data/lib/datadog/appsec/context.rb +1 -1
  33. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +11 -1
  34. data/lib/datadog/appsec/contrib/active_record/patcher.rb +12 -4
  35. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +2 -2
  36. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +1 -1
  37. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  38. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +1 -1
  39. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +1 -1
  40. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +1 -1
  41. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +1 -1
  42. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +1 -1
  43. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +7 -7
  44. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  45. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +3 -3
  46. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +5 -5
  47. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +31 -4
  48. data/lib/datadog/appsec/contrib/rails/patcher.rb +2 -2
  49. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +8 -7
  50. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +1 -1
  51. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +17 -5
  52. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +1 -1
  53. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +8 -7
  54. data/lib/datadog/appsec/metrics/collector.rb +5 -5
  55. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +3 -3
  56. data/lib/datadog/appsec/monitor/gateway/watcher.rb +2 -2
  57. data/lib/datadog/appsec/processor/rule_loader.rb +1 -1
  58. data/lib/datadog/appsec/response.rb +1 -1
  59. data/lib/datadog/appsec/security_engine/engine.rb +8 -7
  60. data/lib/datadog/appsec/security_engine/runner.rb +2 -2
  61. data/lib/datadog/appsec/trace_keeper.rb +1 -1
  62. data/lib/datadog/appsec.rb +1 -1
  63. data/lib/datadog/core/configuration/agent_settings_resolver.rb +14 -13
  64. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
  65. data/lib/datadog/core/configuration/components.rb +12 -11
  66. data/lib/datadog/core/configuration/components_state.rb +8 -1
  67. data/lib/datadog/core/configuration/settings.rb +5 -2
  68. data/lib/datadog/core/configuration/supported_configurations.rb +3 -0
  69. data/lib/datadog/core/configuration.rb +2 -2
  70. data/lib/datadog/core/crashtracking/component.rb +1 -1
  71. data/lib/datadog/core/diagnostics/environment_logger.rb +1 -1
  72. data/lib/datadog/core/environment/cgroup.rb +2 -2
  73. data/lib/datadog/core/environment/container.rb +3 -3
  74. data/lib/datadog/core/metrics/client.rb +6 -6
  75. data/lib/datadog/core/process_discovery.rb +1 -1
  76. data/lib/datadog/core/remote/client.rb +44 -3
  77. data/lib/datadog/core/remote/dispatcher.rb +34 -3
  78. data/lib/datadog/core/remote/tie/tracing.rb +4 -3
  79. data/lib/datadog/core/remote/transport/http.rb +2 -2
  80. data/lib/datadog/core/runtime/metrics.rb +14 -14
  81. data/lib/datadog/core/semaphore.rb +3 -1
  82. data/lib/datadog/core/telemetry/event/app_started.rb +9 -9
  83. data/lib/datadog/core/telemetry/logger.rb +1 -1
  84. data/lib/datadog/core/telemetry/logging.rb +1 -1
  85. data/lib/datadog/core/telemetry/request.rb +9 -3
  86. data/lib/datadog/core/telemetry/transport/http.rb +2 -2
  87. data/lib/datadog/core/telemetry/worker.rb +1 -1
  88. data/lib/datadog/core/transport/http/adapters/net.rb +1 -1
  89. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
  90. data/lib/datadog/core/transport/http/builder.rb +1 -1
  91. data/lib/datadog/core/transport/http.rb +3 -3
  92. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +2 -2
  93. data/lib/datadog/core/workers/async.rb +1 -1
  94. data/lib/datadog/core/workers/runtime_metrics.rb +2 -2
  95. data/lib/datadog/data_streams/pathway_context.rb +1 -1
  96. data/lib/datadog/data_streams/processor.rb +48 -27
  97. data/lib/datadog/data_streams/transport/http.rb +1 -1
  98. data/lib/datadog/data_streams.rb +16 -0
  99. data/lib/datadog/di/capture_expression_evaluator.rb +48 -11
  100. data/lib/datadog/di/component.rb +73 -2
  101. data/lib/datadog/di/configuration.rb +19 -0
  102. data/lib/datadog/di/contrib/active_record.rb +1 -1
  103. data/lib/datadog/di/el/compiler.rb +4 -4
  104. data/lib/datadog/di/el/evaluator.rb +247 -43
  105. data/lib/datadog/di/el/expression.rb +36 -6
  106. data/lib/datadog/di/error.rb +16 -0
  107. data/lib/datadog/di/guardrails_telemetry/reason.rb +3 -2
  108. data/lib/datadog/di/instrumenter.rb +39 -10
  109. data/lib/datadog/di/probe_notification_builder.rb +58 -10
  110. data/lib/datadog/di/probe_notifier_worker.rb +1 -1
  111. data/lib/datadog/di/remote.rb +46 -2
  112. data/lib/datadog/di/serializer.rb +47 -13
  113. data/lib/datadog/di.rb +27 -0
  114. data/lib/datadog/error_tracking/component.rb +1 -1
  115. data/lib/datadog/error_tracking/configuration.rb +1 -1
  116. data/lib/datadog/kit/appsec/events/v2.rb +6 -6
  117. data/lib/datadog/kit/appsec/events.rb +1 -1
  118. data/lib/datadog/kit/enable_core_dumps.rb +1 -1
  119. data/lib/datadog/kit/identity.rb +1 -1
  120. data/lib/datadog/open_feature/activation.rb +26 -1
  121. data/lib/datadog/open_feature/agentless/configuration_source.rb +94 -15
  122. data/lib/datadog/open_feature/component.rb +22 -2
  123. data/lib/datadog/open_feature/configuration/agentless_endpoint.rb +6 -0
  124. data/lib/datadog/open_feature/configuration.rb +10 -4
  125. data/lib/datadog/open_feature/evaluation_engine.rb +62 -4
  126. data/lib/datadog/open_feature/exposures/buffer.rb +4 -0
  127. data/lib/datadog/open_feature/exposures/reporter.rb +17 -4
  128. data/lib/datadog/open_feature/exposures/worker.rb +37 -6
  129. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +5 -5
  130. data/lib/datadog/open_feature/flag_evaluation/writer.rb +1 -1
  131. data/lib/datadog/open_feature/hooks/debug_logging_hook.rb +56 -0
  132. data/lib/datadog/open_feature/hooks/evaluation_telemetry_opt_out_hook.rb +25 -0
  133. data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +2 -2
  134. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +1 -1
  135. data/lib/datadog/open_feature/native_evaluator.rb +1 -1
  136. data/lib/datadog/open_feature/noop_evaluator.rb +1 -1
  137. data/lib/datadog/open_feature/provider.rb +69 -12
  138. data/lib/datadog/open_feature/remote.rb +8 -1
  139. data/lib/datadog/open_feature/resolution_details.rb +2 -2
  140. data/lib/datadog/open_feature/transport.rb +6 -6
  141. data/lib/datadog/opentelemetry/api/context.rb +3 -3
  142. data/lib/datadog/opentelemetry/logs.rb +5 -5
  143. data/lib/datadog/opentelemetry/metrics.rb +3 -3
  144. data/lib/datadog/opentelemetry/sdk/propagator.rb +3 -3
  145. data/lib/datadog/opentelemetry/sdk/span_processor.rb +2 -2
  146. data/lib/datadog/opentelemetry/sdk/trace/span.rb +1 -1
  147. data/lib/datadog/profiling/collectors/code_provenance.rb +3 -3
  148. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +4 -4
  149. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  150. data/lib/datadog/profiling/collectors/info.rb +37 -6
  151. data/lib/datadog/profiling/collectors/thread_context.rb +1 -1
  152. data/lib/datadog/profiling/component.rb +41 -39
  153. data/lib/datadog/profiling/exporter.rb +4 -6
  154. data/lib/datadog/profiling/http_transport.rb +3 -3
  155. data/lib/datadog/profiling/profiler.rb +2 -2
  156. data/lib/datadog/profiling/scheduler.rb +2 -2
  157. data/lib/datadog/profiling/tag_builder.rb +1 -1
  158. data/lib/datadog/symbol_database/extractor.rb +8 -8
  159. data/lib/datadog/symbol_database/uploader.rb +1 -1
  160. data/lib/datadog/tracing/buffer.rb +3 -3
  161. data/lib/datadog/tracing/client_ip.rb +1 -1
  162. data/lib/datadog/tracing/component.rb +15 -10
  163. data/lib/datadog/tracing/configuration/dynamic/option.rb +2 -2
  164. data/lib/datadog/tracing/configuration/ext.rb +2 -0
  165. data/lib/datadog/tracing/configuration/settings.rb +14 -3
  166. data/lib/datadog/tracing/context.rb +1 -1
  167. data/lib/datadog/tracing/context_provider.rb +8 -0
  168. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +2 -2
  169. data/lib/datadog/tracing/contrib/active_job/data_streams.rb +27 -2
  170. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  171. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +1 -1
  172. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  173. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -1
  174. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +1 -1
  175. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
  176. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
  177. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +1 -1
  178. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -1
  179. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +1 -1
  180. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -1
  181. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -2
  182. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +1 -1
  183. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +3 -3
  184. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +1 -1
  185. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +17 -12
  186. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -1
  187. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +1 -1
  188. data/lib/datadog/tracing/contrib/excon/middleware.rb +16 -9
  189. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -1
  190. data/lib/datadog/tracing/contrib/faraday/middleware.rb +14 -8
  191. data/lib/datadog/tracing/contrib/grape/endpoint.rb +4 -4
  192. data/lib/datadog/tracing/contrib/graphql/patcher.rb +1 -1
  193. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +3 -3
  194. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +1 -1
  195. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +2 -2
  196. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -1
  197. data/lib/datadog/tracing/contrib/grpc.rb +1 -1
  198. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -1
  199. data/lib/datadog/tracing/contrib/hanami/plugin.rb +1 -1
  200. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -1
  201. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -1
  202. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +1 -1
  203. data/lib/datadog/tracing/contrib/http/instrumentation.rb +21 -6
  204. data/lib/datadog/tracing/contrib/http.rb +1 -1
  205. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +1 -1
  206. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +14 -8
  207. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +1 -1
  208. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +14 -8
  209. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
  210. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +2 -2
  211. data/lib/datadog/tracing/contrib/karafka/monitor.rb +1 -1
  212. data/lib/datadog/tracing/contrib/karafka/patcher.rb +1 -1
  213. data/lib/datadog/tracing/contrib/karafka.rb +1 -1
  214. data/lib/datadog/tracing/contrib/lograge/patcher.rb +1 -1
  215. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +1 -1
  216. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  217. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +1 -1
  218. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +1 -1
  219. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +3 -3
  220. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
  221. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +3 -3
  222. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +1 -1
  223. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +4 -4
  224. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +1 -1
  225. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +4 -4
  226. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  227. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  228. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +1 -1
  229. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +1 -1
  230. data/lib/datadog/tracing/contrib/racecar/events/message.rb +1 -1
  231. data/lib/datadog/tracing/contrib/rack/middlewares.rb +3 -3
  232. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  233. data/lib/datadog/tracing/contrib/rails/framework.rb +7 -7
  234. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  235. data/lib/datadog/tracing/contrib/rails/runner.rb +4 -4
  236. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +1 -1
  237. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  238. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  239. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +1 -1
  240. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +17 -10
  241. data/lib/datadog/tracing/contrib/sequel/database.rb +1 -1
  242. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -1
  243. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -1
  244. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +2 -2
  245. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +2 -2
  246. data/lib/datadog/tracing/contrib/sidekiq.rb +1 -1
  247. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +1 -1
  248. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +1 -1
  249. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -1
  250. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +1 -1
  251. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +3 -3
  252. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +102 -0
  253. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
  254. data/lib/datadog/tracing/contrib/waterdrop.rb +1 -1
  255. data/lib/datadog/tracing/diagnostics/environment_logger.rb +1 -1
  256. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  257. data/lib/datadog/tracing/distributed/b3_single.rb +1 -1
  258. data/lib/datadog/tracing/distributed/baggage.rb +3 -3
  259. data/lib/datadog/tracing/distributed/datadog.rb +3 -3
  260. data/lib/datadog/tracing/distributed/propagation.rb +7 -7
  261. data/lib/datadog/tracing/distributed/trace_context.rb +1 -1
  262. data/lib/datadog/tracing/distributed/trace_state/open_telemetry.rb +1 -1
  263. data/lib/datadog/tracing/otel_thread_context.rb +3 -3
  264. data/lib/datadog/tracing/pipeline.rb +1 -1
  265. data/lib/datadog/tracing/remote.rb +50 -19
  266. data/lib/datadog/tracing/sampling/priority_sampler.rb +1 -1
  267. data/lib/datadog/tracing/sampling/rule.rb +1 -1
  268. data/lib/datadog/tracing/sampling/rule_sampler.rb +1 -1
  269. data/lib/datadog/tracing/sampling/span/rule_parser.rb +2 -2
  270. data/lib/datadog/tracing/span_operation.rb +1 -1
  271. data/lib/datadog/tracing/trace_digest.rb +1 -1
  272. data/lib/datadog/tracing/trace_operation.rb +6 -6
  273. data/lib/datadog/tracing/tracer.rb +6 -6
  274. data/lib/datadog/tracing/transport/http/telemetry.rb +1 -1
  275. data/lib/datadog/tracing/transport/http.rb +2 -2
  276. data/lib/datadog/tracing/transport/io.rb +1 -1
  277. data/lib/datadog/tracing/transport/native.rb +3 -3
  278. data/lib/datadog/tracing/transport/statistics.rb +2 -2
  279. data/lib/datadog/tracing/transport/telemetry.rb +3 -1
  280. data/lib/datadog/tracing/transport/trace_formatter.rb +12 -12
  281. data/lib/datadog/tracing/transport/traces.rb +1 -1
  282. data/lib/datadog/tracing/utils.rb +1 -1
  283. data/lib/datadog/tracing/workers.rb +1 -1
  284. data/lib/datadog/version.rb +1 -1
  285. metadata +9 -8
  286. data/lib/datadog/appsec/utils/hash_coercion.rb +0 -23
@@ -54,7 +54,11 @@ module Datadog
54
54
  end
55
55
 
56
56
  def enqueue(event)
57
- buffer.push(event)
57
+ unless buffer.push(event)
58
+ @logger.debug { "Feature Flags: exposure not queued: buffer closed" }
59
+ return false
60
+ end
61
+
58
62
  start unless running?
59
63
 
60
64
  true
@@ -84,7 +88,10 @@ module Datadog
84
88
  break if Core::Utils::Time.get_time - started > wait_time
85
89
  end
86
90
 
87
- stop(true)
91
+ log_shutdown_outcome(wait_time)
92
+ stopped = stop(true)
93
+ @logger.debug("Feature Flags: exposure worker stopped") unless running?
94
+ stopped
88
95
  end
89
96
 
90
97
  private
@@ -93,23 +100,47 @@ module Datadog
93
100
  return if events.empty?
94
101
 
95
102
  if dropped.positive?
96
- @logger.debug { "OpenFeature: Resolution details worker dropped #{dropped} event(s) due to full buffer" }
103
+ @logger.debug do
104
+ "Feature Flags: dropped #{dropped} older queued exposure event(s) because the exposure buffer was full"
105
+ end
97
106
  end
98
107
 
99
108
  payload = @batch_builder.payload_for(events)
109
+ @logger.debug { "Feature Flags: flushing #{events.size} exposure event(s) to the Datadog Agent" }
100
110
  response = @transport.send_exposures(payload)
101
111
 
102
- unless response&.ok?
103
- @logger.debug { "OpenFeature: Resolution details upload response was not OK: #{response.inspect}" }
112
+ if response&.ok?
113
+ @logger.debug { "Feature Flags: sent #{events.size} exposure event(s) to the Datadog Agent" }
114
+ else
115
+ @logger.debug do
116
+ "Feature Flags: exposure upload response was not OK; dropping #{events.size} exposure event(s) " \
117
+ "without retry: #{response.inspect}"
118
+ end
104
119
  end
105
120
 
106
121
  response
107
122
  rescue => e
108
- @logger.debug { "OpenFeature: Failed to flush resolution details events: #{e.class}: #{e.message}" }
123
+ @logger.debug do
124
+ "Feature Flags: failed to flush exposure events; dropping #{events.size} exposure event(s) " \
125
+ "without retry: #{e.class}: #{e.message}"
126
+ end
109
127
  @telemetry.report(e, description: "OpenFeature: Failed to flush resolution details events")
110
128
 
111
129
  nil
112
130
  end
131
+
132
+ def log_shutdown_outcome(wait_time)
133
+ @logger.debug do
134
+ queued = buffer.length
135
+ evicted = buffer.pending_dropped_count
136
+ uploading = !!in_iteration?
137
+ remaining = queued.positive? ? "; #{queued} queued exposure event(s) will not be sent" : "; no queued exposure events remain"
138
+ remaining += "; #{evicted} exposure event(s) evicted from the full buffer were not sent" if evicted.positive?
139
+ outcome = uploading ? "; the in-flight upload may still report sent or dropping during shutdown; if forcibly terminated, its outcome will not be reported" : ""
140
+ "Feature Flags: exposure shutdown wait finished; queued=#{queued}, " \
141
+ "upload_in_progress=#{uploading}, wait_budget=#{wait_time}s#{remaining}#{outcome}"
142
+ end
143
+ end
113
144
  end
114
145
  end
115
146
  end
@@ -124,7 +124,7 @@ module Datadog
124
124
  if per_flag_count >= @per_flag_cap
125
125
  add_to_degraded(
126
126
  flag_key, variant, allocation_key, runtime_default, error_message, evaluation_time_ms,
127
- observe_full_evaluation_data
127
+ observe_full_evaluation_data,
128
128
  )
129
129
  return
130
130
  end
@@ -140,7 +140,7 @@ module Datadog
140
140
  error_message: error_message,
141
141
  targeting_key: targeting_key,
142
142
  context_attrs: observe_full_evaluation_data ? attrs : nil,
143
- observe_full_evaluation_data: observe_full_evaluation_data
143
+ observe_full_evaluation_data: observe_full_evaluation_data,
144
144
  )
145
145
  @full[full_key] = entry
146
146
  @global_count += 1
@@ -148,7 +148,7 @@ module Datadog
148
148
  # Route to degraded tier
149
149
  add_to_degraded(
150
150
  flag_key, variant, allocation_key, runtime_default, error_message, evaluation_time_ms,
151
- observe_full_evaluation_data
151
+ observe_full_evaluation_data,
152
152
  )
153
153
  end
154
154
  end
@@ -328,7 +328,7 @@ module Datadog
328
328
  end
329
329
 
330
330
  output[prefix] = string_value.encode(
331
- Encoding::UTF_8, invalid: :replace, undef: :replace
331
+ Encoding::UTF_8, invalid: :replace, undef: :replace,
332
332
  ).freeze
333
333
  rescue
334
334
  # Unsupported caller values must not break flag evaluation.
@@ -433,7 +433,7 @@ module Datadog
433
433
  evaluation_time_ms,
434
434
  runtime_default: runtime_default,
435
435
  error_message: error_message,
436
- observe_full_evaluation_data: observe_full_evaluation_data
436
+ observe_full_evaluation_data: observe_full_evaluation_data,
437
437
  )
438
438
  end
439
439
  end
@@ -489,7 +489,7 @@ module Datadog
489
489
  {
490
490
  "context" => @service_context,
491
491
  "flagEvaluations" => events,
492
- }
492
+ },
493
493
  )
494
494
  if response.respond_to?(:ok?) && !response.ok?
495
495
  @logger.debug { "OpenFeature EVP: transport response was not OK: #{response.inspect}" }
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../ext"
4
+
5
+ module Datadog
6
+ module OpenFeature
7
+ module Hooks
8
+ # Logs each SDK-final evaluation outcome for onboarding diagnostics.
9
+ #
10
+ # Logs raw flag values, default values, targeting keys, context attributes, and
11
+ # error messages, so it is only registered while debug logging is enabled.
12
+ class DebugLoggingHook
13
+ include ::OpenFeature::SDK::Hooks::Hook if defined?(::OpenFeature::SDK::Hooks::Hook)
14
+
15
+ def self.available?
16
+ !!defined?(::OpenFeature::SDK::Hooks::Hook)
17
+ end
18
+
19
+ def initialize(logger)
20
+ @logger = logger
21
+ end
22
+
23
+ def finally(hook_context:, evaluation_details:, **_opts)
24
+ @logger.debug do
25
+ evaluation_context = hook_context.evaluation_context
26
+ "Feature Flags: evaluated #{hook_context.flag_key.inspect} (" \
27
+ "type=#{hook_context.flag_value_type}, " \
28
+ "default=#{hook_context.default_value.inspect}, " \
29
+ "value=#{evaluation_details.value.inspect}, " \
30
+ "variant=#{evaluation_details.variant.inspect}, " \
31
+ "reason=#{evaluation_details.reason.inspect}, " \
32
+ "allocation=#{extract_allocation_key(evaluation_details).inspect}, " \
33
+ "error_code=#{evaluation_details.error_code.inspect}, " \
34
+ "error_message=#{evaluation_details.error_message.inspect}, " \
35
+ "targeting_key=#{evaluation_context&.targeting_key.inspect}, " \
36
+ "attributes=#{attributes(evaluation_context).inspect}, " \
37
+ "flag_metadata=#{evaluation_details.flag_metadata.inspect})"
38
+ end
39
+ end
40
+
41
+ private
42
+
43
+ def extract_allocation_key(evaluation_details)
44
+ metadata = evaluation_details.flag_metadata
45
+ metadata&.[](Ext::METADATA_ALLOCATION_KEY)
46
+ end
47
+
48
+ def attributes(evaluation_context)
49
+ return {} unless evaluation_context
50
+
51
+ evaluation_context.fields.reject { |key, _value| key == ::OpenFeature::SDK::EvaluationContext::TARGETING_KEY }
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module OpenFeature
5
+ module Hooks
6
+ class EvaluationTelemetryOptOutHook
7
+ PARAMETER = "dd_evaluation_telemetry_opt_out"
8
+
9
+ def self.opted_out?(evaluation_context)
10
+ evaluation_context&.fields&.[](PARAMETER).equal?(true)
11
+ end
12
+
13
+ def initialize(hook)
14
+ @hook = hook
15
+ end
16
+
17
+ def finally(hook_context:, evaluation_details:, **options)
18
+ return if self.class.opted_out?(hook_context.evaluation_context)
19
+
20
+ @hook.finally(hook_context: hook_context, evaluation_details: evaluation_details, **options)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -94,7 +94,7 @@ module Datadog
94
94
  end
95
95
  end
96
96
  rescue => e
97
- @logger.debug { "Error capturing span enrichment: #{e.class}: #{e.message}" }
97
+ @logger.debug { "OpenFeature: Error capturing span enrichment: #{e.class}: #{e.message}" }
98
98
  end
99
99
 
100
100
  # Provider-close cleanup: mark the hook inactive and drop all accumulated
@@ -153,7 +153,7 @@ module Datadog
153
153
 
154
154
  write_tags_on_root(span_op, finishing_trace_op, state)
155
155
  rescue => e
156
- @logger.debug { "Error writing span enrichment tags: #{e.class}: #{e.message}" }
156
+ @logger.debug { "OpenFeature: Error writing span enrichment tags: #{e.class}: #{e.message}" }
157
157
  end
158
158
  end
159
159
 
@@ -78,7 +78,7 @@ module Datadog
78
78
  @counter = meter.create_counter(
79
79
  METRIC_NAME,
80
80
  unit: METRIC_UNIT,
81
- description: METRIC_DESCRIPTION
81
+ description: METRIC_DESCRIPTION,
82
82
  )
83
83
  end
84
84
  rescue => e
@@ -66,7 +66,7 @@ module Datadog
66
66
  ResolutionDetails.build_error(
67
67
  value: default_value,
68
68
  error_code: Ext::PARSE_ERROR,
69
- error_message: INVALID_FLAG_CONFIGURATION_ERROR_MESSAGE
69
+ error_message: INVALID_FLAG_CONFIGURATION_ERROR_MESSAGE,
70
70
  )
71
71
  end
72
72
  end
@@ -23,7 +23,7 @@ module Datadog
23
23
  error?: true,
24
24
  error_code: Ext::PROVIDER_NOT_READY,
25
25
  error_message: "Waiting for flags configuration",
26
- reason: Ext::ERROR
26
+ reason: Ext::ERROR,
27
27
  )
28
28
  end
29
29
  end
@@ -3,6 +3,7 @@
3
3
  require_relative "ext"
4
4
  require_relative "../open_feature"
5
5
  require_relative "../core/utils/time"
6
+ require_relative "hooks/evaluation_telemetry_opt_out_hook"
6
7
  require "open_feature/sdk"
7
8
 
8
9
  module Datadog
@@ -67,7 +68,15 @@ module Datadog
67
68
 
68
69
  attr_reader :metadata
69
70
 
70
- def initialize
71
+ def initialize(enable_evaluation_telemetry_opt_out_parameter: nil)
72
+ @enable_evaluation_telemetry_opt_out_parameter = case enable_evaluation_telemetry_opt_out_parameter
73
+ when nil
74
+ Datadog.configuration.feature_flags.evaluation_telemetry_per_subject_opt_out_enabled
75
+ when true, false
76
+ enable_evaluation_telemetry_opt_out_parameter
77
+ else
78
+ raise ArgumentError, "enable_evaluation_telemetry_opt_out_parameter expects true, false, or nil"
79
+ end
71
80
  @metadata = ::OpenFeature::SDK::Provider::ProviderMetadata.new(name: NAME).freeze
72
81
  @initialization_mutex = Mutex.new
73
82
  @initializing = false
@@ -99,6 +108,7 @@ module Datadog
99
108
  @stale_emitted = false
100
109
  @stale_pending = false
101
110
  end
111
+ Datadog.logger.debug { "Feature Flags: provider initialization started" }
102
112
  ready_handler_installed = install_initialization_ready_handler
103
113
 
104
114
  component, failure = OpenFeature.activate_provider(self)
@@ -117,6 +127,7 @@ module Datadog
117
127
  case wait_result
118
128
  when Component::CONFIGURATION_READY
119
129
  @initialization_mutex.synchronize { @initializing = false } unless ready_handler_installed
130
+ Datadog.logger.debug { "Feature Flags: provider initialized successfully" }
120
131
  when Component::CONFIGURATION_TIMEOUT
121
132
  message = "Feature Flags provider initialization timed out while waiting for configuration"
122
133
  Datadog.logger.error(message)
@@ -164,14 +175,20 @@ module Datadog
164
175
  )
165
176
  end
166
177
  OpenFeature.deactivate_provider(self)
178
+ Datadog.logger.debug { "Feature Flags: provider shut down" }
167
179
  end
168
180
 
169
181
  def hooks
170
182
  component = Datadog.send(:components).open_feature
171
- [
183
+ telemetry_hooks = [
172
184
  component&.flag_eval_metrics_hook,
173
185
  component&.flag_eval_evp_hook,
174
186
  ].compact
187
+ if @enable_evaluation_telemetry_opt_out_parameter
188
+ telemetry_hooks = telemetry_hooks.map { |hook| Hooks::EvaluationTelemetryOptOutHook.new(hook) }
189
+ end
190
+
191
+ [*telemetry_hooks, component&.debug_logging_hook].compact
175
192
  end
176
193
 
177
194
  def fetch_boolean_value(flag_key:, default_value:, evaluation_context: nil)
@@ -222,6 +239,8 @@ module Datadog
222
239
  def fail_initialization(component, message)
223
240
  prepare_initialization_failure(component)
224
241
  cancel_initialization_if_shutdown!
242
+ # Non-blocking set_provider surfaces this only as a PROVIDER_ERROR event.
243
+ Datadog.logger.debug { "Feature Flags: provider failed to initialize: #{message}" }
225
244
  raise message.to_s
226
245
  end
227
246
 
@@ -314,7 +333,7 @@ module Datadog
314
333
  end
315
334
  end
316
335
  end
317
- emit_event(::OpenFeature::SDK::ProviderEvent::PROVIDER_READY) if emit_ready
336
+ emit_state_event(::OpenFeature::SDK::ProviderEvent::PROVIDER_READY) if emit_ready
318
337
  end
319
338
 
320
339
  def provider_ready(_details)
@@ -336,7 +355,7 @@ module Datadog
336
355
  end
337
356
  end
338
357
  configuration.remove_handler(::OpenFeature::SDK::ProviderEvent::PROVIDER_READY, handler) if handler
339
- emit_event(::OpenFeature::SDK::ProviderEvent::PROVIDER_STALE) if emit_stale
358
+ emit_state_event(::OpenFeature::SDK::ProviderEvent::PROVIDER_STALE) if emit_stale
340
359
  end
341
360
 
342
361
  def configuration_changed(event)
@@ -382,7 +401,25 @@ module Datadog
382
401
  end
383
402
  end
384
403
 
385
- emit_event(event_type) if event_type
404
+ emit_state_event(event_type) if event_type
405
+ end
406
+
407
+ def emit_state_event(event_type)
408
+ log_state_event(event_type)
409
+ emit_event(event_type)
410
+ end
411
+
412
+ def log_state_event(event_type)
413
+ logger = Datadog.logger
414
+ logger.debug do
415
+ availability = case event_type
416
+ when ::OpenFeature::SDK::ProviderEvent::PROVIDER_READY
417
+ "; configuration is available"
418
+ when ::OpenFeature::SDK::ProviderEvent::PROVIDER_STALE
419
+ "; configuration is no longer available"
420
+ end
421
+ "Feature Flags: provider emitted #{event_type}#{availability}"
422
+ end
386
423
  end
387
424
 
388
425
  def evaluate(flag_key, default_value:, expected_type:, evaluation_context:)
@@ -392,7 +429,10 @@ module Datadog
392
429
  flag_meta = nil
393
430
 
394
431
  engine = OpenFeature.engine
395
- return component_not_configured_default(default_value, eval_time_ms) if engine.nil?
432
+ if engine.nil?
433
+ log_component_not_configured(flag_key, expected_type)
434
+ return component_not_configured_default(default_value, eval_time_ms)
435
+ end
396
436
 
397
437
  result = fetch_engine_value(engine, flag_key, default_value, expected_type, evaluation_context)
398
438
 
@@ -406,7 +446,9 @@ module Datadog
406
446
  # Drive APM span enrichment directly from the evaluation path. This is the only reliable
407
447
  # way to attach `ffe_*` tags across all supported OpenFeature SDK versions, since older
408
448
  # SDKs do not dispatch provider hooks. Guarded so enrichment can never break evaluation.
409
- enrich_span(flag_key, result, evaluation_context)
449
+ unless evaluation_telemetry_opted_out?(evaluation_context)
450
+ enrich_span(flag_key, result, evaluation_context)
451
+ end
410
452
 
411
453
  sdk_success_details(result, flag_meta)
412
454
  rescue => e
@@ -414,11 +456,11 @@ module Datadog
414
456
  error_result = Datadog::OpenFeature::ResolutionDetails.build_error(
415
457
  value: default_value,
416
458
  error_code: Ext::GENERAL,
417
- error_message: error_message
459
+ error_message: error_message,
418
460
  )
419
461
  error_flag_meta = flag_meta
420
462
  error_flag_meta ||= build_flag_metadata(
421
- error_result, eval_time_ms || (Core::Utils::Time.now.to_f * 1000).to_i
463
+ error_result, eval_time_ms || (Core::Utils::Time.now.to_f * 1000).to_i,
422
464
  )
423
465
 
424
466
  sdk_error_details(default_value, Ext::GENERAL, error_message, Ext::ERROR, error_flag_meta)
@@ -429,7 +471,7 @@ module Datadog
429
471
  flag_key,
430
472
  default_value: default_value,
431
473
  expected_type: expected_type,
432
- evaluation_context: evaluation_context
474
+ evaluation_context: evaluation_context,
433
475
  )
434
476
  end
435
477
 
@@ -448,7 +490,7 @@ module Datadog
448
490
  error_code: error_code,
449
491
  error_message: error_message,
450
492
  reason: reason,
451
- flag_metadata: flag_meta
493
+ flag_metadata: flag_meta,
452
494
  )
453
495
  end
454
496
 
@@ -495,6 +537,21 @@ module Datadog
495
537
  Datadog.send(:components).open_feature&.span_enrichment_hook
496
538
  end
497
539
 
540
+ # No component means no DebugLoggingHook and no raw-data warning, so only non-raw fields are logged.
541
+ def log_component_not_configured(flag_key, expected_type)
542
+ logger = Datadog.logger
543
+ logger.debug do
544
+ "Feature Flags: provider returned the default value for #{flag_key.inspect} (type=#{expected_type}): " \
545
+ "the Feature Flags component is not active; see the provider initialization logs " \
546
+ "(error_code=#{Ext::PROVIDER_FATAL})"
547
+ end
548
+ end
549
+
550
+ def evaluation_telemetry_opted_out?(evaluation_context)
551
+ @enable_evaluation_telemetry_opt_out_parameter &&
552
+ Hooks::EvaluationTelemetryOptOutHook.opted_out?(evaluation_context)
553
+ end
554
+
498
555
  def component_not_configured_default(value, eval_time_ms)
499
556
  ::OpenFeature::SDK::Provider::ResolutionDetails.new(
500
557
  value: value,
@@ -504,7 +561,7 @@ module Datadog
504
561
  flag_metadata: {
505
562
  "dd.eval.timestamp_ms" => eval_time_ms,
506
563
  Ext::METADATA_OBSERVE_FULL_EVALUATION_DATA => false,
507
- }
564
+ },
508
565
  )
509
566
  end
510
567
  end
@@ -19,7 +19,7 @@ module Datadog
19
19
  FFE_PRODUCTS
20
20
  end
21
21
 
22
- def receivers(telemetry, component_provider:)
22
+ def receivers(telemetry, component_provider:, logger: Datadog.logger)
23
23
  matcher = Core::Remote::Dispatcher::Matcher::Product.new(FFE_PRODUCTS)
24
24
  receiver = Core::Remote::Dispatcher::Receiver.new(matcher) do |repository, changes|
25
25
  component = component_provider.call
@@ -27,8 +27,15 @@ module Datadog
27
27
 
28
28
  changes.each do |change|
29
29
  content = repository[change.path]
30
+ logger.debug do
31
+ version = content ? " (version #{content.version})" : ""
32
+ "Feature Flags: received Remote Configuration #{change.type} for #{change.path}#{version}"
33
+ end
30
34
 
31
35
  unless content || change.type == :delete
36
+ logger.debug do
37
+ "Feature Flags: ignored Remote Configuration #{change.type} for #{change.path}: content is missing"
38
+ end
32
39
  next telemetry.error("OpenFeature: Remote Configuration change is not present on #{change.type}")
33
40
  end
34
41
 
@@ -19,7 +19,7 @@ module Datadog
19
19
  :extra_logging,
20
20
  :log?,
21
21
  :error?,
22
- keyword_init: true
22
+ keyword_init: true,
23
23
  )
24
24
  def self.build_error(value:, error_code:, error_message:, reason: Ext::ERROR)
25
25
  new(
@@ -29,7 +29,7 @@ module Datadog
29
29
  reason: reason,
30
30
  error?: true,
31
31
  log?: false,
32
- serial_id: nil
32
+ serial_id: nil,
33
33
  ).freeze
34
34
  end
35
35
  end
@@ -18,7 +18,7 @@ module Datadog
18
18
  class Spec
19
19
  def initialize
20
20
  @endpoint = Core::Transport::HTTP::API::Endpoint.new(
21
- :post, "/evp_proxy/v2/api/v2/exposures"
21
+ :post, "/evp_proxy/v2/api/v2/exposures",
22
22
  )
23
23
  end
24
24
 
@@ -43,7 +43,7 @@ module Datadog
43
43
  class FlagevaluationsSpec
44
44
  def initialize
45
45
  @endpoint = Core::Transport::HTTP::API::Endpoint.new(
46
- :post, "/evp_proxy/v2/api/v2/flagevaluation"
46
+ :post, "/evp_proxy/v2/api/v2/flagevaluation",
47
47
  )
48
48
  end
49
49
 
@@ -64,7 +64,7 @@ module Datadog
64
64
  def self.build(agent_settings:, logger:)
65
65
  Core::Transport::HTTP.build(
66
66
  agent_settings: agent_settings,
67
- logger: logger
67
+ logger: logger,
68
68
  ) { |t| t.api("exposures", HTTP::Spec.new) }.to_transport(self)
69
69
  end
70
70
 
@@ -72,7 +72,7 @@ module Datadog
72
72
  def self.build_flagevaluations(agent_settings:, logger:)
73
73
  Core::Transport::HTTP.build(
74
74
  agent_settings: agent_settings,
75
- logger: logger
75
+ logger: logger,
76
76
  ) { |t| t.api("flagevaluations", HTTP::FlagevaluationsSpec.new) }.to_transport(self)
77
77
  end
78
78
 
@@ -85,7 +85,7 @@ module Datadog
85
85
  encoder = Core::Encoding::JSONEncoder
86
86
  parcel = Core::Transport::Parcel.new(
87
87
  encoder.encode(payload),
88
- content_type: encoder.content_type
88
+ content_type: encoder.content_type,
89
89
  )
90
90
  request = Core::Transport::Request.new(parcel)
91
91
 
@@ -106,7 +106,7 @@ module Datadog
106
106
  encoder = Core::Encoding::JSONEncoder
107
107
  parcel = Core::Transport::Parcel.new(
108
108
  encoder.encode(payload),
109
- content_type: encoder.content_type
109
+ content_type: encoder.content_type,
110
110
  )
111
111
  request = Core::Transport::Request.new(parcel)
112
112
 
@@ -77,7 +77,7 @@ module Datadog
77
77
  # It effectively becomes an internal trace propagation.
78
78
  trace = Datadog::OpenTelemetry::Trace.start_trace_copy(
79
79
  current_span.datadog_trace,
80
- parent_span: current_span.datadog_span
80
+ parent_span: current_span.datadog_span,
81
81
  )
82
82
  end
83
83
 
@@ -143,8 +143,8 @@ module Datadog
143
143
  unless calls_matched
144
144
  ::OpenTelemetry.handle_error(
145
145
  exception: ::OpenTelemetry::Context::DetachError.new(
146
- "calls to detach should match corresponding calls to attach."
147
- )
146
+ "calls to detach should match corresponding calls to attach.",
147
+ ),
148
148
  )
149
149
  end
150
150
 
@@ -13,7 +13,7 @@ module Datadog
13
13
  true
14
14
  rescue => exc
15
15
  components.logger.warn(
16
- "Failed to initialize OpenTelemetry logs: #{exc.class}: #{exc.message}\n#{(exc.backtrace || []).join("\n")}"
16
+ "Failed to initialize OpenTelemetry logs: #{exc.class}: #{exc.message}\n#{(exc.backtrace || []).join("\n")}",
17
17
  )
18
18
  false
19
19
  end
@@ -42,7 +42,7 @@ module Datadog
42
42
  def disable_log_injection
43
43
  @logger.warn("OTel logs enabled: disabling Datadog log injection to prevent duplicate trace correlation fields")
44
44
  Datadog.configure do |c|
45
- c.tracing.log_injection = false # steep:ignore
45
+ c.tracing.log_injection = false
46
46
  end
47
47
  end
48
48
 
@@ -67,7 +67,7 @@ module Datadog
67
67
  endpoint = config_or_exporter_fallback(
68
68
  signal: :logs,
69
69
  option_name: :endpoint,
70
- computed_default: default_logs_endpoint
70
+ computed_default: default_logs_endpoint,
71
71
  )
72
72
  timeout = config_or_exporter_fallback(signal: :logs, option_name: :timeout_millis)
73
73
  headers = config_or_exporter_fallback(signal: :logs, option_name: :headers)
@@ -77,7 +77,7 @@ module Datadog
77
77
  exporter = Datadog::OpenTelemetry::SDK::LogsExporter.new(
78
78
  endpoint: endpoint,
79
79
  timeout: timeout / 1000.0,
80
- headers: headers
80
+ headers: headers,
81
81
  )
82
82
 
83
83
  processor = ::OpenTelemetry::SDK::Logs::Export::BatchLogRecordProcessor.new(
@@ -85,7 +85,7 @@ module Datadog
85
85
  max_queue_size: logs_config.max_queue_size,
86
86
  schedule_delay: logs_config.schedule_delay_millis,
87
87
  exporter_timeout: logs_config.export_timeout_millis,
88
- max_export_batch_size: logs_config.max_export_batch_size
88
+ max_export_batch_size: logs_config.max_export_batch_size,
89
89
  )
90
90
  provider.add_log_record_processor(processor)
91
91
  true
@@ -63,7 +63,7 @@ module Datadog
63
63
  endpoint = config_or_exporter_fallback(
64
64
  signal: :metrics,
65
65
  option_name: :endpoint,
66
- computed_default: default_metrics_endpoint
66
+ computed_default: default_metrics_endpoint,
67
67
  )
68
68
  timeout = config_or_exporter_fallback(signal: :metrics, option_name: :timeout_millis)
69
69
  headers = config_or_exporter_fallback(signal: :metrics, option_name: :headers)
@@ -73,13 +73,13 @@ module Datadog
73
73
  exporter = Datadog::OpenTelemetry::SDK::MetricsExporter.new(
74
74
  endpoint: endpoint,
75
75
  timeout: timeout / 1000.0,
76
- headers: headers
76
+ headers: headers,
77
77
  )
78
78
 
79
79
  reader = ::OpenTelemetry::SDK::Metrics::Export::PeriodicMetricReader.new(
80
80
  exporter: exporter,
81
81
  export_interval_millis: metrics_config.export_interval_millis,
82
- export_timeout_millis: metrics_config.export_timeout_millis
82
+ export_timeout_millis: metrics_config.export_timeout_millis,
83
83
  )
84
84
  provider.add_metric_reader(reader)
85
85
  rescue LoadError => e
@@ -19,7 +19,7 @@ module Datadog
19
19
  Datadog.logger.error(
20
20
  "Custom setter is not supported. Please inform the `datadog` team at " \
21
21
  " https://github.com/DataDog/dd-trace-rb of your use case so we can best support you. Using the default " \
22
- "OpenTelemetry::Context::Propagation.text_map_setter as a fallback setter."
22
+ "OpenTelemetry::Context::Propagation.text_map_setter as a fallback setter.",
23
23
  )
24
24
  end
25
25
 
@@ -36,7 +36,7 @@ module Datadog
36
36
  Datadog.logger.error(
37
37
  "Custom getter #{getter} is not supported. Please inform the `datadog` team at " \
38
38
  " https://github.com/DataDog/dd-trace-rb of your use case so we can best support you. Using the default " \
39
- "OpenTelemetry::Context::Propagation.text_map_getter as a fallback getter."
39
+ "OpenTelemetry::Context::Propagation.text_map_getter as a fallback getter.",
40
40
  )
41
41
  end
42
42
 
@@ -75,7 +75,7 @@ module Datadog
75
75
  span_id: span_id,
76
76
  trace_flags: trace_flags,
77
77
  tracestate: tracestate,
78
- remote: true
78
+ remote: true,
79
79
  )
80
80
 
81
81
  span = ::OpenTelemetry::Trace.non_recording_span(span_context)