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
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
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 |
.detect ⇒ Object
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
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
44 45 46 |
# File 'lib/lescopr/modes/detector.rb', line 44 def self.serverless? SERVERLESS_SIGNALS.any? { |s| ENV.key?(s) } end |