@@ -33,6 +33,9 @@ def fields
3333
3434 attr_writer :propagators , :error_handler , :id_generator
3535
36+ Components = Struct . new ( :tracer_provider , :propagators , keyword_init : true )
37+ Config = Struct . new ( :propagator , :tracer_provider , keyword_init : true )
38+
3639 def initialize
3740 @instrumentation_names = [ ]
3841 @instrumentation_config_map = { }
@@ -142,12 +145,12 @@ def add_log_record_processor(log_record_processor); end
142145 # - setup tracer_provider, meter_provider, and logger_provider
143146 # - install instrumentation
144147 def configure
148+ configuration = parse ( ENV . fetch ( 'OTEL_CONFIG_FILE' , '' ) )
145149 OpenTelemetry . logger = logger
146150 OpenTelemetry . error_handler = error_handler
147- configure_propagation
148- configure_span_processors
149- tracer_provider . id_generator = @id_generator
150- OpenTelemetry . tracer_provider = tracer_provider
151+ components = create ( configuration )
152+ OpenTelemetry . propagation = Context ::Propagation ::CompositeTextMapPropagator . compose_propagators ( components . propagators . compact )
153+ OpenTelemetry . tracer_provider = components . tracer_provider
151154 metrics_configuration_hook
152155 logs_configuration_hook
153156 install_instrumentation
@@ -160,7 +163,7 @@ def metrics_configuration_hook; end
160163 def logs_configuration_hook ; end
161164
162165 def tracer_provider
163- @tracer_provider ||= Trace ::TracerProvider . new ( resource : @resource )
166+ @tracer_provider ||= Trace ::TracerProviderConfig . new
164167 end
165168
166169 def check_use_mode! ( mode )
@@ -178,8 +181,8 @@ def install_instrumentation
178181 end
179182
180183 def configure_span_processors
181- processors = @span_processors . empty? ? wrapped_exporters_from_env . compact : @span_processors
182- processors . each { | p | tracer_provider . add_span_processor ( p ) }
184+ @span_processors += tracer_provider &. span_processors || [ ]
185+ @span_processors . empty? ? wrapped_exporters_from_env . compact : @span_processors
183186 end
184187
185188 def wrapped_exporters_from_env # rubocop:disable Metrics/CyclomaticComplexity
@@ -206,8 +209,20 @@ def wrapped_exporters_from_env # rubocop:disable Metrics/CyclomaticComplexity
206209 end
207210 end
208211
209- def configure_propagation # rubocop:disable Metrics/CyclomaticComplexity
210- propagators = ENV . fetch ( 'OTEL_PROPAGATORS' , 'tracecontext,baggage' ) . split ( ',' ) . uniq . collect do |propagator |
212+ def configure_propagation ( propagator_config )
213+ if propagator_config
214+ propagator_list = propagator_config . composite_list &.split ( ',' ) || [ ]
215+ Array ( propagator_config . composite &.instance_variables ) . each do |propagator |
216+ propagatorList << propagator . to_s . delete_prefix ( '@' ) . strip
217+ end
218+ else
219+ propagator_list = ENV . fetch ( 'OTEL_PROPAGATORS' , 'tracecontext,baggage' ) . split ( ',' )
220+ end
221+ build_propagators ( propagator_list )
222+ end
223+
224+ def build_propagators ( propagator_list ) # rubocop:disable Metrics/CyclomaticComplexity
225+ propagator_list . uniq . collect do |propagator |
211226 case propagator
212227 when 'tracecontext' then OpenTelemetry ::Trace ::Propagation ::TraceContext . text_map_propagator
213228 when 'baggage' then OpenTelemetry ::Baggage ::Propagation . text_map_propagator
@@ -222,7 +237,6 @@ def configure_propagation # rubocop:disable Metrics/CyclomaticComplexity
222237 NoopTextMapPropagator . new
223238 end
224239 end
225- OpenTelemetry . propagation = Context ::Propagation ::CompositeTextMapPropagator . compose_propagators ( ( @propagators || propagators ) . compact )
226240 end
227241
228242 def fetch_propagator ( name , class_name , gem_suffix = name )
@@ -238,6 +252,24 @@ def fetch_exporter(name, class_name)
238252 OpenTelemetry . logger . warn "The #{ name } exporter cannot be configured - please add opentelemetry-exporter-#{ name } to your Gemfile, spans will not be exported"
239253 nil
240254 end
255+
256+ def parse ( filepath )
257+ Config . new
258+ end
259+
260+ def create ( config )
261+ Components . new . tap do |c |
262+ c . tracer_provider = Trace ::TracerProvider . new (
263+ sampler : tracer_provider &.sampler ,
264+ resource : @resource ,
265+ id_generator : @id_generator || tracer_provider &.id_generator ,
266+ span_limits : tracer_provider &.span_limits ,
267+ span_processors : configure_span_processors ,
268+ tracer_provider_config : config &.tracer_provider
269+ )
270+ c . propagators = @propagators || configure_propagation ( config &.propagator )
271+ end
272+ end
241273 end
242274 end
243275end
0 commit comments