OTel-ruby-sdk 'Custom-Sampler isn’t being applied

42 Views Asked by At

I'm currently in the process of setting up the Otel SDK for our Ruby application. As part of this instrumentation, I've decided to use a custom sampler called TraceIdRatioBasedSampler. However, I'm encountering an issue where it appears that the sampler isn’t being applied correctly.

Has anyone else faced a similar issue or can suggest potential reasons why it's not working as expected? Any help or insights would be greatly appreciated!

Below is the sample code:

require 'opentelemetry/sdk'
require 'opentelemetry/exporter/otlp'
require 'opentelemetry/instrumentation/all'

class TraceIdRatioBasedSampler
  def initialize(trace_id_ratio)
    @trace_id_ratio = trace_id_ratio
  end

  def should_sample?(trace_id:, parent_context:, links:, name:, kind:, attributes:)
    tracestate = OpenTelemetry::Trace.current_span(parent_context).context.tracestate
    decision = rand <= @trace_id_ratio ?         OpenTelemetry::SDK::Trace::Samplers::Decision::RECORD_AND_SAMPLE : 
                                             OpenTelemetry::SDK::Trace::Samplers::Decision::DROP
    OpenTelemetry::SDK::Trace::Samplers::Result.new(decision: decision, attributes: {}, tracestate: tracestate)
  end

  def description
    'TraceIdRatioBasedSampler'
  end
end

trace_id_ratio = 0.5

sampler = TraceIdRatioBasedSampler.new(trace_id_ratio)
tracer_provider = OpenTelemetry::SDK::Trace::TracerProvider.new(sampler: sampler)
OpenTelemetry.tracer_provider = tracer_provider


OpenTelemetry::SDK.configure do |c|
   c.use 'OpenTelemetry::Instrumentation::Rails'
   c.resource = OpenTelemetry::SDK::Resources::Resource.create(
   'service.name' => 'RUBY-OTEL-SERVICE',
   'service.version' => '1.1'
   )

  c.add_span_processor(
    OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(
      OpenTelemetry::SDK::Trace::Export::ConsoleSpanExporter.new
    )
  )

end

Tracer = OpenTelemetry.tracer_provider.tracer('sample-app', '0.1.0')
p OpenTelemetry.tracer_provider
span = Tracer.start_span('health-check-span')
begin
  span.set_attribute('health', 'Good')
ensure
  span.finish
end

We are printing trace provider here but its not showing my custom sampler i.e TraceIdRatioBasedSampler in it.

Output:

@sampler=#<OpenTelemetry:
:Trace::Samplers::ParentBased:0x000000010dc53718 @root=#<OpenTelemetry:
:Trace::Samplers::ConstantSampler:0x0000000109a32640 @decision=:__record_and_sample__, @description="AlwaysOnSampler">, @remote_parent_sampled=#<OpenTelemetry:
:Trace::Samplers::ConstantSampler:0x0000000109a32640 @decision=:__record_and_sample__, @description="AlwaysOnSampler">, @remote_parent_not_sampled=#<OpenTelemetry:
:Trace::Samplers::ConstantSampler:0x0000000109a32550 @decision=:__drop__, @description="AlwaysOffSampler">, @local_parent_sampled=#<OpenTelemetry:
:Trace::Samplers::ConstantSampler:0x0000000109a32640 @decision=:__record_and_sample__, @description="AlwaysOnSampler">, @local_parent_not_sampled=#<OpenTelemetry:
:Trace::Samplers::ConstantSampler:0x0000000109a32550 @decision=:__drop__, @description="AlwaysOffSampler">>,
0

There are 0 best solutions below