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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +99 -1
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +20 -0
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +2 -15
- data/ext/datadog_profiling_native_extension/macos_sampler_thread.h +55 -0
- data/ext/datadog_profiling_native_extension/stack_recorder.c +6 -11
- data/lib/datadog/ai_guard/configuration.rb +1 -0
- data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +53 -39
- data/lib/datadog/ai_guard/evaluation.rb +6 -1
- data/lib/datadog/ai_guard/ext.rb +12 -1
- data/lib/datadog/appsec/api_security/route_extractor.rb +3 -0
- data/lib/datadog/appsec/component.rb +4 -1
- data/lib/datadog/appsec/compressed_json.rb +2 -2
- data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +3 -3
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +9 -40
- data/lib/datadog/appsec/default_header_tags.rb +48 -0
- data/lib/datadog/core/configuration/components.rb +8 -1
- data/lib/datadog/core/configuration/settings.rb +16 -7
- data/lib/datadog/core/configuration/supported_configurations.rb +10 -0
- data/lib/datadog/core/environment/ext.rb +4 -0
- data/lib/datadog/core/environment/identity.rb +15 -1
- data/lib/datadog/core/environment/process.rb +50 -27
- data/lib/datadog/core/remote/client/capabilities.rb +11 -2
- data/lib/datadog/core/remote/transport/http/config.rb +5 -5
- data/lib/datadog/core/telemetry/request.rb +0 -2
- data/lib/datadog/core/transport/response.rb +1 -1
- data/lib/datadog/core/utils/{base64.rb → base64_codec.rb} +3 -2
- data/lib/datadog/core/utils/{array.rb → enumerable_compat.rb} +2 -2
- data/lib/datadog/core/utils/hash.rb +0 -23
- data/lib/datadog/core/utils/spawn_monkey_patch.rb +46 -16
- data/lib/datadog/data_streams/pathway_context.rb +3 -3
- data/lib/datadog/di/code_tracker.rb +43 -22
- data/lib/datadog/di/contrib/active_record.rb +6 -2
- data/lib/datadog/di/instrumenter.rb +24 -4
- data/lib/datadog/di/probe_notification_builder.rb +1 -1
- data/lib/datadog/di/remote.rb +4 -4
- data/lib/datadog/di/serializer.rb +5 -5
- data/lib/datadog/di/utils.rb +42 -14
- data/lib/datadog/opentelemetry/configuration/settings.rb +65 -0
- data/lib/datadog/opentelemetry/ext.rb +9 -0
- data/lib/datadog/opentelemetry/logs.rb +98 -0
- data/lib/datadog/opentelemetry/metrics.rb +10 -46
- data/lib/datadog/opentelemetry/sdk/configurator.rb +40 -0
- data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +37 -0
- data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
- data/lib/datadog/opentelemetry.rb +1 -0
- data/lib/datadog/profiling/collectors/thread_context.rb +0 -4
- data/lib/datadog/profiling/component.rb +3 -11
- data/lib/datadog/profiling/ext/dir_monkey_patches.rb +3 -2
- data/lib/datadog/profiling/stack_recorder.rb +0 -4
- data/lib/datadog/symbol_database/component.rb +409 -0
- data/lib/datadog/symbol_database/configuration.rb +2 -2
- data/lib/datadog/symbol_database/extractor.rb +32 -4
- data/lib/datadog/symbol_database/remote.rb +175 -0
- data/lib/datadog/symbol_database/scope_batcher.rb +8 -0
- data/lib/datadog/symbol_database/service_version.rb +11 -2
- data/lib/datadog/symbol_database/symbol.rb +6 -3
- data/lib/datadog/symbol_database/uploader.rb +62 -8
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -1
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -1
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +8 -0
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +4 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +4 -1
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -1
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -1
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -4
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -4
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -4
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
- data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -5
- data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +1 -5
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -8
- data/lib/datadog/tracing/contrib/excon/middleware.rb +1 -5
- data/lib/datadog/tracing/contrib/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +1 -5
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +3 -0
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -5
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -5
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/kafka/event.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -5
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -5
- data/lib/datadog/tracing/contrib/opensearch/quantize.rb +2 -2
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -5
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +3 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +2 -2
- data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/racecar/event.rb +1 -5
- data/lib/datadog/tracing/contrib/rack/header_tagging.rb +23 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -0
- data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/rails/runner.rb +2 -0
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -2
- data/lib/datadog/tracing/contrib/redis/tags.rb +0 -5
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +1 -5
- data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -1
- data/lib/datadog/tracing/contrib/sequel/database.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -0
- data/lib/datadog/tracing/contrib/sequel/utils.rb +0 -5
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +3 -2
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +1 -0
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -0
- data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
- data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +1 -5
- data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +1 -1
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -13
- data/lib/datadog/tracing/distributed/trace_context.rb +0 -28
- data/lib/datadog/tracing/metadata/ext.rb +10 -0
- data/lib/datadog/tracing/span_operation.rb +13 -0
- data/lib/datadog/tracing/trace_operation.rb +22 -0
- data/lib/datadog/tracing/tracer.rb +9 -0
- data/lib/datadog/tracing/transport/traces.rb +2 -2
- data/lib/datadog/version.rb +1 -1
- 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 '
|
|
4
|
+
require_relative 'ext'
|
|
5
|
+
require_relative 'signal_configuration'
|
|
5
6
|
|
|
6
7
|
module Datadog
|
|
7
8
|
module OpenTelemetry
|
|
8
9
|
class Metrics
|
|
9
|
-
|
|
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.
|
|
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 =
|
|
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 =
|
|
96
|
-
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 =
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
#
|
|
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
|
-
#
|
|
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
|
)
|