datadog 2.39.0 → 2.41.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 (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +97 -44
  3. data/ext/datadog_profiling_native_extension/collectors_stack.c +219 -148
  4. data/ext/datadog_profiling_native_extension/collectors_stack.h +16 -2
  5. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +12 -7
  6. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
  7. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +19 -11
  8. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -0
  9. data/ext/datadog_profiling_native_extension/extconf.rb +12 -7
  10. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -3
  11. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +284 -76
  12. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +16 -10
  13. data/ext/libdatadog_api/datadog_ruby_common.c +19 -11
  14. data/ext/libdatadog_api/datadog_ruby_common.h +7 -0
  15. data/ext/libdatadog_api/init.c +4 -0
  16. data/ext/libdatadog_api/trace_exporter.c +1312 -0
  17. data/ext/libdatadog_api/trace_exporter.h +5 -0
  18. data/ext/libdatadog_extconf_helpers.rb +1 -1
  19. data/lib/datadog/ai_guard/api_client.rb +1 -1
  20. data/lib/datadog/ai_guard/evaluation/request.rb +8 -8
  21. data/lib/datadog/ai_guard/evaluation.rb +11 -3
  22. data/lib/datadog/ai_guard/ext.rb +3 -1
  23. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +21 -42
  24. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
  25. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
  26. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
  27. data/lib/datadog/appsec/configuration.rb +11 -2
  28. data/lib/datadog/appsec/context.rb +1 -1
  29. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +1 -1
  30. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +2 -2
  31. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  32. data/lib/datadog/appsec/contrib/devise/patcher.rb +1 -1
  33. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +2 -2
  34. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +2 -2
  35. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  36. data/lib/datadog/appsec/contrib/rack/ext.rb +2 -2
  37. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +2 -2
  38. data/lib/datadog/appsec/contrib/rack/patcher.rb +1 -1
  39. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +6 -3
  40. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +2 -2
  41. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
  42. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
  43. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +2 -2
  44. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
  45. data/lib/datadog/appsec/processor/rule_loader.rb +12 -12
  46. data/lib/datadog/appsec/response.rb +1 -1
  47. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +3 -3
  48. data/lib/datadog/appsec/security_engine/engine.rb +3 -3
  49. data/lib/datadog/core/configuration/components.rb +2 -2
  50. data/lib/datadog/core/configuration/option_definition.rb +1 -1
  51. data/lib/datadog/core/configuration/options.rb +1 -1
  52. data/lib/datadog/core/configuration/settings.rb +33 -41
  53. data/lib/datadog/core/configuration/supported_configurations.rb +3 -0
  54. data/lib/datadog/core/diagnostics/environment_logger.rb +36 -1
  55. data/lib/datadog/core/environment/gc.rb +1 -1
  56. data/lib/datadog/core/environment/vm_cache.rb +1 -1
  57. data/lib/datadog/core/environment/yjit.rb +2 -2
  58. data/lib/datadog/core/metrics/helpers.rb +1 -1
  59. data/lib/datadog/core/metrics/options.rb +2 -2
  60. data/lib/datadog/core/process_discovery.rb +1 -1
  61. data/lib/datadog/core/remote/client.rb +1 -1
  62. data/lib/datadog/core/remote/configuration/repository.rb +2 -2
  63. data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
  64. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -1
  65. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +1 -1
  66. data/lib/datadog/core/telemetry/event/app_started.rb +5 -24
  67. data/lib/datadog/core/telemetry/event/generate_metrics.rb +1 -1
  68. data/lib/datadog/core/telemetry/event/log.rb +2 -2
  69. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +1 -1
  70. data/lib/datadog/core/telemetry/metric.rb +2 -2
  71. data/lib/datadog/core/telemetry/request.rb +2 -2
  72. data/lib/datadog/core/transport/http.rb +1 -1
  73. data/lib/datadog/core/transport/transport.rb +1 -1
  74. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +170 -18
  75. data/lib/datadog/core/utils/sequence.rb +3 -6
  76. data/lib/datadog/core/utils/time.rb +16 -54
  77. data/lib/datadog/data_streams/processor.rb +14 -14
  78. data/lib/datadog/di/el/compiler.rb +88 -12
  79. data/lib/datadog/di/el/evaluator.rb +82 -2
  80. data/lib/datadog/di/el/expression.rb +13 -2
  81. data/lib/datadog/di/instrumenter.rb +5 -4
  82. data/lib/datadog/di/probe_builder.rb +7 -6
  83. data/lib/datadog/di/probe_notification_builder.rb +2 -2
  84. data/lib/datadog/di/serializer.rb +29 -4
  85. data/lib/datadog/error_tracking/component.rb +1 -1
  86. data/lib/datadog/kit/appsec/events/v2.rb +2 -2
  87. data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
  88. data/lib/datadog/open_feature/exposures/event.rb +5 -5
  89. data/lib/datadog/profiling/collectors/info.rb +1 -1
  90. data/lib/datadog/profiling/collectors/thread_context.rb +6 -13
  91. data/lib/datadog/profiling/component.rb +1 -0
  92. data/lib/datadog/profiling/tasks/exec.rb +1 -1
  93. data/lib/datadog/profiling.rb +4 -0
  94. data/lib/datadog/symbol_database/extractor.rb +6 -6
  95. data/lib/datadog/tracing/component.rb +21 -0
  96. data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
  97. data/lib/datadog/tracing/configuration/dynamic.rb +5 -3
  98. data/lib/datadog/tracing/configuration/ext.rb +1 -0
  99. data/lib/datadog/tracing/configuration/settings.rb +16 -0
  100. data/lib/datadog/tracing/contrib/action_cable/events.rb +1 -1
  101. data/lib/datadog/tracing/contrib/action_mailer/events.rb +1 -1
  102. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
  103. data/lib/datadog/tracing/contrib/action_view/events.rb +1 -1
  104. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +1 -1
  105. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  106. data/lib/datadog/tracing/contrib/active_record/events.rb +1 -1
  107. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -2
  108. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  109. data/lib/datadog/tracing/contrib/aws/services.rb +1 -1
  110. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  111. data/lib/datadog/tracing/contrib/ext.rb +3 -3
  112. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -1
  113. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -1
  114. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +1 -1
  115. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +2 -1
  116. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +4 -0
  117. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +7 -2
  118. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +7 -2
  119. data/lib/datadog/tracing/contrib/kafka/events.rb +1 -1
  120. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +1 -1
  121. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  122. data/lib/datadog/tracing/contrib/opensearch/ext.rb +1 -1
  123. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +1 -1
  124. data/lib/datadog/tracing/contrib/patchable.rb +1 -1
  125. data/lib/datadog/tracing/contrib/patcher.rb +1 -1
  126. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  127. data/lib/datadog/tracing/contrib/racecar/events.rb +1 -1
  128. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +1 -1
  129. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +1 -1
  130. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  131. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +1 -1
  132. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  133. data/lib/datadog/tracing/contrib/redis/quantize.rb +36 -2
  134. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +9 -3
  135. data/lib/datadog/tracing/contrib/sequel/database.rb +1 -5
  136. data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
  137. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +1 -1
  138. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +1 -1
  139. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
  140. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
  141. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +1 -1
  142. data/lib/datadog/tracing/correlation.rb +2 -2
  143. data/lib/datadog/tracing/diagnostics/environment_logger.rb +2 -2
  144. data/lib/datadog/tracing/distributed/baggage.rb +1 -2
  145. data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
  146. data/lib/datadog/tracing/metadata/tagging.rb +1 -1
  147. data/lib/datadog/tracing/remote.rb +2 -2
  148. data/lib/datadog/tracing/span.rb +1 -1
  149. data/lib/datadog/tracing/span_operation.rb +1 -1
  150. data/lib/datadog/tracing/sync_writer.rb +8 -3
  151. data/lib/datadog/tracing/tracer.rb +8 -0
  152. data/lib/datadog/tracing/transport/io/traces.rb +1 -1
  153. data/lib/datadog/tracing/transport/native/response.rb +71 -0
  154. data/lib/datadog/tracing/transport/native.rb +387 -0
  155. data/lib/datadog/tracing/transport/trace_formatter.rb +1 -1
  156. data/lib/datadog/tracing/writer.rb +17 -4
  157. data/lib/datadog/version.rb +1 -1
  158. metadata +12 -7
@@ -31,7 +31,7 @@ module Datadog
31
31
  @waf_builder = WAF::HandleBuilder.new(
32
32
  obfuscator: {
33
33
  key_regex: appsec_settings.obfuscator_key_regex,
34
- value_regex: appsec_settings.obfuscator_value_regex
34
+ value_regex: appsec_settings.obfuscator_value_regex,
35
35
  }
36
36
  )
37
37
 
@@ -130,7 +130,7 @@ module Datadog
130
130
  tags: {
131
131
  waf_version: Datadog::AppSec::WAF::VERSION::BASE_STRING,
132
132
  event_rules_version: ruleset_version.to_s,
133
- success: success.to_s
133
+ success: success.to_s,
134
134
  }
135
135
  )
