Module: Lescopr::Modes::Detector

Defined in:
lib/lescopr/modes/detector.rb

Overview

Auto-detect the optimal transport mode.

Priority:

1. LESCOPR_MODE env var (daemon | embedded | direct)
2. Serverless / short-lived signals → direct
3. Multi-worker forked process      → embedded
4. Container (Docker / K8s)         → embedded
5. Daemon local active (checked by caller) → daemon
6. Fallback                         → embedded

Returns:

  • ('daemon', 'embedded', 'direct')

Constant Summary collapse

SERVERLESS_SIGNALS =
%w[
  AWS_LAMBDA_FUNCTION_NAME
  AWS_LAMBDA_RUNTIME_API
  LAMBDA_TASK_ROOT
  VERCEL
  VERCEL_ENV
  NETLIFY
  NETLIFY_DEV
  K_SERVICE
  FUNCTION_NAME
  FUNCTIONS_WORKER_RUNTIME
  AZURE_FUNCTIONS_ENVIRONMENT
].freeze

Class Method Summary collapse

Class Method Details

.container?Boolean

Returns:

  • (Boolean)


56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/lescopr/modes/detector.rb', line 56

def self.container?
  return true if File.exist?("/.dockerenv")
  return true if ENV["KUBERNETES_SERVICE_HOST"]

  begin
    content = File.read("/proc/1/cgroup")
    return true if content.include?("docker") || content.include?("kubepods")
  rescue Errno::ENOENT, Errno::EACCES
    # Not Linux or no access — not a container
  end

  false
end

.detectObject



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/lescopr/modes/detector.rb', line 32

def self.detect
  forced = ENV.fetch("LESCOPR_MODE", "").downcase
  return forced if %w[daemon embedded direct].include?(forced)

  return "direct"   if serverless?
  return "embedded" if multiworker_child?
  return "embedded" if container?

  # Caller checks whether the daemon is actually running
  "daemon"
end

.multiworker_child?Boolean

Returns:

  • (Boolean)


48
49
50
51
52
53
54
# File 'lib/lescopr/modes/detector.rb', line 48

def self.multiworker_child?
  # Unicorn / Puma forked workers expose the master PID
  return true if ENV["UNICORN_FD"] || ($0 && $0.include?("unicorn"))
  return true if ENV["PUMA_WORKER"] || (defined?(Puma) && Puma.respond_to?(:cli_config))
  return true if ENV["SIDEKIQ_WORKERS"] || (defined?(Sidekiq) && Sidekiq.server?)
  false
end

.serverless?Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/lescopr/modes/detector.rb', line 44

def self.serverless?
  SERVERLESS_SIGNALS.any? { |s| ENV.key?(s) }
end