datadog 2.33.0 → 2.35.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 (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +99 -1
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +20 -0
  4. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +2 -15
  5. data/ext/datadog_profiling_native_extension/macos_sampler_thread.h +55 -0
  6. data/ext/datadog_profiling_native_extension/stack_recorder.c +6 -11
  7. data/lib/datadog/ai_guard/configuration.rb +1 -0
  8. data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +53 -39
  9. data/lib/datadog/ai_guard/evaluation.rb +6 -1
  10. data/lib/datadog/ai_guard/ext.rb +12 -1
  11. data/lib/datadog/appsec/api_security/route_extractor.rb +3 -0
  12. data/lib/datadog/appsec/component.rb +4 -1
  13. data/lib/datadog/appsec/compressed_json.rb +2 -2
  14. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +3 -3
  15. data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
  16. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +9 -40
  17. data/lib/datadog/appsec/default_header_tags.rb +48 -0
  18. data/lib/datadog/core/configuration/components.rb +8 -1
  19. data/lib/datadog/core/configuration/settings.rb +16 -7
  20. data/lib/datadog/core/configuration/supported_configurations.rb +10 -0
  21. data/lib/datadog/core/environment/ext.rb +4 -0
  22. data/lib/datadog/core/environment/identity.rb +15 -1
  23. data/lib/datadog/core/environment/process.rb +50 -27
  24. data/lib/datadog/core/remote/client/capabilities.rb +11 -2
  25. data/lib/datadog/core/remote/transport/http/config.rb +5 -5
  26. data/lib/datadog/core/telemetry/request.rb +0 -2
  27. data/lib/datadog/core/transport/response.rb +1 -1
  28. data/lib/datadog/core/utils/{base64.rb → base64_codec.rb} +3 -2
  29. data/lib/datadog/core/utils/{array.rb → enumerable_compat.rb} +2 -2
  30. data/lib/datadog/core/utils/hash.rb +0 -23
  31. data/lib/datadog/core/utils/spawn_monkey_patch.rb +46 -16
  32. data/lib/datadog/data_streams/pathway_context.rb +3 -3
  33. data/lib/datadog/di/code_tracker.rb +43 -22
  34. data/lib/datadog/di/contrib/active_record.rb +6 -2
  35. data/lib/datadog/di/instrumenter.rb +24 -4
  36. data/lib/datadog/di/probe_notification_builder.rb +1 -1
  37. data/lib/datadog/di/remote.rb +4 -4
  38. data/lib/datadog/di/serializer.rb +5 -5
  39. data/lib/datadog/di/utils.rb +42 -14
  40. data/lib/datadog/opentelemetry/configuration/settings.rb +65 -0
  41. data/lib/datadog/opentelemetry/ext.rb +9 -0
  42. data/lib/datadog/opentelemetry/logs.rb +98 -0
  43. data/lib/datadog/opentelemetry/metrics.rb +10 -46
  44. data/lib/datadog/opentelemetry/sdk/configurator.rb +40 -0
  45. data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +37 -0
  46. data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
  47. data/lib/datadog/opentelemetry.rb +1 -0
  48. data/lib/datadog/profiling/collectors/thread_context.rb +0 -4
  49. data/lib/datadog/profiling/component.rb +3 -11
  50. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +3 -2
  51. data/lib/datadog/profiling/stack_recorder.rb +0 -4
  52. data/lib/datadog/symbol_database/component.rb +409 -0
  53. data/lib/datadog/symbol_database/configuration.rb +2 -2
  54. data/lib/datadog/symbol_database/extractor.rb +32 -4
  55. data/lib/datadog/symbol_database/remote.rb +175 -0
  56. data/lib/datadog/symbol_database/scope_batcher.rb +8 -0
  57. data/lib/datadog/symbol_database/service_version.rb +11 -2
  58. data/lib/datadog/symbol_database/symbol.rb +6 -3
  59. data/lib/datadog/symbol_database/uploader.rb +62 -8
  60. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -1
  61. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -1
  62. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -1
  63. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -1
  64. data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
  65. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +1 -0
  66. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +8 -0
  67. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +4 -1
  68. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +4 -1
  69. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -1
  70. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -1
  71. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -1
  72. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -1
  73. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -1
  74. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -1
  75. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -4
  76. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -4
  77. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -4
  78. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -5
  79. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
  80. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
  81. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
  82. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -5
  83. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
  84. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +1 -5
  85. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -8
  86. data/lib/datadog/tracing/contrib/excon/middleware.rb +1 -5
  87. data/lib/datadog/tracing/contrib/ext.rb +3 -1
  88. data/lib/datadog/tracing/contrib/faraday/middleware.rb +1 -5
  89. data/lib/datadog/tracing/contrib/grape/endpoint.rb +3 -0
  90. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +1 -0
  91. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -5
  92. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -5
  93. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
  94. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -0
  95. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -0
  96. data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -5
  97. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +1 -5
  98. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -5
  99. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -0
  100. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
  101. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -5
  102. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +1 -5
  103. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -5
  104. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +2 -2
  105. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +1 -5
  106. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -5
  107. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +3 -0
  108. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +2 -2
  109. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
  110. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -5
  111. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +23 -0
  112. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -0
  113. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +2 -0
  114. data/lib/datadog/tracing/contrib/rails/runner.rb +2 -0
  115. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -2
  116. data/lib/datadog/tracing/contrib/redis/tags.rb +0 -5
  117. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +2 -0
  118. data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -0
  119. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +1 -5
  120. data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
  121. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -1
  122. data/lib/datadog/tracing/contrib/sequel/database.rb +1 -0
  123. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -0
  124. data/lib/datadog/tracing/contrib/sequel/utils.rb +0 -5
  125. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -0
  126. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +1 -0
  127. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
  128. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
  129. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
  130. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
  131. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
  132. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +3 -2
  133. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
  134. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +1 -0
  135. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -0
  136. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
  137. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +1 -5
  138. data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +1 -1
  139. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -13
  140. data/lib/datadog/tracing/distributed/trace_context.rb +0 -28
  141. data/lib/datadog/tracing/metadata/ext.rb +10 -0
  142. data/lib/datadog/tracing/span_operation.rb +13 -0
  143. data/lib/datadog/tracing/trace_operation.rb +22 -0
  144. data/lib/datadog/tracing/tracer.rb +9 -0
  145. data/lib/datadog/tracing/transport/traces.rb +2 -2
  146. data/lib/datadog/version.rb +1 -1
  147. metadata +16 -10
@@ -1,18 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative '../core/configuration/ext'
4
- require_relative '../core/environment/socket'
4
+ require_relative 'ext'
5
+ require_relative 'signal_configuration'
5
6
 
6
7
  module Datadog
7
8
  module OpenTelemetry
8
9
  class Metrics
9
- EXPORTER_NONE = 'none'
10
+ include SignalConfiguration
10
11
 
11
12
  def self.initialize!(components)
12
13
  new(components).configure_metrics_sdk
13
14
  true
14
15
  rescue => exc
15
- components.logger.error("Failed to initialize OpenTelemetry metrics: #{exc.class}: #{exc.message}: #{exc.backtrace.join("\n")}")
16
+ components.logger.warn("Failed to initialize OpenTelemetry metrics: #{exc.class}: #{exc.message}: #{exc.backtrace.join("\n")}")
16
17
  false
17
18
  end
18
19
 
@@ -41,38 +42,9 @@ module Datadog
41
42
 
42
43
  private
43
44
 
44
- def create_resource
45
- resource_attributes = {}
46
-
47
- @settings.tags&.each do |key, value|
48
- otel_key = case key
49
- when 'service' then 'service.name'
50
- when 'env' then 'deployment.environment'
51
- when 'version' then 'service.version'
52
- else key
53
- end
54
- resource_attributes[otel_key] = value
55
- end
56
-
57
- resource_attributes['service.name'] = @settings.service_without_fallback || resource_attributes['service.name'] || Datadog::Core::Environment::Ext::FALLBACK_SERVICE_NAME
58
- resource_attributes['deployment.environment'] = @settings.env if @settings.env
59
- resource_attributes['service.version'] = @settings.version if @settings.version
60
-
61
- hostname = Datadog::Core::Environment::Socket.resolved_hostname(@settings)
62
- if hostname
63
- if hostname == @settings.hostname
64
- resource_attributes['host.name'] = hostname
65
- elsif !resource_attributes.key?('host.name')
66
- resource_attributes['host.name'] = hostname
67
- end
68
- end
69
-
70
- ::OpenTelemetry::SDK::Resources::Resource.create(resource_attributes)
71
- end
72
-
73
45
  def configure_metric_reader(provider)
74
46
  exporter_name = @settings.opentelemetry.metrics.exporter
75
- return if exporter_name == EXPORTER_NONE
47
+ return if exporter_name == Ext::EXPORTER_NONE
76
48
 
77
49
  configure_otlp_exporter(provider)
78
50
  rescue => e
@@ -88,15 +60,16 @@ module Datadog
88
60
  require_relative 'sdk/metrics_exporter'
89
61
 
90
62
  metrics_config = @settings.opentelemetry.metrics
91
- endpoint = get_metrics_config_with_fallback(
63
+ endpoint = config_or_exporter_fallback(
64
+ signal: :metrics,
92
65
  option_name: :endpoint,
93
66
  computed_default: default_metrics_endpoint
94
67
  )
95
- timeout = get_metrics_config_with_fallback(option_name: :timeout_millis)
96
- headers = get_metrics_config_with_fallback(option_name: :headers)
68
+ timeout = config_or_exporter_fallback(signal: :metrics, option_name: :timeout_millis)
69
+ headers = config_or_exporter_fallback(signal: :metrics, option_name: :headers)
97
70
  # OpenTelemetry SDK only supports http/protobuf protocol.
98
71
  # TODO: Add support for http/json and grpc.
99
- # protocol = get_metrics_config_with_fallback(option_name: :protocol)
72
+ # protocol = config_or_exporter_fallback(signal: :metrics, option_name: :protocol)
100
73
  exporter = Datadog::OpenTelemetry::SDK::MetricsExporter.new(
101
74
  endpoint: endpoint,
102
75
  timeout: timeout / 1000.0,
@@ -112,15 +85,6 @@ module Datadog
112
85
  rescue LoadError => e
113
86
  @logger.warn("Could not load OTLP metrics exporter: #{e.class}: #{e.message}")
114
87
  end
115
-
116
- # Returns metrics config value if explicitly set, otherwise falls back to exporter config or computed default value.
117
- def get_metrics_config_with_fallback(option_name:, computed_default: nil)
118
- if @settings.opentelemetry.metrics.using_default?(option_name)
119
- @settings.opentelemetry.exporter.public_send(option_name) || computed_default
120
- else
121
- @settings.opentelemetry.metrics.public_send(option_name)
122
- end
123
- end
124
88
  end
125
89
  end
126
90
  end
@@ -30,6 +30,16 @@ module Datadog
30
30
  [SpanProcessor.new]
31
31
  end
32
32
 
33
+ # SDK 1.6.0+ calls logs_configuration_hook from configure.
34
+ # https://github.com/open-telemetry/opentelemetry-ruby/blob/opentelemetry-sdk/v1.6.0/sdk/lib/opentelemetry/sdk/configurator.rb#L152
35
+ # Older supported SDK versions do not, so we call it explicitly as a fallback.
36
+ # The flag prevents double-calling on newer SDK versions.
37
+ def configure
38
+ @datadog_logs_hook_called = false
39
+ super
40
+ logs_configuration_hook unless @datadog_logs_hook_called
41
+ end
42
+
33
43
  def metrics_configuration_hook
34
44
  components = Datadog.send(:components)
35
45
  return super unless components.settings.opentelemetry.metrics.enabled
@@ -45,15 +55,45 @@ module Datadog
45
55
  super unless success
46
56
  end
47
57
 
58
+ def logs_configuration_hook
59
+ @datadog_logs_hook_called = true
60
+ components = Datadog.send(:components)
61
+ unless components.settings.opentelemetry.logs.enabled
62
+ super if defined?(super)
63
+ return
64
+ end
65
+
66
+ begin
67
+ require 'opentelemetry-logs-sdk'
68
+ rescue LoadError => exc
69
+ components.logger.warn("Failed to load OpenTelemetry logs gems: #{exc.class}: #{exc.message}")
70
+ return
71
+ end
72
+
73
+ success = Datadog::OpenTelemetry::Logs.initialize!(components)
74
+ unless success
75
+ components.logger.warn('Falling back to OpenTelemetry default logs configuration')
76
+ super if defined?(super)
77
+ end
78
+ end
79
+
48
80
  # Prepend to ConfiguratorPatch (not Configurator) so our hook runs first.
49
81
  begin
50
82
  require 'opentelemetry-metrics-sdk' if defined?(OpenTelemetry::SDK) && !defined?(OpenTelemetry::SDK::Metrics::ConfiguratorPatch)
51
83
  rescue LoadError
52
84
  end
53
85
 
86
+ begin
87
+ require 'opentelemetry-logs-sdk' if defined?(OpenTelemetry::SDK) && !defined?(OpenTelemetry::SDK::Logs::ConfiguratorPatch)
88
+ rescue LoadError
89
+ end
90
+
54
91
  if defined?(::OpenTelemetry::SDK::Metrics::ConfiguratorPatch)
55
92
  ::OpenTelemetry::SDK::Metrics::ConfiguratorPatch.prepend(self) unless ::OpenTelemetry::SDK::Metrics::ConfiguratorPatch.ancestors.include?(self)
56
93
  end
94
+ if defined?(::OpenTelemetry::SDK::Logs::ConfiguratorPatch)
95
+ ::OpenTelemetry::SDK::Logs::ConfiguratorPatch.prepend(self) unless ::OpenTelemetry::SDK::Logs::ConfiguratorPatch.ancestors.include?(self)
96
+ end
57
97
  ::OpenTelemetry::SDK::Configurator.prepend(self) unless ::OpenTelemetry::SDK::Configurator.ancestors.include?(self)
58
98
  end
59
99
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'opentelemetry/exporter/otlp_logs'
4
+
5
+ module Datadog
6
+ module OpenTelemetry
7
+ module SDK
8
+ class LogsExporter < ::OpenTelemetry::Exporter::OTLP::Logs::LogsExporter
9
+ METRIC_EXPORT_ATTEMPTS = 'otel.logs_export_attempts'
10
+ METRIC_EXPORT_SUCCESSES = 'otel.logs_export_successes'
11
+ METRIC_EXPORT_FAILURES = 'otel.logs_export_failures'
12
+ METRIC_LOG_RECORDS = 'otel.log_records'
13
+ TELEMETRY_NAMESPACE = 'tracers'
14
+ TELEMETRY_TAGS = {'protocol' => 'http', 'encoding' => 'protobuf'}.freeze
15
+
16
+ def export(log_records, timeout: nil)
17
+ telemetry&.inc(TELEMETRY_NAMESPACE, METRIC_EXPORT_ATTEMPTS, 1, tags: TELEMETRY_TAGS)
18
+ telemetry&.inc(TELEMETRY_NAMESPACE, METRIC_LOG_RECORDS, log_records.size, tags: TELEMETRY_TAGS)
19
+ result = super
20
+ metric_name = (result == 0) ? METRIC_EXPORT_SUCCESSES : METRIC_EXPORT_FAILURES
21
+ telemetry&.inc(TELEMETRY_NAMESPACE, metric_name, 1, tags: TELEMETRY_TAGS)
22
+ result
23
+ rescue => e
24
+ Datadog.logger.warn("Failed to export OpenTelemetry Logs: #{e.class}: #{e.message}")
25
+ telemetry&.inc(TELEMETRY_NAMESPACE, METRIC_EXPORT_FAILURES, 1, tags: TELEMETRY_TAGS)
26
+ raise
27
+ end
28
+
29
+ private
30
+
31
+ def telemetry
32
+ Datadog.send(:components).telemetry
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../core/configuration/ext'
4
+ require_relative '../core/environment/socket'
5
+
6
+ module Datadog
7
+ module OpenTelemetry
8
+ # Shared resource building and signal-specific config fallback logic for Logs and Metrics.
9
+ module SignalConfiguration
10
+ private
11
+
12
+ def create_resource
13
+ resource_attributes = {}
14
+
15
+ @settings.tags&.each do |key, value| # steep:ignore
16
+ otel_key = case key
17
+ when 'service' then 'service.name'
18
+ when 'env' then 'deployment.environment'
19
+ when 'version' then 'service.version'
20
+ else key
21
+ end
22
+ resource_attributes[otel_key] = value
23
+ end
24
+
25
+ resource_attributes['service.name'] = @settings.service_without_fallback || resource_attributes['service.name'] || Datadog::Core::Environment::Ext::FALLBACK_SERVICE_NAME # steep:ignore
26
+ resource_attributes['deployment.environment'] = @settings.env if @settings.env # steep:ignore
27
+ resource_attributes['service.version'] = @settings.version if @settings.version # steep:ignore
28
+
29
+ hostname = Datadog::Core::Environment::Socket.resolved_hostname(@settings) # steep:ignore
30
+ if hostname
31
+ if hostname == @settings.hostname # steep:ignore
32
+ resource_attributes['host.name'] = hostname
33
+ elsif !resource_attributes.key?('host.name')
34
+ resource_attributes['host.name'] = hostname
35
+ end
36
+ end
37
+
38
+ ::OpenTelemetry::SDK::Resources::Resource.create(resource_attributes)
39
+ end
40
+
41
+ # Returns the signal-specific option value when explicitly set,
42
+ # otherwise falls back to the general OTLP exporter config or computed_default.
43
+ def config_or_exporter_fallback(signal:, option_name:, computed_default: nil)
44
+ signal_settings = @settings.opentelemetry.public_send(signal) # steep:ignore
45
+ if signal_settings.using_default?(option_name)
46
+ @settings.opentelemetry.exporter.public_send(option_name) || computed_default # steep:ignore
47
+ else
48
+ signal_settings.public_send(option_name)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -23,6 +23,7 @@ require_relative 'opentelemetry/sdk/configurator' if defined?(OpenTelemetry::SDK
23
23
  require_relative 'opentelemetry/sdk/trace/span' if defined?(OpenTelemetry::SDK)
24
24
 
25
25
  require_relative 'opentelemetry/metrics' if defined?(OpenTelemetry::SDK::Metrics)
26
+ require_relative 'opentelemetry/logs' if defined?(OpenTelemetry::SDK::Logs)
26
27
 
27
28
  module Datadog
28
29
  # Datadog OpenTelemetry integration.
@@ -19,7 +19,6 @@ module Datadog
19
19
  max_frames:,
20
20
  tracer:,
21
21
  endpoint_collection_enabled:,
22
- timeline_enabled:,
23
22
  waiting_for_gvl_threshold_ns:,
24
23
  otel_context_enabled:,
25
24
  native_filenames_enabled:
@@ -31,7 +30,6 @@ module Datadog
31
30
  max_frames: max_frames,
32
31
  tracer_context_key: tracer_context_key,
33
32
  endpoint_collection_enabled: endpoint_collection_enabled,
34
- timeline_enabled: timeline_enabled,
35
33
  waiting_for_gvl_threshold_ns: waiting_for_gvl_threshold_ns,
36
34
  otel_context_enabled: otel_context_enabled,
37
35
  native_filenames_enabled: validate_native_filenames(native_filenames_enabled),
@@ -43,7 +41,6 @@ module Datadog
43
41
  max_frames: 400,
44
42
  tracer: nil,
45
43
  endpoint_collection_enabled: false,
46
- timeline_enabled: false,
47
44
  waiting_for_gvl_threshold_ns: 10_000_000,
48
45
  otel_context_enabled: false,
49
46
  native_filenames_enabled: true,
@@ -54,7 +51,6 @@ module Datadog
54
51
  max_frames: max_frames,
55
52
  tracer: tracer,
56
53
  endpoint_collection_enabled: endpoint_collection_enabled,
57
- timeline_enabled: timeline_enabled,
58
54
  waiting_for_gvl_threshold_ns: waiting_for_gvl_threshold_ns,
59
55
  otel_context_enabled: otel_context_enabled,
60
56
  native_filenames_enabled: native_filenames_enabled,
@@ -37,7 +37,6 @@ module Datadog
37
37
  # NOTE: Please update the Initialization section of ProfilingDevelopment.md with any changes to this method
38
38
 
39
39
  no_signals_workaround_enabled = no_signals_workaround_enabled?(settings, logger)
40
- timeline_enabled = settings.profiling.advanced.timeline_enabled
41
40
  allocation_profiling_enabled = enable_allocation_profiling?(settings, logger)
42
41
  heap_sample_every = get_heap_sample_every(settings)
43
42
  heap_profiling_enabled = enable_heap_profiling?(settings, allocation_profiling_enabled, heap_sample_every, logger)
@@ -53,10 +52,9 @@ module Datadog
53
52
  heap_samples_enabled: heap_profiling_enabled,
54
53
  heap_size_enabled: heap_size_profiling_enabled,
55
54
  heap_sample_every: heap_sample_every,
56
- timeline_enabled: timeline_enabled,
57
55
  heap_clean_after_gc_enabled: settings.profiling.advanced.heap_clean_after_gc_enabled,
58
56
  )
59
- thread_context_collector = build_thread_context_collector(settings, recorder, optional_tracer, timeline_enabled)
57
+ thread_context_collector = build_thread_context_collector(settings, recorder, optional_tracer)
60
58
  worker = Datadog::Profiling::Collectors::CpuAndWallTimeWorker.new(
61
59
  gc_profiling_enabled: enable_gc_profiling?(settings, logger),
62
60
  no_signals_workaround_enabled: no_signals_workaround_enabled,
@@ -71,7 +69,6 @@ module Datadog
71
69
 
72
70
  internal_metadata = {
73
71
  no_signals_workaround_enabled: no_signals_workaround_enabled,
74
- timeline_enabled: timeline_enabled,
75
72
  heap_sample_every: heap_sample_every,
76
73
  }.freeze
77
74
 
@@ -99,13 +96,12 @@ module Datadog
99
96
  [nil, {profiling_enabled: false}]
100
97
  end
101
98
 
102
- private_class_method def self.build_thread_context_collector(settings, recorder, optional_tracer, timeline_enabled)
99
+ private_class_method def self.build_thread_context_collector(settings, recorder, optional_tracer)
103
100
  Datadog::Profiling::Collectors::ThreadContext.new(
104
101
  recorder: recorder,
105
102
  max_frames: settings.profiling.advanced.max_frames,
106
103
  tracer: optional_tracer,
107
104
  endpoint_collection_enabled: settings.profiling.advanced.endpoint.collection.enabled,
108
- timeline_enabled: timeline_enabled,
109
105
  waiting_for_gvl_threshold_ns: settings.profiling.advanced.waiting_for_gvl_threshold_ns,
110
106
  otel_context_enabled: settings.profiling.advanced.preview_otel_context_enabled,
111
107
  native_filenames_enabled: settings.profiling.advanced.native_filenames_enabled,
@@ -469,11 +465,7 @@ module Datadog
469
465
  end
470
466
 
471
467
  private_class_method def self.enable_gvl_profiling?(settings, logger)
472
- return false if RUBY_VERSION < "3.2"
473
-
474
- # GVL profiling only makes sense in the context of timeline. We could emit a warning here, but not sure how
475
- # useful it is -- if a customer disables timeline, there's nowhere to look for GVL profiling anyway!
476
- settings.profiling.advanced.timeline_enabled && settings.profiling.advanced.gvl_enabled
468
+ RUBY_VERSION >= "3.2" && settings.profiling.advanced.gvl_enabled
477
469
  end
478
470
  end
479
471
  end
@@ -4,9 +4,10 @@ module Datadog
4
4
  module Profiling
5
5
  # Monkey patches needed for profiler features and compatibility
6
6
  module Ext
7
- # All Ruby versions as of this writing have bugs in the dir class implementation, causing issues such as
7
+ # Ruby versions before 3.4 have bugs in the `Dir` class implementation, causing issues such as
8
8
  # https://github.com/DataDog/dd-trace-rb/issues/3450 .
9
- # See also https://bugs.ruby-lang.org/issues/20586 for more details.
9
+ # This was fixed upstream in https://bugs.ruby-lang.org/issues/20586 but we use this monkey patch to work around
10
+ # the issue on legacy versions (it gets applied by `Datadog::Profiling::Component`).
10
11
  #
11
12
  # This monkey patch for the Ruby `Dir` class works around these bugs for affected Ruby versions by temporarily
12
13
  # blocking the profiler from interrupting system calls.
@@ -13,7 +13,6 @@ module Datadog
13
13
  heap_samples_enabled:,
14
14
  heap_size_enabled:,
15
15
  heap_sample_every:,
16
- timeline_enabled:,
17
16
  heap_clean_after_gc_enabled:
18
17
  )
19
18
  # This mutex works in addition to the fancy C-level mutexes we have in the native side (see the docs there).
@@ -30,7 +29,6 @@ module Datadog
30
29
  heap_samples_enabled: heap_samples_enabled,
31
30
  heap_size_enabled: heap_size_enabled,
32
31
  heap_sample_every: heap_sample_every,
33
- timeline_enabled: timeline_enabled,
34
32
  heap_clean_after_gc_enabled: heap_clean_after_gc_enabled,
35
33
  )
36
34
  end
@@ -40,7 +38,6 @@ module Datadog
40
38
  heap_samples_enabled: false,
41
39
  heap_size_enabled: false,
42
40
  heap_sample_every: 1,
43
- timeline_enabled: false,
44
41
  heap_clean_after_gc_enabled: true,
45
42
  **options
46
43
  )
@@ -49,7 +46,6 @@ module Datadog
49
46
  heap_samples_enabled: heap_samples_enabled,
50
47
  heap_size_enabled: heap_size_enabled,
51
48
  heap_sample_every: heap_sample_every,
52
- timeline_enabled: timeline_enabled,
53
49
  heap_clean_after_gc_enabled: heap_clean_after_gc_enabled,
54
50
  **options,
55
51
  )