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.
Files changed (214) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +87 -2
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +21 -12
  4. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +9 -7
  5. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +18 -0
  6. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +10 -0
  7. data/ext/datadog_profiling_native_extension/extconf.rb +6 -24
  8. data/ext/datadog_profiling_native_extension/heap_recorder.c +5 -6
  9. data/ext/datadog_profiling_native_extension/http_transport.c +51 -64
  10. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +0 -13
  11. data/ext/datadog_profiling_native_extension/profiling.c +3 -1
  12. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +24 -8
  13. data/ext/datadog_profiling_native_extension/setup_signal_handler.h +1 -3
  14. data/ext/datadog_profiling_native_extension/stack_recorder.c +29 -43
  15. data/ext/libdatadog_api/crashtracker.c +5 -8
  16. data/ext/libdatadog_api/crashtracker_report_exception.c +34 -144
  17. data/ext/libdatadog_api/datadog_ruby_common.c +18 -0
  18. data/ext/libdatadog_api/datadog_ruby_common.h +10 -0
  19. data/ext/libdatadog_api/di.c +79 -0
  20. data/ext/libdatadog_api/extconf.rb +5 -20
  21. data/ext/libdatadog_api/init.c +5 -2
  22. data/ext/libdatadog_extconf_helpers.rb +57 -11
  23. data/lib/datadog/ai_guard/component.rb +2 -0
  24. data/lib/datadog/ai_guard/configuration/settings.rb +3 -0
  25. data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +41 -3
  26. data/lib/datadog/ai_guard/evaluation/content_builder.rb +31 -0
  27. data/lib/datadog/ai_guard/evaluation/content_part.rb +36 -0
  28. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +3 -1
  29. data/lib/datadog/ai_guard/evaluation/request.rb +14 -9
  30. data/lib/datadog/ai_guard/evaluation/result.rb +3 -1
  31. data/lib/datadog/ai_guard/evaluation.rb +36 -7
  32. data/lib/datadog/ai_guard.rb +26 -8
  33. data/lib/datadog/appsec/autoload.rb +1 -1
  34. data/lib/datadog/appsec/component.rb +11 -7
  35. data/lib/datadog/appsec/contrib/active_record/patcher.rb +3 -0
  36. data/lib/datadog/appsec/contrib/devise/integration.rb +1 -1
  37. data/lib/datadog/appsec/contrib/excon/patcher.rb +2 -0
  38. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +1 -1
  39. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  40. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +1 -1
  41. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +10 -11
  42. data/lib/datadog/appsec/contrib/rack/integration.rb +1 -1
  43. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +25 -2
  44. data/lib/datadog/appsec/contrib/rack/response_body.rb +36 -0
  45. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +2 -2
  46. data/lib/datadog/appsec/contrib/rails/integration.rb +1 -1
  47. data/lib/datadog/appsec/contrib/rails/patcher.rb +2 -2
  48. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +2 -0
  49. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
  50. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +3 -3
  51. data/lib/datadog/appsec/event.rb +1 -17
  52. data/lib/datadog/appsec/instrumentation/gateway/middleware.rb +2 -3
  53. data/lib/datadog/appsec/instrumentation/gateway.rb +2 -15
  54. data/lib/datadog/appsec/monitor/gateway/watcher.rb +4 -2
  55. data/lib/datadog/appsec/utils/http/media_type.rb +1 -2
  56. data/lib/datadog/appsec/utils/http/url_encoded.rb +2 -2
  57. data/lib/datadog/appsec.rb +5 -9
  58. data/lib/datadog/core/configuration/base.rb +17 -5
  59. data/lib/datadog/core/configuration/components.rb +21 -8
  60. data/lib/datadog/core/configuration/config_helper.rb +9 -0
  61. data/lib/datadog/core/configuration/option.rb +32 -6
  62. data/lib/datadog/core/configuration/option_definition.rb +38 -12
  63. data/lib/datadog/core/configuration/options.rb +41 -7
  64. data/lib/datadog/core/configuration/settings.rb +42 -3
  65. data/lib/datadog/core/configuration/supported_configurations.rb +17 -0
  66. data/lib/datadog/core/contrib/rails/railtie.rb +32 -0
  67. data/lib/datadog/core/contrib/rails/utils.rb +7 -3
  68. data/lib/datadog/core/crashtracking/component.rb +7 -15
  69. data/lib/datadog/core/environment/container.rb +2 -2
  70. data/lib/datadog/core/environment/ext.rb +1 -0
  71. data/lib/datadog/core/environment/identity.rb +25 -3
  72. data/lib/datadog/core/environment/process.rb +12 -0
  73. data/lib/datadog/core/metrics/client.rb +5 -5
  74. data/lib/datadog/core/process_discovery.rb +5 -0
  75. data/lib/datadog/core/remote/component.rb +38 -21
  76. data/lib/datadog/core/runtime/metrics.rb +2 -3
  77. data/lib/datadog/core/telemetry/component.rb +3 -0
  78. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +2 -3
  79. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +32 -0
  80. data/lib/datadog/core/telemetry/event/app_started.rb +151 -169
  81. data/lib/datadog/core/telemetry/event.rb +1 -7
  82. data/lib/datadog/core/telemetry/ext.rb +1 -0
  83. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +5 -0
  84. data/lib/datadog/core/telemetry/worker.rb +20 -0
  85. data/lib/datadog/core/utils/base64.rb +1 -1
  86. data/lib/datadog/core/utils/only_once.rb +1 -1
  87. data/lib/datadog/core/utils/spawn_monkey_patch.rb +36 -0
  88. data/lib/datadog/core/workers/async.rb +1 -1
  89. data/lib/datadog/core/workers/interval_loop.rb +13 -6
  90. data/lib/datadog/core/workers/queue.rb +0 -4
  91. data/lib/datadog/core/workers/runtime_metrics.rb +9 -1
  92. data/lib/datadog/core.rb +0 -1
  93. data/lib/datadog/data_streams/pathway_context.rb +1 -1
  94. data/lib/datadog/data_streams/processor.rb +1 -0
  95. data/lib/datadog/di/boot.rb +3 -4
  96. data/lib/datadog/di/component.rb +20 -4
  97. data/lib/datadog/di/instrumenter.rb +20 -10
  98. data/lib/datadog/di/probe_manager.rb +79 -62
  99. data/lib/datadog/di/probe_notification_builder.rb +148 -33
  100. data/lib/datadog/di/probe_notifier_worker.rb +52 -6
  101. data/lib/datadog/di/probe_repository.rb +198 -0
  102. data/lib/datadog/di/remote.rb +5 -6
  103. data/lib/datadog/di/serializer.rb +127 -9
  104. data/lib/datadog/di/transport/http.rb +12 -3
  105. data/lib/datadog/di/transport/input.rb +46 -8
  106. data/lib/datadog/di.rb +81 -0
  107. data/lib/datadog/kit/enable_core_dumps.rb +1 -1
  108. data/lib/datadog/open_feature/configuration.rb +2 -0
  109. data/lib/datadog/open_feature/evaluation_engine.rb +1 -1
  110. data/lib/datadog/open_feature/exposures/reporter.rb +1 -1
  111. data/lib/datadog/open_feature/exposures/worker.rb +1 -1
  112. data/lib/datadog/open_feature/remote.rb +1 -1
  113. data/lib/datadog/open_feature/transport.rb +1 -1
  114. data/lib/datadog/opentelemetry/configuration/settings.rb +2 -0
  115. data/lib/datadog/profiling/collectors/code_provenance.rb +2 -3
  116. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +14 -1
  117. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  118. data/lib/datadog/profiling/component.rb +31 -1
  119. data/lib/datadog/profiling/http_transport.rb +5 -6
  120. data/lib/datadog/profiling/load_native_extension.rb +1 -1
  121. data/lib/datadog/profiling/profiler.rb +15 -12
  122. data/lib/datadog/profiling/scheduler.rb +2 -2
  123. data/lib/datadog/profiling/tasks/exec.rb +2 -2
  124. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  125. data/lib/datadog/profiling.rb +1 -2
  126. data/lib/datadog/single_step_instrument.rb +1 -1
  127. data/lib/datadog/tracing/buffer.rb +3 -3
  128. data/lib/datadog/tracing/component.rb +11 -0
  129. data/lib/datadog/tracing/configuration/settings.rb +2 -1
  130. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
  131. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +20 -0
  132. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +3 -1
  133. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  134. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  135. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  136. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  137. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  138. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  139. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  140. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  141. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +1 -1
  142. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  143. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -1
  144. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  145. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -1
  146. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
  147. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -1
  148. data/lib/datadog/tracing/contrib/configurable.rb +18 -3
  149. data/lib/datadog/tracing/contrib/dalli/integration.rb +4 -1
  150. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -1
  151. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +5 -1
  152. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  153. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -2
  154. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  155. data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -2
  156. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -2
  157. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  158. data/lib/datadog/tracing/contrib/faraday/middleware.rb +2 -2
  159. data/lib/datadog/tracing/contrib/grape/endpoint.rb +7 -7
  160. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +13 -8
  161. data/lib/datadog/tracing/contrib/grape/patcher.rb +6 -1
  162. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +5 -2
  163. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  164. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +5 -2
  165. data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
  166. data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -1
  167. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +5 -2
  168. data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
  169. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +5 -2
  170. data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
  171. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -1
  172. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +5 -1
  173. data/lib/datadog/tracing/contrib/karafka/ext.rb +1 -0
  174. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -1
  175. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +5 -2
  176. data/lib/datadog/tracing/contrib/que/ext.rb +1 -0
  177. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +5 -1
  178. data/lib/datadog/tracing/contrib/rack/ext.rb +1 -0
  179. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +5 -2
  180. data/lib/datadog/tracing/contrib/rails/ext.rb +1 -0
  181. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  182. data/lib/datadog/tracing/contrib/rails/patcher.rb +0 -1
  183. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  184. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +2 -2
  185. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  186. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +5 -2
  187. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  188. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +5 -1
  189. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +1 -0
  190. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +5 -1
  191. data/lib/datadog/tracing/contrib/sinatra/ext.rb +1 -0
  192. data/lib/datadog/tracing/contrib/status_range_matcher.rb +4 -0
  193. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  194. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +5 -1
  195. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +1 -0
  196. data/lib/datadog/tracing/distributed/datadog.rb +4 -2
  197. data/lib/datadog/tracing/event.rb +1 -1
  198. data/lib/datadog/tracing/metadata/ext.rb +4 -0
  199. data/lib/datadog/tracing/remote.rb +1 -1
  200. data/lib/datadog/tracing/sampling/ext.rb +2 -0
  201. data/lib/datadog/tracing/sampling/priority_sampler.rb +13 -0
  202. data/lib/datadog/tracing/sampling/rule.rb +1 -1
  203. data/lib/datadog/tracing/sampling/rule_sampler.rb +54 -25
  204. data/lib/datadog/tracing/sampling/span/rule_parser.rb +1 -1
  205. data/lib/datadog/tracing/span_operation.rb +1 -1
  206. data/lib/datadog/tracing/sync_writer.rb +0 -1
  207. data/lib/datadog/tracing/trace_operation.rb +50 -6
  208. data/lib/datadog/tracing/tracer.rb +25 -0
  209. data/lib/datadog/tracing/transport/io/client.rb +1 -1
  210. data/lib/datadog/tracing/transport/trace_formatter.rb +11 -0
  211. data/lib/datadog/tracing/writer.rb +0 -1
  212. data/lib/datadog/version.rb +1 -1
  213. metadata +15 -8
  214. 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, meta, &block)
