datadog 2.31.0 → 2.33.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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/ext/datadog_profiling_native_extension/clock_id.h +9 -1
  3. data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +73 -0
  4. data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +1 -1
  5. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +17 -7
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +16 -5
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +6 -0
  8. data/ext/datadog_profiling_native_extension/extconf.rb +8 -4
  9. data/ext/datadog_profiling_native_extension/http_transport.c +10 -5
  10. data/ext/datadog_profiling_native_extension/stack_recorder.c +3 -9
  11. data/ext/datadog_profiling_native_extension/time_helpers.h +1 -0
  12. data/ext/libdatadog_api/crashtracker.c +2 -0
  13. data/ext/libdatadog_api/di.c +48 -0
  14. data/ext/libdatadog_api/extconf.rb +7 -4
  15. data/ext/libdatadog_extconf_helpers.rb +38 -1
  16. data/lib/datadog/ai_guard/autoload.rb +10 -0
  17. data/lib/datadog/ai_guard/component.rb +1 -1
  18. data/lib/datadog/ai_guard/configuration.rb +105 -2
  19. data/lib/datadog/ai_guard/contrib/auto_instrument.rb +24 -0
  20. data/lib/datadog/ai_guard/contrib/rack/integration.rb +42 -0
  21. data/lib/datadog/ai_guard/contrib/rack/patcher.rb +26 -0
  22. data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +83 -0
  23. data/lib/datadog/ai_guard/contrib/rails/integration.rb +41 -0
  24. data/lib/datadog/ai_guard/contrib/rails/patcher.rb +97 -0
  25. data/lib/datadog/ai_guard/evaluation.rb +2 -0
  26. data/lib/datadog/ai_guard/ext.rb +2 -0
  27. data/lib/datadog/ai_guard.rb +8 -0
  28. data/lib/datadog/appsec/autoload.rb +1 -1
  29. data/lib/datadog/appsec/component.rb +1 -1
  30. data/lib/datadog/appsec/configuration.rb +414 -1
  31. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +75 -0
  32. data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +39 -0
  33. data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +30 -0
  34. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +111 -0
  35. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +2 -1
  36. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +1 -1
  37. data/lib/datadog/appsec/contrib/rails/patcher.rb +2 -2
  38. data/lib/datadog/appsec/metrics/telemetry.rb +13 -1
  39. data/lib/datadog/appsec/security_engine/runner.rb +1 -1
  40. data/lib/datadog/appsec/trace_keeper.rb +18 -6
  41. data/lib/datadog/appsec/utils/http/url_encoded.rb +2 -2
  42. data/lib/datadog/appsec.rb +1 -0
  43. data/lib/datadog/core/configuration/components.rb +1 -1
  44. data/lib/datadog/core/configuration/settings.rb +13 -0
  45. data/lib/datadog/core/configuration/supported_configurations.rb +4 -0
  46. data/lib/datadog/core/configuration.rb +1 -1
  47. data/lib/datadog/core/contrib/rails/utils.rb +1 -1
  48. data/lib/datadog/core/crashtracking/component.rb +3 -3
  49. data/lib/datadog/core/diagnostics/environment_logger.rb +3 -1
  50. data/lib/datadog/core/environment/container.rb +2 -2
  51. data/lib/datadog/core/environment/ext.rb +1 -0
  52. data/lib/datadog/core/environment/socket.rb +13 -0
  53. data/lib/datadog/core/feature_flags.rb +1 -1
  54. data/lib/datadog/core/metrics/client.rb +5 -5
  55. data/lib/datadog/core/remote/client.rb +1 -1
  56. data/lib/datadog/core/remote/component.rb +2 -2
  57. data/lib/datadog/core/runtime/metrics.rb +1 -1
  58. data/lib/datadog/core/telemetry/emitter.rb +1 -1
  59. data/lib/datadog/core/telemetry/event/app_started.rb +2 -2
  60. data/lib/datadog/core/transport/http.rb +2 -0
  61. data/lib/datadog/core/utils.rb +1 -1
  62. data/lib/datadog/core/workers/async.rb +1 -1
  63. data/lib/datadog/core.rb +1 -1
  64. data/lib/datadog/data_streams/configuration.rb +40 -1
  65. data/lib/datadog/data_streams/pathway_context.rb +1 -1
  66. data/lib/datadog/data_streams/processor.rb +1 -1
  67. data/lib/datadog/data_streams.rb +1 -1
  68. data/lib/datadog/di/base.rb +8 -5
  69. data/lib/datadog/di/code_tracker.rb +179 -1
  70. data/lib/datadog/di/component.rb +1 -1
  71. data/lib/datadog/di/configuration.rb +235 -2
  72. data/lib/datadog/di/instrumenter.rb +46 -26
  73. data/lib/datadog/di/probe_builder.rb +1 -1
  74. data/lib/datadog/di/probe_file_loader.rb +2 -2
  75. data/lib/datadog/di/probe_manager.rb +6 -6
  76. data/lib/datadog/di/probe_notification_builder.rb +1 -1
  77. data/lib/datadog/di/probe_notifier_worker.rb +2 -2
  78. data/lib/datadog/di/remote.rb +6 -6
  79. data/lib/datadog/di/serializer.rb +1 -1
  80. data/lib/datadog/di/transport/input.rb +3 -3
  81. data/lib/datadog/error_tracking/configuration.rb +55 -2
  82. data/lib/datadog/kit/enable_core_dumps.rb +1 -1
  83. data/lib/datadog/open_feature/component.rb +18 -1
  84. data/lib/datadog/open_feature/evaluation_engine.rb +3 -3
  85. data/lib/datadog/open_feature/exposures/reporter.rb +1 -1
  86. data/lib/datadog/open_feature/exposures/worker.rb +1 -1
  87. data/lib/datadog/open_feature/hooks/flag_eval_hook.rb +49 -0
  88. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +149 -0
  89. data/lib/datadog/open_feature/provider.rb +19 -1
  90. data/lib/datadog/open_feature/remote.rb +1 -1
  91. data/lib/datadog/open_feature/transport.rb +1 -1
  92. data/lib/datadog/opentelemetry/metrics.rb +13 -4
  93. data/lib/datadog/opentelemetry/sdk/configurator.rb +1 -1
  94. data/lib/datadog/opentelemetry/sdk/id_generator.rb +16 -10
  95. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +1 -1
  96. data/lib/datadog/profiling/collectors/code_provenance.rb +35 -9
  97. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +31 -2
  98. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +8 -2
  99. data/lib/datadog/profiling/collectors/info.rb +16 -3
  100. data/lib/datadog/profiling/component.rb +3 -6
  101. data/lib/datadog/profiling/exporter.rb +37 -12
  102. data/lib/datadog/profiling/ext.rb +0 -2
  103. data/lib/datadog/profiling/flush.rb +21 -12
  104. data/lib/datadog/profiling/http_transport.rb +12 -1
  105. data/lib/datadog/profiling/load_native_extension.rb +1 -1
  106. data/lib/datadog/profiling/profiler.rb +13 -1
  107. data/lib/datadog/profiling/scheduler.rb +2 -2
  108. data/lib/datadog/profiling/stack_recorder.rb +0 -4
  109. data/lib/datadog/profiling/tasks/exec.rb +8 -3
  110. data/lib/datadog/profiling/tasks/help.rb +1 -0
  111. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  112. data/lib/datadog/single_step_instrument.rb +1 -1
  113. data/lib/datadog/symbol_database/configuration.rb +65 -0
  114. data/lib/datadog/symbol_database/extractor.rb +906 -0
  115. data/lib/datadog/symbol_database/file_hash.rb +46 -0
  116. data/lib/datadog/symbol_database/logger.rb +43 -0
  117. data/lib/datadog/symbol_database/scope.rb +102 -0
  118. data/lib/datadog/symbol_database/scope_batcher.rb +280 -0
  119. data/lib/datadog/symbol_database/service_version.rb +57 -0
  120. data/lib/datadog/symbol_database/symbol.rb +66 -0
  121. data/lib/datadog/symbol_database/transport/http/endpoint.rb +28 -0
  122. data/lib/datadog/symbol_database/transport/http.rb +45 -0
  123. data/lib/datadog/symbol_database/transport.rb +54 -0
  124. data/lib/datadog/symbol_database/uploader.rb +169 -0
  125. data/lib/datadog/symbol_database.rb +49 -0
  126. data/lib/datadog/tracing/buffer.rb +3 -3
  127. data/lib/datadog/tracing/configuration/settings.rb +1 -1
  128. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +5 -3
  129. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  130. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  131. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  132. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  133. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  134. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  135. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  136. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  137. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +1 -1
  138. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  139. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  140. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -1
  141. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  142. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -1
  143. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
  144. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -1
  145. data/lib/datadog/tracing/contrib/component.rb +1 -1
  146. data/lib/datadog/tracing/contrib/configuration/resolver.rb +7 -4
  147. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  148. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -1
  149. data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -2
  150. data/lib/datadog/tracing/contrib/extensions.rb +9 -0
  151. data/lib/datadog/tracing/contrib/faraday/middleware.rb +2 -2
  152. data/lib/datadog/tracing/contrib/grape/endpoint.rb +5 -5
  153. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +2 -2
  154. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +2 -2
  155. data/lib/datadog/tracing/contrib/http/instrumentation.rb +2 -2
  156. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -2
  157. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +2 -2
  158. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
  159. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +2 -2
  160. data/lib/datadog/tracing/contrib/karafka/patcher.rb +1 -1
  161. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +3 -3
  162. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -1
  163. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
  164. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +6 -0
  165. data/lib/datadog/tracing/contrib/rack/ext.rb +27 -0
  166. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  167. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  168. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +117 -1
  169. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  170. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  171. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +2 -2
  172. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  173. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  174. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
  175. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  176. data/lib/datadog/tracing/contrib.rb +8 -0
  177. data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -1
  178. data/lib/datadog/tracing/distributed/baggage.rb +59 -5
  179. data/lib/datadog/tracing/distributed/datadog.rb +11 -11
  180. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -1
  181. data/lib/datadog/tracing/distributed/propagation.rb +2 -2
  182. data/lib/datadog/tracing/distributed/trace_context.rb +74 -32
  183. data/lib/datadog/tracing/event.rb +1 -1
  184. data/lib/datadog/tracing/metadata/tagging.rb +2 -2
  185. data/lib/datadog/tracing/pipeline.rb +1 -1
  186. data/lib/datadog/tracing/remote.rb +1 -1
  187. data/lib/datadog/tracing/sampling/rule.rb +1 -1
  188. data/lib/datadog/tracing/sampling/rule_sampler.rb +2 -2
  189. data/lib/datadog/tracing/sampling/span/rule_parser.rb +2 -2
  190. data/lib/datadog/tracing/span_operation.rb +3 -3
  191. data/lib/datadog/tracing/trace_operation.rb +4 -4
  192. data/lib/datadog/tracing/tracer.rb +6 -8
  193. data/lib/datadog/tracing/transport/io/client.rb +1 -1
  194. data/lib/datadog/tracing/workers.rb +2 -1
  195. data/lib/datadog/version.rb +1 -1
  196. metadata +33 -12
  197. data/ext/datadog_profiling_native_extension/clock_id_noop.c +0 -21
  198. data/lib/datadog/ai_guard/configuration/settings.rb +0 -113
  199. data/lib/datadog/appsec/configuration/settings.rb +0 -423
  200. data/lib/datadog/data_streams/configuration/settings.rb +0 -49
  201. data/lib/datadog/di/configuration/settings.rb +0 -243
  202. data/lib/datadog/error_tracking/configuration/settings.rb +0 -63