136
136
  end
@@ -156,7 +156,7 @@ module Datadog
156
156
  common_tags = {
157
157
  waf_version: Datadog::AppSec::WAF::VERSION::BASE_STRING,
158
158
  event_rules_version: diagnostics["ruleset_version"].to_s,
159
- action: action
159
+ action: action,
160
160
  }
161
161
 
162
162
  if diagnostics["error"]
@@ -352,13 +352,13 @@ module Datadog
352
352
  # have direct ownership of it.
353
353
  old_statsd = [
354
354
  runtime_metrics.metrics.statsd,
355
- health_metrics.statsd
355
+ health_metrics.statsd,
356
356
  ].compact.uniq
357
357
 
358
358
  new_statsd = if replacement
359
359
  [
360
360
  replacement.runtime_metrics.metrics.statsd,
361
- replacement.health_metrics.statsd
361
+ replacement.health_metrics.statsd,
362
362
  ].compact.uniq
363
363
  else
364
364
  []
@@ -165,7 +165,7 @@ module Datadog
165
165
  resetter: @resetter,
166
166
  setter: @setter,
167
167
  type: @type,
168
- type_options: @type_options
168
+ type_options: @type_options,
169
169
  }
170
170
  end
171
171
 
@@ -84,7 +84,7 @@ module Datadog
84
84
  end
