module Datadog::Tracing::Component

def build_tracer(settings, logger:)

def build_tracer(settings, logger:)
  # If a custom tracer has been provided, use it instead.
  # Ignore all other options (they should already be configured.)
  tracer = settings.tracing.instance
  return tracer unless tracer.nil?
  agent_settings = Configuration::AgentSettingsResolver.call(settings, logger: logger)
  # Apply test mode settings if test mode is activated
  if settings.tracing.test_mode.enabled
    trace_flush = build_test_mode_trace_flush(settings)
    sampler = build_test_mode_sampler
    writer = build_test_mode_writer(settings, agent_settings)
  else
    trace_flush = build_trace_flush(settings)
    sampler = build_sampler(settings)
    writer = build_writer(settings, agent_settings)
  end
  # The sampler instance is wrapped in a delegator,
  # so dynamic instrumentation can hot-swap it.
  # This prevents full tracer reinitialization on sampling changes.
  sampler_delegator = SamplerDelegatorComponent.new(sampler)
  subscribe_to_writer_events!(writer, sampler_delegator, settings.tracing.test_mode.enabled)
  Tracing::Tracer.new(
    default_service: settings.service,
    enabled: settings.tracing.enabled,
    trace_flush: trace_flush,
    sampler: sampler_delegator,
    span_sampler: build_span_sampler(settings),
    writer: writer,
    tags: build_tracer_tags(settings),
  )
end