datadog 2.1.0 → 2.3.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 (183) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +101 -1
  3. data/ext/datadog_profiling_loader/extconf.rb +15 -15
  4. data/ext/datadog_profiling_native_extension/clock_id.h +1 -0
  5. data/ext/datadog_profiling_native_extension/clock_id_from_pthread.c +1 -2
  6. data/ext/datadog_profiling_native_extension/clock_id_noop.c +1 -2
  7. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +132 -44
  8. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +49 -26
  9. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +34 -4
  10. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +4 -0
  11. data/ext/datadog_profiling_native_extension/collectors_stack.c +90 -37
  12. data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -2
  13. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +81 -19
  14. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +1 -0
  15. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +110 -0
  16. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +57 -0
  17. data/ext/datadog_profiling_native_extension/extconf.rb +69 -62
  18. data/ext/datadog_profiling_native_extension/heap_recorder.c +34 -6
  19. data/ext/datadog_profiling_native_extension/heap_recorder.h +3 -1
  20. data/ext/datadog_profiling_native_extension/helpers.h +6 -17
  21. data/ext/datadog_profiling_native_extension/http_transport.c +3 -3
  22. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +0 -86
  23. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +2 -23
  24. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +61 -126
  25. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +64 -138
  26. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +17 -11
  27. data/ext/datadog_profiling_native_extension/profiling.c +0 -2
  28. data/ext/datadog_profiling_native_extension/ruby_helpers.c +0 -33
  29. data/ext/datadog_profiling_native_extension/ruby_helpers.h +1 -26
  30. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +1 -1
  31. data/ext/datadog_profiling_native_extension/setup_signal_handler.h +1 -0
  32. data/ext/datadog_profiling_native_extension/stack_recorder.c +27 -8
  33. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -0
  34. data/ext/datadog_profiling_native_extension/time_helpers.c +0 -15
  35. data/ext/datadog_profiling_native_extension/time_helpers.h +36 -6
  36. data/ext/{datadog_profiling_native_extension → libdatadog_api}/crashtracker.c +20 -7
  37. data/ext/libdatadog_api/datadog_ruby_common.c +110 -0
  38. data/ext/libdatadog_api/datadog_ruby_common.h +57 -0
  39. data/ext/libdatadog_api/extconf.rb +108 -0
  40. data/ext/libdatadog_api/macos_development.md +26 -0
  41. data/ext/libdatadog_extconf_helpers.rb +130 -0
  42. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +49 -0
  43. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +73 -0
  44. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +68 -0
  45. data/lib/datadog/appsec/contrib/graphql/integration.rb +41 -0
  46. data/lib/datadog/appsec/contrib/graphql/patcher.rb +37 -0
  47. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +59 -0
  48. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +1 -1
  49. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +1 -1
  50. data/lib/datadog/appsec/extensions.rb +1 -0
  51. data/lib/datadog/appsec/processor/actions.rb +1 -1
  52. data/lib/datadog/appsec/response.rb +15 -1
  53. data/lib/datadog/appsec.rb +1 -0
  54. data/lib/datadog/core/configuration/components.rb +17 -12
  55. data/lib/datadog/core/configuration/settings.rb +93 -7
  56. data/lib/datadog/core/configuration.rb +3 -17
  57. data/lib/datadog/core/crashtracking/agent_base_url.rb +21 -0
  58. data/lib/datadog/core/crashtracking/component.rb +111 -0
  59. data/lib/datadog/core/crashtracking/tag_builder.rb +39 -0
  60. data/lib/datadog/core/deprecations.rb +58 -0
  61. data/lib/datadog/core/diagnostics/environment_logger.rb +8 -11
  62. data/lib/datadog/core/environment/yjit.rb +5 -0
  63. data/lib/datadog/core/runtime/ext.rb +1 -0
  64. data/lib/datadog/core/runtime/metrics.rb +6 -0
  65. data/lib/datadog/core/telemetry/component.rb +154 -0
  66. data/lib/datadog/core/telemetry/emitter.rb +9 -11
  67. data/lib/datadog/core/telemetry/event.rb +132 -26
  68. data/lib/datadog/core/telemetry/ext.rb +3 -0
  69. data/lib/datadog/core/telemetry/http/adapters/net.rb +11 -13
  70. data/lib/datadog/core/telemetry/http/ext.rb +3 -0
  71. data/lib/datadog/core/telemetry/http/transport.rb +38 -9
  72. data/lib/datadog/core/telemetry/logging.rb +35 -0
  73. data/lib/datadog/core/telemetry/metric.rb +167 -0
  74. data/lib/datadog/core/telemetry/metrics_collection.rb +81 -0
  75. data/lib/datadog/core/telemetry/metrics_manager.rb +81 -0
  76. data/lib/datadog/core/telemetry/request.rb +1 -1
  77. data/lib/datadog/core/telemetry/worker.rb +173 -0
  78. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +102 -0
  79. data/lib/datadog/core/utils/only_once_successful.rb +76 -0
  80. data/lib/datadog/core.rb +2 -19
  81. data/lib/datadog/kit/appsec/events.rb +2 -4
  82. data/lib/datadog/opentelemetry/sdk/propagator.rb +5 -10
  83. data/lib/datadog/opentelemetry/sdk/span_processor.rb +15 -2
  84. data/lib/datadog/opentelemetry/sdk/trace/span.rb +23 -0
  85. data/lib/datadog/profiling/collectors/code_provenance.rb +24 -11
  86. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +17 -17
  87. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +11 -13
  88. data/lib/datadog/profiling/collectors/info.rb +3 -3
  89. data/lib/datadog/profiling/collectors/thread_context.rb +4 -2
  90. data/lib/datadog/profiling/component.rb +85 -90
  91. data/lib/datadog/profiling/exporter.rb +3 -3
  92. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +410 -0
  93. data/lib/datadog/profiling/ext.rb +21 -21
  94. data/lib/datadog/profiling/flush.rb +1 -1
  95. data/lib/datadog/profiling/http_transport.rb +8 -6
  96. data/lib/datadog/profiling/load_native_extension.rb +5 -5
  97. data/lib/datadog/profiling/preload.rb +1 -1
  98. data/lib/datadog/profiling/profiler.rb +5 -8
  99. data/lib/datadog/profiling/scheduler.rb +31 -25
  100. data/lib/datadog/profiling/tag_builder.rb +2 -2
  101. data/lib/datadog/profiling/tasks/exec.rb +5 -5
  102. data/lib/datadog/profiling/tasks/setup.rb +16 -35
  103. data/lib/datadog/profiling.rb +5 -5
  104. data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
  105. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +1 -1
  106. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +1 -1
  107. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +1 -1
  108. data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -6
  109. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +9 -4
  110. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -2
  111. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +1 -5
  112. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  113. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  114. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  115. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  116. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  117. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  118. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  119. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  120. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +1 -1
  121. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  122. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +2 -1
  123. data/lib/datadog/tracing/contrib/active_support/cache/event.rb +32 -0
  124. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +156 -0
  125. data/lib/datadog/tracing/contrib/active_support/cache/events.rb +34 -0
  126. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +45 -41
  127. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +17 -40
  128. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -1
  129. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +29 -6
  130. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +16 -4
  131. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +33 -29
  132. data/lib/datadog/tracing/contrib/analytics.rb +5 -0
  133. data/lib/datadog/tracing/contrib/ext.rb +14 -0
  134. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +5 -0
  135. data/lib/datadog/tracing/contrib/graphql/patcher.rb +8 -2
  136. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +166 -0
  137. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +28 -0
  138. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -1
  139. data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +1 -1
  140. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
  141. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +3 -3
  142. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
  143. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
  144. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +3 -3
  145. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +3 -3
  146. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +3 -3
  147. data/lib/datadog/tracing/contrib/lograge/patcher.rb +16 -0
  148. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +5 -0
  149. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +17 -13
  150. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +5 -0
  151. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +4 -1
  152. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +28 -0
  153. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +5 -1
  154. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +22 -10
  155. data/lib/datadog/tracing/contrib/racecar/event.rb +2 -2
  156. data/lib/datadog/tracing/contrib/rails/ext.rb +9 -0
  157. data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -0
  158. data/lib/datadog/tracing/contrib/rails/runner.rb +95 -0
  159. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +5 -0
  160. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +4 -1
  161. data/lib/datadog/tracing/diagnostics/environment_logger.rb +14 -16
  162. data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
  163. data/lib/datadog/tracing/distributed/b3_single.rb +3 -1
  164. data/lib/datadog/tracing/distributed/datadog.rb +2 -2
  165. data/lib/datadog/tracing/distributed/propagation.rb +9 -2
  166. data/lib/datadog/tracing/distributed/trace_context.rb +3 -2
  167. data/lib/datadog/tracing/metadata/errors.rb +9 -1
  168. data/lib/datadog/tracing/metadata/ext.rb +4 -0
  169. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
  170. data/lib/datadog/tracing/span.rb +9 -2
  171. data/lib/datadog/tracing/span_event.rb +41 -0
  172. data/lib/datadog/tracing/span_operation.rb +9 -4
  173. data/lib/datadog/tracing/trace_operation.rb +7 -3
  174. data/lib/datadog/tracing/trace_segment.rb +4 -1
  175. data/lib/datadog/tracing/tracer.rb +9 -2
  176. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -0
  177. data/lib/datadog/tracing.rb +5 -1
  178. data/lib/datadog/version.rb +2 -2
  179. metadata +43 -12
  180. data/lib/datadog/core/telemetry/client.rb +0 -95
  181. data/lib/datadog/core/telemetry/heartbeat.rb +0 -33
  182. data/lib/datadog/profiling/crashtracker.rb +0 -91
  183. data/lib/datadog/profiling/ext/forking.rb +0 -98
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../core/utils/time'
3
+ require_relative "../core/utils/time"
4
4
 