85
85
  {
86
86
  option_name.to_sym => opt_getter,
87
- :"#{option_name}=" => opt_setter
87
+ :"#{option_name}=" => opt_setter,
88
88
  }
89
89
  end
90
90
 
@@ -644,6 +644,13 @@ module Datadog
644
644
  o.env "DD_PROFILING_EXPERIMENTAL_USE_SYSTEM_DNS"
645
645
  o.default true
646
646
  end
647
+
648
+ # Whether the profiler samples include the class/module name in stack frames, like `Foo::Bar#baz`, or not (`baz`)
649
+ option :experimental_show_classes_enabled do |o|
650
+ o.type :bool
651
+ o.env "DD_PROFILING_EXPERIMENTAL_SHOW_CLASSES_ENABLED"
652
+ o.default false
653
+ end
647
654
  end
648
655
 
649
656
  # @public_api
@@ -792,55 +799,40 @@ module Datadog
792
799
  end
793
800
  end
794
801
 
795
- # The time provider used by Datadog. It must respect the interface of [Time](https://ruby-doc.org/core-3.0.1/Time.html).
796
- #
797
- # When testing, it can be helpful to use a different time provider.
798
- #
799
- # For [Timecop](https://rubygems.org/gems/timecop), for example, `->{ Time.now_without_mock_time }`
800
- # allows Datadog features to use the real wall time when time is frozen.
801
- #
802
- # @default `->{ Time.now }`
803
- # @return [Proc<Time>]
802
+ # Deprecated and no longer does anything.
803
+ # This gem already takes care to not be affected by timecop.
804
+ # DEV-3.0: Remove `time_now_provider` option
804
805
  option :time_now_provider do |o|
805
- o.default_proc { ::Time.now }
806
+ o.default_proc { Datadog::Core::Utils::Time.now }
806
807
  o.type :proc
807
-
808
- o.after_set do |time_provider|
809
- Core::Utils::Time.now_provider = time_provider
810
- end
811
-
812
- o.resetter do |_value|
813
- # TODO: Resetter needs access to the default value
814
- # TODO: to help reduce duplication.
815
- -> { ::Time.now }.tap do |default|
816
- Core::Utils::Time.now_provider = default
808
+ o.after_set do |_, _, precedence|
809
+ unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
810
+ unless defined?(Datadog::CI) # the datadog-ci gem needs to work with any datadog gem version and not warn
811
+ Core.log_deprecation(key: :time_now_provider) do
812
+ "The time_now_provider setting has been deprecated for removal " \
813
+ "and no longer does anything. Please remove it from your Datadog.configure block. " \
814
+ "The datadog gem always uses the real non-mocked time, even when the timecop gem monkey-patches Time."
815
+ end
816
+ end
817
817
  end
