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_loader/datadog_profiling_loader.c,
ext/datadog_profiling_native_extension/native_extension_helpers.rb

Overview

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

Defined Under Namespace

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

Class Method Summary collapse

Class Method Details

.allocation_countObject

rubocop:disable Lint/NestedMethodDefinition (On purpose!)



57
58
59
60
61
# File 'lib/datadog/profiling.rb', line 57

def self.allocation_count
  # This no-op implementation is used when profiling failed to load.
  # It gets replaced inside #replace_noop_allocation_count.
  nil
end

.enabled?Boolean

Returns:

  • (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

.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.

Returns:

  • (Boolean)

    ‘true` if the profiler has successfully started, otherwise `false`.



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

Returns:

  • (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