@@ -25,7 +25,7 @@ module Datadog
25
25
  def query
26
26
  ::Rack::Utils.parse_query(request.query_string)
27
27
  rescue => e
28
- Datadog.logger.debug { "AppSec: Failed to parse request query string: #{e.class}: #{e}" }
28
+ Datadog.logger.debug { "AppSec: Failed to parse request query string: #{e.class}: #{e.message}" }
29
29
  AppSec.telemetry.report(e, description: 'AppSec: Failed to parse request query string')
30
30
 
31
31
  {}
@@ -138,7 +138,7 @@ module Datadog
138
138
  end
139
139
  rescue => e
140
140
  error_message = 'Failed to get application routes'
141
- Datadog.logger.error("#{error_message}, #{e.class}: #{e}")
141
+ Datadog.logger.error("#{error_message}, #{e.class}: #{e.message}")
142
142
  AppSec.telemetry.report(e, description: error_message)
143
143
  end
144
144
  end
@@ -148,7 +148,7 @@ module Datadog
148
148
  Datadog::AppSec::Contrib::Rails::Patcher.report_routes_via_telemetry(::Rails.application.routes.routes)
149
149
  rescue => e
150
150
  error_message = 'Failed to get application routes'
151
- Datadog.logger.error("#{error_message}, #{e.class}: #{e}")
151
+ Datadog.logger.error("#{error_message}, #{e.class}: #{e.message}")
152
152
  AppSec.telemetry.report(e, description: error_message)