5
- require_relative '../core/worker'
6
- require_relative '../core/workers/polling'
5
+ require_relative "../core/worker"
6
+ require_relative "../core/workers/polling"
7
7
 
8
8
  module Datadog
9
9
  module Profiling
@@ -22,7 +22,8 @@ module Datadog
22
22
 
23
23
  attr_reader \
24
24
  :exporter,
25
- :transport
25
+ :transport,
26
+ :profiler_failed
26
27
 
27
28
  public
28
29
 
@@ -34,6 +35,7 @@ module Datadog
34
35
  )
35
36
  @exporter = exporter
36
37
  @transport = transport
38
+ @profiler_failed = false
37
39
 
38
40
  # Workers::Async::Thread settings
39
41
  self.fork_policy = fork_policy
@@ -50,25 +52,23 @@ module Datadog
50
52
  end
51
53
 
52
54
  def perform(on_failure_proc)
53
- begin
54
- # A profiling flush may be called while the VM is shutting down, to report the last profile. When we do so,
55
- # we impose a strict timeout. This means this last profile may or may not be sent, depending on if the flush can
56
- # successfully finish in the strict timeout.
57
- # This can be somewhat confusing (why did it not get reported?), so let's at least log what happened.
58
- interrupted = true
59
-
60
- flush_and_wait
61
- interrupted = false
62
- rescue Exception => e # rubocop:disable Lint/RescueException
63
- Datadog.logger.warn(
64
- 'Profiling::Scheduler thread error. ' \
65
- "Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
66
- )
67
- on_failure_proc&.call
68
- raise
69
- ensure
70
- Datadog.logger.debug('#flush was interrupted or failed before it could complete') if interrupted
71
- end
55
+ # A profiling flush may be called while the VM is shutting down, to report the last profile. When we do so,
56
+ # we impose a strict timeout. This means this last profile may or may not be sent, depending on if the flush can
57
+ # successfully finish in the strict timeout.
58
+ # This can be somewhat confusing (why did it not get reported?), so let's at least log what happened.
59
+ interrupted = true
60
+
61
+ flush_and_wait
62
+ interrupted = false
63
+ rescue Exception => e # rubocop:disable Lint/RescueException
64
+ Datadog.logger.warn(
65
+ "Profiling::Scheduler thread error. " \
66
+ "Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
67
+ )
68
+ on_failure_proc&.call
69
+ raise
70
+ ensure
71
+ Datadog.logger.debug("#flush was interrupted or failed before it could complete") if interrupted
72
72
  end