818
818
  end
819
819
  end
820
820
 
821
- # The monotonic clock time provider used by Datadog. This option is internal and is used by `datadog-ci`
822
- # gem to avoid traces' durations being skewed by timecop.
823
- #
824
- # It must respect the interface of [Datadog::Core::Utils::Time#get_time] method.
825
- #
826
- # For [Timecop](https://rubygems.org/gems/timecop), for example,
827
- # `->(unit = :float_second) { ::Process.clock_gettime_without_mock(Datadog::Core::Utils::Time::MONOTONIC_CLOCK_ID, unit) }`
828
- # allows Datadog features to use the real monotonic time when time is frozen with
829
- # `Timecop.mock_process_clock = true`.
830
- #
831
- # @default `->(unit = :float_second) { ::Process.clock_gettime(Core::Utils::Time::MONOTONIC_CLOCK_ID, unit) }`
832
- # @return [Proc<Numeric>]
821
+ # Deprecated and no longer does anything.
822
+ # This gem already takes care to not be affected by timecop.
823
+ # DEV-3.0: Remove `get_time_provider` option
833
824
  option :get_time_provider do |o|
834
- o.default_proc { |unit = :float_second| ::Process.clock_gettime(Core::Utils::Time::MONOTONIC_CLOCK_ID, unit) }
825
+ o.default_proc { |unit = :float_second| Datadog::Core::Utils::Time.get_time(unit) }
835
826
  o.type :proc
836
-
837
- o.after_set do |get_time_provider|
838
- Core::Utils::Time.get_time_provider = get_time_provider
839
- end
840
-
841
- o.resetter do |_value|
842
- ->(unit = :float_second) { ::Process.clock_gettime(Core::Utils::Time::MONOTONIC_CLOCK_ID, unit) }.tap do |default|
843
- Core::Utils::Time.get_time_provider = default
827
+ o.after_set do |_, _, precedence|
828
+ unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
829
+ unless defined?(Datadog::CI) # the datadog-ci gem needs to work with any datadog gem version and not warn
830
+ Core.log_deprecation(key: :get_time_provider) do
831
+ "The get_time_provider setting has been deprecated for removal " \
832
+ "and no longer does anything. Please remove it from your Datadog.configure block. " \
833
+ "The datadog gem always uses the real non-mocked time, even when the timecop gem monkey-patches Process.clock_gettime."
834
+ end
835
+ end
844
836
  end
845
837
  end
846
838
  end
@@ -24,6 +24,7 @@ module Datadog
24
24
  "DD_API_SECURITY_REQUEST_SAMPLE_RATE",
25
25
  "DD_API_SECURITY_SAMPLE_DELAY",
26
26
  "DD_APM_TRACING_ENABLED",
27
+ "DD_APPSEC_AGENTIC_ONBOARDING",
27
28
  "DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING",
28
29
  "DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE",
29
30
  "DD_APPSEC_BODY_PARSING_SIZE_LIMIT",
@@ -60,6 +61,7 @@ module Datadog
60
61
  "DD_ERROR_TRACKING_HANDLED_ERRORS_INCLUDE",
61
62
  "DD_EXPERIMENTAL_FLAGGING_PROVIDER_ENABLED",
62
63
  "DD_EXPERIMENTAL_FLAGGING_PROVIDER_SPAN_ENRICHMENT_ENABLED",
64
+ "DD_EXPERIMENTAL_NATIVE_TRANSPORT_ENABLED",
63
65
  "DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED",
64
66
  "DD_EXTERNAL_ENV",
65
67
  "DD_FLAGGING_EVALUATION_COUNTS_ENABLED",
@@ -85,6 +87,7 @@ module Datadog
85
87
  "DD_PROFILING_EXPERIMENTAL_HEAP_ENABLED",
86
88
  "DD_PROFILING_EXPERIMENTAL_HEAP_SAMPLE_RATE",
87
89
  "DD_PROFILING_EXPERIMENTAL_HEAP_SIZE_ENABLED",
