Module: Datadog::Profiling

Defined in:
lib/datadog/profiling.rb,
lib/datadog/profiling/ext.rb,
lib/datadog/profiling/flush.rb,
lib/datadog/profiling/exporter.rb,
lib/datadog/profiling/profiler.rb,
lib/datadog/profiling/component.rb,
lib/datadog/profiling/scheduler.rb,
lib/datadog/profiling/tasks/exec.rb,
lib/datadog/profiling/tasks/help.rb,
lib/datadog/profiling/tag_builder.rb,
lib/datadog/profiling/tasks/setup.rb,
lib/datadog/profiling/http_transport.rb,
lib/datadog/profiling/stack_recorder.rb,
lib/datadog/profiling/collectors/info.rb,
lib/datadog/profiling/collectors/stack.rb,
lib/datadog/profiling/native_extension.rb,
lib/datadog/profiling/ext/dir_monkey_patches.rb,
lib/datadog/profiling/collectors/thread_context.rb,
lib/datadog/profiling/collectors/code_provenance.rb,
lib/datadog/profiling/collectors/idle_sampling_helper.rb,
lib/datadog/profiling/collectors/dynamic_sampling_rate.rb,
lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb,
ext/datadog_profiling_native_extension/profiling.c,
ext/datadog_profiling_native_extension/native_extension_helpers.rb

Overview

Datadog Continuous Profiler implementation: https://docs.datadoghq.com/profiler/

Defined Under Namespace

Modules: Collectors, Component, Ext, NativeExtension, NativeExtensionHelpers, TagBuilder, Tasks Classes: Exporter, Flush, HttpTransport, Profiler, Scheduler, StackRecorder

Class Method Summary collapse

Class Method Details

.enabled?Boolean



63
64
65
66
67
# File 'lib/datadog/profiling.rb', line 63

def self.enabled?
  profiler = Datadog.send(:components).profiler
  # Use .send(...) to avoid exposing the attr_reader as an API to the outside
  !!profiler&.send(:scheduler)&.running?
end

.replace_noop_allocation_countObject



80
81
82
83
84
85
86
87
# File 'lib/datadog/profiling.rb', line 80

def self.replace_noop_allocation_count
  class << self
    remove_method :allocation_count
    def allocation_count
      Datadog::Profiling::Collectors::CpuAndWallTimeWorker._native_allocation_count
    end
  end
end

.start_if_enabledBoolean

Starts the profiler, if the profiler is supported by in this runtime environment and if the profiler has been enabled in configuration.



27
28
29
30
31
32
33
34
35
# File 'lib/datadog/profiling.rb', line 27

def self.start_if_enabled
  # If the profiler was not previously touched, getting the profiler instance triggers start as a side-effect
  # otherwise we get nil
  profiler = Datadog.send(:components).profiler
  # ...but we still try to start it BECAUSE if the process forks, the profiler will exist but may
  # not yet have been started in the fork
  profiler&.start
  !!profiler
end

.supported?Boolean



10
11
12
# File 'lib/datadog/profiling.rb', line 10

def self.supported?
  unsupported_reason.nil?
end

.unsupported_reasonObject



14
15
16
17
18
19
# File 'lib/datadog/profiling.rb', line 14

def self.unsupported_reason
  # NOTE: Only the first matching reason is returned, so try to keep a nice order on reasons -- e.g. tell users
  # first that they can't use this on JRuby before telling them that something else failed

  native_library_compilation_skipped? || native_library_failed_to_load?
end

.wait_until_running(timeout_seconds: 5) ⇒ Object



69
70
71
72
73
74
75
76
77
78
# File 'lib/datadog/profiling.rb', line 69

def self.wait_until_running(timeout_seconds: 5)
  profiler = Datadog.send(:components).profiler
  if profiler
    # Use .send(...) to avoid exposing the attr_reader as an API to the outside
    worker = profiler.send(:worker)
    worker.wait_until_running(timeout_seconds: timeout_seconds)
  else
    raise 'Profiler not enabled or available'
  end
end