73
73
 
74
74
  # Configure Workers::IntervalLoop to not report immediately when scheduler starts
@@ -80,8 +80,14 @@ module Datadog
80
80
  true
81
81
  end
82
82
 
83
+ # This is called by the Profiler class whenever an issue happened in the profiler. This makes sure that even
84
+ # if there is data to be flushed, we don't try to flush it.
85
+ def mark_profiler_failed
86
+ @profiler_failed = true
87
+ end
88
+
83
89
  def work_pending?
84
- exporter.can_flush?
90
+ !profiler_failed && exporter.can_flush?
85
91
  end
86
92
 
87
93
  def reset_after_fork
@@ -124,7 +130,7 @@ module Datadog
124
130
 
125
131
  begin
126
132
  transport.export(flush)
127
- rescue StandardError => e
133
+ rescue => e
128
134
  Datadog.logger.error(
129
135
  "Unable to report profile. Cause: #{e.class.name} #{e.message} Location: #{Array(e.backtrace).first}"
130
136
  )
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../core/utils'
4
- require_relative '../core/environment/git'
3
+ require_relative "../core/utils"
4
+ require_relative "../core/environment/git"
5
5
 
6
6
  module Datadog
7
7
  module Profiling
@@ -18,16 +18,16 @@ module Datadog
18
18
 