25
- @default = meta[:default]
26
- @default_proc = meta[:default_proc]
27
- @env = meta[:env]
28
- @env_parser = meta[:env_parser]
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 = meta[:after_set]
31
- @resetter = meta[:resetter]
32
- @setter = meta[:setter] || block || IDENTITY
33
- @type = meta[:type]
34
- @type_options = meta[:type_options]
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, meta)
152
+ OptionDefinition.new(@name, attributes)
130
153
  end
131
154
 
132
- def meta
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 ||= (superclass <= Options) ? superclass.options.dup : {}
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, meta = {}, &block)
27
- settings_name = defined?(@settings_name) && @settings_name
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).set(value, precedence: precedence)
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::GenericSettingsClass
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 experimental process tags propagation such that payloads like spans contain the process tag.
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 `false`
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 false
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.underscore
10
+ application_name = if ::Rails::VERSION::MAJOR >= 6
11
+ ::Rails.application.class.module_parent_name
12
12
  else
13
- ::Rails.application.class.parent_name.underscore
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("Crashtracker failed to report unhandled exception: #{e.message}")
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, settings: Datadog.configuration)
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
- message =
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
- agent_base_url,
128
- message,
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.message}")
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.message}")
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.name} #{e.message} Location: #{Array(e.backtrace).first}"
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.name} #{e.message} Location: #{Array(e.backtrace).first}"
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
- # Retrieves number of classes from runtime
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
- # Check if runtime has changed, e.g. forked.
23
- after_fork! { @id = ::SecureRandom.uuid.freeze }
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.name} #{e.message} Source: #{Array(e.backtrace).first}"
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.name} #{e.message} Source: #{Array(e.backtrace).first}"
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.name} #{e.message} Source: #{Array(e.backtrace).first}"
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.name} #{e.message} Source: #{Array(e.backtrace).first}"
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.name} #{e.message} Source: #{Array(e.backtrace).first}"
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