153
153
  end
154
154
  end
@@ -5,6 +5,11 @@ module Datadog
5
5
  module Metrics
6
6
  # A class responsible for reporting WAF and RASP telemetry metrics.
7
7
  module Telemetry
8
+ ACTION_BLOCK = 'block_request'
9
+ ACTION_REDIRECT = 'redirect_request'
10
+ BLOCK_SUCCESS = 'success'
11
+ BLOCK_IRRELEVANT = 'irrelevant'
12
+
8
13
  module_function
9
14
 
10
15
  def report_rasp(type, result, phase: nil)
@@ -19,8 +24,15 @@ module Datadog
19
24
  namespace = Ext::TELEMETRY_METRICS_NAMESPACE
20
25
 
21
26
  AppSec.telemetry.inc(namespace, 'rasp.rule.eval', 1, tags: tags)
22
- AppSec.telemetry.inc(namespace, 'rasp.rule.match', 1, tags: tags) if result.match?
23
27
  AppSec.telemetry.inc(namespace, 'rasp.timeout', 1, tags: tags) if result.timeout?
28
+
29
+ if result.match?
30
+ blocked = result.actions.key?(ACTION_BLOCK) || result.actions.key?(ACTION_REDIRECT)
31
+ # NOTE: Mutates tags to avoid an extra hash allocation. Keep this the last .inc call.
32
+ tags[:block] = blocked ? BLOCK_SUCCESS : BLOCK_IRRELEVANT
33
+
34
+ AppSec.telemetry.inc(namespace, 'rasp.rule.match', 1, tags: tags)
35
+ end
24
36
  end