19
19
  def rubyopts
20
20
  [
21
- '-rdatadog/profiling/preload'
21
+ "-rdatadog/profiling/preload"
22
22
  ]
23
23
  end
24
24
 
25
25
  private
26
26
 
27
27
  def set_rubyopt!
28
- existing_rubyopt = ENV['RUBYOPT']
28
+ existing_rubyopt = ENV["RUBYOPT"]
29
29
 
30
- ENV['RUBYOPT'] = existing_rubyopt ? "#{existing_rubyopt} #{rubyopts.join(' ')}" : rubyopts.join(' ')
30
+ ENV["RUBYOPT"] = existing_rubyopt ? "#{existing_rubyopt} #{rubyopts.join(" ")}" : rubyopts.join(" ")
31
31
  end
32
32
 
33
33
  # If there's an error here, rather than throwing a cryptic stack trace, let's instead have clearer messages, and
@@ -38,10 +38,10 @@ module Datadog
38
38
  def exec_with_error_handling(args)
39
39
  Kernel.exec(*args)
40
40
  rescue Errno::ENOENT => e
41
- Kernel.warn "ddprofrb exec failed: #{e.class.name} #{e.message} (command was '#{args.join(' ')}')"
41
+ Kernel.warn "ddprofrb exec failed: #{e.class.name} #{e.message} (command was '#{args.join(" ")}')"
42
42
  Kernel.exit 127
43
43
  rescue Errno::EACCES, Errno::ENOEXEC => e
44
- Kernel.warn "ddprofrb exec failed: #{e.class.name} #{e.message} (command was '#{args.join(' ')}')"
44
+ Kernel.warn "ddprofrb exec failed: #{e.class.name} #{e.message} (command was '#{args.join(" ")}')"
45
45
  Kernel.exit 126
46
46
  end
47
47
  end
@@ -1,56 +1,37 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../core/utils/only_once'
4
- require_relative '../ext/forking'
3
+ require_relative "../../core/utils/only_once"
4
+ require_relative "../../core/utils/at_fork_monkey_patch"
5
5
 
