diff --git a/CHANGELOG.md b/CHANGELOG.md index 7277742e8d5..eb8754dc587 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,6 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - `DeploymentEnvironmentKey` added to `go.opentelemetry.io/otel/semconv` package. (#1323) - Add an opencensus to opentelemetry tracing bridge. (#1305) - Add a parent context argument to `SpanProcessor.OnStart` to follow the specification. (#1333) -- Add an opencensus binary propagation implementation. (#1334) - Add missing tests for `sdk/trace/attributes_map.go`. (#1337) ### Changed diff --git a/bridge/opencensus/binary/binary.go b/bridge/opencensus/binary/binary.go deleted file mode 100644 index cb1ed95bf39..00000000000 --- a/bridge/opencensus/binary/binary.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright The OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package binary // import "go.opentelemetry.io/otel/bridge/opencensus/binary" - -import ( - "context" - - ocpropagation "go.opencensus.io/trace/propagation" - - "go.opentelemetry.io/otel/bridge/opencensus/utils" - "go.opentelemetry.io/otel/propagation" - "go.opentelemetry.io/otel/trace" -) - -type key uint - -const binaryKey key = 0 - -// binaryHeader is the same as traceContextKey is in opencensus: -// https://github.com/census-instrumentation/opencensus-go/blob/3fb168f674736c026e623310bfccb0691e6dec8a/plugin/ocgrpc/trace_common.go#L30 -const binaryHeader = "grpc-trace-bin" - -// Binary is an OpenTelemetry implementation of the OpenCensus grpc binary format. -// Binary propagation was temporarily removed from opentelemetry. See -// https://github.com/open-telemetry/opentelemetry-specification/issues/437 -type Binary struct{} - -var _ propagation.TextMapPropagator = Binary{} - -// Inject injects context into the TextMapCarrier -func (b Binary) Inject(ctx context.Context, carrier propagation.TextMapCarrier) { - binaryContext := ctx.Value(binaryKey) - if state, ok := binaryContext.(string); binaryContext != nil && ok { - carrier.Set(binaryHeader, state) - } - - sc := trace.SpanContextFromContext(ctx) - if !sc.IsValid() { - return - } - h := ocpropagation.Binary(utils.OTelSpanContextToOC(sc)) - carrier.Set(binaryHeader, string(h)) -} - -// Extract extracts the SpanContext from the TextMapCarrier -func (b Binary) Extract(ctx context.Context, carrier propagation.TextMapCarrier) context.Context { - state := carrier.Get(binaryHeader) - if state != "" { - ctx = context.WithValue(ctx, binaryKey, state) - } - - sc := b.extract(carrier) - if !sc.IsValid() { - return ctx - } - return trace.ContextWithRemoteSpanContext(ctx, sc) -} - -func (b Binary) extract(carrier propagation.TextMapCarrier) trace.SpanContext { - h := carrier.Get(binaryHeader) - if h == "" { - return trace.SpanContext{} - } - ocContext, ok := ocpropagation.FromBinary([]byte(h)) - if !ok { - return trace.SpanContext{} - } - return utils.OCSpanContextToOTel(ocContext) -} - -// Fields returns the fields that this propagator modifies. -func (b Binary) Fields() []string { - return []string{binaryHeader} -} diff --git a/bridge/opencensus/binary/binary_test.go b/bridge/opencensus/binary/binary_test.go deleted file mode 100644 index 1ead6e1c637..00000000000 --- a/bridge/opencensus/binary/binary_test.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright The OpenTelemetry Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package binary - -import ( - "context" - "fmt" - "net/http" - "testing" - - "go.opentelemetry.io/otel/oteltest" - "go.opentelemetry.io/otel/trace" -) - -var ( - traceID = trace.TraceID([16]byte{14, 54, 12}) - spanID = trace.SpanID([8]byte{2, 8, 14, 20}) - childSpanID = trace.SpanID([8]byte{0, 0, 0, 0, 0, 0, 0, 2}) - headerFmt = "\x00\x00\x0e6\f\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00%s\x02%s" -) - -func TestFields(t *testing.T) { - b := Binary{} - fields := b.Fields() - if len(fields) != 1 { - t.Fatalf("Got %d fields, expected 1", len(fields)) - } - if fields[0] != "grpc-trace-bin" { - t.Errorf("Got fields[0] == %s, expected grpc-trace-bin", fields[0]) - } -} - -func TestInject(t *testing.T) { - mockTracer := oteltest.DefaultTracer() - prop := Binary{} - for _, tt := range []struct { - desc string - sc trace.SpanContext - wantHeader string - }{ - { - desc: "empty", - sc: trace.SpanContext{}, - wantHeader: "", - }, - { - desc: "valid spancontext, sampled", - sc: trace.SpanContext{ - TraceID: traceID, - SpanID: spanID, - TraceFlags: trace.FlagsSampled, - }, - wantHeader: fmt.Sprintf(headerFmt, "\x02", "\x01"), - }, - { - desc: "valid spancontext, not sampled", - sc: trace.SpanContext{ - TraceID: traceID, - SpanID: spanID, - }, - wantHeader: fmt.Sprintf(headerFmt, "\x03", "\x00"), - }, - { - desc: "valid spancontext, with unsupported bit set in traceflags", - sc: trace.SpanContext{ - TraceID: traceID, - SpanID: spanID, - TraceFlags: 0xff, - }, - wantHeader: fmt.Sprintf(headerFmt, "\x04", "\x01"), - }, - { - desc: "invalid spancontext", - sc: trace.SpanContext{}, - wantHeader: "", - }, - } { - t.Run(tt.desc, func(t *testing.T) { - req, _ := http.NewRequest("GET", "http://example.com", nil) - ctx := context.Background() - if tt.sc.IsValid() { - ctx = trace.ContextWithRemoteSpanContext(ctx, tt.sc) - ctx, _ = mockTracer.Start(ctx, "inject") - } - prop.Inject(ctx, req.Header) - - gotHeader := req.Header.Get("grpc-trace-bin") - if gotHeader != tt.wantHeader { - t.Errorf("Got header = %q, want %q", gotHeader, tt.wantHeader) - } - }) - } -} -func TestExtract(t *testing.T) { - prop := Binary{} - for _, tt := range []struct { - desc string - header string - wantSc trace.SpanContext - }{ - { - desc: "empty", - header: "", - wantSc: trace.SpanContext{}, - }, - { - desc: "header not binary", - header: "5435j345io34t5904w3jt894j3t854w89tp95jgt9", - wantSc: trace.SpanContext{}, - }, - { - desc: "valid binary header", - header: fmt.Sprintf(headerFmt, "\x02", "\x00"), - wantSc: trace.SpanContext{ - TraceID: traceID, - SpanID: childSpanID, - }, - }, - { - desc: "valid binary and sampled", - header: fmt.Sprintf(headerFmt, "\x02", "\x01"), - wantSc: trace.SpanContext{ - TraceID: traceID, - SpanID: childSpanID, - TraceFlags: trace.FlagsSampled, - }, - }, - } { - t.Run(tt.desc, func(t *testing.T) { - req, _ := http.NewRequest("GET", "http://example.com", nil) - req.Header.Set("grpc-trace-bin", tt.header) - - ctx := context.Background() - ctx = prop.Extract(ctx, req.Header) - gotSc := trace.RemoteSpanContextFromContext(ctx) - if gotSc != tt.wantSc { - t.Errorf("Got SpanContext: %+v, wanted %+v", gotSc, tt.wantSc) - } - }) - } -}