25
37
  end
26
38
  end
@@ -79,7 +79,7 @@ module Datadog
79
79
  def try_run(persistent_data, ephemeral_data, timeout)
80
80
  waf_context.run(persistent_data, ephemeral_data, timeout)
81
81
  rescue WAF::LibDDWAFError => e
82
- Datadog.logger.debug { "#{@debug_tag} execution error: #{e} backtrace: #{e.backtrace&.first(3)}" }
82
+ Datadog.logger.debug { "#{@debug_tag} execution error: #{e.class}: #{e.message} backtrace: #{e.backtrace&.first(3)}" }
83
83
  AppSec.telemetry.report(e, description: 'libddwaf-rb internal low-level error')
84
84
 
85
85
  WAF::Result.new(
@@ -7,16 +7,28 @@ module Datadog
7
7
  def self.keep!(trace)
8
8
  return unless trace
9
9
 
10
+ previous_dm = trace.get_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
11
+
10
12
  # NOTE: This action will not set correct decision maker value, so the
11
13
  # trace keeping must be done with additional steps below
12
14
  trace.keep!
13
15
 
14
- # Propagate to downstream services the information that
15
- # the current distributed trace is containing at least one ASM event.
16
- trace.set_tag(
17
- Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
18
- Tracing::Sampling::Ext::Decision::ASM
19
- )
16
+ # NOTE: Preserve decision maker if already set by another product.
17
+ # As `trace.keep!` resets `_dd.p.dm` to `MANUAL`, we restore the
18
+ # previous value when another product has already claimed the
19
+ # decision maker.
20
+ if previous_dm.nil? || previous_dm == Tracing::Sampling::Ext::Decision::MANUAL
21
+ trace.set_tag(
22
+ Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
23
+ Tracing::Sampling::Ext::Decision::ASM
24
+ )
25
+ else
26
+ trace.set_tag(
27
+ Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
28
+ previous_dm,
29
+ )
30
+ end
31
+
20
32
  trace.set_distributed_source(Ext::PRODUCT_BIT)
21
33
  end
22
34
  end
@@ -30,8 +30,8 @@ module Datadog
30
30
  #
31
31
  # @type var key: ::String
32
32
  # @type var value: ::String
33
- key, value = pair.split('=', 2).map! do |value|
34
- CGI.unescape(value)
33
+ key, value = pair.split('=', 2).map! do |val|
34
+ CGI.unescape(val)
35
35
  end #: [::String, ::String]
36
36
 
37
37
  if (stored = memo[key])
@@ -63,5 +63,6 @@ require_relative 'appsec/contrib/graphql/integration'
63
63
  require_relative 'appsec/contrib/faraday/integration'
64
64
  require_relative 'appsec/contrib/excon/integration'
65
65
  require_relative 'appsec/contrib/rest_client/integration'
66
+ require_relative 'appsec/contrib/aws_lambda/integration'
66
67
 
67
68
  require_relative 'appsec/autoload'
@@ -98,7 +98,7 @@ module Datadog
98
98
  agent_info: agent_info
99
99
  )
100
100
  rescue => e
101
- logger.warn("Failed to initialize Data Streams Monitoring: #{e.class}: #{e}")
101
+ logger.warn("Failed to initialize Data Streams Monitoring: #{e.class}: #{e.message}")
102
102
  nil
103
103
  end
104
104
  end
@@ -13,6 +13,7 @@ require_relative '../../profiling/ext'
13
13
 
14
14
  require_relative '../../tracing/configuration/settings'
15
15
  require_relative '../../opentelemetry/configuration/settings'
16
+ require_relative '../../symbol_database/configuration'
16
17
 
17
18
  module Datadog
18
19
  module Core
@@ -170,6 +171,16 @@ module Datadog
170
171
  o.env Core::Environment::Ext::ENV_ENVIRONMENT
171
172
  end
172
173
 
174
+ # Override the hostname reported by this process.
175
+ # When `report_hostname` is enabled, sets the hostname on traces and
176
+ # the `host.name` resource attribute in OpenTelemetry.
177
+ # @default `DD_HOSTNAME` environment variable, otherwise `nil`
178
+ # @return [String,nil]
179
+ option :hostname do |o|
180
+ o.type :string, nilable: true
181
+ o.env Core::Environment::Ext::ENV_HOSTNAME
182
+ end
183
+
173
184
  # Configuration for container environments. For internal use only.
174
185
  # @!visibility private
175
186
  settings :container do
@@ -1111,6 +1122,8 @@ module Datadog
1111
1122
  extend Datadog::Tracing::Configuration::Settings
1112
1123
 
1113
1124
  extend Datadog::OpenTelemetry::Configuration::Settings