6
6
  module Datadog
7
7
  module Profiling
8
8
  module Tasks
9
- # Takes care of loading our extensions/monkey patches to handle fork() and validating if CPU-time profiling is usable
9
+ # Takes care of restarting the profiler when the process forks
10
10
  class Setup
11
11
  ACTIVATE_EXTENSIONS_ONLY_ONCE = Core::Utils::OnlyOnce.new
12
12
 
13
13
  def run
14
14
  ACTIVATE_EXTENSIONS_ONLY_ONCE.run do
15
- begin
16
- activate_forking_extensions
17
- setup_at_fork_hooks
18
- rescue StandardError, ScriptError => e
19
- Datadog.logger.warn do
20
- "Profiler extensions unavailable. Cause: #{e.class.name} #{e.message} " \
21
- "Location: #{Array(e.backtrace).first}"
22
- end
15
+ Datadog::Core::Utils::AtForkMonkeyPatch.apply!
16
+ setup_at_fork_hooks
17
+ rescue StandardError, ScriptError => e
18
+ Datadog.logger.warn do
19
+ "Profiler extensions unavailable. Cause: #{e.class.name} #{e.message} " \
20
+ "Location: #{Array(e.backtrace).first}"
23
21
  end
24
22
  end
25
23
  end
26
24
 
27
25
  private
28
26
 
29
- def activate_forking_extensions
30
- if Ext::Forking.supported?
31
- Ext::Forking.apply!
32
- elsif Datadog.configuration.profiling.enabled
33
- Datadog.logger.debug('Profiler forking extensions skipped; forking not supported.')
34
- end
35
- rescue StandardError, ScriptError => e
36
- Datadog.logger.warn do
37
- "Profiler forking extensions unavailable. Cause: #{e.class.name} #{e.message} " \
38
- "Location: #{Array(e.backtrace).first}"
39
- end
40
- end
41
-
42
27
  def setup_at_fork_hooks
43
- if Process.respond_to?(:at_fork)
44
- Process.at_fork(:child) do
45
- begin
46
- # Restart profiler, if enabled
47
- Profiling.start_if_enabled
48
- rescue StandardError => e
49
- Datadog.logger.warn do
50
- "Error during post-fork hooks. Cause: #{e.class.name} #{e.message} " \
51
- "Location: #{Array(e.backtrace).first}"
52
- end
53
- end
28
+ Datadog::Core::Utils::AtForkMonkeyPatch.at_fork(:child) do
29
+ # Restart profiler, if enabled
30
+ Profiling.start_if_enabled
31
+ rescue => e
32
+ Datadog.logger.warn do
33
+ "Error during post-fork hooks. Cause: #{e.class.name} #{e.message} " \
34
+ "Location: #{Array(e.backtrace).first}"
54
35
  end
55
36
  end
56
37
  end
@@ -30,7 +30,7 @@ module Datadog
30
30
  profiler = Datadog.send(:components).profiler
31
31
  # ...but we still try to start it BECAUSE if the process forks, the profiler will exist but may
32
32
  # not yet have been started in the fork
33
- profiler.start if profiler
33
+ profiler&.start
34
34
  !!profiler
35
35
  end
36
36
 
@@ -47,6 +47,7 @@ module Datadog
47
47
  # (This is similar to some OS-based time representations.)
48
48
  #
49
49
  # Note 2: All fibers in the same thread will share the same counter values.
50
+ # Note 3: This counter is not accurate when using the M:N scheduler.
50
51
  #
51
52
  # Only available when the profiler is running, and allocation-related features are not disabled via configuration.
52
53
  #
@@ -62,7 +63,7 @@ module Datadog
62
63
  def self.enabled?
63
64
  profiler = Datadog.send(:components).profiler
64
65
  # Use .send(...) to avoid exposing the attr_reader as an API to the outside
