diff --git a/api/distributedcontext/map.go b/api/context/baggage/map.go similarity index 95% rename from api/distributedcontext/map.go rename to api/context/baggage/map.go index 8dff15689ed..ab981f2dbe0 100644 --- a/api/distributedcontext/map.go +++ b/api/context/baggage/map.go @@ -12,12 +12,14 @@ // See the License for the specific language governing permissions and // limitations under the License. -package distributedcontext +package baggage import ( "go.opentelemetry.io/otel/api/core" ) +// TODO Comments needed! This was formerly known as distributedcontext.Map + type entry struct { value core.Value } diff --git a/api/distributedcontext/map_test.go b/api/context/baggage/map_test.go similarity index 99% rename from api/distributedcontext/map_test.go rename to api/context/baggage/map_test.go index 15aed53f158..4fe1e5b2645 100644 --- a/api/distributedcontext/map_test.go +++ b/api/context/baggage/map_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package distributedcontext +package baggage import ( "fmt" diff --git a/api/context/baggage/propagation/propagation.go b/api/context/baggage/propagation/propagation.go new file mode 100644 index 00000000000..713eae61776 --- /dev/null +++ b/api/context/baggage/propagation/propagation.go @@ -0,0 +1,117 @@ +package propagation + +import ( + "context" + "net/url" + "strings" + + "go.opentelemetry.io/otel/api/context/baggage" + "go.opentelemetry.io/otel/api/context/propagation" + "go.opentelemetry.io/otel/api/core" + "go.opentelemetry.io/otel/api/key" +) + +type correlationsType struct{} + +var ( + // CorrelationContextHeader is specified by W3C. + CorrelationContextHeader = "Correlation-Context" + + correlationsKey = &correlationsType{} +) + +// CorrelationContext propagates Key:Values in W3C TraceContext format. +type CorrelationContext struct{} + +var _ propagation.HTTPPropagator = CorrelationContext{} + +// WithMap enters a baggage.Map into a new Context. +func WithMap(ctx context.Context, m baggage.Map) context.Context { + return context.WithValue(ctx, correlationsKey, m) +} + +// WithMap enters a key:value set into a new Context. +func NewContext(ctx context.Context, keyvalues ...core.KeyValue) context.Context { + return WithMap(ctx, FromContext(ctx).Apply(baggage.MapUpdate{ + MultiKV: keyvalues, + })) +} + +// FromContext gets the current baggage.Map from a Context. +func FromContext(ctx context.Context) baggage.Map { + if m, ok := ctx.Value(correlationsKey).(baggage.Map); ok { + return m + } + return baggage.NewEmptyMap() +} + +// Inject implements HTTPInjector. +func (CorrelationContext) Inject(ctx context.Context, supplier propagation.HTTPSupplier) { + correlationCtx := FromContext(ctx) + firstIter := true + var headerValueBuilder strings.Builder + correlationCtx.Foreach(func(kv core.KeyValue) bool { + if !firstIter { + headerValueBuilder.WriteRune(',') + } + firstIter = false + headerValueBuilder.WriteString(url.QueryEscape(strings.TrimSpace((string)(kv.Key)))) + headerValueBuilder.WriteRune('=') + headerValueBuilder.WriteString(url.QueryEscape(strings.TrimSpace(kv.Value.Emit()))) + return true + }) + if headerValueBuilder.Len() > 0 { + headerString := headerValueBuilder.String() + supplier.Set(CorrelationContextHeader, headerString) + } +} + +// Inject implements HTTPExtractor. +func (CorrelationContext) Extract(ctx context.Context, supplier propagation.HTTPSupplier) context.Context { + correlationContext := supplier.Get(CorrelationContextHeader) + if correlationContext == "" { + return WithMap(ctx, baggage.NewEmptyMap()) + } + + contextValues := strings.Split(correlationContext, ",") + keyValues := make([]core.KeyValue, 0, len(contextValues)) + for _, contextValue := range contextValues { + valueAndProps := strings.Split(contextValue, ";") + if len(valueAndProps) < 1 { + continue + } + nameValue := strings.Split(valueAndProps[0], "=") + if len(nameValue) < 2 { + continue + } + name, err := url.QueryUnescape(nameValue[0]) + if err != nil { + continue + } + trimmedName := strings.TrimSpace(name) + value, err := url.QueryUnescape(nameValue[1]) + if err != nil { + continue + } + trimmedValue := strings.TrimSpace(value) + + // TODO (skaris): properties defiend https://w3c.github.io/correlation-context/, are currently + // just put as part of the value. + var trimmedValueWithProps strings.Builder + trimmedValueWithProps.WriteString(trimmedValue) + for _, prop := range valueAndProps[1:] { + trimmedValueWithProps.WriteRune(';') + trimmedValueWithProps.WriteString(prop) + } + + keyValues = append(keyValues, key.New(trimmedName).String(trimmedValueWithProps.String())) + } + return WithMap(ctx, baggage.NewMap(baggage.MapUpdate{ + MultiKV: keyValues, + })) +} + +// GetAllKeys implements HTTPPropagator. +func (CorrelationContext) GetAllKeys() []string { + return []string{CorrelationContextHeader} +} diff --git a/api/context/baggage/propagation/propagation_test.go b/api/context/baggage/propagation/propagation_test.go new file mode 100644 index 00000000000..99c24435450 --- /dev/null +++ b/api/context/baggage/propagation/propagation_test.go @@ -0,0 +1,215 @@ +package propagation_test + +import ( + "context" + "net/http" + "strings" + "testing" + + "github.com/google/go-cmp/cmp" + + "go.opentelemetry.io/otel/api/context/baggage" + bpropagation "go.opentelemetry.io/otel/api/context/baggage/propagation" + "go.opentelemetry.io/otel/api/context/propagation" + "go.opentelemetry.io/otel/api/core" + "go.opentelemetry.io/otel/api/key" +) + +func TestExtractValidDistributedContextFromHTTPReq(t *testing.T) { + props := propagation.New(propagation.WithExtractors(bpropagation.CorrelationContext{})) + tests := []struct { + name string + header string + wantKVs []core.KeyValue + }{ + { + name: "valid w3cHeader", + header: "key1=val1,key2=val2", + wantKVs: []core.KeyValue{ + key.New("key1").String("val1"), + key.New("key2").String("val2"), + }, + }, + { + name: "valid w3cHeader with spaces", + header: "key1 = val1, key2 =val2 ", + wantKVs: []core.KeyValue{ + key.New("key1").String("val1"), + key.New("key2").String("val2"), + }, + }, + { + name: "valid w3cHeader with properties", + header: "key1=val1,key2=val2;prop=1", + wantKVs: []core.KeyValue{ + key.New("key1").String("val1"), + key.New("key2").String("val2;prop=1"), + }, + }, + { + name: "valid header with url-escaped comma", + header: "key1=val1,key2=val2%2Cval3", + wantKVs: []core.KeyValue{ + key.New("key1").String("val1"), + key.New("key2").String("val2,val3"), + }, + }, + { + name: "valid header with an invalid header", + header: "key1=val1,key2=val2,a,val3", + wantKVs: []core.KeyValue{ + key.New("key1").String("val1"), + key.New("key2").String("val2"), + }, + }, + { + name: "valid header with no value", + header: "key1=,key2=val2", + wantKVs: []core.KeyValue{ + key.New("key1").String(""), + key.New("key2").String("val2"), + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + req, _ := http.NewRequest("GET", "http://example.com", nil) + req.Header.Set("Correlation-Context", tt.header) + + ctx := context.Background() + ctx = propagation.ExtractHTTP(ctx, props, req.Header) + gotCorCtx := bpropagation.FromContext(ctx) + wantCorCtx := baggage.NewMap(baggage.MapUpdate{MultiKV: tt.wantKVs}) + if gotCorCtx.Len() != wantCorCtx.Len() { + t.Errorf( + "Got and Want CorCtx are not the same size %d != %d", + gotCorCtx.Len(), + wantCorCtx.Len(), + ) + } + totalDiff := "" + wantCorCtx.Foreach(func(kv core.KeyValue) bool { + val, _ := gotCorCtx.Value(kv.Key) + diff := cmp.Diff(kv, core.KeyValue{Key: kv.Key, Value: val}, cmp.AllowUnexported(core.Value{})) + if diff != "" { + totalDiff += diff + "\n" + } + return true + }) + if totalDiff != "" { + t.Errorf("Extract Tracecontext: %s: -got +want %s", tt.name, totalDiff) + } + }) + } +} + +func TestExtractInvalidDistributedContextFromHTTPReq(t *testing.T) { + props := propagation.New(propagation.WithExtractors(bpropagation.CorrelationContext{})) + tests := []struct { + name string + header string + }{ + { + name: "no key values", + header: "header1", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + req, _ := http.NewRequest("GET", "http://example.com", nil) + req.Header.Set("Correlation-Context", tt.header) + + ctx := context.Background() + ctx = propagation.ExtractHTTP(ctx, props, req.Header) + gotCorCtx := bpropagation.FromContext(ctx) + if gotCorCtx.Len() != 0 { + t.Errorf("Got and Want CorCtx are not the same size %d != %d", gotCorCtx.Len(), 0) + } + }) + } +} + +func TestInjectCorrelationContextToHTTPReq(t *testing.T) { + props := propagation.New(propagation.WithInjectors(bpropagation.CorrelationContext{})) + tests := []struct { + name string + kvs []core.KeyValue + wantInHeader []string + wantedLen int + }{ + { + name: "two simple values", + kvs: []core.KeyValue{ + key.New("key1").String("val1"), + key.New("key2").String("val2"), + }, + wantInHeader: []string{"key1=val1", "key2=val2"}, + }, + { + name: "two values with escaped chars", + kvs: []core.KeyValue{ + key.New("key1").String("val1,val2"), + key.New("key2").String("val3=4"), + }, + wantInHeader: []string{"key1=val1%2Cval2", "key2=val3%3D4"}, + }, + { + name: "values of non-string types", + kvs: []core.KeyValue{ + key.New("key1").Bool(true), + key.New("key2").Int(123), + key.New("key3").Int64(123), + key.New("key4").Int32(123), + key.New("key5").Uint(123), + key.New("key6").Uint32(123), + key.New("key7").Uint64(123), + key.New("key8").Float64(123.567), + key.New("key9").Float32(123.567), + }, + wantInHeader: []string{ + "key1=true", + "key2=123", + "key3=123", + "key4=123", + "key5=123", + "key6=123", + "key7=123", + "key8=123.567", + "key9=123.567", + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + req, _ := http.NewRequest("GET", "http://example.com", nil) + ctx := bpropagation.WithMap(context.Background(), baggage.NewMap(baggage.MapUpdate{MultiKV: tt.kvs})) + propagation.InjectHTTP(ctx, props, req.Header) + + gotHeader := req.Header.Get("Correlation-Context") + wantedLen := len(strings.Join(tt.wantInHeader, ",")) + if wantedLen != len(gotHeader) { + t.Errorf( + "%s: Inject Correlation-Context incorrect length %d != %d.", tt.name, tt.wantedLen, len(gotHeader), + ) + } + for _, inHeader := range tt.wantInHeader { + if !strings.Contains(gotHeader, inHeader) { + t.Errorf( + "%s: Inject Correlation-Context missing part of header: %s in %s", tt.name, inHeader, gotHeader, + ) + } + } + }) + } +} + +func TestTraceContextPropagator_GetAllKeys(t *testing.T) { + var propagator bpropagation.CorrelationContext + want := []string{"Correlation-Context"} + got := propagator.GetAllKeys() + if diff := cmp.Diff(got, want); diff != "" { + t.Errorf("GetAllKeys: -got +want %s", diff) + } +} diff --git a/api/context/propagation/propagation.go b/api/context/propagation/propagation.go new file mode 100644 index 00000000000..b25068ec44c --- /dev/null +++ b/api/context/propagation/propagation.go @@ -0,0 +1,132 @@ +// Copyright 2019, 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 propagation + +import ( + "context" +) + +// HTTPSupplier is implemented by http.Headers. +type HTTPSupplier interface { + Get(key string) string + Set(key string, value string) +} + +// HTTPExtractor extracts from a HTTPSupplier. +type HTTPExtractor interface { + // Extract method retrieves encoded SpanContext using supplier + // from the associated carrier. It decodes the SpanContext + // and returns it and a dctx of correlated context. If no + // SpanContext was retrieved OR if the retrieved SpanContext + // is invalid then an empty SpanContext is returned. + Extract(context.Context, HTTPSupplier) context.Context +} + +// HTTPExtractor injects into a HTTPSupplier. +type HTTPInjector interface { + // Inject method retrieves current SpanContext from the ctx, + // encodes it into propagator specific format and then injects + // the encoded SpanContext using supplier into a carrier + // associated with the supplier. It also takes a + // correlationCtx whose values will be injected into a carrier + // using the supplier. + Inject(context.Context, HTTPSupplier) +} + +// Config contains the current set of extractors and injectors. +type Config struct { + httpEx []HTTPExtractor + httpIn []HTTPInjector +} + +// Propagators is the interface to a set of injectors and extractors +// for all supported carrier formats. +type Propagators interface { + // HTTPExtractors returns the configured extractors. + HTTPExtractors() []HTTPExtractor + + // HTTPInjectors returns the configured injectors. + HTTPInjectors() []HTTPInjector +} + +// HTTPPropagator is the interface to inject and extract to and from +// http.Headers. +type HTTPPropagator interface { + HTTPInjector + HTTPExtractor + + // GetAllKeys returns the HTTP header names used. + GetAllKeys() []string +} + +// Option support passing configuration parameters to New(). +type Option func(*Config) + +// propagators is the default Propagators implementation. +type propagators struct { + config Config +} + +// New returns a standard Propagators implementation. +func New(options ...Option) Propagators { + config := Config{} + for _, opt := range options { + opt(&config) + } + return &propagators{ + config: config, + } +} + +// WithInjectors appends to the optional injector set. +func WithInjectors(inj ...HTTPInjector) Option { + return func(config *Config) { + config.httpIn = append(config.httpIn, inj...) + } +} + +// WithExtractors appends to the optional extractor set. +func WithExtractors(ext ...HTTPExtractor) Option { + return func(config *Config) { + config.httpEx = append(config.httpEx, ext...) + } +} + +// HTTPExtractors implements Propagators. +func (p *propagators) HTTPExtractors() []HTTPExtractor { + return p.config.httpEx +} + +// HTTPExtractors implements Propagators. +func (p *propagators) HTTPInjectors() []HTTPInjector { + return p.config.httpIn +} + +// ExtractHTTP applies props.HTTPExtractors() to the supplier and +// returns the combined result Context. +func ExtractHTTP(ctx context.Context, props Propagators, supplier HTTPSupplier) context.Context { + for _, ex := range props.HTTPExtractors() { + ctx = ex.Extract(ctx, supplier) + } + return ctx +} + +// ExtractHTTP applies props.HTTPInjectors() and returns the combined +// to the supplier. +func InjectHTTP(ctx context.Context, props Propagators, supplier HTTPSupplier) { + for _, in := range props.HTTPInjectors() { + in.Inject(ctx, supplier) + } +} diff --git a/api/distributedcontext/context.go b/api/distributedcontext/context.go deleted file mode 100644 index e1e62ff4f8e..00000000000 --- a/api/distributedcontext/context.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2019, 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 distributedcontext - -import ( - "context" - "runtime/pprof" - - "go.opentelemetry.io/otel/api/core" -) - -type ctxEntriesType struct{} - -var ( - ctxEntriesKey = &ctxEntriesType{} -) - -func WithMap(ctx context.Context, m Map) context.Context { - return context.WithValue(ctx, ctxEntriesKey, m) -} - -func NewContext(ctx context.Context, keyvalues ...core.KeyValue) context.Context { - return WithMap(ctx, FromContext(ctx).Apply(MapUpdate{ - MultiKV: keyvalues, - })) -} - -func FromContext(ctx context.Context) Map { - if m, ok := ctx.Value(ctxEntriesKey).(Map); ok { - return m - } - return NewEmptyMap() -} - -// Note: the golang pprof.Do API forces this memory allocation, we -// should file an issue about that. (There's a TODO in the source.) -func Do(ctx context.Context, f func(ctx context.Context)) { - m := FromContext(ctx) - keyvals := make([]string, 0, 2*len(m.m)) - for k, v := range m.m { - keyvals = append(keyvals, string(k), v.value.Emit()) - } - pprof.Do(ctx, pprof.Labels(keyvals...), f) -} diff --git a/api/global/global.go b/api/global/global.go index 8b49619b09e..29bc3820a01 100644 --- a/api/global/global.go +++ b/api/global/global.go @@ -15,6 +15,7 @@ package global import ( + "go.opentelemetry.io/otel/api/context/propagation" "go.opentelemetry.io/otel/api/global/internal" "go.opentelemetry.io/otel/api/metric" "go.opentelemetry.io/otel/api/trace" @@ -48,3 +49,15 @@ func MeterProvider() metric.Provider { func SetMeterProvider(mp metric.Provider) { internal.SetMeterProvider(mp) } + +// Propagators returns the registered global propagators instance. If +// none is registered then an instance of propagators.NoopPropagators +// is returned. +func Propagators() propagation.Propagators { + return internal.Propagators() +} + +// SetPropagators registers `p` as the global propagators instance. +func SetPropagators(p propagation.Propagators) { + internal.SetPropagators(p) +} diff --git a/api/global/internal/state.go b/api/global/internal/state.go index 32425b9aecb..2a2a862132d 100644 --- a/api/global/internal/state.go +++ b/api/global/internal/state.go @@ -4,8 +4,10 @@ import ( "sync" "sync/atomic" + "go.opentelemetry.io/otel/api/context/propagation" "go.opentelemetry.io/otel/api/metric" "go.opentelemetry.io/otel/api/trace" + tracePropagation "go.opentelemetry.io/otel/api/trace/propagation" ) type ( @@ -16,11 +18,16 @@ type ( meterProviderHolder struct { mp metric.Provider } + + propagatorsHolder struct { + pr propagation.Propagators + } ) var ( - globalTracer = defaultTracerValue() - globalMeter = defaultMeterValue() + globalTracer = defaultTracerValue() + globalMeter = defaultMeterValue() + globalPropagators = defaultPropagatorsValue() delegateMeterOnce sync.Once delegateTraceOnce sync.Once @@ -70,6 +77,16 @@ func SetMeterProvider(mp metric.Provider) { globalMeter.Store(meterProviderHolder{mp: mp}) } +// Propagators is the internal implementation for global.Propagators. +func Propagators() propagation.Propagators { + return globalPropagators.Load().(propagatorsHolder).pr +} + +// SetPropagators is the internal implementation for global.SetPropagators. +func SetPropagators(pr propagation.Propagators) { + globalTracer.Store(propagatorsHolder{pr: pr}) +} + func defaultTracerValue() *atomic.Value { v := &atomic.Value{} v.Store(traceProviderHolder{tp: &traceProvider{}}) @@ -82,6 +99,22 @@ func defaultMeterValue() *atomic.Value { return v } +func defaultPropagatorsValue() *atomic.Value { + v := &atomic.Value{} + v.Store(propagatorsHolder{pr: getDefaultPropagators()}) + return v +} + +// getDefaultPropagators returns a default Propagators, configured +// with W3C trace context propagation. +func getDefaultPropagators() propagation.Propagators { + inex := tracePropagation.TraceContext{} + return propagation.New( + propagation.WithExtractors(inex), + propagation.WithInjectors(inex), + ) +} + // ResetForTest restores the initial global state, for testing purposes. func ResetForTest() { globalTracer = defaultTracerValue() diff --git a/api/propagators/binary_propagator.go b/api/propagators/binary_propagator.go deleted file mode 100644 index 9a73c054b15..00000000000 --- a/api/propagators/binary_propagator.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2019, 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 propagators - -import ( - "go.opentelemetry.io/otel/api/core" -) - -// BinaryFormat is an interface that specifies methods to convert SpanContext -// to/from byte array. -type BinaryFormat interface { - // ToBytes serializes span context into a byte array and returns the array. - ToBytes(sc core.SpanContext) []byte - - // FromBytes de-serializes byte array into span context and returns the span context. - FromBytes([]byte) core.SpanContext -} - -var _ BinaryFormat = binary{} - -type binary struct{} - -// Binary creates a new propagator. The propagator implements -// ToBytes and FromBytes method to transform SpanContext to/from byte array. -func Binary() BinaryFormat { - return binary{} -} - -// ToBytes implements ToBytes method of propagators.BinaryFormat. -// It serializes core.SpanContext into a byte array. -func (bp binary) ToBytes(sc core.SpanContext) []byte { - if sc == core.EmptySpanContext() { - return nil - } - var b [29]byte - copy(b[2:18], sc.TraceID[:]) - b[18] = 1 - copy(b[19:27], sc.SpanID[:]) - b[27] = 2 - b[28] = sc.TraceFlags - return b[:] -} - -// FromBytes implements FromBytes method of propagators.BinaryFormat. -// It de-serializes bytes into core.SpanContext. -func (bp binary) FromBytes(b []byte) (sc core.SpanContext) { - if len(b) == 0 { - return core.EmptySpanContext() - } - b = b[1:] - if len(b) >= 17 && b[0] == 0 { - copy(sc.TraceID[:], b[1:17]) - b = b[17:] - } else { - return core.EmptySpanContext() - } - if len(b) >= 9 && b[0] == 1 { - copy(sc.SpanID[:], b[1:9]) - b = b[9:] - } - if len(b) >= 2 && b[0] == 2 { - sc.TraceFlags = b[1] - } - if sc.IsValid() { - return sc - } - return core.EmptySpanContext() -} diff --git a/api/propagators/binary_propagator_test.go b/api/propagators/binary_propagator_test.go deleted file mode 100644 index 8f5d090b45a..00000000000 --- a/api/propagators/binary_propagator_test.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2019, 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 propagators_test - -import ( - "testing" - - "github.com/google/go-cmp/cmp" - - "go.opentelemetry.io/otel/api/core" - "go.opentelemetry.io/otel/api/propagators" -) - -func TestExtractSpanContextFromBytes(t *testing.T) { - traceID, _ := core.TraceIDFromHex("4bf92f3577b34da6a3ce929d0e0e4736") - spanID, _ := core.SpanIDFromHex("00f067aa0ba902b7") - - propagator := propagators.Binary() - tests := []struct { - name string - bytes []byte - wantSc core.SpanContext - }{ - { - name: "future version of the proto", - bytes: []byte{ - 0x02, 0x00, 0x4b, 0xf9, 0x2f, 0x35, 0x77, 0xb3, 0x4d, 0xa6, 0xa3, 0xce, 0x92, 0x9d, 0x0e, 0x0e, 0x47, 0x36, - 0x01, 0x00, 0xf0, 0x67, 0xaa, 0x0b, 0xa9, 0x02, 0xb7, - 0x02, 0x01, - }, - wantSc: core.SpanContext{ - TraceID: traceID, - SpanID: spanID, - TraceFlags: core.TraceFlagsSampled, - }, - }, - { - name: "current version with valid SpanContext and with Sampled bit set", - bytes: []byte{ - 0x00, 0x00, 0x4b, 0xf9, 0x2f, 0x35, 0x77, 0xb3, 0x4d, 0xa6, 0xa3, 0xce, 0x92, 0x9d, 0x0e, 0x0e, 0x47, 0x36, - 0x01, 0x00, 0xf0, 0x67, 0xaa, 0x0b, 0xa9, 0x02, 0xb7, - 0x02, 0x01, - }, - wantSc: core.SpanContext{ - TraceID: traceID, - SpanID: spanID, - TraceFlags: core.TraceFlagsSampled, - }, - }, - { - name: "valid SpanContext without option", - bytes: []byte{ - 0x00, 0x00, 0x4b, 0xf9, 0x2f, 0x35, 0x77, 0xb3, 0x4d, 0xa6, 0xa3, 0xce, 0x92, 0x9d, 0x0e, 0x0e, 0x47, 0x36, - 0x01, 0x00, 0xf0, 0x67, 0xaa, 0x0b, 0xa9, 0x02, 0xb7, - }, - wantSc: core.SpanContext{ - TraceID: traceID, - SpanID: spanID, - }, - }, - { - name: "zero trace ID", - bytes: []byte{ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x01, - }, - wantSc: core.EmptySpanContext(), - }, - { - name: "zero span ID", - bytes: []byte{ - 0x00, 0x00, 0x4b, 0xf9, 0x2f, 0x35, 0x77, 0xb3, 0x4d, 0xa6, 0xa3, 0xce, 0x92, 0x9d, 0x0e, 0x0e, 0x47, 0x36, - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x01, - }, - wantSc: core.EmptySpanContext(), - }, - { - name: "wrong trace ID field number", - bytes: []byte{ - 0x00, 0x01, 0x4b, 0xf9, 0x2f, 0x35, 0x77, 0xb3, 0x4d, 0xa6, 0xa3, 0xce, 0x92, 0x9d, 0x0e, 0x0e, 0x47, 0x36, - 0x01, 0x00, 0xf0, 0x67, 0xaa, 0x0b, 0xa9, 0x02, 0xb7, - }, - wantSc: core.EmptySpanContext(), - }, - { - name: "short byte array", - bytes: []byte{ - 0x00, 0x00, 0x4b, 0xf9, 0x2f, 0x35, 0x77, 0xb3, 0x4d, - }, - wantSc: core.EmptySpanContext(), - }, - { - name: "nil byte array", - wantSc: core.EmptySpanContext(), - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - gotSc := propagator.FromBytes(tt.bytes) - if diff := cmp.Diff(gotSc, tt.wantSc); diff != "" { - t.Errorf("Deserialize SpanContext from byte array: %s: -got +want %s", tt.name, diff) - } - }) - } -} - -func TestConvertSpanContextToBytes(t *testing.T) { - traceID, _ := core.TraceIDFromHex("4bf92f3577b34da6a3ce929d0e0e4736") - spanID, _ := core.SpanIDFromHex("00f067aa0ba902b7") - - propagator := propagators.Binary() - tests := []struct { - name string - sc core.SpanContext - bytes []byte - }{ - { - name: "valid SpanContext, with sampling bit set", - sc: core.SpanContext{ - TraceID: traceID, - SpanID: spanID, - TraceFlags: core.TraceFlagsSampled, - }, - bytes: []byte{ - 0x00, 0x00, 0x4b, 0xf9, 0x2f, 0x35, 0x77, 0xb3, 0x4d, 0xa6, 0xa3, 0xce, 0x92, 0x9d, 0x0e, 0x0e, 0x47, 0x36, - 0x01, 0x00, 0xf0, 0x67, 0xaa, 0x0b, 0xa9, 0x02, 0xb7, - 0x02, 0x01, - }, - }, - { - name: "valid SpanContext, with sampling bit cleared", - sc: core.SpanContext{ - TraceID: traceID, - SpanID: spanID, - }, - bytes: []byte{ - 0x00, 0x00, 0x4b, 0xf9, 0x2f, 0x35, 0x77, 0xb3, 0x4d, 0xa6, 0xa3, 0xce, 0x92, 0x9d, 0x0e, 0x0e, 0x47, 0x36, - 0x01, 0x00, 0xf0, 0x67, 0xaa, 0x0b, 0xa9, 0x02, 0xb7, - 0x02, 0x00, - }, - }, - { - name: "invalid spancontext", - sc: core.EmptySpanContext(), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - gotBytes := propagator.ToBytes(tt.sc) - if diff := cmp.Diff(gotBytes, tt.bytes); diff != "" { - t.Errorf("Serialize SpanContext to byte array: %s: -got +want %s", tt.name, diff) - } - }) - } -} diff --git a/api/propagators/text_noop_propagator.go b/api/propagators/text_noop_propagator.go deleted file mode 100644 index 85429712118..00000000000 --- a/api/propagators/text_noop_propagator.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2019, 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 propagators - -import ( - "context" - - "go.opentelemetry.io/otel/api/core" - dctx "go.opentelemetry.io/otel/api/distributedcontext" -) - -// NoopTextFormat implements TextFormat that does nothing. -type NoopTextFormat struct{} - -var _ TextFormat = NoopTextFormat{} - -// Inject does nothing. -func (np NoopTextFormat) Inject(ctx context.Context, supplier Supplier) { -} - -// Extract does nothing and returns an empty SpanContext -func (np NoopTextFormat) Extract(ctx context.Context, supplier Supplier) (core.SpanContext, dctx.Map) { - return core.EmptySpanContext(), dctx.NewEmptyMap() -} - -// GetAllKeys returns empty list of strings. -func (np NoopTextFormat) GetAllKeys() []string { - return []string{} -} diff --git a/api/propagators/text_propagator.go b/api/propagators/text_propagator.go deleted file mode 100644 index c39c835c595..00000000000 --- a/api/propagators/text_propagator.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2019, 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 propagators - -import ( - "context" - - "go.opentelemetry.io/otel/api/core" - dctx "go.opentelemetry.io/otel/api/distributedcontext" -) - -// TextFormat is an interface that specifies methods to inject and extract SpanContext -// and distributed context into/from a carrier using Supplier interface. -// For example, HTTP Trace Context propagator would encode SpanContext into W3C Trace -// Context Header and set the header into HttpRequest. -type TextFormat interface { - // Inject method retrieves current SpanContext from the ctx, encodes it into propagator - // specific format and then injects the encoded SpanContext using supplier into a carrier - // associated with the supplier. It also takes a correlationCtx whose values will be - // injected into a carrier using the supplier. - Inject(ctx context.Context, supplier Supplier) - - // Extract method retrieves encoded SpanContext using supplier from the associated carrier. - // It decodes the SpanContext and returns it and a dctx of correlated context. - // If no SpanContext was retrieved OR if the retrieved SpanContext is invalid then - // an empty SpanContext is returned. - Extract(ctx context.Context, supplier Supplier) (core.SpanContext, dctx.Map) - - // GetAllKeys returns all the keys that this propagator injects/extracts into/from a - // carrier. The use cases for this are - // * allow pre-allocation of fields, especially in systems like gRPC Metadata - // * allow a single-pass over an iterator (ex OpenTracing has no getter in TextMap) - GetAllKeys() []string -} - -// Supplier is an interface that specifies methods to retrieve and store -// value for a key to an associated carrier. -// Get method retrieves the value for a given key. -// Set method stores the value for a given key. -type Supplier interface { - Get(key string) string - Set(key string, value string) -} diff --git a/api/propagators/trace_context_propagator.go b/api/propagators/trace_context_propagator.go deleted file mode 100644 index 75e88b51d6a..00000000000 --- a/api/propagators/trace_context_propagator.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2019, 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 propagators - -import ( - "context" - "encoding/hex" - "fmt" - "net/url" - "regexp" - "strings" - - "go.opentelemetry.io/otel/api/core" - dctx "go.opentelemetry.io/otel/api/distributedcontext" - "go.opentelemetry.io/otel/api/key" - "go.opentelemetry.io/otel/api/trace" -) - -const ( - supportedVersion = 0 - maxVersion = 254 - TraceparentHeader = "Traceparent" - CorrelationContextHeader = "Correlation-Context" -) - -// TraceContext propagates SpanContext in W3C TraceContext format. -type TraceContext struct{} - -var _ TextFormat = TraceContext{} -var traceCtxRegExp = regexp.MustCompile("^[0-9a-f]{2}-[a-f0-9]{32}-[a-f0-9]{16}-[a-f0-9]{2}-?") - -func (hp TraceContext) Inject(ctx context.Context, supplier Supplier) { - sc := trace.SpanFromContext(ctx).SpanContext() - if sc.IsValid() { - h := fmt.Sprintf("%.2x-%s-%.16x-%.2x", - supportedVersion, - sc.TraceIDString(), - sc.SpanID, - sc.TraceFlags&core.TraceFlagsSampled) - supplier.Set(TraceparentHeader, h) - } - - correlationCtx := dctx.FromContext(ctx) - firstIter := true - var headerValueBuilder strings.Builder - correlationCtx.Foreach(func(kv core.KeyValue) bool { - if !firstIter { - headerValueBuilder.WriteRune(',') - } - firstIter = false - headerValueBuilder.WriteString(url.QueryEscape(strings.TrimSpace((string)(kv.Key)))) - headerValueBuilder.WriteRune('=') - headerValueBuilder.WriteString(url.QueryEscape(strings.TrimSpace(kv.Value.Emit()))) - return true - }) - if headerValueBuilder.Len() > 0 { - headerString := headerValueBuilder.String() - supplier.Set(CorrelationContextHeader, headerString) - } -} - -func (hp TraceContext) Extract( - ctx context.Context, supplier Supplier, -) (core.SpanContext, dctx.Map) { - return hp.extractSpanContext(ctx, supplier), hp.extractCorrelationCtx(ctx, supplier) -} - -func (hp TraceContext) extractSpanContext( - ctx context.Context, supplier Supplier, -) core.SpanContext { - h := supplier.Get(TraceparentHeader) - if h == "" { - return core.EmptySpanContext() - } - - h = strings.Trim(h, "-") - if !traceCtxRegExp.MatchString(h) { - return core.EmptySpanContext() - } - - sections := strings.Split(h, "-") - if len(sections) < 4 { - return core.EmptySpanContext() - } - - if len(sections[0]) != 2 { - return core.EmptySpanContext() - } - ver, err := hex.DecodeString(sections[0]) - if err != nil { - return core.EmptySpanContext() - } - version := int(ver[0]) - if version > maxVersion { - return core.EmptySpanContext() - } - - if version == 0 && len(sections) != 4 { - return core.EmptySpanContext() - } - - if len(sections[1]) != 32 { - return core.EmptySpanContext() - } - - var sc core.SpanContext - - sc.TraceID, err = core.TraceIDFromHex(sections[1][:32]) - if err != nil { - return core.EmptySpanContext() - } - - if len(sections[2]) != 16 { - return core.EmptySpanContext() - } - sc.SpanID, err = core.SpanIDFromHex(sections[2]) - if err != nil { - return core.EmptySpanContext() - } - - if len(sections[3]) != 2 { - return core.EmptySpanContext() - } - opts, err := hex.DecodeString(sections[3]) - if err != nil || len(opts) < 1 || (version == 0 && opts[0] > 2) { - return core.EmptySpanContext() - } - sc.TraceFlags = opts[0] &^ core.TraceFlagsUnused - - if !sc.IsValid() { - return core.EmptySpanContext() - } - - return sc -} - -func (hp TraceContext) extractCorrelationCtx(ctx context.Context, supplier Supplier) dctx.Map { - correlationContext := supplier.Get(CorrelationContextHeader) - if correlationContext == "" { - return dctx.NewEmptyMap() - } - - contextValues := strings.Split(correlationContext, ",") - keyValues := make([]core.KeyValue, 0, len(contextValues)) - for _, contextValue := range contextValues { - valueAndProps := strings.Split(contextValue, ";") - if len(valueAndProps) < 1 { - continue - } - nameValue := strings.Split(valueAndProps[0], "=") - if len(nameValue) < 2 { - continue - } - name, err := url.QueryUnescape(nameValue[0]) - if err != nil { - continue - } - trimmedName := strings.TrimSpace(name) - value, err := url.QueryUnescape(nameValue[1]) - if err != nil { - continue - } - trimmedValue := strings.TrimSpace(value) - - // TODO (skaris): properties defiend https://w3c.github.io/correlation-context/, are currently - // just put as part of the value. - var trimmedValueWithProps strings.Builder - trimmedValueWithProps.WriteString(trimmedValue) - for _, prop := range valueAndProps[1:] { - trimmedValueWithProps.WriteRune(';') - trimmedValueWithProps.WriteString(prop) - } - - keyValues = append(keyValues, key.New(trimmedName).String(trimmedValueWithProps.String())) - } - return dctx.NewMap(dctx.MapUpdate{ - MultiKV: keyValues, - }) -} - -func (hp TraceContext) GetAllKeys() []string { - return []string{TraceparentHeader, CorrelationContextHeader} -} diff --git a/api/testharness/harness.go b/api/testharness/harness.go index e82c1cc1b13..0e3d5d65bfb 100644 --- a/api/testharness/harness.go +++ b/api/testharness/harness.go @@ -125,30 +125,14 @@ func (h *Harness) TestTracer(subjectFactory func() trace.Tracer) { e.Expect(csc.SpanID).NotToEqual(psc.SpanID) }) - t.Run("propagates a parent's trace ID through `ChildOf`", func(t *testing.T) { + t.Run("propagates a parent's trace ID through `WithParent`", func(t *testing.T) { t.Parallel() e := matchers.NewExpecter(t) subject := subjectFactory() - _, parent := subject.Start(context.Background(), "parent") - _, child := subject.Start(context.Background(), "child", trace.ChildOf(parent.SpanContext())) - - psc := parent.SpanContext() - csc := child.SpanContext() - - e.Expect(csc.TraceID).ToEqual(psc.TraceID) - e.Expect(csc.SpanID).NotToEqual(psc.SpanID) - }) - - t.Run("propagates a parent's trace ID through `FollowsFrom`", func(t *testing.T) { - t.Parallel() - - e := matchers.NewExpecter(t) - subject := subjectFactory() - - _, parent := subject.Start(context.Background(), "parent") - _, child := subject.Start(context.Background(), "child", trace.FollowsFrom(parent.SpanContext())) + parentCtx, parent := subject.Start(context.Background(), "parent") + _, child := subject.Start(context.Background(), "child", trace.WithParent(parentCtx)) psc := parent.SpanContext() csc := child.SpanContext() diff --git a/api/trace/api.go b/api/trace/api.go index 11c7f541427..c2e9607052c 100644 --- a/api/trace/api.go +++ b/api/trace/api.go @@ -100,26 +100,11 @@ type StartConfig struct { Attributes []core.KeyValue StartTime time.Time Links []Link - Relation Relation Record bool + Parent context.Context SpanKind SpanKind } -// Relation is used to establish relationship between newly created span and the -// other span. The other span could be related as a parent or linked or any other -// future relationship type. -type Relation struct { - core.SpanContext - RelationshipType -} - -type RelationshipType int - -const ( - ChildOfRelationship RelationshipType = iota - FollowsFromRelationship -) - // Link is used to establish relationship between two spans within the same Trace or // across different Traces. Few examples of Link usage. // 1. Batch Processing: A batch of elements may contain elements associated with one @@ -189,6 +174,21 @@ func (sk SpanKind) String() string { } } +// WithParent explicitly sets the parent context. When the +// parent context is not set explicitly, it defaults to: +// 1. If a current upstream context is set +// a. If a current Span is set with the same trace_id, use the Span's +// SpanContext as parent. +// b. If the current Span belongs to a different trace_id, use the upstream +// context are parent. +// 2. If a current span is set and upstream context is not set, use its context. +// 3. If neither upstream nor span context is set, a new root. +func WithParent(ctx context.Context) StartOption { + return func(c *StartConfig) { + c.Parent = ctx + } +} + // WithStartTime sets the start time of the span to provided time t, when it is started. // In absence of this option, wall clock time is used as start time. // This option is typically used when starting of the span is delayed. @@ -216,26 +216,6 @@ func WithRecord() StartOption { } } -// ChildOf. TODO: do we need this?. -func ChildOf(sc core.SpanContext) StartOption { - return func(c *StartConfig) { - c.Relation = Relation{ - SpanContext: sc, - RelationshipType: ChildOfRelationship, - } - } -} - -// FollowsFrom. TODO: do we need this?. -func FollowsFrom(sc core.SpanContext) StartOption { - return func(c *StartConfig) { - c.Relation = Relation{ - SpanContext: sc, - RelationshipType: FollowsFromRelationship, - } - } -} - // LinkedTo allows instantiating a Span with initial Links. func LinkedTo(sc core.SpanContext, attrs ...core.KeyValue) StartOption { return func(c *StartConfig) { diff --git a/api/trace/current.go b/api/trace/current.go index c1ad829dcde..55cd2d56528 100644 --- a/api/trace/current.go +++ b/api/trace/current.go @@ -20,9 +20,7 @@ import ( type currentSpanKeyType struct{} -var ( - currentSpanKey = ¤tSpanKeyType{} -) +var currentSpanKey = ¤tSpanKeyType{} func ContextWithSpan(ctx context.Context, span Span) context.Context { return context.WithValue(ctx, currentSpanKey, span) diff --git a/api/propagators/b3_propagator.go b/api/trace/propagation/b3_propagator.go similarity index 78% rename from api/propagators/b3_propagator.go rename to api/trace/propagation/b3_propagator.go index b608be9e0cc..2285fd150b3 100644 --- a/api/propagators/b3_propagator.go +++ b/api/trace/propagation/b3_propagator.go @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -package propagators +package propagation import ( "context" "fmt" "strings" + "go.opentelemetry.io/otel/api/context/propagation" "go.opentelemetry.io/otel/api/core" - dctx "go.opentelemetry.io/otel/api/distributedcontext" "go.opentelemetry.io/otel/api/trace" ) @@ -50,47 +50,44 @@ type B3 struct { SingleHeader bool } -var _ TextFormat = B3{} +var _ propagation.HTTPPropagator = B3{} -func (b3 B3) Inject(ctx context.Context, supplier Supplier) { +func (b3 B3) Inject(ctx context.Context, supplier propagation.HTTPSupplier) { sc := trace.SpanFromContext(ctx).SpanContext() - if sc.IsValid() { - if b3.SingleHeader { - sampled := sc.TraceFlags & core.TraceFlagsSampled - supplier.Set(B3SingleHeader, - fmt.Sprintf("%s-%.16x-%.1d", sc.TraceIDString(), sc.SpanID, sampled)) + if !sc.IsValid() { + return + } + if b3.SingleHeader { + sampled := sc.TraceFlags & core.TraceFlagsSampled + supplier.Set(B3SingleHeader, + fmt.Sprintf("%s-%.16x-%.1d", sc.TraceIDString(), sc.SpanID, sampled)) + } else { + supplier.Set(B3TraceIDHeader, sc.TraceIDString()) + supplier.Set(B3SpanIDHeader, + fmt.Sprintf("%.16x", sc.SpanID)) + + var sampled string + if sc.IsSampled() { + sampled = "1" } else { - supplier.Set(B3TraceIDHeader, sc.TraceIDString()) - supplier.Set(B3SpanIDHeader, - fmt.Sprintf("%.16x", sc.SpanID)) - - var sampled string - if sc.IsSampled() { - sampled = "1" - } else { - sampled = "0" - } - supplier.Set(B3SampledHeader, sampled) + sampled = "0" } + supplier.Set(B3SampledHeader, sampled) } } // Extract retrieves B3 Headers from the supplier -func (b3 B3) Extract(ctx context.Context, supplier Supplier) (core.SpanContext, dctx.Map) { +func (b3 B3) Extract(ctx context.Context, supplier propagation.HTTPSupplier) context.Context { + var sc core.SpanContext if b3.SingleHeader { - return b3.extractSingleHeader(supplier), dctx.NewEmptyMap() + sc = b3.extractSingleHeader(ctx, supplier) + } else { + sc = b3.extract(ctx, supplier) } - return b3.extract(supplier), dctx.NewEmptyMap() + return WithRemoteContext(ctx, sc) } -func (b3 B3) GetAllKeys() []string { - if b3.SingleHeader { - return []string{B3SingleHeader} - } - return []string{B3TraceIDHeader, B3SpanIDHeader, B3SampledHeader} -} - -func (b3 B3) extract(supplier Supplier) core.SpanContext { +func (b3 B3) extract(ctx context.Context, supplier propagation.HTTPSupplier) core.SpanContext { tid, err := core.TraceIDFromHex(supplier.Get(B3TraceIDHeader)) if err != nil { return core.EmptySpanContext() @@ -125,10 +122,10 @@ func (b3 B3) extract(supplier Supplier) core.SpanContext { return sc } -func (b3 B3) extractSingleHeader(supplier Supplier) core.SpanContext { +func (b3 B3) extractSingleHeader(ctx context.Context, supplier propagation.HTTPSupplier) core.SpanContext { h := supplier.Get(B3SingleHeader) if h == "" || h == "0" { - core.EmptySpanContext() + return core.EmptySpanContext() } sc := core.SpanContext{} parts := strings.Split(h, "-") @@ -202,3 +199,10 @@ func (b3 B3) extracDebugFlag(debug string) (flag byte, ok bool) { } return 0, false } + +func (b3 B3) GetAllKeys() []string { + if b3.SingleHeader { + return []string{B3SingleHeader} + } + return []string{B3TraceIDHeader, B3SpanIDHeader, B3SampledHeader} +} diff --git a/api/propagators/b3_propagator_benchmark_test.go b/api/trace/propagation/b3_propagator_benchmark_test.go similarity index 88% rename from api/propagators/b3_propagator_benchmark_test.go rename to api/trace/propagation/b3_propagator_benchmark_test.go index b3917931457..500a44912bd 100644 --- a/api/propagators/b3_propagator_benchmark_test.go +++ b/api/trace/propagation/b3_propagator_benchmark_test.go @@ -12,15 +12,15 @@ // See the License for the specific language governing permissions and // limitations under the License. -package propagators_test +package propagation_test import ( "context" "net/http" "testing" - "go.opentelemetry.io/otel/api/propagators" "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/api/trace/propagation" mocktrace "go.opentelemetry.io/otel/internal/trace" ) @@ -53,7 +53,7 @@ func BenchmarkExtractB3(b *testing.B) { } for _, tg := range testGroup { - propagator := propagators.B3{SingleHeader: tg.singleHeader} + propagator := propagation.B3{SingleHeader: tg.singleHeader} for _, tt := range tg.tests { traceBenchmark(tg.name+"/"+tt.name, b, func(b *testing.B) { ctx := context.Background() @@ -64,7 +64,7 @@ func BenchmarkExtractB3(b *testing.B) { b.ReportAllocs() b.ResetTimer() for i := 0; i < b.N; i++ { - _, _ = propagator.Extract(ctx, req.Header) + _ = propagator.Extract(ctx, req.Header) } }) } @@ -97,13 +97,13 @@ func BenchmarkInjectB3(b *testing.B) { for _, tg := range testGroup { id = 0 - propagator := propagators.B3{SingleHeader: tg.singleHeader} + propagator := propagation.B3{SingleHeader: tg.singleHeader} for _, tt := range tg.tests { traceBenchmark(tg.name+"/"+tt.name, b, func(b *testing.B) { req, _ := http.NewRequest("GET", "http://example.com", nil) ctx := context.Background() if tt.parentSc.IsValid() { - ctx, _ = mockTracer.Start(ctx, "inject", trace.ChildOf(tt.parentSc)) + ctx, _ = mockTracer.Start(ctx, "inject", trace.WithParent(propagation.WithRemoteContext(ctx, tt.parentSc))) } else { ctx, _ = mockTracer.Start(ctx, "inject") } diff --git a/api/propagators/b3_propagator_data_test.go b/api/trace/propagation/b3_propagator_data_test.go similarity index 56% rename from api/propagators/b3_propagator_data_test.go rename to api/trace/propagation/b3_propagator_data_test.go index 73389d47916..6fdf78dd808 100644 --- a/api/propagators/b3_propagator_data_test.go +++ b/api/trace/propagation/b3_propagator_data_test.go @@ -12,11 +12,11 @@ // See the License for the specific language governing permissions and // limitations under the License. -package propagators_test +package propagation_test import ( "go.opentelemetry.io/otel/api/core" - "go.opentelemetry.io/otel/api/propagators" + "go.opentelemetry.io/otel/api/trace/propagation" ) type extractTest struct { @@ -29,8 +29,8 @@ var extractMultipleHeaders = []extractTest{ { name: "sampling state defer", headers: map[string]string{ - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "00f067aa0ba902b7", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "00f067aa0ba902b7", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -40,9 +40,9 @@ var extractMultipleHeaders = []extractTest{ { name: "sampling state deny", headers: map[string]string{ - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "00f067aa0ba902b7", - propagators.B3SampledHeader: "0", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "00f067aa0ba902b7", + propagation.B3SampledHeader: "0", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -52,9 +52,9 @@ var extractMultipleHeaders = []extractTest{ { name: "sampling state accept", headers: map[string]string{ - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "00f067aa0ba902b7", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "00f067aa0ba902b7", + propagation.B3SampledHeader: "1", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -65,9 +65,9 @@ var extractMultipleHeaders = []extractTest{ { name: "sampling state as a boolean", headers: map[string]string{ - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "00f067aa0ba902b7", - propagators.B3SampledHeader: "true", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "00f067aa0ba902b7", + propagation.B3SampledHeader: "true", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -78,9 +78,9 @@ var extractMultipleHeaders = []extractTest{ { name: "debug flag set", headers: map[string]string{ - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "00f067aa0ba902b7", - propagators.B3DebugFlagHeader: "1", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "00f067aa0ba902b7", + propagation.B3DebugFlagHeader: "1", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -94,10 +94,10 @@ var extractMultipleHeaders = []extractTest{ // takes precedence. Hence, it is sampled. name: "debug flag set and sampling state is deny", headers: map[string]string{ - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "00f067aa0ba902b7", - propagators.B3SampledHeader: "0", - propagators.B3DebugFlagHeader: "1", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "00f067aa0ba902b7", + propagation.B3SampledHeader: "0", + propagation.B3DebugFlagHeader: "1", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -108,10 +108,10 @@ var extractMultipleHeaders = []extractTest{ { name: "with parent span id", headers: map[string]string{ - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "00f067aa0ba902b7", - propagators.B3SampledHeader: "1", - propagators.B3ParentSpanIDHeader: "00f067aa0ba90200", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "00f067aa0ba902b7", + propagation.B3SampledHeader: "1", + propagation.B3ParentSpanIDHeader: "00f067aa0ba90200", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -122,7 +122,7 @@ var extractMultipleHeaders = []extractTest{ { name: "with only sampled state header", headers: map[string]string{ - propagators.B3SampledHeader: "0", + propagation.B3SampledHeader: "0", }, wantSc: core.EmptySpanContext(), }, @@ -132,7 +132,7 @@ var extractSingleHeader = []extractTest{ { name: "sampling state defer", headers: map[string]string{ - propagators.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7", + propagation.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -142,7 +142,7 @@ var extractSingleHeader = []extractTest{ { name: "sampling state deny", headers: map[string]string{ - propagators.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-0", + propagation.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-0", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -152,7 +152,7 @@ var extractSingleHeader = []extractTest{ { name: "sampling state accept", headers: map[string]string{ - propagators.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-1", + propagation.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-1", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -163,7 +163,7 @@ var extractSingleHeader = []extractTest{ { name: "sampling state debug", headers: map[string]string{ - propagators.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-d", + propagation.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-d", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -174,7 +174,7 @@ var extractSingleHeader = []extractTest{ { name: "with parent span id", headers: map[string]string{ - propagators.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-1-00000000000000cd", + propagation.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-1-00000000000000cd", }, wantSc: core.SpanContext{ TraceID: traceID, @@ -185,7 +185,7 @@ var extractSingleHeader = []extractTest{ { name: "with only sampling state deny", headers: map[string]string{ - propagators.B3SingleHeader: "0", + propagation.B3SingleHeader: "0", }, wantSc: core.EmptySpanContext(), }, @@ -195,143 +195,143 @@ var extractInvalidB3MultipleHeaders = []extractTest{ { name: "trace ID length > 32", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab00000000000000000000000000000000", - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "ab00000000000000000000000000000000", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "trace ID length >16 and <32", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab0000000000000000000000000000", - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "ab0000000000000000000000000000", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "trace ID length <16", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab0000000000", - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "ab0000000000", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "wrong span ID length", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab000000000000000000000000000000", - propagators.B3SpanIDHeader: "cd0000000000000000", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "ab000000000000000000000000000000", + propagation.B3SpanIDHeader: "cd0000000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "wrong sampled flag length", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab000000000000000000000000000000", - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "10", + propagation.B3TraceIDHeader: "ab000000000000000000000000000000", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "10", }, }, { name: "bogus trace ID", headers: map[string]string{ - propagators.B3TraceIDHeader: "qw000000000000000000000000000000", - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "qw000000000000000000000000000000", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "bogus span ID", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab000000000000000000000000000000", - propagators.B3SpanIDHeader: "qw00000000000000", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "ab000000000000000000000000000000", + propagation.B3SpanIDHeader: "qw00000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "bogus sampled flag", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab000000000000000000000000000000", - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "d", + propagation.B3TraceIDHeader: "ab000000000000000000000000000000", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "d", }, }, { name: "bogus debug flag (string)", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab000000000000000000000000000000", - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "1", - propagators.B3DebugFlagHeader: "d", + propagation.B3TraceIDHeader: "ab000000000000000000000000000000", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "1", + propagation.B3DebugFlagHeader: "d", }, }, { name: "bogus debug flag (number)", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab000000000000000000000000000000", - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "1", - propagators.B3DebugFlagHeader: "10", + propagation.B3TraceIDHeader: "ab000000000000000000000000000000", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "1", + propagation.B3DebugFlagHeader: "10", }, }, { name: "upper case trace ID", headers: map[string]string{ - propagators.B3TraceIDHeader: "AB000000000000000000000000000000", - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "AB000000000000000000000000000000", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "upper case span ID", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab000000000000000000000000000000", - propagators.B3SpanIDHeader: "CD00000000000000", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "ab000000000000000000000000000000", + propagation.B3SpanIDHeader: "CD00000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "zero trace ID", headers: map[string]string{ - propagators.B3TraceIDHeader: "00000000000000000000000000000000", - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "00000000000000000000000000000000", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "zero span ID", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab000000000000000000000000000000", - propagators.B3SpanIDHeader: "0000000000000000", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "ab000000000000000000000000000000", + propagation.B3SpanIDHeader: "0000000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "missing span ID", headers: map[string]string{ - propagators.B3TraceIDHeader: "ab000000000000000000000000000000", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "ab000000000000000000000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "missing trace ID", headers: map[string]string{ - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "1", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "missing trace ID with valid single header", headers: map[string]string{ - propagators.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-1", - propagators.B3SpanIDHeader: "cd00000000000000", - propagators.B3SampledHeader: "1", + propagation.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-1", + propagation.B3SpanIDHeader: "cd00000000000000", + propagation.B3SampledHeader: "1", }, }, { name: "sampled header set to 1 but trace ID and span ID are missing", headers: map[string]string{ - propagators.B3SampledHeader: "1", + propagation.B3SampledHeader: "1", }, }, } @@ -340,96 +340,96 @@ var extractInvalidB3SingleHeader = []extractTest{ { name: "wrong trace ID length", headers: map[string]string{ - propagators.B3SingleHeader: "ab00000000000000000000000000000000-cd00000000000000-1", + propagation.B3SingleHeader: "ab00000000000000000000000000000000-cd00000000000000-1", }, }, { name: "wrong span ID length", headers: map[string]string{ - propagators.B3SingleHeader: "ab000000000000000000000000000000-cd0000000000000000-1", + propagation.B3SingleHeader: "ab000000000000000000000000000000-cd0000000000000000-1", }, }, { name: "wrong sampled state length", headers: map[string]string{ - propagators.B3SingleHeader: "00-ab000000000000000000000000000000-cd00000000000000-01", + propagation.B3SingleHeader: "00-ab000000000000000000000000000000-cd00000000000000-01", }, }, { name: "wrong parent span ID length", headers: map[string]string{ - propagators.B3SingleHeader: "ab000000000000000000000000000000-cd00000000000000-1-cd0000000000000000", + propagation.B3SingleHeader: "ab000000000000000000000000000000-cd00000000000000-1-cd0000000000000000", }, }, { name: "bogus trace ID", headers: map[string]string{ - propagators.B3SingleHeader: "qw000000000000000000000000000000-cd00000000000000-1", + propagation.B3SingleHeader: "qw000000000000000000000000000000-cd00000000000000-1", }, }, { name: "bogus span ID", headers: map[string]string{ - propagators.B3SingleHeader: "ab000000000000000000000000000000-qw00000000000000-1", + propagation.B3SingleHeader: "ab000000000000000000000000000000-qw00000000000000-1", }, }, { name: "bogus sampled flag", headers: map[string]string{ - propagators.B3SingleHeader: "ab000000000000000000000000000000-cd00000000000000-q", + propagation.B3SingleHeader: "ab000000000000000000000000000000-cd00000000000000-q", }, }, { name: "bogus parent span ID", headers: map[string]string{ - propagators.B3SingleHeader: "ab000000000000000000000000000000-cd00000000000000-1-qw00000000000000", + propagation.B3SingleHeader: "ab000000000000000000000000000000-cd00000000000000-1-qw00000000000000", }, }, { name: "upper case trace ID", headers: map[string]string{ - propagators.B3SingleHeader: "AB000000000000000000000000000000-cd00000000000000-1", + propagation.B3SingleHeader: "AB000000000000000000000000000000-cd00000000000000-1", }, }, { name: "upper case span ID", headers: map[string]string{ - propagators.B3SingleHeader: "ab000000000000000000000000000000-CD00000000000000-1", + propagation.B3SingleHeader: "ab000000000000000000000000000000-CD00000000000000-1", }, }, { name: "upper case parent span ID", headers: map[string]string{ - propagators.B3SingleHeader: "ab000000000000000000000000000000-cd00000000000000-1-EF00000000000000", + propagation.B3SingleHeader: "ab000000000000000000000000000000-cd00000000000000-1-EF00000000000000", }, }, { name: "zero trace ID and span ID", headers: map[string]string{ - propagators.B3SingleHeader: "00000000000000000000000000000000-0000000000000000-1", + propagation.B3SingleHeader: "00000000000000000000000000000000-0000000000000000-1", }, }, { name: "missing single header with valid separate headers", headers: map[string]string{ - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "00f067aa0ba902b7", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "00f067aa0ba902b7", + propagation.B3SampledHeader: "1", }, }, { name: "upper case span ID with valid separate headers", headers: map[string]string{ - propagators.B3SingleHeader: "ab000000000000000000000000000000-CD00000000000000-1", - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "00f067aa0ba902b7", - propagators.B3SampledHeader: "1", + propagation.B3SingleHeader: "ab000000000000000000000000000000-CD00000000000000-1", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "00f067aa0ba902b7", + propagation.B3SampledHeader: "1", }, }, { name: "with sampling set to true", headers: map[string]string{ - propagators.B3SingleHeader: "ab000000000000000000000000000000-cd00000000000000-true", + propagation.B3SingleHeader: "ab000000000000000000000000000000-cd00000000000000-true", }, }, } @@ -450,12 +450,12 @@ var injectB3MultipleHeader = []injectTest{ TraceFlags: core.TraceFlagsSampled, }, wantHeaders: map[string]string{ - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "0000000000000001", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "0000000000000001", + propagation.B3SampledHeader: "1", }, doNotWantHeaders: []string{ - propagators.B3ParentSpanIDHeader, + propagation.B3ParentSpanIDHeader, }, }, { @@ -465,12 +465,12 @@ var injectB3MultipleHeader = []injectTest{ SpanID: spanID, }, wantHeaders: map[string]string{ - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "0000000000000002", - propagators.B3SampledHeader: "0", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "0000000000000002", + propagation.B3SampledHeader: "0", }, doNotWantHeaders: []string{ - propagators.B3ParentSpanIDHeader, + propagation.B3ParentSpanIDHeader, }, }, { @@ -481,12 +481,12 @@ var injectB3MultipleHeader = []injectTest{ TraceFlags: 0xff, }, wantHeaders: map[string]string{ - propagators.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", - propagators.B3SpanIDHeader: "0000000000000003", - propagators.B3SampledHeader: "1", + propagation.B3TraceIDHeader: "4bf92f3577b34da6a3ce929d0e0e4736", + propagation.B3SpanIDHeader: "0000000000000003", + propagation.B3SampledHeader: "1", }, doNotWantHeaders: []string{ - propagators.B3ParentSpanIDHeader, + propagation.B3ParentSpanIDHeader, }, }, } @@ -500,13 +500,13 @@ var injectB3SingleleHeader = []injectTest{ TraceFlags: core.TraceFlagsSampled, }, wantHeaders: map[string]string{ - propagators.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-0000000000000001-1", + propagation.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-0000000000000001-1", }, doNotWantHeaders: []string{ - propagators.B3TraceIDHeader, - propagators.B3SpanIDHeader, - propagators.B3SampledHeader, - propagators.B3ParentSpanIDHeader, + propagation.B3TraceIDHeader, + propagation.B3SpanIDHeader, + propagation.B3SampledHeader, + propagation.B3ParentSpanIDHeader, }, }, { @@ -516,13 +516,13 @@ var injectB3SingleleHeader = []injectTest{ SpanID: spanID, }, wantHeaders: map[string]string{ - propagators.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-0000000000000002-0", + propagation.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-0000000000000002-0", }, doNotWantHeaders: []string{ - propagators.B3TraceIDHeader, - propagators.B3SpanIDHeader, - propagators.B3SampledHeader, - propagators.B3ParentSpanIDHeader, + propagation.B3TraceIDHeader, + propagation.B3SpanIDHeader, + propagation.B3SampledHeader, + propagation.B3ParentSpanIDHeader, }, }, { @@ -533,13 +533,13 @@ var injectB3SingleleHeader = []injectTest{ TraceFlags: 0xff, }, wantHeaders: map[string]string{ - propagators.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-0000000000000003-1", + propagation.B3SingleHeader: "4bf92f3577b34da6a3ce929d0e0e4736-0000000000000003-1", }, doNotWantHeaders: []string{ - propagators.B3TraceIDHeader, - propagators.B3SpanIDHeader, - propagators.B3SampledHeader, - propagators.B3ParentSpanIDHeader, + propagation.B3TraceIDHeader, + propagation.B3SpanIDHeader, + propagation.B3SampledHeader, + propagation.B3ParentSpanIDHeader, }, }, } diff --git a/api/propagators/b3_propagator_test.go b/api/trace/propagation/b3_propagator_test.go similarity index 79% rename from api/propagators/b3_propagator_test.go rename to api/trace/propagation/b3_propagator_test.go index c043258a94b..654db3513e8 100644 --- a/api/propagators/b3_propagator_test.go +++ b/api/trace/propagation/b3_propagator_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package propagators_test +package propagation_test import ( "context" @@ -21,8 +21,9 @@ import ( "github.com/google/go-cmp/cmp" - "go.opentelemetry.io/otel/api/propagators" + "go.opentelemetry.io/otel/api/context/propagation" "go.opentelemetry.io/otel/api/trace" + tpropagation "go.opentelemetry.io/otel/api/trace/propagation" mocktrace "go.opentelemetry.io/otel/internal/trace" ) @@ -55,7 +56,9 @@ func TestExtractB3(t *testing.T) { } for _, tg := range testGroup { - propagator := propagators.B3{SingleHeader: tg.singleHeader} + propagator := tpropagation.B3{SingleHeader: tg.singleHeader} + props := propagation.New(propagation.WithExtractors(propagator)) + for _, tt := range tg.tests { t.Run(tt.name, func(t *testing.T) { req, _ := http.NewRequest("GET", "http://example.com", nil) @@ -64,7 +67,8 @@ func TestExtractB3(t *testing.T) { } ctx := context.Background() - gotSc, _ := propagator.Extract(ctx, req.Header) + ctx = propagation.ExtractHTTP(ctx, props, req.Header) + gotSc := tpropagation.RemoteContext(ctx) if diff := cmp.Diff(gotSc, tt.wantSc); diff != "" { t.Errorf("%s: %s: -got +want %s", tg.name, tt.name, diff) } @@ -99,17 +103,18 @@ func TestInjectB3(t *testing.T) { for _, tg := range testGroup { id = 0 - propagator := propagators.B3{SingleHeader: tg.singleHeader} + propagator := tpropagation.B3{SingleHeader: tg.singleHeader} + props := propagation.New(propagation.WithInjectors(propagator)) for _, tt := range tg.tests { t.Run(tt.name, func(t *testing.T) { req, _ := http.NewRequest("GET", "http://example.com", nil) ctx := context.Background() if tt.parentSc.IsValid() { - ctx, _ = mockTracer.Start(ctx, "inject", trace.ChildOf(tt.parentSc)) + ctx, _ = mockTracer.Start(ctx, "inject", trace.WithParent(tpropagation.WithRemoteContext(ctx, tt.parentSc))) } else { ctx, _ = mockTracer.Start(ctx, "inject") } - propagator.Inject(ctx, req.Header) + propagation.InjectHTTP(ctx, props, req.Header) for h, v := range tt.wantHeaders { got, want := req.Header.Get(h), v @@ -129,11 +134,11 @@ func TestInjectB3(t *testing.T) { } func TestB3Propagator_GetAllKeys(t *testing.T) { - propagator := propagators.B3{SingleHeader: false} + propagator := tpropagation.B3{SingleHeader: false} want := []string{ - propagators.B3TraceIDHeader, - propagators.B3SpanIDHeader, - propagators.B3SampledHeader, + tpropagation.B3TraceIDHeader, + tpropagation.B3SpanIDHeader, + tpropagation.B3SampledHeader, } got := propagator.GetAllKeys() if diff := cmp.Diff(got, want); diff != "" { @@ -142,9 +147,9 @@ func TestB3Propagator_GetAllKeys(t *testing.T) { } func TestB3PropagatorWithSingleHeader_GetAllKeys(t *testing.T) { - propagator := propagators.B3{SingleHeader: true} + propagator := tpropagation.B3{SingleHeader: true} want := []string{ - propagators.B3SingleHeader, + tpropagation.B3SingleHeader, } got := propagator.GetAllKeys() if diff := cmp.Diff(got, want); diff != "" { diff --git a/api/trace/propagation/context.go b/api/trace/propagation/context.go new file mode 100644 index 00000000000..cff7c1d3935 --- /dev/null +++ b/api/trace/propagation/context.go @@ -0,0 +1,24 @@ +package propagation + +import ( + "context" + + "go.opentelemetry.io/otel/api/core" +) + +type remoteContextType struct{} + +var remoteContextKey = &remoteContextType{} + +// WithRemoteContext enters a core.SpanContext into a new Context. +func WithRemoteContext(ctx context.Context, sc core.SpanContext) context.Context { + return context.WithValue(ctx, remoteContextKey, sc) +} + +// RemoteContext gets the current core.SpanContext from a Context. +func RemoteContext(ctx context.Context) core.SpanContext { + if sc, ok := ctx.Value(remoteContextKey).(core.SpanContext); ok { + return sc + } + return core.EmptySpanContext() +} diff --git a/api/propagators/doc.go b/api/trace/propagation/doc.go similarity index 75% rename from api/propagators/doc.go rename to api/trace/propagation/doc.go index 5c7c9816941..91a352d461a 100644 --- a/api/propagators/doc.go +++ b/api/trace/propagation/doc.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package propagators contains interface definition for BinaryFormat and -// TextFormat propagators and implementation of propagators for different +// Package propagation contains interface definition for BinaryFormat and +// TextFormat propagation and implementation of propagation for different // format and suppliers. -package propagators // import "go.opentelemetry.io/otel/api/propagators" +package propagation // import "go.opentelemetry.io/otel/api/trace/propagation" diff --git a/api/trace/propagation/trace_context_propagator.go b/api/trace/propagation/trace_context_propagator.go new file mode 100644 index 00000000000..8b7d262f429 --- /dev/null +++ b/api/trace/propagation/trace_context_propagator.go @@ -0,0 +1,130 @@ +// Copyright 2019, 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 propagation + +import ( + "context" + "encoding/hex" + "fmt" + "regexp" + "strings" + + "go.opentelemetry.io/otel/api/context/propagation" + "go.opentelemetry.io/otel/api/core" + "go.opentelemetry.io/otel/api/trace" +) + +const ( + supportedVersion = 0 + maxVersion = 254 + TraceparentHeader = "Traceparent" + CorrelationContextHeader = "Correlation-Context" +) + +// TraceContext propagates SpanContext in W3C TraceContext format. +type TraceContext struct{} + +var _ propagation.HTTPPropagator = TraceContext{} +var traceCtxRegExp = regexp.MustCompile("^[0-9a-f]{2}-[a-f0-9]{32}-[a-f0-9]{16}-[a-f0-9]{2}-?") + +func (TraceContext) Inject(ctx context.Context, supplier propagation.HTTPSupplier) { + sc := trace.SpanFromContext(ctx).SpanContext() + if !sc.IsValid() { + return + } + h := fmt.Sprintf("%.2x-%s-%.16x-%.2x", + supportedVersion, + sc.TraceIDString(), + sc.SpanID, + sc.TraceFlags&core.TraceFlagsSampled) + supplier.Set(TraceparentHeader, h) +} + +func (tc TraceContext) Extract( + ctx context.Context, supplier propagation.HTTPSupplier, +) context.Context { + return WithRemoteContext(ctx, tc.extract(supplier)) +} + +func (TraceContext) extract(supplier propagation.HTTPSupplier) core.SpanContext { + h := supplier.Get(TraceparentHeader) + if h == "" { + return core.EmptySpanContext() + } + + h = strings.Trim(h, "-") + if !traceCtxRegExp.MatchString(h) { + return core.EmptySpanContext() + } + + sections := strings.Split(h, "-") + if len(sections) < 4 { + return core.EmptySpanContext() + } + + if len(sections[0]) != 2 { + return core.EmptySpanContext() + } + ver, err := hex.DecodeString(sections[0]) + if err != nil { + return core.EmptySpanContext() + } + version := int(ver[0]) + if version > maxVersion { + return core.EmptySpanContext() + } + + if version == 0 && len(sections) != 4 { + return core.EmptySpanContext() + } + + if len(sections[1]) != 32 { + return core.EmptySpanContext() + } + + var sc core.SpanContext + + sc.TraceID, err = core.TraceIDFromHex(sections[1][:32]) + if err != nil { + return core.EmptySpanContext() + } + + if len(sections[2]) != 16 { + return core.EmptySpanContext() + } + sc.SpanID, err = core.SpanIDFromHex(sections[2]) + if err != nil { + return core.EmptySpanContext() + } + + if len(sections[3]) != 2 { + return core.EmptySpanContext() + } + opts, err := hex.DecodeString(sections[3]) + if err != nil || len(opts) < 1 || (version == 0 && opts[0] > 2) { + return core.EmptySpanContext() + } + sc.TraceFlags = opts[0] &^ core.TraceFlagsUnused + + if !sc.IsValid() { + return core.EmptySpanContext() + } + + return sc +} + +func (TraceContext) GetAllKeys() []string { + return []string{TraceparentHeader} +} diff --git a/api/propagators/trace_context_propagator_benchmark_test.go b/api/trace/propagation/trace_context_propagator_benchmark_test.go similarity index 87% rename from api/propagators/trace_context_propagator_benchmark_test.go rename to api/trace/propagation/trace_context_propagator_benchmark_test.go index 7086b281072..6722b2d11c4 100644 --- a/api/propagators/trace_context_propagator_benchmark_test.go +++ b/api/trace/propagation/trace_context_propagator_benchmark_test.go @@ -1,4 +1,4 @@ -package propagators +package propagation_test import ( "context" @@ -7,11 +7,13 @@ import ( "go.opentelemetry.io/otel/api/core" "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/api/trace/propagation" + tpropagation "go.opentelemetry.io/otel/api/trace/propagation" mocktrace "go.opentelemetry.io/otel/internal/trace" ) func BenchmarkInject(b *testing.B) { - var t TraceContext + var t propagation.TraceContext injectSubBenchmarks(b, func(ctx context.Context, b *testing.B) { req, _ := http.NewRequest("GET", "http://example.com", nil) @@ -39,7 +41,7 @@ func injectSubBenchmarks(b *testing.B, fn func(context.Context, *testing.B)) { TraceFlags: core.TraceFlagsSampled, } ctx := context.Background() - ctx, _ = mockTracer.Start(ctx, "inject", trace.ChildOf(sc)) + ctx, _ = mockTracer.Start(ctx, "inject", trace.WithParent(tpropagation.WithRemoteContext(ctx, sc))) fn(ctx, b) }) @@ -52,7 +54,7 @@ func injectSubBenchmarks(b *testing.B, fn func(context.Context, *testing.B)) { func BenchmarkExtract(b *testing.B) { extractSubBenchmarks(b, func(b *testing.B, req *http.Request) { - var propagator TraceContext + var propagator tpropagation.TraceContext ctx := context.Background() b.ResetTimer() for i := 0; i < b.N; i++ { diff --git a/api/propagators/trace_context_propagator_test.go b/api/trace/propagation/trace_context_propagator_test.go similarity index 57% rename from api/propagators/trace_context_propagator_test.go rename to api/trace/propagation/trace_context_propagator_test.go index e9ffcd6aeb1..55fcbf0df68 100644 --- a/api/propagators/trace_context_propagator_test.go +++ b/api/trace/propagation/trace_context_propagator_test.go @@ -12,21 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -package propagators_test +package propagation_test import ( "context" "net/http" - "strings" "testing" "github.com/google/go-cmp/cmp" + "go.opentelemetry.io/otel/api/context/propagation" "go.opentelemetry.io/otel/api/core" - dctx "go.opentelemetry.io/otel/api/distributedcontext" - "go.opentelemetry.io/otel/api/key" - "go.opentelemetry.io/otel/api/propagators" "go.opentelemetry.io/otel/api/trace" + tpropagation "go.opentelemetry.io/otel/api/trace/propagation" mocktrace "go.opentelemetry.io/otel/internal/trace" ) @@ -46,7 +44,7 @@ func mustSpanIDFromHex(s string) (t core.SpanID) { } func TestExtractValidTraceContextFromHTTPReq(t *testing.T) { - var propagator propagators.TraceContext + props := propagation.New(propagation.WithExtractors(tpropagation.TraceContext{})) tests := []struct { name string header string @@ -130,7 +128,8 @@ func TestExtractValidTraceContextFromHTTPReq(t *testing.T) { req.Header.Set("traceparent", tt.header) ctx := context.Background() - gotSc, _ := propagator.Extract(ctx, req.Header) + ctx = propagation.ExtractHTTP(ctx, props, req.Header) + gotSc := tpropagation.RemoteContext(ctx) if diff := cmp.Diff(gotSc, tt.wantSc); diff != "" { t.Errorf("Extract Tracecontext: %s: -got +want %s", tt.name, diff) } @@ -139,8 +138,8 @@ func TestExtractValidTraceContextFromHTTPReq(t *testing.T) { } func TestExtractInvalidTraceContextFromHTTPReq(t *testing.T) { - var propagator propagators.TraceContext wantSc := core.EmptySpanContext() + props := propagation.New(propagation.WithExtractors(tpropagation.TraceContext{})) tests := []struct { name string header string @@ -217,7 +216,8 @@ func TestExtractInvalidTraceContextFromHTTPReq(t *testing.T) { req.Header.Set("traceparent", tt.header) ctx := context.Background() - gotSc, _ := propagator.Extract(ctx, req.Header) + ctx = propagation.ExtractHTTP(ctx, props, req.Header) + gotSc := tpropagation.RemoteContext(ctx) if diff := cmp.Diff(gotSc, wantSc); diff != "" { t.Errorf("Extract Tracecontext: %s: -got +want %s", tt.name, diff) } @@ -231,7 +231,7 @@ func TestInjectTraceContextToHTTPReq(t *testing.T) { Sampled: false, StartSpanID: &id, } - var propagator propagators.TraceContext + props := propagation.New(propagation.WithInjectors(tpropagation.TraceContext{})) tests := []struct { name string sc core.SpanContext @@ -274,9 +274,9 @@ func TestInjectTraceContextToHTTPReq(t *testing.T) { req, _ := http.NewRequest("GET", "http://example.com", nil) ctx := context.Background() if tt.sc.IsValid() { - ctx, _ = mockTracer.Start(ctx, "inject", trace.ChildOf(tt.sc)) + ctx, _ = mockTracer.Start(ctx, "inject", trace.WithParent(tpropagation.WithRemoteContext(ctx, tt.sc))) } - propagator.Inject(ctx, req.Header) + propagation.InjectHTTP(ctx, props, req.Header) gotHeader := req.Header.Get("traceparent") if diff := cmp.Diff(gotHeader, tt.wantHeader); diff != "" { @@ -286,197 +286,9 @@ func TestInjectTraceContextToHTTPReq(t *testing.T) { } } -func TestExtractValidDistributedContextFromHTTPReq(t *testing.T) { - propagator := propagators.TraceContext{} - tests := []struct { - name string - header string - wantKVs []core.KeyValue - }{ - { - name: "valid w3cHeader", - header: "key1=val1,key2=val2", - wantKVs: []core.KeyValue{ - key.New("key1").String("val1"), - key.New("key2").String("val2"), - }, - }, - { - name: "valid w3cHeader with spaces", - header: "key1 = val1, key2 =val2 ", - wantKVs: []core.KeyValue{ - key.New("key1").String("val1"), - key.New("key2").String("val2"), - }, - }, - { - name: "valid w3cHeader with properties", - header: "key1=val1,key2=val2;prop=1", - wantKVs: []core.KeyValue{ - key.New("key1").String("val1"), - key.New("key2").String("val2;prop=1"), - }, - }, - { - name: "valid header with url-escaped comma", - header: "key1=val1,key2=val2%2Cval3", - wantKVs: []core.KeyValue{ - key.New("key1").String("val1"), - key.New("key2").String("val2,val3"), - }, - }, - { - name: "valid header with an invalid header", - header: "key1=val1,key2=val2,a,val3", - wantKVs: []core.KeyValue{ - key.New("key1").String("val1"), - key.New("key2").String("val2"), - }, - }, - { - name: "valid header with no value", - header: "key1=,key2=val2", - wantKVs: []core.KeyValue{ - key.New("key1").String(""), - key.New("key2").String("val2"), - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - req, _ := http.NewRequest("GET", "http://example.com", nil) - req.Header.Set("Correlation-Context", tt.header) - - ctx := context.Background() - _, gotCorCtx := propagator.Extract(ctx, req.Header) - wantCorCtx := dctx.NewMap(dctx.MapUpdate{MultiKV: tt.wantKVs}) - if gotCorCtx.Len() != wantCorCtx.Len() { - t.Errorf( - "Got and Want CorCtx are not the same size %d != %d", - gotCorCtx.Len(), - wantCorCtx.Len(), - ) - } - totalDiff := "" - wantCorCtx.Foreach(func(kv core.KeyValue) bool { - val, _ := gotCorCtx.Value(kv.Key) - diff := cmp.Diff(kv, core.KeyValue{Key: kv.Key, Value: val}, cmp.AllowUnexported(core.Value{})) - if diff != "" { - totalDiff += diff + "\n" - } - return true - }) - if totalDiff != "" { - t.Errorf("Extract Tracecontext: %s: -got +want %s", tt.name, totalDiff) - } - }) - } -} - -func TestExtractInvalidDistributedContextFromHTTPReq(t *testing.T) { - propagator := propagators.TraceContext{} - tests := []struct { - name string - header string - }{ - { - name: "no key values", - header: "header1", - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - req, _ := http.NewRequest("GET", "http://example.com", nil) - req.Header.Set("Correlation-Context", tt.header) - - ctx := context.Background() - _, gotCorCtx := propagator.Extract(ctx, req.Header) - if gotCorCtx.Len() != 0 { - t.Errorf("Got and Want CorCtx are not the same size %d != %d", gotCorCtx.Len(), 0) - } - }) - } -} - -func TestInjectCorrelationContextToHTTPReq(t *testing.T) { - propagator := propagators.TraceContext{} - tests := []struct { - name string - kvs []core.KeyValue - wantInHeader []string - wantedLen int - }{ - { - name: "two simple values", - kvs: []core.KeyValue{ - key.New("key1").String("val1"), - key.New("key2").String("val2"), - }, - wantInHeader: []string{"key1=val1", "key2=val2"}, - }, - { - name: "two values with escaped chars", - kvs: []core.KeyValue{ - key.New("key1").String("val1,val2"), - key.New("key2").String("val3=4"), - }, - wantInHeader: []string{"key1=val1%2Cval2", "key2=val3%3D4"}, - }, - { - name: "values of non-string types", - kvs: []core.KeyValue{ - key.New("key1").Bool(true), - key.New("key2").Int(123), - key.New("key3").Int64(123), - key.New("key4").Int32(123), - key.New("key5").Uint(123), - key.New("key6").Uint32(123), - key.New("key7").Uint64(123), - key.New("key8").Float64(123.567), - key.New("key9").Float32(123.567), - }, - wantInHeader: []string{ - "key1=true", - "key2=123", - "key3=123", - "key4=123", - "key5=123", - "key6=123", - "key7=123", - "key8=123.567", - "key9=123.567", - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - req, _ := http.NewRequest("GET", "http://example.com", nil) - ctx := dctx.WithMap(context.Background(), dctx.NewMap(dctx.MapUpdate{MultiKV: tt.kvs})) - propagator.Inject(ctx, req.Header) - - gotHeader := req.Header.Get("Correlation-Context") - wantedLen := len(strings.Join(tt.wantInHeader, ",")) - if wantedLen != len(gotHeader) { - t.Errorf( - "%s: Inject Correlation-Context incorrect length %d != %d.", tt.name, tt.wantedLen, len(gotHeader), - ) - } - for _, inHeader := range tt.wantInHeader { - if !strings.Contains(gotHeader, inHeader) { - t.Errorf( - "%s: Inject Correlation-Context missing part of header: %s in %s", tt.name, inHeader, gotHeader, - ) - } - } - }) - } -} - func TestTraceContextPropagator_GetAllKeys(t *testing.T) { - var propagator propagators.TraceContext - want := []string{"Traceparent", "Correlation-Context"} + var propagator tpropagation.TraceContext + want := []string{"Traceparent"} got := propagator.GetAllKeys() if diff := cmp.Diff(got, want); diff != "" { t.Errorf("GetAllKeys: -got +want %s", diff) diff --git a/api/trace/testtrace/tracer.go b/api/trace/testtrace/tracer.go index deb3221bf04..e33f7bb5016 100644 --- a/api/trace/testtrace/tracer.go +++ b/api/trace/testtrace/tracer.go @@ -21,6 +21,8 @@ import ( "go.opentelemetry.io/otel/api/core" "go.opentelemetry.io/otel/api/trace" + + "go.opentelemetry.io/otel/internal/trace/parent" ) var _ trace.Tracer = (*Tracer)(nil) @@ -52,10 +54,9 @@ func (t *Tracer) Start(ctx context.Context, name string, opts ...trace.StartOpti var traceID core.TraceID var parentSpanID core.SpanID - if parentSpanContext := c.Relation.SpanContext; parentSpanContext.IsValid() { - traceID = parentSpanContext.TraceID - parentSpanID = parentSpanContext.SpanID - } else if parentSpanContext := trace.SpanFromContext(ctx).SpanContext(); parentSpanContext.IsValid() { + ctx, parentSpanContext, _ := parent.GetContext(ctx, c.Parent) + + if parentSpanContext.IsValid() { traceID = parentSpanContext.TraceID parentSpanID = parentSpanContext.SpanID } else { diff --git a/api/trace/testtrace/tracer_test.go b/api/trace/testtrace/tracer_test.go index 3c7907fd8f1..28acf7b75f6 100644 --- a/api/trace/testtrace/tracer_test.go +++ b/api/trace/testtrace/tracer_test.go @@ -74,17 +74,17 @@ func TestTracer(t *testing.T) { e.Expect(attributes[attr2.Key]).ToEqual(attr2.Value) }) - t.Run("uses the parent's span context from ChildOf", func(t *testing.T) { + t.Run("uses the parent's span context from WithParent", func(t *testing.T) { t.Parallel() e := matchers.NewExpecter(t) subject := testtrace.NewTracer() - _, parent := subject.Start(context.Background(), "parent") - parentSpanContext := parent.SpanContext() + parent, parentSpan := subject.Start(context.Background(), "parent") + parentSpanContext := parentSpan.SpanContext() - _, span := subject.Start(context.Background(), "child", trace.ChildOf(parentSpanContext)) + _, span := subject.Start(context.Background(), "child", trace.WithParent(parent)) testSpan, ok := span.(*testtrace.Span) e.Expect(ok).ToBeTrue() @@ -102,54 +102,11 @@ func TestTracer(t *testing.T) { subject := testtrace.NewTracer() - _, parent := subject.Start(context.Background(), "parent") - parentSpanContext := parent.SpanContext() + parentCtx, parentSpan := subject.Start(context.Background(), "parent") + parentSpanContext := parentSpan.SpanContext() ctx, _ := subject.Start(context.Background(), "should be ignored") - _, span := subject.Start(ctx, "child", trace.ChildOf(parentSpanContext)) - - testSpan, ok := span.(*testtrace.Span) - e.Expect(ok).ToBeTrue() - - childSpanContext := testSpan.SpanContext() - e.Expect(childSpanContext.TraceID).ToEqual(parentSpanContext.TraceID) - e.Expect(childSpanContext.SpanID).NotToEqual(parentSpanContext.SpanID) - e.Expect(testSpan.ParentSpanID()).ToEqual(parentSpanContext.SpanID) - }) - - t.Run("uses the parent's span context from FollowsFrom", func(t *testing.T) { - t.Parallel() - - e := matchers.NewExpecter(t) - - subject := testtrace.NewTracer() - - _, parent := subject.Start(context.Background(), "parent") - parentSpanContext := parent.SpanContext() - - _, span := subject.Start(context.Background(), "child", trace.FollowsFrom(parentSpanContext)) - - testSpan, ok := span.(*testtrace.Span) - e.Expect(ok).ToBeTrue() - - childSpanContext := testSpan.SpanContext() - e.Expect(childSpanContext.TraceID).ToEqual(parentSpanContext.TraceID) - e.Expect(childSpanContext.SpanID).NotToEqual(parentSpanContext.SpanID) - e.Expect(testSpan.ParentSpanID()).ToEqual(parentSpanContext.SpanID) - }) - - t.Run("defers to FollowsFrom if the provided context also contains a parent span", func(t *testing.T) { - t.Parallel() - - e := matchers.NewExpecter(t) - - subject := testtrace.NewTracer() - - _, parent := subject.Start(context.Background(), "parent") - parentSpanContext := parent.SpanContext() - - ctx, _ := subject.Start(context.Background(), "should be ignored") - _, span := subject.Start(ctx, "child", trace.FollowsFrom(parentSpanContext)) + _, span := subject.Start(ctx, "child", trace.WithParent(parentCtx)) testSpan, ok := span.(*testtrace.Span) e.Expect(ok).ToBeTrue() diff --git a/bridge/opentracing/bridge.go b/bridge/opentracing/bridge.go index 62a0ceb2ec9..a3f80e093cd 100644 --- a/bridge/opentracing/bridge.go +++ b/bridge/opentracing/bridge.go @@ -27,16 +27,18 @@ import ( otext "github.com/opentracing/opentracing-go/ext" otlog "github.com/opentracing/opentracing-go/log" + "go.opentelemetry.io/otel/api/context/baggage" + "go.opentelemetry.io/otel/api/core" otelcore "go.opentelemetry.io/otel/api/core" + "go.opentelemetry.io/otel/api/key" oteltrace "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/api/trace/propagation" "go.opentelemetry.io/otel/bridge/opentracing/migration" ) type bridgeSpanContext struct { - // TODO: have a look at the java implementation of the shim to - // see what do they do with the baggage items - baggageItems map[string]string + baggageItems baggage.Map otelSpanContext otelcore.SpanContext } @@ -44,7 +46,7 @@ var _ ot.SpanContext = &bridgeSpanContext{} func newBridgeSpanContext(otelSpanContext otelcore.SpanContext, parentOtSpanContext ot.SpanContext) *bridgeSpanContext { bCtx := &bridgeSpanContext{ - baggageItems: nil, + baggageItems: baggage.NewEmptyMap(), otelSpanContext: otelSpanContext, } if parentOtSpanContext != nil { @@ -57,24 +59,20 @@ func newBridgeSpanContext(otelSpanContext otelcore.SpanContext, parentOtSpanCont } func (c *bridgeSpanContext) ForeachBaggageItem(handler func(k, v string) bool) { - for k, v := range c.baggageItems { - if !handler(k, v) { - break - } - } + c.baggageItems.Foreach(func(kv core.KeyValue) bool { + return handler(string(kv.Key), kv.Value.Emit()) + }) } func (c *bridgeSpanContext) setBaggageItem(restrictedKey, value string) { - if c.baggageItems == nil { - c.baggageItems = make(map[string]string) - } crk := http.CanonicalHeaderKey(restrictedKey) - c.baggageItems[crk] = value + c.baggageItems.Apply(baggage.MapUpdate{SingleKV: key.New(crk).String(value)}) } func (c *bridgeSpanContext) baggageItem(restrictedKey string) string { crk := http.CanonicalHeaderKey(restrictedKey) - return c.baggageItems[crk] + val, _ := c.baggageItems.Value(key.New(crk)) + return val.Emit() } type bridgeSpan struct { @@ -309,15 +307,16 @@ func (t *BridgeTracer) StartSpan(operationName string, opts ...ot.StartSpanOptio for _, opt := range opts { opt.Apply(&sso) } - // TODO: handle links, needs SpanData to be in the API first? + // TODO: handle links bRelation, _ := otSpanReferencesToBridgeRelationAndLinks(sso.References) attributes, kind, hadTrueErrorTag := otTagsToOtelAttributesKindAndError(sso.Tags) checkCtx := migration.WithDeferredSetup(context.Background()) checkCtx2, otelSpan := t.setTracer.tracer().Start(checkCtx, operationName, func(opts *oteltrace.StartConfig) { opts.Attributes = attributes opts.StartTime = sso.StartTime - opts.Relation = bRelation.ToOtelRelation() + opts.Parent = bRelation.ToOtelParent() opts.Record = true + opts.Links = nil // TODO: handle links opts.SpanKind = kind }) if checkCtx != checkCtx2 { @@ -442,17 +441,21 @@ func otTagToOtelCoreKey(k string) otelcore.Key { type bridgeRelation struct { spanContext *bridgeSpanContext - relationshipType oteltrace.RelationshipType + relationshipType ot.SpanReferenceType } -func (r bridgeRelation) ToOtelRelation() oteltrace.Relation { +func (r bridgeRelation) ToOtelParent() context.Context { + ctx := context.Background() if r.spanContext == nil { - return oteltrace.Relation{} - } - return oteltrace.Relation{ - SpanContext: r.spanContext.otelSpanContext, - RelationshipType: r.relationshipType, + return ctx } + ctx = propagation.WithRemoteContext(ctx, core.SpanContext{ + TraceID: r.spanContext.otelSpanContext.TraceID, + SpanID: r.spanContext.otelSpanContext.SpanID, + // TODO: Flags + }) + // TODO: relationshipType + return ctx } func otSpanReferencesToBridgeRelationAndLinks(references []ot.SpanReference) (bridgeRelation, []*bridgeSpanContext) { @@ -462,7 +465,7 @@ func otSpanReferencesToBridgeRelationAndLinks(references []ot.SpanReference) (br first := references[0] relation := bridgeRelation{ spanContext: mustGetBridgeSpanContext(first.ReferencedContext), - relationshipType: otSpanReferenceTypeToOtelRelationshipType(first.Type), + relationshipType: first.Type, } var links []*bridgeSpanContext for _, reference := range references[1:] { @@ -479,17 +482,6 @@ func mustGetBridgeSpanContext(ctx ot.SpanContext) *bridgeSpanContext { return ourCtx } -func otSpanReferenceTypeToOtelRelationshipType(srt ot.SpanReferenceType) oteltrace.RelationshipType { - switch srt { - case ot.ChildOfRef: - return oteltrace.ChildOfRelationship - case ot.FollowsFromRef: - return oteltrace.FollowsFromRelationship - default: - panic("fix yer code, it uses bogus opentracing reference type") - } -} - // TODO: these headers are most likely bogus var ( traceIDHeader = http.CanonicalHeaderKey("x-otelbridge-trace-id") diff --git a/bridge/opentracing/internal/mock.go b/bridge/opentracing/internal/mock.go index 82781a0e19b..c1e6b3c7c0b 100644 --- a/bridge/opentracing/internal/mock.go +++ b/bridge/opentracing/internal/mock.go @@ -22,10 +22,12 @@ import ( "google.golang.org/grpc/codes" + otelbaggage "go.opentelemetry.io/otel/api/context/baggage" + otelctxprop "go.opentelemetry.io/otel/api/context/baggage/propagation" otelcore "go.opentelemetry.io/otel/api/core" - oteldctx "go.opentelemetry.io/otel/api/distributedcontext" otelkey "go.opentelemetry.io/otel/api/key" oteltrace "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/internal/trace/parent" "go.opentelemetry.io/otel/bridge/opentracing/migration" ) @@ -44,7 +46,7 @@ type MockContextKeyValue struct { } type MockTracer struct { - Resources oteldctx.Map + Resources otelbaggage.Map FinishedSpans []*MockSpan SpareTraceIDs []otelcore.TraceID SpareSpanIDs []otelcore.SpanID @@ -59,7 +61,7 @@ var _ migration.DeferredContextSetupTracerExtension = &MockTracer{} func NewMockTracer() *MockTracer { return &MockTracer{ - Resources: oteldctx.NewEmptyMap(), + Resources: otelbaggage.NewEmptyMap(), FinishedSpans: nil, SpareTraceIDs: nil, SpareSpanIDs: nil, @@ -94,7 +96,7 @@ func (t *MockTracer) Start(ctx context.Context, name string, opts ...oteltrace.S officialTracer: t, spanContext: spanContext, recording: spanOpts.Record, - Attributes: oteldctx.NewMap(oteldctx.MapUpdate{ + Attributes: otelbaggage.NewMap(otelbaggage.MapUpdate{ MultiKV: spanOpts.Attributes, }), StartTime: startTime, @@ -146,14 +148,8 @@ func (t *MockTracer) getParentSpanID(ctx context.Context, spanOpts *oteltrace.St } func (t *MockTracer) getParentSpanContext(ctx context.Context, spanOpts *oteltrace.StartConfig) otelcore.SpanContext { - if spanOpts.Relation.RelationshipType == oteltrace.ChildOfRelationship && - spanOpts.Relation.SpanContext.IsValid() { - return spanOpts.Relation.SpanContext - } - if parentSpanContext := oteltrace.SpanFromContext(ctx).SpanContext(); parentSpanContext.IsValid() { - return parentSpanContext - } - return otelcore.EmptySpanContext() + _, spanCtx, _ := parent.GetContext(ctx, spanOpts.Parent) + return spanCtx } func (t *MockTracer) getSpanID() otelcore.SpanID { @@ -193,10 +189,10 @@ func (t *MockTracer) DeferredContextSetupHook(ctx context.Context, span oteltrac } type MockEvent struct { - CtxAttributes oteldctx.Map + CtxAttributes otelbaggage.Map Timestamp time.Time Name string - Attributes oteldctx.Map + Attributes otelbaggage.Map } type MockSpan struct { @@ -206,7 +202,7 @@ type MockSpan struct { SpanKind oteltrace.SpanKind recording bool - Attributes oteldctx.Map + Attributes otelbaggage.Map StartTime time.Time EndTime time.Time ParentSpanID otelcore.SpanID @@ -237,12 +233,12 @@ func (s *MockSpan) SetError(v bool) { } func (s *MockSpan) SetAttributes(attributes ...otelcore.KeyValue) { - s.applyUpdate(oteldctx.MapUpdate{ + s.applyUpdate(otelbaggage.MapUpdate{ MultiKV: attributes, }) } -func (s *MockSpan) applyUpdate(update oteldctx.MapUpdate) { +func (s *MockSpan) applyUpdate(update otelbaggage.MapUpdate) { s.Attributes = s.Attributes.Apply(update) } @@ -274,10 +270,10 @@ func (s *MockSpan) AddEvent(ctx context.Context, name string, attrs ...otelcore. func (s *MockSpan) AddEventWithTimestamp(ctx context.Context, timestamp time.Time, name string, attrs ...otelcore.KeyValue) { s.Events = append(s.Events, MockEvent{ - CtxAttributes: oteldctx.FromContext(ctx), + CtxAttributes: otelctxprop.FromContext(ctx), Timestamp: timestamp, Name: name, - Attributes: oteldctx.NewMap(oteldctx.MapUpdate{ + Attributes: otelbaggage.NewMap(otelbaggage.MapUpdate{ MultiKV: attrs, }), }) diff --git a/example/basic/go.sum b/example/basic/go.sum index ee2fea89a7f..000605cb891 100644 --- a/example/basic/go.sum +++ b/example/basic/go.sum @@ -13,6 +13,7 @@ github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -28,6 +29,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -147,6 +150,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -272,12 +276,14 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/example/basic/main.go b/example/basic/main.go index f46e65cf416..e5304a7c6fd 100644 --- a/example/basic/main.go +++ b/example/basic/main.go @@ -18,12 +18,11 @@ import ( "context" "log" - "go.opentelemetry.io/otel/api/distributedcontext" + "go.opentelemetry.io/otel/api/context/baggage/propagation" "go.opentelemetry.io/otel/api/global" "go.opentelemetry.io/otel/api/key" "go.opentelemetry.io/otel/api/metric" "go.opentelemetry.io/otel/api/trace" - metricstdout "go.opentelemetry.io/otel/exporter/metric/stdout" tracestdout "go.opentelemetry.io/otel/exporter/trace/stdout" "go.opentelemetry.io/otel/sdk/metric/controller/push" sdktrace "go.opentelemetry.io/otel/sdk/trace" @@ -82,7 +81,7 @@ func main() { ctx := context.Background() - ctx = distributedcontext.NewContext(ctx, + ctx = propagation.NewContext(ctx, fooKey.String("foo1"), barKey.String("bar1"), ) @@ -105,7 +104,7 @@ func main() { meter.RecordBatch( // Note: call-site variables added as context Entries: - distributedcontext.NewContext(ctx, anotherKey.String("xyz")), + propagation.NewContext(ctx, anotherKey.String("xyz")), commonLabels, oneMetric.Measurement(1.0), diff --git a/example/grpc/go.mod b/example/grpc/go.mod index ac03cbdc308..919797fc85a 100644 --- a/example/grpc/go.mod +++ b/example/grpc/go.mod @@ -7,5 +7,5 @@ replace go.opentelemetry.io/otel => ../.. require ( github.com/golang/protobuf v1.3.2 go.opentelemetry.io/otel v0.2.0 - google.golang.org/grpc v1.24.0 + google.golang.org/grpc v1.25.1 ) diff --git a/example/grpc/go.sum b/example/grpc/go.sum index a0f76c64906..10eff217d91 100644 --- a/example/grpc/go.sum +++ b/example/grpc/go.sum @@ -13,6 +13,7 @@ github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -28,6 +29,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -146,6 +149,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -272,12 +276,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/example/grpc/middleware/tracing/tracing.go b/example/grpc/middleware/tracing/tracing.go index b737773ec53..cca5c87ae66 100644 --- a/example/grpc/middleware/tracing/tracing.go +++ b/example/grpc/middleware/tracing/tracing.go @@ -26,8 +26,9 @@ import ( "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" + "go.opentelemetry.io/otel/api/context/baggage" + "go.opentelemetry.io/otel/api/context/baggage/propagation" "go.opentelemetry.io/otel/api/core" - "go.opentelemetry.io/otel/api/distributedcontext" "go.opentelemetry.io/otel/api/global" "go.opentelemetry.io/otel/api/key" "go.opentelemetry.io/otel/api/trace" @@ -39,7 +40,7 @@ func UnaryServerInterceptor(ctx context.Context, req interface{}, info *grpc.Una metadataCopy := requestMetadata.Copy() entries, spanCtx := grpctrace.Extract(ctx, &metadataCopy) - ctx = distributedcontext.WithMap(ctx, distributedcontext.NewMap(distributedcontext.MapUpdate{ + ctx = propagation.WithMap(ctx, baggage.NewMap(baggage.MapUpdate{ MultiKV: entries, })) diff --git a/example/http-stackdriver/go.mod b/example/http-stackdriver/go.mod index 037ede1b031..5e74574abe1 100644 --- a/example/http-stackdriver/go.mod +++ b/example/http-stackdriver/go.mod @@ -10,5 +10,5 @@ replace ( require ( go.opentelemetry.io/otel v0.2.0 go.opentelemetry.io/otel/exporter/trace/stackdriver v0.2.0 - google.golang.org/grpc v1.24.0 + google.golang.org/grpc v1.25.1 ) diff --git a/example/http-stackdriver/go.sum b/example/http-stackdriver/go.sum index f3b43dc6ca2..5a45bc0a811 100644 --- a/example/http-stackdriver/go.sum +++ b/example/http-stackdriver/go.sum @@ -28,6 +28,7 @@ github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -43,6 +44,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -176,6 +179,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -368,8 +372,9 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/example/http/go.mod b/example/http/go.mod index 23f11185077..c185d41b0d3 100644 --- a/example/http/go.mod +++ b/example/http/go.mod @@ -6,5 +6,5 @@ replace go.opentelemetry.io/otel => ../.. require ( go.opentelemetry.io/otel v0.2.0 - google.golang.org/grpc v1.24.0 + google.golang.org/grpc v1.25.1 ) diff --git a/example/http/go.sum b/example/http/go.sum index 0d20305f518..d653e5cc95b 100644 --- a/example/http/go.sum +++ b/example/http/go.sum @@ -13,6 +13,7 @@ github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -28,6 +29,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -150,6 +153,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -278,12 +282,14 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= diff --git a/example/jaeger/go.sum b/example/jaeger/go.sum index 472d39199ad..6ca20dfb9d9 100644 --- a/example/jaeger/go.sum +++ b/example/jaeger/go.sum @@ -17,6 +17,7 @@ github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -32,6 +33,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -159,6 +162,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -303,13 +307,15 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/example/namedtracer/go.sum b/example/namedtracer/go.sum index ee2fea89a7f..000605cb891 100644 --- a/example/namedtracer/go.sum +++ b/example/namedtracer/go.sum @@ -13,6 +13,7 @@ github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -28,6 +29,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -147,6 +150,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -272,12 +276,14 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/example/prometheus/go.sum b/example/prometheus/go.sum index 34e41077b9b..9adc8e93bb4 100644 --- a/example/prometheus/go.sum +++ b/example/prometheus/go.sum @@ -14,6 +14,7 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -29,6 +30,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -151,6 +154,8 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -278,12 +283,14 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 h1:Nw54tB0rB7hY/N0NQvRW8DG4Yk3Q6T9cu9RcFQDu1tc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/exporter/metric/prometheus/go.sum b/exporter/metric/prometheus/go.sum index bac20f55cca..085a8410f87 100644 --- a/exporter/metric/prometheus/go.sum +++ b/exporter/metric/prometheus/go.sum @@ -14,6 +14,7 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -29,6 +30,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -149,6 +152,8 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4 h1:gQz4mCbXsO+nc9n1hCxHcGA3Zx3Eo+UHZoInFGUIXNM= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -274,12 +279,13 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/exporter/trace/jaeger/go.mod b/exporter/trace/jaeger/go.mod index 6f8842835a0..69f07e59c7e 100644 --- a/exporter/trace/jaeger/go.mod +++ b/exporter/trace/jaeger/go.mod @@ -10,5 +10,5 @@ require ( github.com/stretchr/testify v1.4.0 go.opentelemetry.io/otel v0.2.0 google.golang.org/api v0.11.0 - google.golang.org/grpc v1.24.0 + google.golang.org/grpc v1.25.1 ) diff --git a/exporter/trace/jaeger/go.sum b/exporter/trace/jaeger/go.sum index c2e3f007963..4618cc365ec 100644 --- a/exporter/trace/jaeger/go.sum +++ b/exporter/trace/jaeger/go.sum @@ -17,6 +17,7 @@ github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -32,6 +33,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -161,6 +164,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -306,13 +310,15 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/exporter/trace/stackdriver/go.mod b/exporter/trace/stackdriver/go.mod index 2e03801ba32..4fb5305da2f 100644 --- a/exporter/trace/stackdriver/go.mod +++ b/exporter/trace/stackdriver/go.mod @@ -12,5 +12,5 @@ require ( golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 google.golang.org/api v0.11.0 google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 - google.golang.org/grpc v1.24.0 + google.golang.org/grpc v1.25.1 ) diff --git a/exporter/trace/stackdriver/go.sum b/exporter/trace/stackdriver/go.sum index ef01d44fcae..3c2f1c4c9e0 100644 --- a/exporter/trace/stackdriver/go.sum +++ b/exporter/trace/stackdriver/go.sum @@ -27,6 +27,7 @@ github.com/benbjohnson/clock v1.0.0/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -42,6 +43,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -175,6 +178,7 @@ github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -365,8 +369,9 @@ google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZi google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/go.mod b/go.mod index 7e86c814ee9..c26ec0effea 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( golang.org/x/sys v0.0.0-20191010194322-b09406accb47 // indirect golang.org/x/tools v0.0.0-20191025174333-e96d959c4788 google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 // indirect - google.golang.org/grpc v1.24.0 + google.golang.org/grpc v1.25.1 mvdan.cc/unparam v0.0.0-20190917161559-b83a221c10a2 // indirect sourcegraph.com/sqs/pbtypes v1.0.0 // indirect ) diff --git a/go.sum b/go.sum index 1af69309501..316ab7729b9 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,7 @@ github.com/beorn7/perks v1.0.0 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/bombsimon/wsl v1.2.5 h1:9gTOkIwVtoDZywvX802SDHokeX4kW1cKnV8ZTVAPkRs= github.com/bombsimon/wsl v1.2.5/go.mod h1:43lEF/i0kpXbLCeDXL9LMT8c92HyBywXb0AsgMHYngM= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= @@ -33,6 +34,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= @@ -210,6 +213,7 @@ github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDf github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -284,6 +288,7 @@ github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opentelemetry.io v0.1.0 h1:EANZoRCOP+A3faIlw/iN6YEWoYb1vleZRKm1EvH8T48= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= @@ -359,12 +364,14 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 h1:4HYDjxeNXAOTv3o1N2tjo8UUSlhQgAD52FVkwxnWgM8= google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1 h1:wdKvqQk7IttEw92GoRyKG2IDrUIpgpj6H6m81yfeMW0= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/trace/mock_tracer.go b/internal/trace/mock_tracer.go index d6d033d03be..af04e034dec 100644 --- a/internal/trace/mock_tracer.go +++ b/internal/trace/mock_tracer.go @@ -22,6 +22,7 @@ import ( "go.opentelemetry.io/otel/api/core" apitrace "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/internal/trace/parent" ) // MockTracer is a simple tracer used for testing purpose only. @@ -54,14 +55,17 @@ func (mt *MockTracer) Start(ctx context.Context, name string, o ...apitrace.Star } var span *MockSpan var sc core.SpanContext - if !opts.Relation.SpanContext.IsValid() { + + ctx, parentSpanContext, _ := parent.GetContext(ctx, opts.Parent) + + if !parentSpanContext.IsValid() { sc = core.SpanContext{} _, _ = rand.Read(sc.TraceID[:]) if mt.Sampled { sc.TraceFlags = core.TraceFlagsSampled } } else { - sc = opts.Relation.SpanContext + sc = parentSpanContext } binary.BigEndian.PutUint64(sc.SpanID[:], atomic.AddUint64(mt.StartSpanID, 1)) diff --git a/internal/trace/parent/parent.go b/internal/trace/parent/parent.go new file mode 100644 index 00000000000..897245ea0e2 --- /dev/null +++ b/internal/trace/parent/parent.go @@ -0,0 +1,26 @@ +package parent + +import ( + "context" + + "go.opentelemetry.io/otel/api/core" + "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/api/trace/propagation" +) + +func getEffective(ctx context.Context) (core.SpanContext, bool) { + if sctx := trace.SpanFromContext(ctx).SpanContext(); sctx.IsValid() { + return sctx, false + } + return propagation.RemoteContext(ctx), true +} + +func GetContext(ctx, parent context.Context) (context.Context, core.SpanContext, bool) { + if parent != nil { + pctx, remote := getEffective(parent) + return parent, pctx, remote + } + + sctx, remote := getEffective(ctx) + return ctx, sctx, remote +} diff --git a/plugin/grpctrace/grpctrace.go b/plugin/grpctrace/grpctrace.go index 0f87b1bf2b7..86054b9284a 100644 --- a/plugin/grpctrace/grpctrace.go +++ b/plugin/grpctrace/grpctrace.go @@ -20,17 +20,11 @@ import ( "google.golang.org/grpc/metadata" + bpropagation "go.opentelemetry.io/otel/api/context/baggage/propagation" + "go.opentelemetry.io/otel/api/context/propagation" "go.opentelemetry.io/otel/api/core" - "go.opentelemetry.io/otel/api/propagators" -) - -const ( - // Vendor is the integration provider - Vendor = "ot" -) - -var ( - propagator = propagators.TraceContext{} + "go.opentelemetry.io/otel/api/global" + tpropagation "go.opentelemetry.io/otel/api/trace/propagation" ) type metadataSupplier struct { @@ -48,19 +42,20 @@ func (s *metadataSupplier) Set(key string, value string) { // Inject injects the gRPC call metadata into the Span func Inject(ctx context.Context, metadata *metadata.MD) { - propagator.Inject(ctx, &metadataSupplier{ + propagation.InjectHTTP(ctx, global.Propagators(), &metadataSupplier{ metadata: metadata, }) } // Extract returns the Context Entries and SpanContext that were encoded by Inject. func Extract(ctx context.Context, metadata *metadata.MD) ([]core.KeyValue, core.SpanContext) { - spanContext, correlationCtx := propagator.Extract(ctx, &metadataSupplier{ + ctx = propagation.ExtractHTTP(ctx, global.Propagators(), &metadataSupplier{ metadata: metadata, }) + spanContext := tpropagation.RemoteContext(ctx) var correlationCtxKVs []core.KeyValue - correlationCtx.Foreach(func(kv core.KeyValue) bool { + bpropagation.FromContext(ctx).Foreach(func(kv core.KeyValue) bool { correlationCtxKVs = append(correlationCtxKVs, kv) return true }) diff --git a/plugin/httptrace/httptrace.go b/plugin/httptrace/httptrace.go index 398b25e87ff..f62dc2f19c9 100644 --- a/plugin/httptrace/httptrace.go +++ b/plugin/httptrace/httptrace.go @@ -18,9 +18,12 @@ import ( "context" "net/http" + bpropagation "go.opentelemetry.io/otel/api/context/baggage/propagation" + "go.opentelemetry.io/otel/api/context/propagation" "go.opentelemetry.io/otel/api/core" + "go.opentelemetry.io/otel/api/global" "go.opentelemetry.io/otel/api/key" - "go.opentelemetry.io/otel/api/propagators" + tpropagation "go.opentelemetry.io/otel/api/trace/propagation" ) const ( @@ -30,13 +33,11 @@ const ( var ( HostKey = key.New("http.host") URLKey = key.New("http.url") - - propagator = propagators.TraceContext{} ) // Returns the Attributes, Context Entries, and SpanContext that were encoded by Inject. func Extract(ctx context.Context, req *http.Request) ([]core.KeyValue, []core.KeyValue, core.SpanContext) { - sc, correlationCtx := propagator.Extract(ctx, req.Header) + ctx = propagation.ExtractHTTP(ctx, global.Propagators(), req.Header) attrs := []core.KeyValue{ URLKey.String(req.URL.String()), @@ -44,14 +45,14 @@ func Extract(ctx context.Context, req *http.Request) ([]core.KeyValue, []core.Ke } var correlationCtxKVs []core.KeyValue - correlationCtx.Foreach(func(kv core.KeyValue) bool { + bpropagation.FromContext(ctx).Foreach(func(kv core.KeyValue) bool { correlationCtxKVs = append(correlationCtxKVs, kv) return true }) - return attrs, correlationCtxKVs, sc + return attrs, correlationCtxKVs, tpropagation.RemoteContext(ctx) } func Inject(ctx context.Context, req *http.Request) { - propagator.Inject(ctx, req.Header) + propagation.InjectHTTP(ctx, global.Propagators(), req.Header) } diff --git a/plugin/othttp/handler.go b/plugin/othttp/handler.go index c3583abe294..7128976a31a 100644 --- a/plugin/othttp/handler.go +++ b/plugin/othttp/handler.go @@ -18,10 +18,11 @@ import ( "io" "net/http" + "go.opentelemetry.io/otel/api/context/propagation" "go.opentelemetry.io/otel/api/core" "go.opentelemetry.io/otel/api/global" - "go.opentelemetry.io/otel/api/propagators" "go.opentelemetry.io/otel/api/trace" + tpropagation "go.opentelemetry.io/otel/api/trace/propagation" ) var _ http.Handler = &Handler{} @@ -50,7 +51,7 @@ type Handler struct { handler http.Handler tracer trace.Tracer - prop propagators.TextFormat + props propagation.Propagators spanStartOptions []trace.StartOption public bool readEvent bool @@ -77,12 +78,12 @@ func WithPublicEndpoint() Option { } } -// WithPropagator configures the Handler with a specific propagator. If this -// option isn't specificed then -// go.opentelemetry.io/otel/api/propagators.TraceContext is used. -func WithPropagator(p propagators.TextFormat) Option { +// WithPropagators configures the Handler with specific propagators. If this +// option isn't specified then +// go.opentelemetry.io/otel/api/global/Propagators are used. +func WithPropagators(ps propagation.Propagators) Option { return func(h *Handler) { - h.prop = p + h.props = ps } } @@ -130,7 +131,7 @@ func NewHandler(handler http.Handler, operation string, opts ...Option) http.Han h := Handler{handler: handler, operation: operation} defaultOpts := []Option{ WithTracer(global.TraceProvider().Tracer("go.opentelemetry.io/plugin/othttp")), - WithPropagator(propagators.TraceContext{}), + WithPropagators(global.Propagators()), WithSpanOptions(trace.WithSpanKind(trace.SpanKindServer)), } @@ -144,16 +145,17 @@ func NewHandler(handler http.Handler, operation string, opts ...Option) http.Han func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { opts := append([]trace.StartOption{}, h.spanStartOptions...) // start with the configured options - // TODO: do something with the correlation context - sc, _ := h.prop.Extract(r.Context(), r.Header) - if sc.IsValid() { // not a valid span context, so no link / parent relationship to establish + ctx := propagation.ExtractHTTP(r.Context(), h.props, r.Header) + + // not a valid span context, so no link / parent relationship to establish + if sc := tpropagation.RemoteContext(ctx); sc.IsValid() { var opt trace.StartOption if h.public { // If the endpoint is a public endpoint, it should start a new trace // and incoming remote sctx should be added as a link. opt = trace.LinkedTo(sc) } else { // not a private endpoint, so assume child relationship - opt = trace.ChildOf(sc) + opt = trace.WithParent(ctx) } opts = append(opts, opt) } @@ -177,7 +179,7 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } } - rww := &respWriterWrapper{ResponseWriter: w, record: writeRecordFunc, ctx: ctx, injector: h.prop} + rww := &respWriterWrapper{ResponseWriter: w, record: writeRecordFunc, ctx: ctx, props: h.props} // Setup basic span attributes before calling handler.ServeHTTP so that they // are available to be mutated by the handler if needed. @@ -221,8 +223,7 @@ func setAfterServeAttributes(span trace.Span, read, wrote, statusCode int64, rer func WithRouteTag(route string, h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { span := trace.SpanFromContext(r.Context()) - //TODO: Why doesn't tag.Upsert work? span.SetAttributes(RouteKey.String(route)) - h.ServeHTTP(w, r.WithContext(trace.ContextWithSpan(r.Context(), span))) + h.ServeHTTP(w, r) }) } diff --git a/plugin/othttp/handler_example_test.go b/plugin/othttp/handler_example_test.go index c41300bbf51..2e4ffc0ff03 100644 --- a/plugin/othttp/handler_example_test.go +++ b/plugin/othttp/handler_example_test.go @@ -76,7 +76,7 @@ func ExampleNewHandler() { func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() var name string - // Wrap another function in it's own span + // Wrap another function in its own span if err := trace.SpanFromContext(ctx).Tracer().WithSpan(ctx, "figureOutName", func(ctx context.Context) error { var err error diff --git a/plugin/othttp/handler_test.go b/plugin/othttp/handler_test.go index 4bc645d10f3..ea9bf222a48 100644 --- a/plugin/othttp/handler_test.go +++ b/plugin/othttp/handler_test.go @@ -20,7 +20,7 @@ import ( "net/http/httptest" "testing" - "go.opentelemetry.io/otel/api/propagators" + "go.opentelemetry.io/otel/api/trace/propagation" mocktrace "go.opentelemetry.io/otel/internal/trace" ) @@ -47,7 +47,7 @@ func TestBasics(t *testing.T) { if got, expected := rr.Result().StatusCode, http.StatusOK; got != expected { t.Fatalf("got %d, expected %d", got, expected) } - if got := rr.Header().Get(propagators.TraceparentHeader); got == "" { + if got := rr.Header().Get(propagation.TraceparentHeader); got == "" { t.Fatal("expected non empty trace header") } if got, expected := id, uint64(1); got != expected { diff --git a/plugin/othttp/wrap.go b/plugin/othttp/wrap.go index 95b3ec6bfe4..194abbd9253 100644 --- a/plugin/othttp/wrap.go +++ b/plugin/othttp/wrap.go @@ -19,7 +19,7 @@ import ( "io" "net/http" - "go.opentelemetry.io/otel/api/propagators" + "go.opentelemetry.io/otel/api/context/propagation" ) var _ io.ReadCloser = &bodyWrapper{} @@ -49,10 +49,6 @@ func (w *bodyWrapper) Close() error { var _ http.ResponseWriter = &respWriterWrapper{} -type injector interface { - Inject(context.Context, propagators.Supplier) -} - // respWriterWrapper wraps a http.ResponseWriter in order to track the number of // bytes written, the last error, and to catch the returned statusCode // TODO: The wrapped http.ResponseWriter doesn't implement any of the optional @@ -64,7 +60,8 @@ type respWriterWrapper struct { // used to inject the header ctx context.Context - injector + + props propagation.Propagators written int64 statusCode int @@ -95,6 +92,6 @@ func (w *respWriterWrapper) WriteHeader(statusCode int) { } w.wroteHeader = true w.statusCode = statusCode - w.injector.Inject(w.ctx, w.Header()) + propagation.InjectHTTP(w.ctx, w.props, w.Header()) w.ResponseWriter.WriteHeader(statusCode) } diff --git a/sdk/trace/batch_span_processor_test.go b/sdk/trace/batch_span_processor_test.go index 4c87894d1af..c49b5edd20e 100644 --- a/sdk/trace/batch_span_processor_test.go +++ b/sdk/trace/batch_span_processor_test.go @@ -23,6 +23,7 @@ import ( "go.opentelemetry.io/otel/api/core" apitrace "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/api/trace/propagation" export "go.opentelemetry.io/otel/sdk/export/trace" sdktrace "go.opentelemetry.io/otel/sdk/trace" ) @@ -183,11 +184,12 @@ func createAndRegisterBatchSP(t *testing.T, option testOption, te *testBatchExpo } func generateSpan(t *testing.T, tr apitrace.Tracer, option testOption) { + ctx := context.Background() sc := getSpanContext() for i := 0; i < option.genNumSpans; i++ { binary.BigEndian.PutUint64(sc.TraceID[0:8], uint64(i+1)) - _, span := tr.Start(context.Background(), option.name, apitrace.ChildOf(sc)) + _, span := tr.Start(ctx, option.name, apitrace.WithParent(propagation.WithRemoteContext(ctx, sc))) span.End() } } diff --git a/sdk/trace/simple_span_processor_test.go b/sdk/trace/simple_span_processor_test.go index 8d57f5cfb90..8b3edde4627 100644 --- a/sdk/trace/simple_span_processor_test.go +++ b/sdk/trace/simple_span_processor_test.go @@ -20,6 +20,7 @@ import ( "go.opentelemetry.io/otel/api/core" apitrace "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/api/trace/propagation" export "go.opentelemetry.io/otel/sdk/export/trace" sdktrace "go.opentelemetry.io/otel/sdk/trace" ) @@ -65,7 +66,8 @@ func TestSimpleSpanProcessorOnEnd(t *testing.T) { SpanID: sid, TraceFlags: 0x1, } - _, span := tr.Start(context.Background(), "OnEnd", apitrace.ChildOf(sc)) + ctx := context.Background() + _, span := tr.Start(ctx, "OnEnd", apitrace.WithParent(propagation.WithRemoteContext(ctx, sc))) span.End() wantTraceID := tid diff --git a/sdk/trace/trace_test.go b/sdk/trace/trace_test.go index ca566c56c17..9dee998e30a 100644 --- a/sdk/trace/trace_test.go +++ b/sdk/trace/trace_test.go @@ -31,6 +31,7 @@ import ( "go.opentelemetry.io/otel/api/testharness" "go.opentelemetry.io/otel/api/trace" apitrace "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/api/trace/propagation" export "go.opentelemetry.io/otel/sdk/export/trace" ) @@ -176,6 +177,7 @@ func TestSampling(t *testing.T) { var sampled int for i := 0; i < total; i++ { var opts []apitrace.StartOption + ctx := context.Background() if tc.parent { psc := core.SpanContext{ TraceID: idg.NewTraceID(), @@ -184,9 +186,9 @@ func TestSampling(t *testing.T) { if tc.sampledParent { psc.TraceFlags = core.TraceFlagsSampled } - opts = append(opts, apitrace.ChildOf(psc)) + opts = append(opts, apitrace.WithParent(propagation.WithRemoteContext(ctx, psc))) } - _, span := tr.Start(context.Background(), "test", opts...) + _, span := tr.Start(ctx, "test", opts...) if span.SpanContext().IsSampled() { sampled++ } @@ -211,18 +213,19 @@ func TestSampling(t *testing.T) { func TestStartSpanWithChildOf(t *testing.T) { tp, _ := NewProvider() tr := tp.Tracer("SpanWith ChildOf") + ctx := context.Background() sc1 := core.SpanContext{ TraceID: tid, SpanID: sid, TraceFlags: 0x0, } - _, s1 := tr.Start(context.Background(), "span1-unsampled-parent1", apitrace.ChildOf(sc1)) + _, s1 := tr.Start(ctx, "span1-unsampled-parent1", apitrace.WithParent(propagation.WithRemoteContext(ctx, sc1))) if err := checkChild(sc1, s1); err != nil { t.Error(err) } - _, s2 := tr.Start(context.Background(), "span2-unsampled-parent1", apitrace.ChildOf(sc1)) + _, s2 := tr.Start(ctx, "span2-unsampled-parent1", apitrace.WithParent(propagation.WithRemoteContext(ctx, sc1))) if err := checkChild(sc1, s2); err != nil { t.Error(err) } @@ -233,54 +236,12 @@ func TestStartSpanWithChildOf(t *testing.T) { TraceFlags: 0x1, //Tracestate: testTracestate, } - _, s3 := tr.Start(context.Background(), "span3-sampled-parent2", apitrace.ChildOf(sc2)) + _, s3 := tr.Start(context.Background(), "span3-sampled-parent2", apitrace.WithParent(propagation.WithRemoteContext(ctx, sc2))) if err := checkChild(sc2, s3); err != nil { t.Error(err) } - ctx, s4 := tr.Start(context.Background(), "span4-sampled-parent2", apitrace.ChildOf(sc2)) - if err := checkChild(sc2, s4); err != nil { - t.Error(err) - } - - s4Sc := s4.SpanContext() - _, s5 := tr.Start(ctx, "span5-implicit-childof-span4") - if err := checkChild(s4Sc, s5); err != nil { - t.Error(err) - } -} - -func TestStartSpanWithFollowsFrom(t *testing.T) { - tp, _ := NewProvider() - tr := tp.Tracer("SpanWith FollowsFrom") - - sc1 := core.SpanContext{ - TraceID: tid, - SpanID: sid, - TraceFlags: 0x0, - } - _, s1 := tr.Start(context.Background(), "span1-unsampled-parent1", apitrace.FollowsFrom(sc1)) - if err := checkChild(sc1, s1); err != nil { - t.Error(err) - } - - _, s2 := tr.Start(context.Background(), "span2-unsampled-parent1", apitrace.FollowsFrom(sc1)) - if err := checkChild(sc1, s2); err != nil { - t.Error(err) - } - - sc2 := core.SpanContext{ - TraceID: tid, - SpanID: sid, - TraceFlags: 0x1, - //Tracestate: testTracestate, - } - _, s3 := tr.Start(context.Background(), "span3-sampled-parent2", apitrace.FollowsFrom(sc2)) - if err := checkChild(sc2, s3); err != nil { - t.Error(err) - } - - ctx, s4 := tr.Start(context.Background(), "span4-sampled-parent2", apitrace.FollowsFrom(sc2)) + ctx, s4 := tr.Start(context.Background(), "span4-sampled-parent2", apitrace.WithParent(propagation.WithRemoteContext(ctx, sc2))) if err := checkChild(sc2, s4); err != nil { t.Error(err) } @@ -574,14 +535,15 @@ func TestLinksOverLimit(t *testing.T) { func TestSetSpanName(t *testing.T) { te := &testExporter{} tp, _ := NewProvider(WithSyncer(te)) + ctx := context.Background() want := "SetSpanName/SpanName-1" - _, span := tp.Tracer("SetSpanName").Start(context.Background(), "SpanName-1", - apitrace.ChildOf(core.SpanContext{ + _, span := tp.Tracer("SetSpanName").Start(ctx, "SpanName-1", + apitrace.WithParent(propagation.WithRemoteContext(ctx, core.SpanContext{ TraceID: tid, SpanID: sid, TraceFlags: 1, - }), + })), ) got, err := endSpan(te, span) if err != nil { @@ -662,11 +624,12 @@ func startSpan(tp *Provider, trName string, args ...apitrace.StartOption) apitra } // startNamed Span is a test utility func that starts a span with a -// passed name and with ChildOf option. remote span context contains +// passed name and with WithParent option. remote span context contains // TraceFlags with sampled bit set. This allows the span to be // automatically sampled. func startNamedSpan(tp *Provider, trName, name string, args ...apitrace.StartOption) apitrace.Span { - args = append(args, apitrace.ChildOf(remoteSpanContext()), apitrace.WithRecord()) + ctx := context.Background() + args = append(args, apitrace.WithParent(propagation.WithRemoteContext(ctx, remoteSpanContext())), apitrace.WithRecord()) _, span := tp.Tracer(trName).Start( context.Background(), name, @@ -678,7 +641,7 @@ func startNamedSpan(tp *Provider, trName, name string, args ...apitrace.StartOpt // endSpan is a test utility function that ends the span in the context and // returns the exported export.SpanData. // It requires that span be sampled using one of these methods -// 1. Passing parent span context using ChildOf option +// 1. Passing parent span context using WithParent option // 2. Use WithSampler(AlwaysSample()) // 3. Configuring AlwaysSample() as default sampler // @@ -739,9 +702,10 @@ func TestEndSpanTwice(t *testing.T) { func TestStartSpanAfterEnd(t *testing.T) { spans := make(fakeExporter) tp, _ := NewProvider(WithConfig(Config{DefaultSampler: AlwaysSample()}), WithSyncer(spans)) + ctx := context.Background() tr := tp.Tracer("SpanAfterEnd") - ctx, span0 := tr.Start(context.Background(), "parent", apitrace.ChildOf(remoteSpanContext())) + ctx, span0 := tr.Start(ctx, "parent", apitrace.WithParent(propagation.WithRemoteContext(ctx, remoteSpanContext()))) ctx1, span1 := tr.Start(ctx, "span-1") span1.End() // Start a new span with the context containing span-1 @@ -820,16 +784,18 @@ func TestExecutionTracerTaskEnd(t *testing.T) { tID, _ := core.TraceIDFromHex("0102030405060708090a0b0c0d0e0f") sID, _ := core.SpanIDFromHex("0001020304050607") + ctx := context.Background() _, apiSpan = tr.Start( - context.Background(), + ctx, "foo", - apitrace.ChildOf( - core.SpanContext{ - TraceID: tID, - SpanID: sID, - TraceFlags: 0, - }, + apitrace.WithParent( + propagation.WithRemoteContext(ctx, + core.SpanContext{ + TraceID: tID, + SpanID: sID, + TraceFlags: 0, + }), ), ) s = apiSpan.(*span) diff --git a/sdk/trace/tracer.go b/sdk/trace/tracer.go index 0832d392a24..606e9380ab6 100644 --- a/sdk/trace/tracer.go +++ b/sdk/trace/tracer.go @@ -17,8 +17,8 @@ package trace import ( "context" - "go.opentelemetry.io/otel/api/core" apitrace "go.opentelemetry.io/otel/api/trace" + "go.opentelemetry.io/otel/internal/trace/parent" ) type tracer struct { @@ -30,34 +30,21 @@ var _ apitrace.Tracer = &tracer{} func (tr *tracer) Start(ctx context.Context, name string, o ...apitrace.StartOption) (context.Context, apitrace.Span) { var opts apitrace.StartConfig - var parent core.SpanContext - var remoteParent bool - //TODO [rghetia] : Add new option for parent. If parent is configured then use that parent. for _, op := range o { op(&opts) } - if relation := opts.Relation; relation.SpanContext != core.EmptySpanContext() { - switch relation.RelationshipType { - case apitrace.ChildOfRelationship, apitrace.FollowsFromRelationship: - parent = relation.SpanContext - remoteParent = true - default: - // Future relationship types may have different behavior, - // e.g., adding a `Link` instead of setting the `parent` - } - } else { - if p := apitrace.SpanFromContext(ctx); p != nil { - if sdkSpan, ok := p.(*span); ok { - sdkSpan.addChild() - parent = sdkSpan.spanContext - } + ctx, parentSpanContext, remoteParent := parent.GetContext(ctx, opts.Parent) + + if p := apitrace.SpanFromContext(ctx); p != nil { + if sdkSpan, ok := p.(*span); ok { + sdkSpan.addChild() } } spanName := tr.spanNameWithPrefix(name) - span := startSpanInternal(tr, spanName, parent, remoteParent, opts) + span := startSpanInternal(tr, spanName, parentSpanContext, remoteParent, opts) for _, l := range opts.Links { span.addLink(l) }