1125
+
1126
+ extend Datadog::SymbolDatabase::Configuration::Settings
1114
1127
  end
1115
1128
  # standard:enable Metrics/BlockLength
1116
1129
  end
@@ -61,12 +61,14 @@ module Datadog
61
61
  "DD_GIT_COMMIT_SHA",
62
62
  "DD_GIT_REPOSITORY_URL",
63
63
  "DD_HEALTH_METRICS_ENABLED",
64
+ "DD_HOSTNAME",
64
65
  "DD_INJECTION_ENABLED",
65
66
  "DD_INJECT_FORCE",
66
67
  "DD_INSTRUMENTATION_INSTALL_ID",
67
68
  "DD_INSTRUMENTATION_INSTALL_TIME",
68
69
  "DD_INSTRUMENTATION_INSTALL_TYPE",
69
70
  "DD_INSTRUMENTATION_TELEMETRY_ENABLED",
71
+ "DD_INTERNAL_FORCE_SYMBOL_DATABASE_UPLOAD",
70
72
  "DD_LOGS_INJECTION",
71
73
  "DD_METRICS_OTEL_ENABLED",
72
74
  "DD_METRIC_AGENT_PORT",
@@ -104,6 +106,7 @@ module Datadog
104
106
  "DD_SITE",
105
107
  "DD_SPAN_SAMPLING_RULES",
106
108
  "DD_SPAN_SAMPLING_RULES_FILE",
109
+ "DD_SYMBOL_DATABASE_UPLOAD_ENABLED",
107
110
  "DD_TAGS",
108
111
  "DD_TELEMETRY_AGENTLESS_URL",
109
112
  "DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED",
@@ -226,6 +229,7 @@ module Datadog
226
229
  "DD_TRACE_HTTP_ENABLED",
227
230
  "DD_TRACE_HTTP_ERROR_STATUS_CODES",
228
231
  "DD_TRACE_HTTP_SERVER_ERROR_STATUSES",
232
+ "DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED",
229
233
  "DD_TRACE_KAFKA_ANALYTICS_ENABLED",
230
234
  "DD_TRACE_KAFKA_ANALYTICS_SAMPLE_RATE",
231
235
  "DD_TRACE_KAFKA_ENABLED",
@@ -238,7 +238,7 @@ module Datadog
238
238
  yield write_components
239
239
  rescue ThreadError => e
240
240
  logger_without_components.error(
241
- "Detected deadlock during datadog initialization: #{e.class}: #{e}. " \
241
+ "Detected deadlock during datadog initialization: #{e.class}: #{e.message}. " \
242
242
  'Please report this at https://github.com/datadog/dd-trace-rb/blob/master/CONTRIBUTING.md#found-a-bug' \
243
243
  "\n\tSource:\n\t#{Array(e.backtrace).join("\n\t")}"
244
244
  )
@@ -14,7 +14,7 @@ module Datadog
14
14
  end
15
15
  application_name&.underscore
16
16
  rescue => e
17
- Datadog.logger.debug("Failed to extract Rails application name: #{e.class}: #{e}")
17
+ Datadog.logger.debug("Failed to extract Rails application name: #{e.class}: #{e.message}")
18
18
  nil
19
19
  end
20
20
 
@@ -55,7 +55,7 @@ module Datadog
55
55
  # Unhandled exception report triggering means that the application is already in a bad state
56
56
  # We don't want to swallow non-StandardError exceptions here; we would rather just let the
57
57
  # application crash
58
- Datadog.logger.debug { "Crashtracker failed to report unhandled exception: #{e.class}: #{e}" }
58
+ Datadog.logger.debug { "Crashtracker failed to report unhandled exception: #{e.class}: #{e.message}" }
59
59
  end
60
60
  end
61
61
 
@@ -130,7 +130,7 @@ module Datadog
130
130
  self.class._native_stop
131
131
  logger.debug('Crash tracking stopped successfully')
132
132
  rescue => e
133
- logger.error("Failed to stop crash tracking: #{e.class}: #{e}")
133
+ logger.error("Failed to stop crash tracking: #{e.class}: #{e.message}")
134
134
  end
135
135
 
136
136
  private
@@ -149,7 +149,7 @@ module Datadog
149
149
  )
150
150
  logger.debug("Crash tracking action: #{action} successful")
151
151
  rescue => e
152
- logger.error("Failed to #{action} crash tracking: #{e.class}: #{e}")
152
+ logger.error("Failed to #{action} crash tracking: #{e.class}: #{e.message}")
153
153
  end
154
154
  end
155
155
  end
@@ -52,7 +52,9 @@ module Datadog
52
52
  log_configuration!('CORE', data.to_json)
53
53
  end
54
54
  rescue => e
55
- logger.warn("Failed to collect core environment information: #{e} Location: #{Array(e.backtrace).first}")
55
+ logger.warn(
56
+ "Failed to collect core environment information: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
57
+ )
56
58
  end
57
59
  end
58
60
 