65
- !!(profiler.send(:scheduler).running? if profiler)
66
+ !!profiler&.send(:scheduler)&.running?
66
67
  end
67
68
 
68
69
  def self.wait_until_running(timeout_seconds: 5)
@@ -97,7 +98,7 @@ module Datadog
97
98
 
98
99
  contents = file_api.read(skipped_reason_file).strip
99
100
  contents unless contents.empty?
100
- rescue StandardError
101
+ rescue
101
102
  # Do nothing
102
103
  end
103
104
  end
@@ -135,7 +136,7 @@ module Datadog
135
136
  private_class_method def self.load_profiling
136
137
  return false unless supported?
137
138
 
138
- require_relative 'profiling/ext/forking'
139
+ require_relative 'profiling/ext/dir_monkey_patches'
139
140
  require_relative 'profiling/collectors/info'
140
141
  require_relative 'profiling/collectors/code_provenance'
141
142
  require_relative 'profiling/collectors/cpu_and_wall_time_worker'
@@ -143,7 +144,6 @@ module Datadog
143
144
  require_relative 'profiling/collectors/idle_sampling_helper'
144
145
  require_relative 'profiling/collectors/stack'
145
146
  require_relative 'profiling/collectors/thread_context'
146
- require_relative 'profiling/crashtracker'
147
147
  require_relative 'profiling/stack_recorder'
148
148
  require_relative 'profiling/exporter'
149
149
  require_relative 'profiling/flush'
@@ -46,7 +46,7 @@ module Datadog
46
46
  module ClassMethods
47
47
  include Contrib::ActionCable::Event::ClassMethods
48
48
 
49
- def subscription(*args)
49
+ def subscription(*args, **kwargs)
50
50
  super.tap do |subscription|
51
51
  subscription.before_trace { ensure_clean_context! }
52
52
  end
@@ -34,7 +34,7 @@ module Datadog
34
34
  Tracing::Metadata::Ext::AppTypes::TYPE_WEB
35
35
  end
36
36
 
37
- def process(span, _event, _id, payload)
37
+ def on_start(span, _event, _id, payload)
38
38
  channel = payload[:broadcasting] # Channel has high cardinality
39
39
  span.service = configuration[:service_name] if configuration[:service_name]
40
40
  span.type = span_type
@@ -33,7 +33,7 @@ module Datadog
33
33
  Tracing::Metadata::Ext::AppTypes::TYPE_WEB
34
34
  end
35
35
 
36
- def process(span, _event, _id, payload)
36
+ def on_start(span, _event, _id, payload)
37
37
  channel_class = payload[:channel_class]
38
38
  action = payload[:action]
39
39
 
@@ -33,7 +33,7 @@ module Datadog
33
33
  Tracing::Metadata::Ext::AppTypes::TYPE_WEB
34
34
  end
35
35
 
36
- def process(span, _event, _id, payload)
36
+ def on_start(span, _event, _id, payload)
37
37
  channel_class = payload[:channel_class]
38
38
 
39
39
  span.service = configuration[:service_name] if configuration[:service_name]
@@ -27,9 +27,11 @@ module Datadog
27
27
  Datadog.configuration.tracing[:action_mailer]
28
28
  end
29
29
 
30
- def process(span, event, _id, payload)
30
+ def on_start(span, event, _id, payload)
31
+ super
32
+
33
+ span.type = span_type
31
34
  span.service = configuration[:service_name] if configuration[:service_name]
32
- span.resource = payload[:mailer]
33
35
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
34
36
 
35
37
  # Set analytics sample rate
@@ -39,10 +41,6 @@ module Datadog
39
41
 
40
42
  # Measure service stats
41
43
  Contrib::Analytics.set_measured(span)
42
-
43
- report_if_exception(span, payload)
44
- rescue StandardError => e
45
- Datadog.logger.debug(e.message)
46
44
  end
47
45
  end
48
46
  end
@@ -30,15 +30,20 @@ module Datadog
30
30
  Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
