Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added methods for SpanID and TraceID on bridgeSpanContext #3966

Merged
merged 14 commits into from
Apr 25, 2023
Merged
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm

- The `go.opentelemetry.io/otel/metric/embedded` package. (#3916)
- The `Version` function to `go.opentelemetry.io/otel/sdk` to return the SDK version. (#3949)
- Methods `bridgeSpanContext.TraceID` and `bridgeSpanContext.SpanID` to `go.opentelemetry.io/otel/bridget/opentracing` to expose traceID and spanID for a span. (#3966)

### Changed

Expand All @@ -21,6 +20,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
This adds an implementation requirement to set the interface default behavior for unimplemented methods. (#3916)
- Move No-Op implementation from `go.opentelemetry.io/otel/metric` into its own package `go.opentelemetry.io/otel/metric/noop`. (#3941)
- `metric.NewNoopMeterProvider` is replaced with `noop.NewMeterProvider`
- Promoted all the methods from `otel.SpanContext` to `bridgeSpanContext` by embedding `otel.SpanContext` in `bridgeSpanContext`. (#3966)
Kaushal28 marked this conversation as resolved.
Show resolved Hide resolved

### Fixed

Expand Down
48 changes: 28 additions & 20 deletions bridge/opentracing/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,32 +58,40 @@ if s, ok := sc.(samplable); ok && s.IsSampled() {
}
```

### `SpanContext.TraceID`

Return the underlying OpenTelemetry `Span.TraceID` value by converting a `bridgeSpanContext`.
Any `SpanContext` method can be accessed as following:
Kaushal28 marked this conversation as resolved.
Show resolved Hide resolved
Kaushal28 marked this conversation as resolved.
Show resolved Hide resolved

```go
type traceId interface {
TraceID() bool
type spanContextProvider interface {
TraceID() trace.TraceID
SpanID() trace.SpanID
TraceFlags() trace.TraceFlags
... // any other available method can be added here to access it
}

var sc opentracing.SpanContext = ...
if s, ok := sc.(traceId); ok {
if s, ok := sc.(spanContextProvider); ok {
// Use TraceID by s.TraceID()
}
```

### `SpanContext.SpanID`

Return the underlying OpenTelemetry `Span.SpanID` value by converting a `bridgeSpanContext`.

```go
type spanId interface {
SpanID() bool
}

var sc opentracing.SpanContext = ...
if s, ok := sc.(spanId); ok {
// Use SpanID by s.SpanID()
// Use TraceFlags by s.TraceFlags()
...
}
```

Here is the list of available methods on `SpanContext` that can be accessed as above:

- `IsValid() bool`
- `IsRemote() bool`
- `WithRemote(remote bool) SpanContext`
- `TraceID() TraceID`
- `HasTraceID() bool`
- `WithTraceID(traceID TraceID) SpanContext`
- `SpanID() SpanID`
- `HasSpanID() bool`
- `WithSpanID(spanID SpanID) SpanContext`
- `TraceFlags() TraceFlags`
- `IsSampled() bool`
- `WithTraceFlags(flags TraceFlags) SpanContext`
- `TraceState() TraceState`
- `WithTraceState(state TraceState) SpanContext`
- `Equal(other SpanContext) bool`
- `MarshalJSON() ([]byte, error)`
Kaushal28 marked this conversation as resolved.
Show resolved Hide resolved
34 changes: 12 additions & 22 deletions bridge/opentracing/bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,16 @@ var (
)

type bridgeSpanContext struct {
bag baggage.Baggage
otelSpanContext trace.SpanContext
bag baggage.Baggage
trace.SpanContext
}

var _ ot.SpanContext = &bridgeSpanContext{}

func newBridgeSpanContext(otelSpanContext trace.SpanContext, parentOtSpanContext ot.SpanContext) *bridgeSpanContext {
bCtx := &bridgeSpanContext{
bag: baggage.Baggage{},
otelSpanContext: otelSpanContext,
bag: baggage.Baggage{},
SpanContext: otelSpanContext,
}
if parentOtSpanContext != nil {
parentOtSpanContext.ForeachBaggageItem(func(key, value string) bool {
Expand All @@ -73,17 +73,7 @@ func (c *bridgeSpanContext) ForeachBaggageItem(handler func(k, v string) bool) {
}

func (c *bridgeSpanContext) IsSampled() bool {
return c.otelSpanContext.IsSampled()
}

// TraceID returns TraceID of underlying span
func (c *bridgeSpanContext) TraceID() trace.TraceID {
return c.otelSpanContext.TraceID()
}

// SpanID returns SpanID of underlying span
func (c *bridgeSpanContext) SpanID() trace.SpanID {
return c.otelSpanContext.SpanID()
return c.SpanContext.IsSampled()
Kaushal28 marked this conversation as resolved.
Show resolved Hide resolved
}

func (c *bridgeSpanContext) setBaggageItem(restrictedKey, value string) {
Expand Down Expand Up @@ -439,7 +429,7 @@ func (t *BridgeTracer) StartSpan(operationName string, opts ...ot.StartSpanOptio
attributes, kind, hadTrueErrorTag := otTagsToOTelAttributesKindAndError(sso.Tags)
checkCtx := migration.WithDeferredSetup(context.Background())
if parentBridgeSC != nil {
checkCtx = trace.ContextWithRemoteSpanContext(checkCtx, parentBridgeSC.otelSpanContext)
checkCtx = trace.ContextWithRemoteSpanContext(checkCtx, parentBridgeSC.SpanContext)
}
checkCtx2, otelSpan := t.setTracer.tracer().Start(
checkCtx,
Expand Down Expand Up @@ -620,7 +610,7 @@ func otSpanReferencesToParentAndLinks(references []ot.SpanReference) (*bridgeSpa

func otSpanReferenceToOTelLink(bridgeSC *bridgeSpanContext, refType ot.SpanReferenceType) trace.Link {
return trace.Link{
SpanContext: bridgeSC.otelSpanContext,
SpanContext: bridgeSC.SpanContext,
Attributes: otSpanReferenceTypeToOTelLinkAttributes(refType),
}
}
Expand Down Expand Up @@ -665,7 +655,7 @@ func (t *BridgeTracer) Inject(sm ot.SpanContext, format interface{}, carrier int
if !ok {
return ot.ErrInvalidSpanContext
}
if !bridgeSC.otelSpanContext.IsValid() {
if !bridgeSC.IsValid() {
return ot.ErrInvalidSpanContext
}

Expand Down Expand Up @@ -697,7 +687,7 @@ func (t *BridgeTracer) Inject(sm ot.SpanContext, format interface{}, carrier int

fs := fakeSpan{
Span: noopSpan,
sc: bridgeSC.otelSpanContext,
sc: bridgeSC.SpanContext,
}
ctx := trace.ContextWithSpan(context.Background(), fs)
ctx = baggage.ContextWithBaggage(ctx, bridgeSC.bag)
Expand Down Expand Up @@ -739,10 +729,10 @@ func (t *BridgeTracer) Extract(format interface{}, carrier interface{}) (ot.Span
ctx := t.getPropagator().Extract(context.Background(), textCarrier)
bag := baggage.FromContext(ctx)
bridgeSC := &bridgeSpanContext{
bag: bag,
otelSpanContext: trace.SpanContextFromContext(ctx),
bag: bag,
SpanContext: trace.SpanContextFromContext(ctx),
}
if !bridgeSC.otelSpanContext.IsValid() {
if !bridgeSC.IsValid() {
return nil, ot.ErrSpanContextNotFound
}
return bridgeSC, nil
Expand Down
35 changes: 19 additions & 16 deletions bridge/opentracing/bridge_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -261,14 +261,6 @@ type samplable interface {
IsSampled() bool
}

type traceId interface {
TraceID() trace.TraceID
}

type spanId interface {
SpanID() trace.SpanID
}

func TestBridgeTracer_ExtractAndInject(t *testing.T) {
bridge := NewBridgeTracer()
bridge.SetTextMapPropagator(new(testTextMapPropagator))
Expand Down Expand Up @@ -374,12 +366,12 @@ func TestBridgeTracer_ExtractAndInject(t *testing.T) {
bsc, ok := spanContext.(*bridgeSpanContext)
assert.True(t, ok)
require.NotNil(t, bsc)
require.NotNil(t, bsc.otelSpanContext)
require.NotNil(t, bsc.otelSpanContext.SpanID())
require.NotNil(t, bsc.otelSpanContext.TraceID())
require.NotNil(t, bsc.SpanContext)
require.NotNil(t, bsc.SpanID())
require.NotNil(t, bsc.TraceID())

assert.Equal(t, spanID.String(), bsc.otelSpanContext.SpanID().String())
assert.Equal(t, traceID.String(), bsc.otelSpanContext.TraceID().String())
assert.Equal(t, spanID.String(), bsc.SpanID().String())
assert.Equal(t, traceID.String(), bsc.TraceID().String())
}
}
})
Expand Down Expand Up @@ -555,12 +547,19 @@ func TestBridge_SpanContext_IsSampled(t *testing.T) {
}
}

func TestBridge_SpanContext_TraceID_SpanID(t *testing.T) {
func TestBridge_SpanContext_Promoted_Methods(t *testing.T) {
Kaushal28 marked this conversation as resolved.
Show resolved Hide resolved
bridge := NewBridgeTracer()
bridge.SetTextMapPropagator(new(testTextMapPropagator))

tmc := newTextCarrier()

type spanContextProvider interface {
HasTraceID() bool
TraceID() trace.TraceID
HasSpanID() bool
SpanID() trace.SpanID
}

testCases := []struct {
name string
traceID trace.TraceID
Expand All @@ -584,8 +583,12 @@ func TestBridge_SpanContext_TraceID_SpanID(t *testing.T) {
spanContext, err := bridge.Extract(ot.TextMap, tmc)
assert.NoError(t, err)

assert.Equal(t, spanID.String(), spanContext.(spanId).SpanID().String())
assert.Equal(t, traceID.String(), spanContext.(traceId).TraceID().String())
assert.NotPanics(t, func() {
assert.Equal(t, spanID.String(), spanContext.(spanContextProvider).SpanID().String())
assert.Equal(t, traceID.String(), spanContext.(spanContextProvider).TraceID().String())
assert.True(t, spanContext.(spanContextProvider).HasSpanID())
assert.True(t, spanContext.(spanContextProvider).HasTraceID())
})
})
}
}