Skip to content

Commit

Permalink
Move current_span to Tracer interface
Browse files Browse the repository at this point in the history
  • Loading branch information
jterapin committed Aug 23, 2024
1 parent bb404a8 commit 1cd2d83
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 71 deletions.
14 changes: 7 additions & 7 deletions gems/aws-sdk-core/lib/aws-sdk-core/telemetry/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,13 @@ def start_span(name, with_parent: nil, attributes: nil, kind: nil)
def in_span(name, attributes: nil, kind: nil)
raise NotImplementedError
end

# Returns the current active span.
#
# @return [Aws::Telemetry::SpanBase]
def current_span
raise NotImplementedError
end
end

# Base for `Span` classes.
Expand Down Expand Up @@ -147,13 +154,6 @@ def current
raise NotImplementedError
end

# Returns the current span from current context.
#
# @return [Aws::Telemetry::SpanBase]
def current_span
raise NotImplementedError
end

# Associates a Context with the caller’s current execution unit.
# Returns a token to be used with the matching call to detach.
#
Expand Down
6 changes: 4 additions & 2 deletions gems/aws-sdk-core/lib/aws-sdk-core/telemetry/no_op.rb
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ def start_span(name, with_parent: nil, attributes: nil, kind: nil)
def in_span(name, attributes: nil, kind: nil)
yield NoOpSpan.new
end

def current_span
NoOpSpan.new
end
end

# No-op implementation for {SpanBase}.
Expand Down Expand Up @@ -58,8 +62,6 @@ def record_exception(exception, attributes: nil); end
class NoOpContextManager < ContextManagerBase
def current; end

def current_span; end

def attach(context); end

def detach(token); end
Expand Down
15 changes: 7 additions & 8 deletions gems/aws-sdk-core/lib/aws-sdk-core/telemetry/otel.rb
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ def initialize

private

# @api private
def otel_loaded?
if @use_otel.nil?
@use_otel =
Expand Down Expand Up @@ -117,6 +116,13 @@ def in_span(name, attributes: nil, kind: nil, &block)
block.call(OTelSpan.new(span))
end
end

# Returns the current active span.
#
# @return [Aws::Telemetry::OTelSpan]
def current_span
OTelSpan.new(OpenTelemetry::Trace.current_span)
end
end

# OpenTelemetry-based {SpanBase}, represents a single operation
Expand Down Expand Up @@ -206,13 +212,6 @@ def current
OpenTelemetry::Context.current
end

# Returns the current span from current context.
#
# @return [Aws::Telemetry::OTelSpan]
def current_span
OTelSpan.new(OpenTelemetry::Trace.current_span)
end

# Associates a Context with the caller’s current execution unit.
# Returns a token to be used with the matching call to detach.
#
Expand Down
4 changes: 2 additions & 2 deletions gems/aws-sdk-core/sig/aws-sdk-core/telemetry/base.rbs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ module Aws
def start_span: (String name, ?untyped with_parent, ?Hash[String, untyped] attributes, ?SpanKind kind) -> SpanBase

def in_span: (String name, ?Hash[String, untyped] attributes, ?SpanKind kind) -> SpanBase

def current_span: () -> SpanBase
end

class SpanBase
Expand All @@ -35,8 +37,6 @@ module Aws
class ContextManagerBase
def current: () -> untyped

def current_span: () -> SpanBase

def attach: (untyped context) -> untyped

def detach: (untyped token) -> bool
Expand Down
8 changes: 4 additions & 4 deletions gems/aws-sdk-core/spec/aws/telemetry/base_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,10 @@ module Telemetry
expect do
subject.in_span('foo')
end.to raise_error(NotImplementedError)

expect do
subject.current_span
end.to raise_error(NotImplementedError)
end
end

Expand Down Expand Up @@ -58,10 +62,6 @@ module Telemetry
subject.current
end.to raise_error(NotImplementedError)

expect do
subject.current_span
end.to raise_error(NotImplementedError)

expect do
subject.attach('foo')
end.to raise_error(NotImplementedError)
Expand Down
7 changes: 7 additions & 0 deletions gems/aws-sdk-core/spec/aws/telemetry/no_op_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,13 @@ module Telemetry
end
end
end