@@ -108,7 +108,7 @@ module Datadog
108
108
  end
109
109
  rescue => e
110
110
  Datadog.logger.debug(
111
- "Error while checking cgroup namespace. Cause: #{e.class}: #{e} Location: #{Array(e.backtrace).first}"
111
+ "Error while checking cgroup namespace. Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
112
112
  )
113
113
  false
114
114
  end
@@ -172,7 +172,7 @@ module Datadog
172
172
  @entry = Entry.new # Empty entry if no valid cgroup entry is found
173
173
  rescue => e
174
174
  Datadog.logger.debug(
175
- "Error while reading container entry. Cause: #{e.class}: #{e} Location: #{Array(e.backtrace).first}"
175
+ "Error while reading container entry. Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
176
176
  )
177
177
  @entry = Entry.new unless defined?(@entry)
178
178
  @entry
@@ -18,6 +18,7 @@ module Datadog
18
18
  ENV_API_KEY = 'DD_API_KEY'
19
19
  ENV_ENVIRONMENT = 'DD_ENV'
20
20
  ENV_EXTERNAL_ENV = 'DD_EXTERNAL_ENV'
21
+ ENV_HOSTNAME = 'DD_HOSTNAME'
21
22
  ENV_SERVICE = 'DD_SERVICE'
22
23
  ENV_SITE = 'DD_SITE'
23
24
  ENV_TAGS = 'DD_TAGS'
@@ -18,6 +18,19 @@ module Datadog
18
18
 
19
19
  @hostname ||= ::Socket.gethostname.freeze
20
20
  end
21
+
22
+ # Returns the resolved hostname when `report_hostname` is enabled:
23
+ # the configured DD_HOSTNAME if set, otherwise the system hostname.
24
+ # Returns nil when `report_hostname` is disabled or no hostname is available.
25
+ def resolved_hostname(settings)
26
+ return nil unless settings.tracing.report_hostname
27
+
28
+ configured = settings.hostname
29
+ return configured if configured && !configured.empty?
30
+
31
+ resolved_hostname = hostname
32
+ resolved_hostname if resolved_hostname && !resolved_hostname.empty?
33
+ end
21
34
  end
22
35
  end
23
36
  end
@@ -37,7 +37,7 @@ module Datadog
37
37
  # moved into C extension
38
38
  @value = json?(value) ? JSON.parse(value) : value
39
39
  rescue JSON::ParserError => e
40
- raise Error, "Failed to parse JSON value: #{e.class}: #{e}"
40
+ raise Error, "Failed to parse JSON value: #{e.class}: #{e.message}"
41
41
  end
42
42
 
43
43
  # Check if the resolution resulted in an error
@@ -101,7 +101,7 @@ module Datadog
101
101
  statsd.count(stat, value, metric_options(options))
102
102
  rescue => e
103
103
  logger.error(
104
- "Failed to send count stat. Cause: #{e.class}: #{e} Source: #{Array(e.backtrace).first}"
104
+ "Failed to send count stat. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
105
105
  )
106
106
  telemetry.report(e, description: 'Failed to send count stat')
107
107
  end
@@ -115,7 +115,7 @@ module Datadog
115
115
  statsd.distribution(stat, value, metric_options(options))
116
116
  rescue => e
117
117
  logger.error(
118
- "Failed to send distribution stat. Cause: #{e.class}: #{e} Source: #{Array(e.backtrace).first}"
118
+ "Failed to send distribution stat. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
119
119
  )
120
120
  telemetry.report(e, description: 'Failed to send distribution stat')
121
121
  end
@@ -128,7 +128,7 @@ module Datadog
128
128
  statsd.increment(stat, metric_options(options))
129
129
  rescue => e
130
130
  logger.error(
131
- "Failed to send increment stat. Cause: #{e.class}: #{e} Source: #{Array(e.backtrace).first}"
131
+ "Failed to send increment stat. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
132
132
  )
133
133
  telemetry.report(e, description: 'Failed to send increment stat')
134
134
  end
@@ -142,7 +142,7 @@ module Datadog
142
142
  statsd.gauge(stat, value, metric_options(options))
143
143
  rescue => e
144
144
  logger.error(
145
- "Failed to send gauge stat. Cause: #{e.class}: #{e} Source: #{Array(e.backtrace).first}"
145
+ "Failed to send gauge stat. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
146
146
  )
147
147
  telemetry.report(e, description: 'Failed to send gauge stat')
148
148
  end
@@ -162,7 +162,7 @@ module Datadog
162
162
  rescue => e
163
163
  # TODO: Likely to be redundant, since `distribution` handles its own errors.
164
164
  logger.error(
165
- "Failed to send time stat. Cause: #{e.class}: #{e} Source: #{Array(e.backtrace).first}"
165
+ "Failed to send time stat. Cause: #{e.class}: #{e.message} Source: #{Array(e.backtrace).first}"
166
166
  )
