datadog 2.29.0 → 2.31.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 +87 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +21 -12
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +9 -7
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +18 -0
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
- data/ext/datadog_profiling_native_extension/extconf.rb +6 -24
- data/ext/datadog_profiling_native_extension/heap_recorder.c +5 -6
- data/ext/datadog_profiling_native_extension/http_transport.c +51 -64
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +0 -13
- data/ext/datadog_profiling_native_extension/profiling.c +3 -1
- data/ext/datadog_profiling_native_extension/setup_signal_handler.c +24 -8
- data/ext/datadog_profiling_native_extension/setup_signal_handler.h +1 -3
- data/ext/datadog_profiling_native_extension/stack_recorder.c +29 -43
- data/ext/libdatadog_api/crashtracker.c +5 -8
- data/ext/libdatadog_api/crashtracker_report_exception.c +34 -144
- data/ext/libdatadog_api/datadog_ruby_common.c +18 -0
- data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
- data/ext/libdatadog_api/di.c +79 -0
- data/ext/libdatadog_api/extconf.rb +5 -20
- data/ext/libdatadog_api/init.c +5 -2
- data/ext/libdatadog_extconf_helpers.rb +57 -11
- data/lib/datadog/ai_guard/component.rb +2 -0
- data/lib/datadog/ai_guard/configuration/settings.rb +3 -0
- data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +41 -3
- data/lib/datadog/ai_guard/evaluation/content_builder.rb +31 -0
- data/lib/datadog/ai_guard/evaluation/content_part.rb +36 -0
- data/lib/datadog/ai_guard/evaluation/no_op_result.rb +3 -1
- data/lib/datadog/ai_guard/evaluation/request.rb +14 -9
- data/lib/datadog/ai_guard/evaluation/result.rb +3 -1
- data/lib/datadog/ai_guard/evaluation.rb +36 -7
- data/lib/datadog/ai_guard.rb +26 -8
- data/lib/datadog/appsec/autoload.rb +1 -1
- data/lib/datadog/appsec/component.rb +11 -7
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +3 -0
- data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/patcher.rb +2 -0
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +10 -11
- data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +25 -2
- data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +2 -2
- data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/patcher.rb +2 -2
- data/lib/datadog/appsec/contrib/rest_client/patcher.rb +2 -0
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +3 -3
- data/lib/datadog/appsec/event.rb +1 -17
- data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
- data/lib/datadog/appsec/instrumentation/gateway.rb +2 -15
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +4 -2
- data/lib/datadog/appsec/utils/http/media_type.rb +1 -2
- data/lib/datadog/appsec/utils/http/url_encoded.rb +2 -2
- data/lib/datadog/appsec.rb +5 -9
- data/lib/datadog/core/configuration/base.rb +17 -5
- data/lib/datadog/core/configuration/components.rb +21 -8
- data/lib/datadog/core/configuration/config_helper.rb +9 -0
- data/lib/datadog/core/configuration/option.rb +32 -6
- data/lib/datadog/core/configuration/option_definition.rb +38 -12
- data/lib/datadog/core/configuration/options.rb +41 -7
- data/lib/datadog/core/configuration/settings.rb +42 -3
- data/lib/datadog/core/configuration/supported_configurations.rb +17 -0
- data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
- data/lib/datadog/core/contrib/rails/utils.rb +7 -3
- data/lib/datadog/core/crashtracking/component.rb +7 -15
- data/lib/datadog/core/environment/container.rb +2 -2
- data/lib/datadog/core/environment/ext.rb +1 -0
- data/lib/datadog/core/environment/identity.rb +25 -3
- data/lib/datadog/core/environment/process.rb +12 -0
- data/lib/datadog/core/metrics/client.rb +5 -5
- data/lib/datadog/core/process_discovery.rb +5 -0
- data/lib/datadog/core/remote/component.rb +38 -21
- data/lib/datadog/core/runtime/metrics.rb +2 -3
- data/lib/datadog/core/telemetry/component.rb +3 -0
- data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +2 -3
- data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
- data/lib/datadog/core/telemetry/event/app_started.rb +151 -169
- data/lib/datadog/core/telemetry/event.rb +1 -7
- data/lib/datadog/core/telemetry/ext.rb +1 -0
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +5 -0
- data/lib/datadog/core/telemetry/worker.rb +20 -0
- data/lib/datadog/core/utils/base64.rb +1 -1
- data/lib/datadog/core/utils/only_once.rb +1 -1
- data/lib/datadog/core/utils/spawn_monkey_patch.rb +36 -0
- data/lib/datadog/core/workers/async.rb +1 -1
- data/lib/datadog/core/workers/interval_loop.rb +13 -6
- data/lib/datadog/core/workers/queue.rb +0 -4
- data/lib/datadog/core/workers/runtime_metrics.rb +9 -1
- data/lib/datadog/core.rb +0 -1
- data/lib/datadog/data_streams/pathway_context.rb +1 -1
- data/lib/datadog/data_streams/processor.rb +1 -0
- data/lib/datadog/di/boot.rb +3 -4
- data/lib/datadog/di/component.rb +20 -4
- data/lib/datadog/di/instrumenter.rb +20 -10
- data/lib/datadog/di/probe_manager.rb +79 -62
- data/lib/datadog/di/probe_notification_builder.rb +148 -33
- data/lib/datadog/di/probe_notifier_worker.rb +52 -6
- data/lib/datadog/di/probe_repository.rb +198 -0
- data/lib/datadog/di/remote.rb +5 -6
- data/lib/datadog/di/serializer.rb +127 -9
- data/lib/datadog/di/transport/http.rb +12 -3
- data/lib/datadog/di/transport/input.rb +46 -8
- data/lib/datadog/di.rb +81 -0
- data/lib/datadog/kit/enable_core_dumps.rb +1 -1
- data/lib/datadog/open_feature/configuration.rb +2 -0
- data/lib/datadog/open_feature/evaluation_engine.rb +1 -1
- data/lib/datadog/open_feature/exposures/reporter.rb +1 -1
- data/lib/datadog/open_feature/exposures/worker.rb +1 -1
- data/lib/datadog/open_feature/remote.rb +1 -1
- data/lib/datadog/open_feature/transport.rb +1 -1
- data/lib/datadog/opentelemetry/configuration/settings.rb +2 -0
- data/lib/datadog/profiling/collectors/code_provenance.rb +2 -3
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +14 -1
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
- data/lib/datadog/profiling/component.rb +31 -1
- data/lib/datadog/profiling/http_transport.rb +5 -6
- data/lib/datadog/profiling/load_native_extension.rb +1 -1
- data/lib/datadog/profiling/profiler.rb +15 -12
- data/lib/datadog/profiling/scheduler.rb +2 -2
- data/lib/datadog/profiling/tasks/exec.rb +2 -2
- data/lib/datadog/profiling/tasks/setup.rb +2 -2
- data/lib/datadog/profiling.rb +1 -2
- data/lib/datadog/single_step_instrument.rb +1 -1
- data/lib/datadog/tracing/buffer.rb +3 -3
- data/lib/datadog/tracing/component.rb +11 -0
- data/lib/datadog/tracing/configuration/settings.rb +2 -1
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +20 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -1
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/configurable.rb +18 -3
- data/lib/datadog/tracing/contrib/dalli/integration.rb +4 -1
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -2
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +2 -2
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +7 -7
- data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
- data/lib/datadog/tracing/contrib/grape/patcher.rb +6 -1
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -1
- data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/karafka/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/que/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/rack/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rails/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
- data/lib/datadog/tracing/contrib/rails/patcher.rb +0 -1
- data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
- data/lib/datadog/tracing/contrib/rake/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/status_range_matcher.rb +4 -0
- data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
- data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/waterdrop/ext.rb +1 -0
- data/lib/datadog/tracing/distributed/datadog.rb +4 -2
- data/lib/datadog/tracing/event.rb +1 -1
- data/lib/datadog/tracing/metadata/ext.rb +4 -0
- data/lib/datadog/tracing/remote.rb +1 -1
- data/lib/datadog/tracing/sampling/ext.rb +2 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +13 -0
- data/lib/datadog/tracing/sampling/rule.rb +1 -1
- data/lib/datadog/tracing/sampling/rule_sampler.rb +54 -25
- data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
- data/lib/datadog/tracing/span_operation.rb +1 -1
- data/lib/datadog/tracing/sync_writer.rb +0 -1
- data/lib/datadog/tracing/trace_operation.rb +50 -6
- data/lib/datadog/tracing/tracer.rb +25 -0
- data/lib/datadog/tracing/transport/io/client.rb +1 -1
- data/lib/datadog/tracing/transport/trace_formatter.rb +11 -0
- data/lib/datadog/tracing/writer.rb +0 -1
- data/lib/datadog/version.rb +1 -1
- metadata +15 -8
- data/lib/datadog/tracing/workers/trace_writer.rb +0 -204
|
@@ -10,28 +10,36 @@ module Datadog
|
|
|
10
10
|
IDENTITY = ->(new_value, _old_value) { new_value }
|
|
11
11
|
|
|
12
12
|
attr_reader \
|
|
13
|
+
:is_settings,
|
|
13
14
|
:default,
|
|
14
15
|
:default_proc,
|
|
15
16
|
:env,
|
|
16
17
|
:env_parser,
|
|
17
18
|
:name,
|
|
18
19
|
:after_set,
|
|
20
|
+
:skip_telemetry,
|
|
19
21
|
:resetter,
|
|
20
22
|
:setter,
|
|
21
23
|
:type,
|
|
22
24
|
:type_options
|
|
23
25
|
|
|
24
|
-
def initialize(name,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
@
|
|
26
|
+
def initialize(name, attributes, &block)
|
|
27
|
+
# When a settings is defined using the config DSL, an option is also created.
|
|
28
|
+
# See Datadog::Core::Configuration::Base::ClassMethods#settings for more details.
|
|
29
|
+
# This flag is used to indicate that the option is a settings option.
|
|
30
|
+
@is_settings = attributes[:is_settings]
|
|
31
|
+
|
|
32
|
+
@default = attributes[:default]
|
|
33
|
+
@default_proc = attributes[:default_proc]
|
|
34
|
+
@env = attributes[:env]
|
|
35
|
+
@env_parser = attributes[:env_parser]
|
|
29
36
|
@name = name.to_sym
|
|
30
|
-
@after_set =
|
|
31
|
-
@
|
|
32
|
-
@
|
|
33
|
-
@
|
|
34
|
-
@
|
|
37
|
+
@after_set = attributes[:after_set]
|
|
38
|
+
@skip_telemetry = attributes[:skip_telemetry]
|
|
39
|
+
@resetter = attributes[:resetter]
|
|
40
|
+
@setter = attributes[:setter] || block || IDENTITY
|
|
41
|
+
@type = attributes[:type]
|
|
42
|
+
@type_options = attributes[:type_options]
|
|
35
43
|
end
|
|
36
44
|
|
|
37
45
|
# Creates a new Option, bound to the context provided.
|
|
@@ -49,6 +57,8 @@ module Datadog
|
|
|
49
57
|
:helpers
|
|
50
58
|
|
|
51
59
|
def initialize(name, options = {})
|
|
60
|
+
@is_settings = options.fetch(:is_settings, false)
|
|
61
|
+
|
|
52
62
|
@env = nil
|
|
53
63
|
@env_parser = nil
|
|
54
64
|
@default = nil
|
|
@@ -56,6 +66,7 @@ module Datadog
|
|
|
56
66
|
@helpers = {}
|
|
57
67
|
@name = name.to_sym
|
|
58
68
|
@after_set = nil
|
|
69
|
+
@skip_telemetry = false
|
|
59
70
|
@resetter = nil
|
|
60
71
|
@setter = OptionDefinition::IDENTITY
|
|
61
72
|
@type = nil
|
|
@@ -95,6 +106,16 @@ module Datadog
|
|
|
95
106
|
@after_set = block
|
|
96
107
|
end
|
|
97
108
|
|
|
109
|
+
# This should only be set to true for options that are manually modified
|
|
110
|
+
# before being added to the telemetry payload in app_started.rb.
|
|
111
|
+
# E.g. telemetry is skipped for `tracing.writer_options`, but in app_started.rb,
|
|
112
|
+
# we send two separate entries for the buffer_size and flush_interval values.
|
|
113
|
+
# Standard: We want to keep this method as skip_telemetry(value),
|
|
114
|
+
# not skip_telemetry = value, so attr_writer is not used.
|
|
115
|
+
def skip_telemetry(value) # standard:disable Style/TrivialAccessors
|
|
116
|
+
@skip_telemetry = value
|
|
117
|
+
end
|
|
118
|
+
|
|
98
119
|
def resetter(&block)
|
|
99
120
|
@resetter = block
|
|
100
121
|
end
|
|
@@ -119,6 +140,8 @@ module Datadog
|
|
|
119
140
|
env(options[:env]) if options.key?(:env)
|
|
120
141
|
env_parser(&options[:env_parser]) if options.key?(:env_parser)
|
|
121
142
|
after_set(&options[:after_set]) if options.key?(:after_set)
|
|
143
|
+
# Steep: https://github.com/soutaro/steep/issues/1979
|
|
144
|
+
skip_telemetry(options[:skip_telemetry]) if options.key?(:skip_telemetry) # steep:ignore ArgumentTypeMismatch
|
|
122
145
|
resetter(&options[:resetter]) if options.key?(:resetter)
|
|
123
146
|
# Steep: https://github.com/soutaro/steep/issues/1979
|
|
124
147
|
setter(&options[:setter]) if options.key?(:setter) # steep:ignore BlockTypeMismatch
|
|
@@ -126,16 +149,19 @@ module Datadog
|
|
|
126
149
|
end
|
|
127
150
|
|
|
128
151
|
def to_definition
|
|
129
|
-
OptionDefinition.new(@name,
|
|
152
|
+
OptionDefinition.new(@name, attributes)
|
|
130
153
|
end
|
|
131
154
|
|
|
132
|
-
def
|
|
155
|
+
def attributes
|
|
133
156
|
{
|
|
157
|
+
is_settings: @is_settings,
|
|
158
|
+
|
|
134
159
|
default: @default,
|
|
135
160
|
default_proc: @default_proc,
|
|
136
161
|
env: @env,
|
|
137
162
|
env_parser: @env_parser,
|
|
138
163
|
after_set: @after_set,
|
|
164
|
+
skip_telemetry: @skip_telemetry,
|
|
139
165
|
resetter: @resetter,
|
|
140
166
|
setter: @setter,
|
|
141
167
|
type: @type,
|
|
@@ -16,17 +16,47 @@ module Datadog
|
|
|
16
16
|
# Class behavior for a configuration object with options
|
|
17
17
|
# @public_api
|
|
18
18
|
module ClassMethods
|
|
19
|
+
def settings_path
|
|
20
|
+
defined?(@settings_path) ? @settings_path : nil
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Registry of nested settings classes keyed by the option name declared
|
|
24
|
+
# via `Base.settings`. This lets us propagate a new settings path down the
|
|
25
|
+
# tree without storing parent references on the nested class or on the
|
|
26
|
+
# option definition itself.
|
|
27
|
+
def settings_children
|
|
28
|
+
@settings_children ||= if superclass <= Options
|
|
29
|
+
superclass.settings_children.dup
|
|
30
|
+
else
|
|
31
|
+
{}
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def settings_path=(path)
|
|
36
|
+
@settings_path = path
|
|
37
|
+
|
|
38
|
+
# Keep nested settings paths in sync when a parent settings path is
|
|
39
|
+
# assigned later, which is how contrib integrations inject
|
|
40
|
+
# "tracing.<integration>" into their configuration classes.
|
|
41
|
+
settings_children.each do |name, settings_class|
|
|
42
|
+
nested_settings_path = path ? "#{path}.#{name}" : name.to_s
|
|
43
|
+
settings_class.settings_path = nested_settings_path
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
19
47
|
def options
|
|
20
48
|
# Allows for class inheritance of option definitions
|
|
21
|
-
@options ||=
|
|
49
|
+
@options ||= if superclass <= Options
|
|
50
|
+
superclass.options.dup
|
|
51
|
+
else
|
|
52
|
+
{}
|
|
53
|
+
end
|
|
22
54
|
end
|
|
23
55
|
|
|
24
56
|
protected
|
|
25
57
|
|
|
26
|
-
def option(name,
|
|
27
|
-
|
|
28
|
-
option_name = settings_name ? "#{settings_name}.#{name}" : name
|
|
29
|
-
builder = OptionDefinition::Builder.new(option_name, meta, &block)
|
|
58
|
+
def option(name, attributes = {}, &block)
|
|
59
|
+
builder = OptionDefinition::Builder.new(name, attributes, &block)
|
|
30
60
|
options[name] = builder.to_definition.tap do
|
|
31
61
|
# Resolve and define helper functions
|
|
32
62
|
helpers = default_helpers(name)
|
|
@@ -75,7 +105,11 @@ module Datadog
|
|
|
75
105
|
end
|
|
76
106
|
|
|
77
107
|
def set_option(name, value, precedence: Configuration::Option::Precedence::PROGRAMMATIC)
|
|
78
|
-
resolve_option(name)
|
|
108
|
+
option = resolve_option(name)
|
|
109
|
+
# Populate lower-precedence values so telemetry and `unset` can
|
|
110
|
+
# still observe the fallback chain after a first programmatic set.
|
|
111
|
+
option.get
|
|
112
|
+
option.set(value, precedence: precedence)
|
|
79
113
|
end
|
|
80
114
|
|
|
81
115
|
def unset_option(name, precedence: Configuration::Option::Precedence::PROGRAMMATIC)
|
|
@@ -120,7 +154,7 @@ module Datadog
|
|
|
120
154
|
|
|
121
155
|
assert_valid_option!(name)
|
|
122
156
|
definition = self.class.options[name]
|
|
123
|
-
# @type self: Configuration::Options::
|
|
157
|
+
# @type self: Configuration::Options::_Settings
|
|
124
158
|
options[name] = definition.build(self)
|
|
125
159
|
end
|
|
126
160
|
|
|
@@ -221,6 +221,8 @@ module Datadog
|
|
|
221
221
|
#
|
|
222
222
|
# @return Logger::Severity
|
|
223
223
|
option :instance do |o|
|
|
224
|
+
# Telemetry for this option is manually modified and added in the AppStarted event.
|
|
225
|
+
o.skip_telemetry true
|
|
224
226
|
o.after_set { |value| set_option(:level, value.level) unless value.nil? }
|
|
225
227
|
end
|
|
226
228
|
|
|
@@ -604,6 +606,30 @@ module Datadog
|
|
|
604
606
|
!(RUBY_VERSION.start_with?('3.3.') && Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.3.4'))
|
|
605
607
|
end
|
|
606
608
|
end
|
|
609
|
+
|
|
610
|
+
# Experimental: Controls the CPU sampling interval in milliseconds. This sets how often the profiler
|
|
611
|
+
# attempts to take a CPU sample. Valid values are 1 to 10.
|
|
612
|
+
#
|
|
613
|
+
# Lower values increase accuracy but also increase overhead. If you need to reduce profiler overhead,
|
|
614
|
+
# use the `overhead_target_percentage` setting instead.
|
|
615
|
+
#
|
|
616
|
+
# @warn This setting is experimental and may be removed or changed in future versions.
|
|
617
|
+
#
|
|
618
|
+
# # No config via environment variable yet
|
|
619
|
+
# @default 10
|
|
620
|
+
option :experimental_cpu_sampling_interval_ms do |o|
|
|
621
|
+
o.type :int
|
|
622
|
+
o.default 10
|
|
623
|
+
end
|
|
624
|
+
|
|
625
|
+
# Fallback to system dns instead of using libdatadog built-in resolver.
|
|
626
|
+
#
|
|
627
|
+
# @default `DD_PROFILING_EXPERIMENTAL_USE_SYSTEM_DNS` environment variable as a boolean, otherwise `true`
|
|
628
|
+
option :experimental_use_system_dns do |o|
|
|
629
|
+
o.type :bool
|
|
630
|
+
o.env 'DD_PROFILING_EXPERIMENTAL_USE_SYSTEM_DNS'
|
|
631
|
+
o.default true
|
|
632
|
+
end
|
|
607
633
|
end
|
|
608
634
|
|
|
609
635
|
# @public_api
|
|
@@ -888,6 +914,19 @@ module Datadog
|
|
|
888
914
|
o.default 60.0
|
|
889
915
|
end
|
|
890
916
|
|
|
917
|
+
# The interval in seconds when extended heartbeat must be sent.
|
|
918
|
+
#
|
|
919
|
+
# This method is used internally, for testing purposes only.
|
|
920
|
+
#
|
|
921
|
+
# @default `DD_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL` environment variable, otherwise `86400`.
|
|
922
|
+
# @return [Integer]
|
|
923
|
+
# @!visibility private
|
|
924
|
+
option :extended_heartbeat_interval_seconds do |o|
|
|
925
|
+
o.type :int
|
|
926
|
+
o.env Core::Telemetry::Ext::ENV_EXTENDED_HEARTBEAT_INTERVAL
|
|
927
|
+
o.default 86400
|
|
928
|
+
end
|
|
929
|
+
|
|
891
930
|
# The interval in seconds when telemetry metrics are aggregated.
|
|
892
931
|
# Should be a denominator of `heartbeat_interval_seconds`.
|
|
893
932
|
#
|
|
@@ -1033,13 +1072,13 @@ module Datadog
|
|
|
1033
1072
|
end
|
|
1034
1073
|
end
|
|
1035
1074
|
|
|
1036
|
-
# Enable
|
|
1075
|
+
# Enable process tags propagation such that payloads like spans contain the process tag.
|
|
1037
1076
|
#
|
|
1038
|
-
# @default `DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED` environment variable, otherwise `
|
|
1077
|
+
# @default `DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED` environment variable, otherwise `true`
|
|
1039
1078
|
# @return [Boolean]
|
|
1040
1079
|
option :experimental_propagate_process_tags_enabled do |o|
|
|
1041
1080
|
o.env 'DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED'
|
|
1042
|
-
o.default
|
|
1081
|
+
o.default true
|
|
1043
1082
|
o.type :bool
|
|
1044
1083
|
end
|
|
1045
1084
|
|
|
@@ -77,6 +77,7 @@ module Datadog
|
|
|
77
77
|
"DD_PROFILING_EXPERIMENTAL_HEAP_ENABLED",
|
|
78
78
|
"DD_PROFILING_EXPERIMENTAL_HEAP_SAMPLE_RATE",
|
|
79
79
|
"DD_PROFILING_EXPERIMENTAL_HEAP_SIZE_ENABLED",
|
|
80
|
+
"DD_PROFILING_EXPERIMENTAL_USE_SYSTEM_DNS",
|
|
80
81
|
"DD_PROFILING_GC_ENABLED",
|
|
81
82
|
"DD_PROFILING_GVL_ENABLED",
|
|
82
83
|
"DD_PROFILING_HEAP_CLEAN_AFTER_GC_ENABLED",
|
|
@@ -106,6 +107,7 @@ module Datadog
|
|
|
106
107
|
"DD_TAGS",
|
|
107
108
|
"DD_TELEMETRY_AGENTLESS_URL",
|
|
108
109
|
"DD_TELEMETRY_DEPENDENCY_COLLECTION_ENABLED",
|
|
110
|
+
"DD_TELEMETRY_EXTENDED_HEARTBEAT_INTERVAL",
|
|
109
111
|
"DD_TELEMETRY_HEARTBEAT_INTERVAL",
|
|
110
112
|
"DD_TELEMETRY_LOG_COLLECTION_ENABLED",
|
|
111
113
|
"DD_TELEMETRY_METRICS_AGGREGATION_INTERVAL",
|
|
@@ -166,11 +168,13 @@ module Datadog
|
|
|
166
168
|
"DD_TRACE_ENABLED",
|
|
167
169
|
"DD_TRACE_ETHON_ANALYTICS_ENABLED",
|
|
168
170
|
"DD_TRACE_ETHON_ANALYTICS_SAMPLE_RATE",
|
|
171
|
+
"DD_TRACE_ETHON_DISTRIBUTED_TRACING",
|
|
169
172
|
"DD_TRACE_ETHON_ENABLED",
|
|
170
173
|
"DD_TRACE_ETHON_PEER_SERVICE",
|
|
171
174
|
"DD_TRACE_ETHON_SERVICE_NAME",
|
|
172
175
|
"DD_TRACE_EXCON_ANALYTICS_ENABLED",
|
|
173
176
|
"DD_TRACE_EXCON_ANALYTICS_SAMPLE_RATE",
|
|
177
|
+
"DD_TRACE_EXCON_DISTRIBUTED_TRACING",
|
|
174
178
|
"DD_TRACE_EXCON_ENABLED",
|
|
175
179
|
"DD_TRACE_EXCON_ERROR_STATUS_CODES",
|
|
176
180
|
"DD_TRACE_EXCON_PEER_SERVICE",
|
|
@@ -178,6 +182,7 @@ module Datadog
|
|
|
178
182
|
"DD_TRACE_EXPERIMENTAL_RUNTIME_ID_ENABLED",
|
|
179
183
|
"DD_TRACE_FARADAY_ANALYTICS_ENABLED",
|
|
180
184
|
"DD_TRACE_FARADAY_ANALYTICS_SAMPLE_RATE",
|
|
185
|
+
"DD_TRACE_FARADAY_DISTRIBUTED_TRACING",
|
|
181
186
|
"DD_TRACE_FARADAY_ENABLED",
|
|
182
187
|
"DD_TRACE_FARADAY_ERROR_STATUS_CODES",
|
|
183
188
|
"DD_TRACE_FARADAY_PEER_SERVICE",
|
|
@@ -194,6 +199,7 @@ module Datadog
|
|
|
194
199
|
"DD_TRACE_GRAPHQL_WITH_UNIFIED_TRACER",
|
|
195
200
|
"DD_TRACE_GRPC_ANALYTICS_ENABLED",
|
|
196
201
|
"DD_TRACE_GRPC_ANALYTICS_SAMPLE_RATE",
|
|
202
|
+
"DD_TRACE_GRPC_DISTRIBUTED_TRACING",
|
|
197
203
|
"DD_TRACE_GRPC_ENABLED",
|
|
198
204
|
"DD_TRACE_GRPC_PEER_SERVICE",
|
|
199
205
|
"DD_TRACE_GRPC_SERVICE_NAME",
|
|
@@ -201,12 +207,14 @@ module Datadog
|
|
|
201
207
|
"DD_TRACE_HEADER_TAGS",
|
|
202
208
|
"DD_TRACE_HTTPCLIENT_ANALYTICS_ENABLED",
|
|
203
209
|
"DD_TRACE_HTTPCLIENT_ANALYTICS_SAMPLE_RATE",
|
|
210
|
+
"DD_TRACE_HTTPCLIENT_DISTRIBUTED_TRACING",
|
|
204
211
|
"DD_TRACE_HTTPCLIENT_ENABLED",
|
|
205
212
|
"DD_TRACE_HTTPCLIENT_ERROR_STATUS_CODES",
|
|
206
213
|
"DD_TRACE_HTTPCLIENT_PEER_SERVICE",
|
|
207
214
|
"DD_TRACE_HTTPCLIENT_SERVICE_NAME",
|
|
208
215
|
"DD_TRACE_HTTPRB_ANALYTICS_ENABLED",
|
|
209
216
|
"DD_TRACE_HTTPRB_ANALYTICS_SAMPLE_RATE",
|
|
217
|
+
"DD_TRACE_HTTPRB_DISTRIBUTED_TRACING",
|
|
210
218
|
"DD_TRACE_HTTPRB_ENABLED",
|
|
211
219
|
"DD_TRACE_HTTPRB_ERROR_STATUS_CODES",
|
|
212
220
|
"DD_TRACE_HTTPRB_PEER_SERVICE",
|
|
@@ -214,12 +222,14 @@ module Datadog
|
|
|
214
222
|
"DD_TRACE_HTTP_ANALYTICS_ENABLED",
|
|
215
223
|
"DD_TRACE_HTTP_ANALYTICS_SAMPLE_RATE",
|
|
216
224
|
"DD_TRACE_HTTP_CLIENT_ERROR_STATUSES",
|
|
225
|
+
"DD_TRACE_HTTP_DISTRIBUTED_TRACING",
|
|
217
226
|
"DD_TRACE_HTTP_ENABLED",
|
|
218
227
|
"DD_TRACE_HTTP_ERROR_STATUS_CODES",
|
|
219
228
|
"DD_TRACE_HTTP_SERVER_ERROR_STATUSES",
|
|
220
229
|
"DD_TRACE_KAFKA_ANALYTICS_ENABLED",
|
|
221
230
|
"DD_TRACE_KAFKA_ANALYTICS_SAMPLE_RATE",
|
|
222
231
|
"DD_TRACE_KAFKA_ENABLED",
|
|
232
|
+
"DD_TRACE_KARAFKA_DISTRIBUTED_TRACING",
|
|
223
233
|
"DD_TRACE_KARAFKA_ENABLED",
|
|
224
234
|
"DD_TRACE_LOGRAGE_ENABLED",
|
|
225
235
|
"DD_TRACE_MEMCACHED_COMMAND_ENABLED",
|
|
@@ -261,6 +271,7 @@ module Datadog
|
|
|
261
271
|
"DD_TRACE_PROPAGATION_STYLE_INJECT",
|
|
262
272
|
"DD_TRACE_QUE_ANALYTICS_ENABLED",
|
|
263
273
|
"DD_TRACE_QUE_ANALYTICS_SAMPLE_RATE",
|
|
274
|
+
"DD_TRACE_QUE_DISTRIBUTED_TRACING",
|
|
264
275
|
"DD_TRACE_QUE_ENABLED",
|
|
265
276
|
"DD_TRACE_QUE_TAG_ARGS_ENABLED",
|
|
266
277
|
"DD_TRACE_QUE_TAG_DATA_ENABLED",
|
|
@@ -269,9 +280,11 @@ module Datadog
|
|
|
269
280
|
"DD_TRACE_RACECAR_ENABLED",
|
|
270
281
|
"DD_TRACE_RACK_ANALYTICS_ENABLED",
|
|
271
282
|
"DD_TRACE_RACK_ANALYTICS_SAMPLE_RATE",
|
|
283
|
+
"DD_TRACE_RACK_DISTRIBUTED_TRACING",
|
|
272
284
|
"DD_TRACE_RACK_ENABLED",
|
|
273
285
|
"DD_TRACE_RAILS_ANALYTICS_ENABLED",
|
|
274
286
|
"DD_TRACE_RAILS_ANALYTICS_SAMPLE_RATE",
|
|
287
|
+
"DD_TRACE_RAILS_DISTRIBUTED_TRACING",
|
|
275
288
|
"DD_TRACE_RAILS_ENABLED",
|
|
276
289
|
"DD_TRACE_RAKE_ANALYTICS_ENABLED",
|
|
277
290
|
"DD_TRACE_RAKE_ANALYTICS_SAMPLE_RATE",
|
|
@@ -291,6 +304,7 @@ module Datadog
|
|
|
291
304
|
"DD_TRACE_RESQUE_ENABLED",
|
|
292
305
|
"DD_TRACE_REST_CLIENT_ANALYTICS_ENABLED",
|
|
293
306
|
"DD_TRACE_REST_CLIENT_ANALYTICS_SAMPLE_RATE",
|
|
307
|
+
"DD_TRACE_REST_CLIENT_DISTRIBUTED_TRACING",
|
|
294
308
|
"DD_TRACE_REST_CLIENT_ENABLED",
|
|
295
309
|
"DD_TRACE_REST_CLIENT_PEER_SERVICE",
|
|
296
310
|
"DD_TRACE_REST_CLIENT_SERVICE_NAME",
|
|
@@ -306,9 +320,11 @@ module Datadog
|
|
|
306
320
|
"DD_TRACE_SHORYUKEN_ENABLED",
|
|
307
321
|
"DD_TRACE_SIDEKIQ_ANALYTICS_ENABLED",
|
|
308
322
|
"DD_TRACE_SIDEKIQ_ANALYTICS_SAMPLE_RATE",
|
|
323
|
+
"DD_TRACE_SIDEKIQ_DISTRIBUTED_TRACING",
|
|
309
324
|
"DD_TRACE_SIDEKIQ_ENABLED",
|
|
310
325
|
"DD_TRACE_SINATRA_ANALYTICS_ENABLED",
|
|
311
326
|
"DD_TRACE_SINATRA_ANALYTICS_SAMPLE_RATE",
|
|
327
|
+
"DD_TRACE_SINATRA_DISTRIBUTED_TRACING",
|
|
312
328
|
"DD_TRACE_SINATRA_ENABLED",
|
|
313
329
|
"DD_TRACE_SNEAKERS_ANALYTICS_ENABLED",
|
|
314
330
|
"DD_TRACE_SNEAKERS_ANALYTICS_SAMPLE_RATE",
|
|
@@ -326,6 +342,7 @@ module Datadog
|
|
|
326
342
|
"DD_TRACE_TRILOGY_ENABLED",
|
|
327
343
|
"DD_TRACE_TRILOGY_PEER_SERVICE",
|
|
328
344
|
"DD_TRACE_TRILOGY_SERVICE_NAME",
|
|
345
|
+
"DD_TRACE_WATERDROP_DISTRIBUTED_TRACING",
|
|
329
346
|
"DD_TRACE_WATERDROP_ENABLED",
|
|
330
347
|
"DD_TRACE_X_DATADOG_TAGS_MAX_LENGTH",
|
|
331
348
|
"DD_VERSION",
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative 'utils'
|
|
4
|
+
require_relative '../../environment/process'
|
|
5
|
+
require_relative '../../process_discovery'
|
|
6
|
+
|
|
7
|
+
module Datadog
|
|
8
|
+
module Core
|
|
9
|
+
module Contrib
|
|
10
|
+
module Rails
|
|
11
|
+
# Railtie for core Rails setup that benefits all Datadog products.
|
|
12
|
+
class Railtie < ::Rails::Railtie
|
|
13
|
+
def self.after_initialize
|
|
14
|
+
if Datadog.configuration.experimental_propagate_process_tags_enabled
|
|
15
|
+
Datadog::Core::Environment::Process.rails_application_name =
|
|
16
|
+
Datadog::Core::Contrib::Rails::Utils.app_name
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Process Discovery should always publish after_initialize since it has access to more information
|
|
20
|
+
Datadog::Core::ProcessDiscovery.publish(Datadog.configuration)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Registered after the method definition so the method exists if on_load fires immediately
|
|
24
|
+
# (which happens when the Railtie is loaded into an already-initialized Rails app).
|
|
25
|
+
::ActiveSupport.on_load(:after_initialize) do
|
|
26
|
+
Datadog::Core::Contrib::Rails::Railtie.after_initialize
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -7,11 +7,15 @@ module Datadog
|
|
|
7
7
|
# common utilities for Rails
|
|
8
8
|
module Utils
|
|
9
9
|
def self.app_name
|
|
10
|
-
if ::Rails::VERSION::MAJOR >= 6
|
|
11
|
-
::Rails.application.class.module_parent_name
|
|
10
|
+
application_name = if ::Rails::VERSION::MAJOR >= 6
|
|
11
|
+
::Rails.application.class.module_parent_name
|
|
12
12
|
else
|
|
13
|
-
::Rails.application.class.parent_name
|
|
13
|
+
::Rails.application.class.parent_name
|
|
14
14
|
end
|
|
15
|
+
application_name&.underscore
|
|
16
|
+
rescue => e
|
|
17
|
+
Datadog.logger.debug("Failed to extract Rails application name: #{e.class}: #{e}")
|
|
18
|
+
nil
|
|
15
19
|
end
|
|
16
20
|
|
|
17
21
|
def self.railtie_supported?
|
|
@@ -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
|
|
58
|
+
Datadog.logger.debug { "Crashtracker failed to report unhandled exception: #{e.class}: #{e}" }
|
|
59
59
|
end
|
|
60
60
|
end
|
|
61
61
|
|
|
@@ -83,12 +83,11 @@ module Datadog
|
|
|
83
83
|
start_or_update_on_fork(action: :update_on_fork, tags: self.class.latest_tags(settings))
|
|
84
84
|
end
|
|
85
85
|
|
|
86
|
-
def report_unhandled_exception(exception
|
|
86
|
+
def report_unhandled_exception(exception)
|
|
87
87
|
# Maximum number of stack frames to include in exception crash reports
|
|
88
88
|
# This is the same number used for signal-based crashtracking's runtime stack
|
|
89
89
|
max_exception_stack_frames = 512
|
|
90
90
|
|
|
91
|
-
current_tags = self.class.latest_tags(settings)
|
|
92
91
|
# extract all frame data upfront; c expects exactly 3 elements, proper types, no nils
|
|
93
92
|
# limit to max_exception_stack_frames frames
|
|
94
93
|
all_backtrace_locations = exception.backtrace_locations || []
|
|
@@ -116,19 +115,12 @@ module Datadog
|
|
|
116
115
|
end
|
|
117
116
|
|
|
118
117
|
exception_message = exception.message
|
|
119
|
-
|
|
120
|
-
if exception_message && !exception_message.empty?
|
|
121
|
-
"Process was terminated due to an unhandled exception of type '#{exception.class}'. Message: \"#{exception_message}\""
|
|
122
|
-
else
|
|
123
|
-
"Process was terminated due to an unhandled exception of type '#{exception.class}'."
|
|
124
|
-
end
|
|
118
|
+
exception_type = exception.class.to_s
|
|
125
119
|
|
|
126
120
|
success = self.class._native_report_ruby_exception(
|
|
127
|
-
|
|
128
|
-
|
|
121
|
+
exception_type,
|
|
122
|
+
exception_message,
|
|
129
123
|
frames_data,
|
|
130
|
-
current_tags.to_a,
|
|
131
|
-
Datadog::VERSION::STRING
|
|
132
124
|
)
|
|
133
125
|
|
|
134
126
|
logger.debug('Crashtracker failed to report unhandled exception to crash tracker') unless success
|
|
@@ -138,7 +130,7 @@ module Datadog
|
|
|
138
130
|
self.class._native_stop
|
|
139
131
|
logger.debug('Crash tracking stopped successfully')
|
|
140
132
|
rescue => e
|
|
141
|
-
logger.error("Failed to stop crash tracking: #{e.
|
|
133
|
+
logger.error("Failed to stop crash tracking: #{e.class}: #{e}")
|
|
142
134
|
end
|
|
143
135
|
|
|
144
136
|
private
|
|
@@ -157,7 +149,7 @@ module Datadog
|
|
|
157
149
|
)
|
|
158
150
|
logger.debug("Crash tracking action: #{action} successful")
|
|
159
151
|
rescue => e
|
|
160
|
-
logger.error("Failed to #{action} crash tracking: #{e.
|
|
152
|
+
logger.error("Failed to #{action} crash tracking: #{e.class}: #{e}")
|
|
161
153
|
end
|
|
162
154
|
end
|
|
163
155
|
end
|
|
@@ -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
|
|
111
|
+
"Error while checking cgroup namespace. Cause: #{e.class}: #{e} 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
|
|
175
|
+
"Error while reading container entry. Cause: #{e.class}: #{e} Location: #{Array(e.backtrace).first}"
|
|
176
176
|
)
|
|
177
177
|
@entry = Entry.new unless defined?(@entry)
|
|
178
178
|
@entry
|
|
@@ -41,6 +41,7 @@ module Datadog
|
|
|
41
41
|
TAG_ENTRYPOINT_NAME = "entrypoint.name"
|
|
42
42
|
TAG_ENTRYPOINT_WORKDIR = "entrypoint.workdir"
|
|
43
43
|
TAG_ENTRYPOINT_TYPE = "entrypoint.type"
|
|
44
|
+
TAG_RAILS_APPLICATION = "rails.application"
|
|
44
45
|
TAG_PROCESS_TAGS = "_dd.tags.process"
|
|
45
46
|
TAG_SERVICE = 'service'
|
|
46
47
|
TAG_VERSION = 'version'
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require 'securerandom'
|
|
4
4
|
|
|
5
|
+
require_relative '../configuration/config_helper'
|
|
5
6
|
require_relative 'ext'
|
|
6
7
|
require_relative '../utils/forking'
|
|
7
8
|
|
|
@@ -13,18 +14,39 @@ module Datadog
|
|
|
13
14
|
module Identity
|
|
14
15
|
extend Core::Utils::Forking
|
|
15
16
|
|
|
17
|
+
ENV_ROOT_SESSION_ID = '_DD_ROOT_RB_SESSION_ID'
|
|
18
|
+
ENV_PARENT_SESSION_ID = '_DD_PARENT_RB_SESSION_ID'
|
|
19
|
+
|
|
16
20
|
module_function
|
|
17
21
|
|
|
18
|
-
|
|
22
|
+
@root_runtime_id = DATADOG_ENV[ENV_ROOT_SESSION_ID]&.freeze
|
|
23
|
+
@parent_runtime_id = DATADOG_ENV[ENV_PARENT_SESSION_ID]&.freeze
|
|
24
|
+
|
|
19
25
|
def id
|
|
20
26
|
@id ||= ::SecureRandom.uuid.freeze
|
|
21
27
|
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
after_fork! do
|
|
29
|
+
# Order matters: capture @id before overwriting
|
|
30
|
+
@parent_runtime_id = @id
|
|
31
|
+
@root_runtime_id ||= @id
|
|
32
|
+
@id = ::SecureRandom.uuid.freeze
|
|
33
|
+
end
|
|
24
34
|
|
|
25
35
|
@id
|
|
26
36
|
end
|
|
27
37
|
|
|
38
|
+
def root_runtime_id
|
|
39
|
+
@root_runtime_id
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def parent_runtime_id
|
|
43
|
+
@parent_runtime_id
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def runtime_propagation_envs
|
|
47
|
+
{ENV_ROOT_SESSION_ID => root_runtime_id || id, ENV_PARENT_SESSION_ID => id}.freeze
|
|
48
|
+
end
|
|
49
|
+
|
|
28
50
|
def pid
|
|
29
51
|
::Process.pid
|
|
30
52
|
end
|
|
@@ -35,6 +35,9 @@ module Datadog
|
|
|
35
35
|
|
|
36
36
|
tags << "#{Environment::Ext::TAG_ENTRYPOINT_TYPE}:#{TagNormalizer.normalize(entrypoint_type, remove_digit_start_char: false)}"
|
|
37
37
|
|
|
38
|
+
rails_application_name = TagNormalizer.normalize_process_value(@rails_application_name.to_s)
|
|
39
|
+
tags << "#{Environment::Ext::TAG_RAILS_APPLICATION}:#{rails_application_name}" unless rails_application_name.empty?
|
|
40
|
+
|
|
38
41
|
@tags = tags.freeze
|
|
39
42
|
end
|
|
40
43
|
|
|
@@ -80,6 +83,15 @@ module Datadog
|
|
|
80
83
|
File.basename(File.expand_path(File.dirname($0)))
|
|
81
84
|
end
|
|
82
85
|
|
|
86
|
+
# Sets the rails application name from other places in code
|
|
87
|
+
# @param name [String] the rails application name
|
|
88
|
+
# @return [void]
|
|
89
|
+
def self.rails_application_name=(name)
|
|
90
|
+
@rails_application_name = name
|
|
91
|
+
remove_instance_variable(:@tags) if instance_variable_defined?(:@tags)
|
|
92
|
+
remove_instance_variable(:@serialized) if instance_variable_defined?(:@serialized)
|
|
93
|
+
end
|
|
94
|
+
|
|
83
95
|
private_class_method :entrypoint_workdir, :entrypoint_type, :entrypoint_name, :entrypoint_basedir
|
|
84
96
|
end
|
|
85
97
|
end
|
|
@@ -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
|
|
104
|
+
"Failed to send count stat. Cause: #{e.class}: #{e} 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
|
|
118
|
+
"Failed to send distribution stat. Cause: #{e.class}: #{e} 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
|
|
131
|
+
"Failed to send increment stat. Cause: #{e.class}: #{e} 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
|
|
145
|
+
"Failed to send gauge stat. Cause: #{e.class}: #{e} 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
|
|
165
|
+
"Failed to send time stat. Cause: #{e.class}: #{e} Source: #{Array(e.backtrace).first}"
|
|
166
166
|
)
|
|
167
167
|
telemetry.report(e, description: 'Failed to send time stat')
|
|
168
168
|
end
|
|
@@ -10,6 +10,11 @@ module Datadog
|
|
|
10
10
|
module ProcessDiscovery
|
|
11
11
|
class << self
|
|
12
12
|
def publish(settings)
|
|
13
|
+
if RUBY_PLATFORM.include?("darwin")
|
|
14
|
+
Datadog.logger.debug { "Skipping process discovery, not yet supported on macOS" }
|
|
15
|
+
return
|
|
16
|
+
end
|
|
17
|
+
|
|
13
18
|
if (libdatadog_api_failure = Datadog::Core::LIBDATADOG_API_FAILURE)
|
|
14
19
|
Datadog.logger.debug { "Cannot enable process discovery: #{libdatadog_api_failure}" }
|
|
15
20
|
return
|