mirror of
https://github.com/open-telemetry/opentelemetry-go.git
synced 2024-12-16 10:19:23 +02:00
942713a02d
This PR removes the non-compliant ChildOf and FollowsFrom interfaces and the Relation type, which were inherited from OpenTracing via the initial prototype. Instead allow adding a span context to the go context as a remote span context and use a simple algorithm for figuring out an actual parent of the new span, which was proposed for the OpenTelemetry specification. Also add a way to ignore current span and remote span context in go context, so we can force the tracer to create a new root span - a span with a new trace ID. That required some moderate changes in the opentracing bridge - first reference with ChildOfRef reference type becomes a local parent, the rest become links. This also fixes links handling in the meantime. The downside of the approach proposed here is that we can only set the remote parent when creating a span through the opentracing API. Co-authored-by: Joshua MacDonald <jmacd@users.noreply.github.com>
102 lines
2.3 KiB
Go
102 lines
2.3 KiB
Go
package trace_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"google.golang.org/grpc/codes"
|
|
|
|
"go.opentelemetry.io/otel/api/core"
|
|
"go.opentelemetry.io/otel/api/trace"
|
|
)
|
|
|
|
func TestSetCurrentSpanOverridesPreviouslySetSpan(t *testing.T) {
|
|
originalSpan := trace.NoopSpan{}
|
|
expectedSpan := mockSpan{}
|
|
|
|
ctx := context.Background()
|
|
|
|
ctx = trace.ContextWithSpan(ctx, originalSpan)
|
|
ctx = trace.ContextWithSpan(ctx, expectedSpan)
|
|
|
|
if span := trace.SpanFromContext(ctx); span != expectedSpan {
|
|
t.Errorf("Want: %v, but have: %v", expectedSpan, span)
|
|
}
|
|
}
|
|
|
|
func TestCurrentSpan(t *testing.T) {
|
|
for _, testcase := range []struct {
|
|
name string
|
|
ctx context.Context
|
|
want trace.Span
|
|
}{
|
|
{
|
|
name: "CurrentSpan() returns a NoopSpan{} from an empty context",
|
|
ctx: context.Background(),
|
|
want: trace.NoopSpan{},
|
|
},
|
|
{
|
|
name: "CurrentSpan() returns current span if set",
|
|
ctx: trace.ContextWithSpan(context.Background(), mockSpan{}),
|
|
want: mockSpan{},
|
|
},
|
|
} {
|
|
t.Run(testcase.name, func(t *testing.T) {
|
|
// proto: CurrentSpan(ctx context.Context) trace.Span
|
|
have := trace.SpanFromContext(testcase.ctx)
|
|
if have != testcase.want {
|
|
t.Errorf("Want: %v, but have: %v", testcase.want, have)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// a duplicate of trace.NoopSpan for testing
|
|
type mockSpan struct{}
|
|
|
|
var _ trace.Span = mockSpan{}
|
|
|
|
// SpanContext returns an invalid span context.
|
|
func (mockSpan) SpanContext() core.SpanContext {
|
|
return core.EmptySpanContext()
|
|
}
|
|
|
|
// IsRecording always returns false for mockSpan.
|
|
func (mockSpan) IsRecording() bool {
|
|
return false
|
|
}
|
|
|
|
// SetStatus does nothing.
|
|
func (mockSpan) SetStatus(status codes.Code) {
|
|
}
|
|
|
|
// SetName does nothing.
|
|
func (mockSpan) SetName(name string) {
|
|
}
|
|
|
|
// SetError does nothing.
|
|
func (mockSpan) SetError(v bool) {
|
|
}
|
|
|
|
// SetAttributes does nothing.
|
|
func (mockSpan) SetAttributes(attributes ...core.KeyValue) {
|
|
}
|
|
|
|
// End does nothing.
|
|
func (mockSpan) End(options ...trace.EndOption) {
|
|
}
|
|
|
|
// Tracer returns noop implementation of Tracer.
|
|
func (mockSpan) Tracer() trace.Tracer {
|
|
return trace.NoopTracer{}
|
|
}
|
|
|
|
// Event does nothing.
|
|
func (mockSpan) AddEvent(ctx context.Context, name string, attrs ...core.KeyValue) {
|
|
}
|
|
|
|
// AddEventWithTimestamp does nothing.
|
|
func (mockSpan) AddEventWithTimestamp(ctx context.Context, timestamp time.Time, name string, attrs ...core.KeyValue) {
|
|
}
|