167
167
  telemetry.report(e, description: 'Failed to send time stat')
168
168
  end
@@ -57,7 +57,7 @@ module Datadog
57
57
 
58
58
  contents = Configuration::ContentList.parse(response.target_files)
59
59
  rescue Remote::Configuration::Path::ParseError => e
60
- raise SyncError, e.message
60
+ raise SyncError, "#{e.class}: #{e.message}"
61
61
  end
62
62
 
63
63
  # To make sure steep does not complain
@@ -45,7 +45,7 @@ module Datadog
45
45
  rescue Client::SyncError => e
46
46
  # Transient errors due to network or agent. Logged the error but not via telemetry
47
47
  logger.error do
48
- "remote worker client sync error: #{e.class}: #{e} location: #{Array(e.backtrace).first}. skipping sync"
48
+ "remote worker client sync error: #{e.class}: #{e.message} location: #{Array(e.backtrace).first}. skipping sync"
49
49
  end
50
50
  rescue => e
51
51
  # In case of unexpected errors, reset the negotiation object
@@ -55,7 +55,7 @@ module Datadog
55
55
 
56
56
  # Transient errors due to network or agent. Logged the error but not via telemetry
57
57
  logger.error do
58
- "remote worker error: #{e.class}: #{e} location: #{Array(e.backtrace).first}. " \
58
+ "remote worker error: #{e.class}: #{e.message} location: #{Array(e.backtrace).first}. " \
59
59
  'resetting client state'
60
60
  end
61
61
 
@@ -100,7 +100,7 @@ module Datadog
100
100
  def try_flush
101
101
  yield
102
102
  rescue => e
103
- Datadog.logger.warn("Error while sending runtime metric. Cause: #{e.class}: #{e}")
103
+ Datadog.logger.warn("Error while sending runtime metric. Cause: #{e.class}: #{e.message}")
104
104
  end
105
105
 
106
106
  def default_metric_options
@@ -39,7 +39,7 @@ module Datadog
39
39
  res
40
40
  rescue => e
41
41
  logger.debug {
42
- "Unable to send telemetry request for event `#{event.respond_to?(:type) ? event.type : event.to_s}`: #{e.class}: #{e}"
42
+ "Unable to send telemetry request for event `#{event.respond_to?(:type) ? event.type : event.to_s}`: #{e.class}: #{e.message}"
43
43
  }
44
44
  Core::Transport::InternalErrorResponse.new(e)
45
45
  end
@@ -260,9 +260,9 @@ module Datadog
260
260
  end
261
261
 
262
262
  def collect_integration_configuration_options(tracing_settings)
263
- return [] unless tracing_settings.respond_to?(:instrumented_integrations)
263
+ return [] unless tracing_settings.respond_to?(:instrumented_built_in_integrations)
264
264
 
265
- tracing_settings.instrumented_integrations.each_value.with_object([]) do |integration, entries|
265
+ tracing_settings.instrumented_built_in_integrations.each_with_object([]) do |integration, entries|
266
266
  integration.configurations.each_value do |configuration|
267
267
  entries.concat(collect_configuration_options_from(configuration))
268
268
  end
@@ -4,6 +4,8 @@ require_relative 'http/builder'
4
4
  require_relative 'http/adapters/net'
5
5
  require_relative 'http/adapters/unix_socket'
6
6
  require_relative 'http/adapters/test'
7
+ require_relative '../environment/container'
8
+ require_relative '../environment/ext'
7
9
 
8
10
  module Datadog
9
11
  module Core
@@ -63,7 +63,7 @@ module Datadog
63
63
  str.encode(::Encoding::UTF_8)
64
64
  end
65
65
  rescue => e
66
- Datadog.logger.debug("Error encoding string in UTF-8: #{e}")
66
+ Datadog.logger.debug("Error encoding string in UTF-8: #{e.class}: #{e.message}")
67
67
 
68
68
  placeholder
69
69
  end
@@ -168,7 +168,7 @@ module Datadog
168
168
  rescue Exception => e
169
169
  @error = e
170
170
  Datadog.logger.debug(
171
- "Worker thread error. Cause: #{e.class}: #{e} Location: #{Array(e.backtrace).first}"
171
+ "Worker thread error. Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
172
172
  )
173
173
  raise
174
174
 
data/lib/datadog/core.rb CHANGED
@@ -18,7 +18,7 @@ module Datadog
18
18
  require "libdatadog_api.#{RUBY_VERSION[/\d+.\d+/]}_#{RUBY_PLATFORM}"
19
19
  nil
20
20
  rescue LoadError => e
21
- e.message
21
+ "#{e.class}: #{e.message}"
22
22
  end
23
23
  end
24
24
 
@@ -1,11 +1,50 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'configuration/settings'
3
+ require_relative '../core/environment/variable_helpers'
4
+ require_relative 'ext'
4
5
 
5
6
  module Datadog
6
7
  module DataStreams