describe '#current_span' do
it 'returns an instance of no-op span' do
expect(subject.current_span)
.to be_an_instance_of(Aws::Telemetry::NoOpSpan)
end
end
end

describe NoOpSpan do
Expand Down
33 changes: 15 additions & 18 deletions gems/aws-sdk-core/spec/aws/telemetry/otel_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,14 @@
module Aws
module Telemetry
describe OTelProvider do
before do
allow(Aws::Telemetry)
.to receive(:otel_loaded?)
.and_return(true)
end

let(:otel_provider) { OTelProvider.new }
let(:context_manager) { otel_provider.context_manager }
let(:tracer_provider) { otel_provider.tracer_provider }
let(:tracer) { tracer_provider.tracer('some_tracer') }

describe '#initialize' do
it 'raises ArgumentError when otel dependency fails to load' do
allow_any_instance_of(Aws::Telemetry::OTelProvider)
.to receive(:otel_loaded?).and_return(false)
.to receive(:require).with('opentelemetry-sdk').and_raise(LoadError)
expect { otel_provider }.to raise_error(ArgumentError)
end

Expand All @@ -43,14 +36,6 @@ module Telemetry
end
end

describe '#current_span' do
it 'returns the current span' do
wrapper_span = tracer.start_span('foo')
expect(context_manager.current_span.instance_variable_get(:@span))
.to eq(wrapper_span.instance_variable_get(:@span))
end
end

describe '#attach' do
it 'sets the current context' do
context_manager.attach(new_context)
Expand All @@ -69,13 +54,17 @@ module Telemetry
end

describe 'OTelTracerProvider' do
let(:tracer) { tracer_provider.tracer('some_tracer') }

it 'returns a tracer instance' do
expect(tracer).to be_a(Aws::Telemetry::OTelTracer)
end

context 'tracer' do
let(:otel_export) { OpenTelemetry::SDK::Trace::Export }
let(:otel_exporter) { otel_export::InMemorySpanExporter.new }
let(:finished_span) { otel_exporter.finished_spans[0] }

before do
processor = otel_export::SimpleSpanProcessor.new(otel_exporter)
OpenTelemetry::SDK.configure do |c|
Expand All @@ -84,8 +73,6 @@ module Telemetry
end
after { SpecHelper.reset_opentelemetry_sdk }

let(:finished_span) { otel_exporter.finished_spans[0] }

describe '#start_span' do
it 'returns a valid span with supplied parameters' do
span = tracer.start_span('some_span')
Expand Down Expand Up @@ -124,6 +111,16 @@ module Telemetry
expect(finished_span.events[0].attributes['burnt']).to eq('pie')
end
end

describe '#current_span' do
it 'returns the current span' do
tracer.in_span('foo') do |span|
span['blueberry'] = 'pie'
expect(tracer.current_span.instance_variable_get(:@span))
.to eq(span.instance_variable_get(:@span))
end
end
end
end
end
end
Expand Down
30 changes: 0 additions & 30 deletions gems/aws-sdk-core/spec/aws/telemetry_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,36 +5,6 @@

module Aws
describe Telemetry do
# describe '.otel_loaded?' do
# before { Aws::Telemetry.instance_variable_set(:@use_otel, nil) }
#
# it 'is true when opentelemetry-sdk is available' do
# expect(Aws::Telemetry).to receive(:require)
# .with('opentelemetry-sdk')
# .and_return(true)
# expect(Aws::Telemetry.otel_loaded?)
# .to be true
# end
#
# it 'returns false when opentelemetry-sdk is not available' do
# expect(Aws::Telemetry).to receive(:require)
# .with('opentelemetry-sdk')
# .and_raise(LoadError)
# expect(Aws::Telemetry.otel_loaded?)
# .to be false
# end
#
# it 'memoizes its status' do
# expect(Aws::Telemetry).to receive(:require)
# .once
# .with('opentelemetry-sdk')
# .and_raise(LoadError)
# Aws::Telemetry.otel_loaded?
# # second call should not call require again
# Aws::Telemetry.otel_loaded?
# end
# end

describe '.module_to_tracer_name' do
it 'correctly converts module to tracer name' do
expect(Aws::Telemetry.module_to_tracer_name('Aws::Telemetry'))
Expand Down

0 comments on commit 1cd2d83

Please sign in to comment.