90
+ "DD_PROFILING_EXPERIMENTAL_SHOW_CLASSES_ENABLED",
88
91
  "DD_PROFILING_EXPERIMENTAL_USE_SYSTEM_DNS",
89
92
  "DD_PROFILING_GC_ENABLED",
90
93
  "DD_PROFILING_GVL_ENABLED",
@@ -75,7 +75,10 @@ module Datadog
75
75
  tags: tags,
76
76
  runtime_metrics_enabled: runtime_metrics_enabled,
77
77
  vm: vm,
78
- health_metrics_enabled: health_metrics_enabled
78
+ health_metrics_enabled: health_metrics_enabled,
79
+ otlp_traces_export_enabled: otlp_traces_export_enabled,
80
+ otlp_metrics_export_enabled: otlp_metrics_export_enabled,
81
+ otlp_logs_export_enabled: otlp_logs_export_enabled,
79
82
  }
80
83
  end
81
84
 
@@ -159,8 +162,40 @@ module Datadog
159
162
  !!Datadog.configuration.health_metrics.enabled
160
163
  end
161
164
 
165
+ # @return [Boolean] whether the tracer exports traces over OTLP.
166
+ # Always false: Ruby exports spans in Datadog's native format and has no OTLP trace exporter.
167
+ def otlp_traces_export_enabled
168
+ false
169
+ end
170
+
171
+ # @return [Boolean] whether the tracer exports metrics over OTLP
172
+ def otlp_metrics_export_enabled
173
+ metrics = opentelemetry_settings&.metrics
174
+ # A "none" exporter skips the OTLP metric reader even when metrics are enabled
175
+ # (mirrors Datadog::OpenTelemetry::Ext::EXPORTER_NONE).
176
+ !!(metrics&.enabled && metrics.exporter != "none")
177
+ end
178
+
179
+ # @return [Boolean] whether the tracer exports logs over OTLP
180
+ def otlp_logs_export_enabled
181
+ logs = opentelemetry_settings&.logs
182
+ # A "none" exporter skips the OTLP log record processor even when logs are enabled
183
+ # (mirrors Datadog::OpenTelemetry::Ext::EXPORTER_NONE).
184
+ !!(logs&.enabled && logs.exporter != "none")
185
+ end
186
+
162
187
  private
163
188
 
189
+ # The `opentelemetry` settings namespace is registered by core configuration, but access it
190
+ # defensively so a missing/unregistered namespace defaults to `false` rather than raising.
191
+ def opentelemetry_settings
192
+ return unless Datadog.configuration.respond_to?(:opentelemetry)
193
+
194
+ Datadog.configuration.opentelemetry
195
+ rescue
196
+ nil
197
+ end
198
+
164
199
  # Outputs "k1:v1,k2:v2,..."
165
200
  def hash_serializer(h)
166
201
  h.map { |k, v| "#{k}:#{v}" }.join(",")
@@ -12,7 +12,7 @@ module Datadog
12
12
  end
13
13
 
14
14
  def available?
15
- defined?(::GC) && ::GC.respond_to?(:stat)
15
+ !!(defined?(::GC) && ::GC.respond_to?(:stat))
16
16
  end
17
17
  end
18
18
  end
@@ -56,7 +56,7 @@ module Datadog
56
56
  end
57
57
 
58
58
  def available?
59
- defined?(::RubyVM) && ::RubyVM.respond_to?(:stat)
59
+ !!(defined?(::RubyVM) && ::RubyVM.respond_to?(:stat))
60
60
  end
61
61
  end
62
62
  end
@@ -59,9 +59,9 @@ module Datadog
59
59
  end
60
60
 
61
61
  def available?
62
- defined?(::RubyVM::YJIT) \
62
+ !!(defined?(::RubyVM::YJIT) \
63
63
  && ::RubyVM::YJIT.enabled? \
64
- && ::RubyVM::YJIT.respond_to?(:runtime_stats)
64
+ && ::RubyVM::YJIT.respond_to?(:runtime_stats))
65
65
  end
66
66
  end
67
67
  end
@@ -10,7 +10,7 @@ module Datadog
10
10
  :distribution,
11
11
  :increment,
12
12
  :gauge,
13
- :time
13
+ :time,
14
14
  ].each do |metric_type|
15
15
  define_method(metric_type) do |name, stat|
