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">>,