7
8
  # Configuration for Data Streams Monitoring
8
9
  module Configuration
10
+ # Configuration settings for Data Streams Monitoring.
11
+ module Settings
12
+ def self.extended(base)
13
+ base = base.singleton_class unless base.is_a?(Class)
14
+ add_settings!(base)
15
+ end
16
+
17
+ def self.add_settings!(base)
18
+ base.class_eval do
19
+ # Data Streams Monitoring configuration
20
+ # @public_api
21
+ settings :data_streams do
22
+ # Whether Data Streams Monitoring is enabled. When enabled, the library will
23
+ # collect and report data lineage information for messaging systems.
24
+ #
25
+ # @default `DD_DATA_STREAMS_ENABLED` environment variable, otherwise `false`.
26
+ # @return [Boolean]
27
+ option :enabled do |o|
28
+ o.type :bool
29
+ o.env Ext::ENV_ENABLED
30
+ o.default false
31
+ end
32
+
33
+ # The interval (in seconds) at which Data Streams Monitoring stats are flushed.
34
+ #
35
+ # @default 10.0
36
+ # @env '_DD_TRACE_STATS_WRITER_INTERVAL'
37
+ # @return [Float]
38
+ # @!visibility private
39
+ option :interval do |o|
40
+ o.type :float
41
+ o.env '_DD_TRACE_STATS_WRITER_INTERVAL'
42
+ o.default 10.0
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
9
48
  end
10
49
  end
11
50
  end
@@ -46,7 +46,7 @@ module Datadog
46
46
  decode(binary_data)
47
47
  rescue ArgumentError => e
48
48
  # Invalid base64 encoding - may indicate version mismatch or corruption
49
- Datadog.logger.debug { "Failed to decode DSM pathway context: #{e.class}: #{e}" }
49
+ Datadog.logger.debug { "Failed to decode DSM pathway context: #{e.class}: #{e.message}" }
50
50
  nil
51
51
  end
52
52
  end
@@ -329,7 +329,7 @@ module Datadog
329
329
  # Send to agent outside mutex to avoid blocking customer code if agent is slow/hung.
330
330
  send_stats_to_agent(payload)
331
331
  rescue => e
332
- @logger.debug("Failed to flush DSM stats to agent: #{e.class}: #{e}")
332
+ @logger.debug("Failed to flush DSM stats to agent: #{e.class}: #{e.message}")
333
333
  end
334
334
 
335
335
  def get_current_pathway
@@ -2,7 +2,7 @@
2
2
 
3
3
  require_relative 'data_streams/processor'
4
4
  require_relative 'data_streams/pathway_context'
5
- require_relative 'data_streams/configuration/settings'
5
+ require_relative 'data_streams/configuration'
6
6
  require_relative 'data_streams/extensions'
7
7
  require_relative 'core/utils/time'
8
8
 
@@ -17,6 +17,10 @@ module Datadog
17
17
  module DI
18
18
  LOCK = Mutex.new
19
19
 
20
+ # Initialized eagerly to avoid "instance variable not initialized"
21
+ # warning on Ruby 2.6/2.7 and to simplify the type to non-nullable.
22
+ @current_components = []
23
+
20
24
  class << self
21
25
  attr_reader :code_tracker
22
26
 
@@ -48,12 +52,12 @@ module Datadog
48
52
  Datadog::DI.activate_tracking!
49
53
  rescue => exc
50
54
  if defined?(Datadog.logger)
51
- Datadog.logger.warn { "di: Failed to activate code tracking for DI: #{exc.class}: #{exc}" }
55
+ Datadog.logger.warn { "di: Failed to activate code tracking for DI: #{exc.class}: #{exc.message}" }
52
56
  else
53
57
  # We do not have Datadog logger potentially because DI code tracker is
54
58
  # being loaded early in application boot process and the rest of datadog
55
59
  # wasn't loaded yet. Output to standard error.
56
- warn("datadog: di: Failed to activate code tracking for DI: #{exc.class}: #{exc}")
60
+ warn("datadog: di: Failed to activate code tracking for DI: #{exc.class}: #{exc.message}")
57
61
  end
58
62
  end
59
63
  end
@@ -88,7 +92,7 @@ module Datadog
88
92
  # Datadog.components from the code tracker.
89
93
  def current_component
90
94
  LOCK.synchronize do
91
- @current_components&.last
95
+ @current_components.last
92
96
  end
93
97
  end
94
98
 
@@ -100,14 +104,13 @@ module Datadog
100
104
  # guaranteed to not end up with no component when one is running.
101
105
  def add_current_component(component)
102
106
  LOCK.synchronize do
103
- @current_components ||= []
104
107
  @current_components << component
105
108
  end
106
109
  end
107
110
 
108
111
  def remove_current_component(component)
109
112
  LOCK.synchronize do
110
- @current_components&.delete(component)
113
+ @current_components.delete(component)
111
114
  end
112
115
  end
113
116
  end