16
16
  name = name.to_sym
@@ -16,8 +16,8 @@ module Datadog
16
16
  "#{Ext::TAG_LANG_VERSION}:#{Environment::Identity.lang_version}",
17
17
  # TODO: Technically not accurate, if tracing version diverges from datadog gem version
18
18
  # If we extract tracing to its own gem, this needs to be updated.
19
- "#{Ext::TAG_TRACER_VERSION}:#{Environment::Identity.gem_datadog_version}"
20
- ].freeze
19
+ "#{Ext::TAG_TRACER_VERSION}:#{Environment::Identity.gem_datadog_version}",
20
+ ].freeze,
21
21
  }.freeze
22
22
 
23
23
  def metric_options(options = nil)
@@ -53,7 +53,7 @@ module Datadog
53
53
  service_version: settings.version || "",
54
54
  # Follows Java: https://github.com/DataDog/dd-trace-java/blob/2ebc964340ac530342cc389ba68ff0f5070d5f9f/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ServiceDiscovery.java#L37-L38
55
55
  process_tags: settings.experimental_propagate_process_tags_enabled ? Core::Environment::Process.serialized : "",
56
- container_id: Core::Environment::Container.container_id || ""
56
+ container_id: Core::Environment::Container.container_id || "",
57
57
  }
58
58
  end
59
59
  end
@@ -185,7 +185,7 @@ module Datadog
185
185
  is_agent: false,
186
186
  client_tracer: client_tracer,
187
187
  # base64 is needed otherwise the Go agent fails with an unmarshal error
188
- capabilities: @capabilities.base64_capabilities
188
+ capabilities: @capabilities.base64_capabilities,
189
189
  },
190
190
  cached_target_files: state.cached_target_files,
191
191
  }
@@ -111,9 +111,9 @@ module Datadog
111
111
  hashes: content.hashes.map do |algorithm, hexdigest|
112
112
  {
113
113
  algorithm: algorithm,
114
- hash: hexdigest
114
+ hash: hexdigest,
115
115
  }
116
- end
116
+ end,
117
117
  }
118
118
  end
119
119
  end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Datadog
4
+ module Core
5
+ module Telemetry
6
+ module ConfigurationValue
7
+ module_function
8
+
9
+ def convert(value)
10
+ case value
11
+ when Integer, String, true, false, nil
12
+ value
13
+ when Float
14
+ value.finite? ? value : value.to_s
15
+ when Hash
16
+ value.map { |key, entry_value| "#{key}:#{entry_value}" }.join(",")
17
+ when Array
18
+ value.join(",")
19
+ when Module
20
+ value.name.to_s
21
+ else
22
+ implements_to_s = begin
23
+ value.method(:to_s).owner != Kernel
24
+ rescue NameError
25
+ false
26
+ end
27
+
28
+ if implements_to_s
29
+ value.to_s
30
+ else
31
+ value.class.to_s
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "base"
4
+ require_relative "../configuration_value"
4
5
 
5
6
  module Datadog
6
7
  module Core
@@ -27,10 +28,11 @@ module Datadog
27
28
  def configuration
28
29
  config = Datadog.configuration
29
30
 
31
+ # @type var res: Array[telemetry_configuration]
30
32
  res = @changes.map do |name, value|
31
33
  {
32
34
  name: name,
33
- value: value,
35
+ value: Telemetry::ConfigurationValue.convert(value),
34
36
  origin: @origin,
35
37
  seq_id: Configuration::Option::Precedence::REMOTE_CONFIGURATION.numeric.next,
36
38
  }
@@ -20,7 +20,7 @@ module Datadog
20
20
  def payload
21
21
  {
22
22
  is_first: @is_first,
23
- endpoints: @endpoints
23
+ endpoints: @endpoints,
24
24
  }
25
25
  end
26
26
  end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "base"
4
+ require_relative "../configuration_value"
4
5
 
5
6
  module Datadog
6
7
  module Core
@@ -65,7 +66,7 @@ module Datadog
65
66
  # actually enabled by env var or by implicit enablement via
66
67
  # remote config.
67
68
  enabled: components.dynamic_instrumentation&.started? || false,
68
- }
69
+ },
69
70
  }
70
71
 
71
72
  if (unsupported_reason = Datadog::Profiling.unsupported_reason)