31
31
  end
32
32
 
33
- def process(span, event, _id, payload)
33
+ def on_start(span, event, _id, payload)
34
34
  super
35
35
 
36
- span.type = span_type
36
+ span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_DELIVER)
37
+ end
38
+
39
+ def on_finish(span, event, _id, payload)
40
+ super
41
+
42
+ span.resource = payload[:mailer] # Mailer is not available at `on_start`
43
+
37
44
  span.set_tag(Ext::TAG_MAILER, payload[:mailer])
38
45
  span.set_tag(Ext::TAG_MSG_ID, payload[:message_id])
39
46
 
40
- span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_DELIVER)
41
-
42
47
  # Since email data can contain PII we disable by default
43
48
  # Some of these fields can be either strings or arrays, so we try to normalize
44
49
  # https://github.com/rails/rails/blob/18707ab17fa492eb25ad2e8f9818a320dc20b823/actionmailer/lib/action_mailer/base.rb#L742-L754
@@ -30,10 +30,11 @@ module Datadog
30
30
  Tracing::Metadata::Ext::HTTP::TYPE_TEMPLATE
31
31
  end
32
32
 
33
- def process(span, event, _id, payload)
33
+ def on_start(span, event, _id, payload)
34
34
  super
35
35
 
36
- span.type = span_type
36
+ span.resource = payload[:mailer] # Mailer is not available at `on_start`
37
+
37
38
  span.set_tag(Ext::TAG_ACTION, payload[:action])
38
39
  span.set_tag(Ext::TAG_MAILER, payload[:mailer])
39
40
 
@@ -27,7 +27,7 @@ module Datadog
27
27
  Ext::SPAN_RENDER_PARTIAL
28
28
  end
29
29
 
30
- def process(span, _event, _id, payload)
30
+ def on_start(span, _event, _id, payload)
31
31
  span.service = configuration[:service_name] if configuration[:service_name]
32
32
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_TEMPLATE
33
33
 
@@ -41,10 +41,6 @@ module Datadog
41
41
 
42
42
  # Measure service stats
43
43
  Contrib::Analytics.set_measured(span)
44
-
45
- record_exception(span, payload)
46
- rescue StandardError => e
47
- Datadog.logger.debug(e.message)
48
44
  end
49
45
  end
50
46
  end
@@ -27,7 +27,7 @@ module Datadog
27
27
  Ext::SPAN_RENDER_TEMPLATE
28
28
  end
29
29
 
30
- def process(span, _event, _id, payload)
30
+ def on_start(span, _event, _id, payload)
31
31
  span.service = configuration[:service_name] if configuration[:service_name]
32
32
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_TEMPLATE
33
33
 
@@ -26,7 +26,7 @@ module Datadog
26
26
  Ext::SPAN_DISCARD
27
27
  end
28
28
 
29
- def process(span, event, _id, payload)
29
+ def on_start(span, event, _id, payload)
30
30
  span.name = span_name
31
31
  span.service = configuration[:service_name] if configuration[:service_name]
32
32
  span.resource = payload[:job].class.name
@@ -26,7 +26,7 @@ module Datadog
26
26
  Ext::SPAN_ENQUEUE
27
27
  end
28
28
 
29
- def process(span, event, _id, payload)
29
+ def on_start(span, event, _id, payload)
30
30
  span.name = span_name
31
31
  span.service = configuration[:service_name] if configuration[:service_name]
32
32
  span.resource = payload[:job].class.name
@@ -26,7 +26,7 @@ module Datadog
26
26
  Ext::SPAN_ENQUEUE
27
27
  end
28
28
 
29
- def process(span, event, _id, payload)
29
+ def on_start(span, event, _id, payload)
30
30
  span.name = span_name
31
31
  span.service = configuration[:service_name] if configuration[:service_name]
32
32
  span.resource = payload[:job].class.name
@@ -26,7 +26,7 @@ module Datadog
26
26
  Ext::SPAN_ENQUEUE_RETRY
