Module: Foam::Otel::Classifier

Defined in:
lib/foam/otel/classifier.rb

Constant Summary collapse

SIGNALS =
%i[traces metrics logs].freeze
UNCLASSIFIABLE =

Sentinel owner for a slot whose FREE predicate is unavailable (the Internal proxy constant disappeared — see Verdict#unclassifiable?).

:unclassifiable_otel_api_shape

Class Method Summary collapse

Class Method Details

.classifyObject



48
49
50
# File 'lib/foam/otel/classifier.rb', line 48

def classify
  SIGNALS.to_h { |signal| [signal, classify_signal(signal)] }
end

.classify_signal(signal) ⇒ Object

One slot, read NOW. init() calls this IMMEDIATELY before each signal's setter — never as an up-front classify-all pass — so the unavoidable pre-read→set gap (Ruby has no atomic set-once attempt; GOTCHAS F8) stays as narrow as the platform allows.



56
57
58
59
60
61
62
63
64
65
# File 'lib/foam/otel/classifier.rb', line 56

def classify_signal(signal)
  case signal
  when :traces
    verdict(OpenTelemetry.tracer_provider, defined?(OpenTelemetry::Internal::ProxyTracerProvider) && OpenTelemetry::Internal::ProxyTracerProvider)
  when :metrics
    verdict(OpenTelemetry.meter_provider, defined?(OpenTelemetry::Internal::ProxyMeterProvider) && OpenTelemetry::Internal::ProxyMeterProvider)
  when :logs
    verdict(OpenTelemetry.logger_provider, defined?(OpenTelemetry::Internal::ProxyLoggerProvider) && OpenTelemetry::Internal::ProxyLoggerProvider)
  end
end

.owner_name(provider) ⇒ Object

A registered provider does not announce its vendor; the class/package is the honest best-effort, "an unknown OTel SDK" the fallback (rule 18 B).



81
82
83
84
85
86
# File 'lib/foam/otel/classifier.rb', line 81

def owner_name(provider)
  name = provider.class.name
  name && !name.empty? ? name : "an unknown OTel SDK"
rescue StandardError
  "an unknown OTel SDK"
end

.verdict(provider, proxy_class) ⇒ Object



67
68
69
70
71
72
73
74
75
76
# File 'lib/foam/otel/classifier.rb', line 67

def verdict(provider, proxy_class)
  # No proxy constant to test against: fail safe (never register into a
  # slot foam cannot prove free) but report the DISTINCT unclassifiable
  # state — a degraded verdict must never name the renamed proxy class
  # as a "foreign owner" (rule 42 warned no-op, GOTCHAS G14).
  return Verdict.new(false, UNCLASSIFIABLE) unless proxy_class

  free = provider.instance_of?(proxy_class)
  Verdict.new(free, free ? nil : owner_name(provider))
end