@@ -214,23 +215,9 @@ module Datadog
214
215
  end
215
216
 
216
217
  def to_telemetry_value(value)
217
- # TODO: Add float if telemetry starts accepting it
218
- case value
219
- when Integer, String, true, false, nil
220
- value
221
- when Hash
222
- value.map { |key, entry_value| "#{key}:#{entry_value}" }.join(",")
223
- when Array
224
- value.join(",")
225
- when Module
226
- value.name.to_s
227
- else
228
- if implements_to_s?(value)
229
- value.to_s
230
- else
231
- value.class.to_s
232
- end
233
- end
218
+ return value.to_s if value.is_a?(Float)
219
+
220
+ Telemetry::ConfigurationValue.convert(value)
234
221
  end
235
222
 
236
223
  def install_signature(settings)
@@ -280,12 +267,6 @@ module Datadog
280
267
  parent_setting = settings.dig(*split_option)
281
268
  parent_setting.send(:resolve_option, option_name.to_sym)
282
269
  end
283
-
284
- def implements_to_s?(value)
285
- value.method(:to_s).owner != Kernel
286
- rescue NameError
287
- false
288
- end
289
270
  end
290
271
  end
291
272
  end
@@ -23,7 +23,7 @@ module Datadog
23
23
  def payload
24
24
  {
25
25
  namespace: @namespace,
26
- series: @metric_series.map(&:to_h)
26
+ series: @metric_series.map(&:to_h),
27
27
  }
28
28
  end
29
29
 
@@ -52,8 +52,8 @@ module Datadog
52
52
  level: @level,
53
53
  stack_trace: @stack_trace,
54
54
  count: @count,
55
- }.compact
56
- ]
55
+ }.compact,
56
+ ],
57
57
  }
58
58
  end
59
59
 
@@ -57,7 +57,7 @@ module Datadog
57
57
  end
58
58
 
59
59
  def reset?
60
- defined?(@reset) && !!@reset
60
+ !!(defined?(@reset) && @reset)
61
61
  end
62
62
  end
63
63
  end
@@ -37,7 +37,7 @@ module Datadog
37
37
  points: values,
38
38
  type: type,
39
39
  tags: tags,
40
- common: common
40
+ common: common,
41
41
  }
42
42
  end
43
43
 
@@ -179,7 +179,7 @@ module Datadog
179
179
  metric: name,
180
180
  points: values,
181
181
  tags: tags,
182
- common: common
182
+ common: common,
183
183
  }
184
184
  end
185
185
  end
@@ -50,7 +50,7 @@ module Datadog
50
50
  runtime_version: Core::Environment::Ext::ENGINE_VERSION,
51
51
  service_name: config.service,
52
52
  service_version: config.version,
53
- tracer_version: tracer_version
53
+ tracer_version: tracer_version,
54
54
  }
55
55
 
56
56
  tag_process_tags!(app, config)
@@ -64,7 +64,7 @@ module Datadog
64
64
  hostname: Core::Environment::Platform.hostname,
65
65
  kernel_name: Core::Environment::Platform.kernel_name,
66
66
  kernel_release: Core::Environment::Platform.kernel_release,
67
- kernel_version: Core::Environment::Platform.kernel_version
67
+ kernel_version: Core::Environment::Platform.kernel_version,
68
68
  }
69
69
  end
70
70
 
@@ -61,7 +61,7 @@ module Datadog
61
61
  Core::Transport::Ext::HTTP::HEADER_META_LANG_INTERPRETER_VENDOR =>
62
62
  Core::Environment::Ext::LANG_ENGINE,
63
63
  Core::Transport::Ext::HTTP::HEADER_META_TRACER_VERSION =>
64
- Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION
64
+ Datadog::Core::Environment::Ext::GEM_DATADOG_VERSION,
65
65
  }.tap do |headers|
66
66
  # Add application container info
67
67
  headers.merge!(Core::Environment::Container.to_headers)
@@ -69,7 +69,7 @@ module Datadog
69
69
 
70
70
  @current_api_id = api_id
71
71
  client_class = self.class.http_client_class || Core::Transport::HTTP::Client
72
- @client = client_class.new(current_api, logger: logger) # steep:ignore
72
+ @client = client_class.new(current_api, logger: logger)
73
73
  end
74
74
 
75
75
  def downgrade?(response)