27
27
  end
28
28
 
29
- def process(span, event, _id, payload)
29
+ def on_start(span, event, _id, payload)
30
30
  span.name = span_name
31
31
  span.service = configuration[:service_name] if configuration[:service_name]
32
32
  span.resource = payload[:job].class.name
@@ -26,7 +26,7 @@ module Datadog
26
26
  Ext::SPAN_PERFORM
27
27
  end
28
28
 
29
- def process(span, event, _id, payload)
29
+ def on_start(span, event, _id, payload)
30
30
  span.name = span_name
31
31
  span.service = configuration[:service_name] if configuration[:service_name]
32
32
  span.resource = payload[:job].class.name
@@ -26,7 +26,7 @@ module Datadog
26
26
  Ext::SPAN_RETRY_STOPPED
27
27
  end
28
28
 
29
- def process(span, event, _id, payload)
29
+ def on_start(span, event, _id, payload)
30
30
  span.name = span_name
31
31
  span.service = configuration[:service_name] if configuration[:service_name]
32
32
  span.resource = payload[:job].class.name
@@ -30,7 +30,7 @@ module Datadog
30
30
  Ext::SPAN_RENDER
31
31
  end
32
32
 
33
- def process(span, _event, _id, payload)
33
+ def on_start(span, _event, _id, payload)
34
34
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_RENDER)
35
35
 
36
36
  set_common_tags(span, payload)
@@ -32,7 +32,7 @@ module Datadog
32
32
  Ext::SPAN_SERIALIZE
33
33
  end
34
34
 
35
- def process(span, _event, _id, payload)
35
+ def on_start(span, _event, _id, payload)
36
36
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_SERIALIZE)
37
37
 
38
38
  set_common_tags(span, payload)
@@ -31,7 +31,7 @@ module Datadog
31
31
  Ext::SPAN_INSTANTIATION
32
32
  end
33
33
 
34
- def process(span, event, _id, payload)
34
+ def on_start(span, event, _id, payload)
35
35
  span.resource = payload.fetch(:class_name)
36
36
  span.type = Ext::SPAN_TYPE_INSTANTIATION
37
37
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -29,7 +29,7 @@ module Datadog
29
29
  Ext::SPAN_SQL
30
30
  end
31
31
 
32
- def process(span, event, _id, payload)
32
+ def on_start(span, event, _id, payload)
33
33
  config = Utils.connection_config(payload[:connection], payload[:connection_id])
34
34
  settings = Datadog.configuration.tracing[:active_record, config]
35
35
  adapter_name = Contrib::Utils::Database.normalize_vendor(config[:adapter])
@@ -62,6 +62,7 @@ module Datadog
62
62
  cached = payload[:cached] || (payload[:name] == PAYLOAD_CACHE)
63
63
 
64
64
  span.set_tag(Ext::TAG_DB_VENDOR, adapter_name)
65
+ span.set_tag(Contrib::Ext::DB::TAG_INSTANCE, config[:database])
65
66
  span.set_tag(Ext::TAG_DB_NAME, config[:database])
66
67
  span.set_tag(Ext::TAG_DB_CACHED, cached) if cached
67
68
  span.set_tag(Tracing::Metadata::Ext::NET::TAG_TARGET_HOST, config[:host]) if config[:host]
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../notifications/event'
4
+
5
+ module Datadog
6
+ module Tracing
7
+ module Contrib
8
+ module ActiveSupport
9
+ module Cache
10
+ # Defines basic behaviors for an ActiveSupport event.
11
+ module Event
12
+ def self.included(base)
13
+ base.include(ActiveSupport::Notifications::Event)
14
+ base.extend(ClassMethods)
15
+ end
16
+
17
+ # Class methods for ActiveRecord events.
18
+ module ClassMethods
19
+ def span_options
20
+ {}
21
+ end
22
+
23
+ def configuration
24
+ Datadog.configuration.tracing[:active_support]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end