Sha256: c4c9137677d2fd1cb50f1478223d211d68dcf731b12dd2ed66d8fccbd349a197

Contents?: true

Size: 1.44 KB

Versions: 2

Compression:

Stored size: 1.44 KB

Contents

# frozen_string_literal: true

module Datadog
  module Profiling
    # Profiling entry point, which coordinates the worker and scheduler threads
    class Profiler
      include Datadog::Core::Utils::Forking

      private

      attr_reader :worker, :scheduler

      public

      def initialize(worker:, scheduler:)
        @worker = worker
        @scheduler = scheduler
      end

      def start
        after_fork! do
          worker.reset_after_fork
          scheduler.reset_after_fork
        end

        worker.start(on_failure_proc: proc { component_failed(:worker) })
        scheduler.start(on_failure_proc: proc { component_failed(:scheduler) })
      end

      def shutdown!
        Datadog.logger.debug('Shutting down profiler')

        stop_worker
        stop_scheduler
      end

      private

      def stop_worker
        worker.stop
      end

      def stop_scheduler
        scheduler.enabled = false
        scheduler.stop(true)
      end

      def component_failed(failed_component)
        Datadog.logger.warn(
          "Detected issue with profiler (#{failed_component} component), stopping profiling. " \
          'See previous log messages for details.'
        )

        if failed_component == :worker
          stop_scheduler
        elsif failed_component == :scheduler
          stop_worker
        else
          raise ArgumentError, "Unexpected failed_component: #{failed_component.inspect}"
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
datadog-2.0.0.beta2 lib/datadog/profiling/profiler.rb
datadog-2.0.0.beta1 lib/datadog/profiling/profiler.rb