diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index d73c34b837b..06d52b94a50 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -4,7 +4,7 @@ on: branches: - main env: - DEFAULT_GO_VERSION: 1.16 + DEFAULT_GO_VERSION: 1.17 jobs: benchmark: name: Benchmarks diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 23fb2e15ee3..da3fcf1b71f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -109,7 +109,7 @@ jobs: compatibility-test: strategy: matrix: - go-version: [1.18, 1.17, 1.16] + go-version: [1.18, 1.17] os: [ubuntu-latest, macos-latest, windows-latest] # GitHub Actions does not support arm* architectures on default # runners. It is possible to acomplish this with a self-hosted runner diff --git a/.github/workflows/dependabot.yml b/.github/workflows/dependabot.yml index c101ef4bb32..763d0427b00 100644 --- a/.github/workflows/dependabot.yml +++ b/.github/workflows/dependabot.yml @@ -13,7 +13,7 @@ jobs: ref: ${{ github.head_ref }} - uses: actions/setup-go@v3 with: - go-version: '^1.16.0' + go-version: '^1.17.0' - uses: evantorrie/mott-the-tidier@v1-beta id: modtidy with: diff --git a/.golangci.yml b/.golangci.yml index affba1f8378..253e3b35b52 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -10,12 +10,13 @@ linters: # Specifically enable linters we want to use. enable: - deadcode + - depguard - errcheck + - godot - gofmt - goimports - gosimple - govet - - godot - ineffassign - misspell - revive @@ -25,30 +26,221 @@ linters: - unused - varcheck - issues: + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + # Setting to unlimited so the linter only is run once to debug all issues. + max-issues-per-linter: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + # Setting to unlimited so the linter only is run once to debug all issues. + max-same-issues: 0 + # Excluding configuration per-path, per-linter, per-text and per-source. exclude-rules: - # helpers in tests often (rightfully) pass a *testing.T as their first argument - - path: _test\.go - text: "context.Context should be the first parameter of a function" + # TODO: Having appropriate comments for exported objects helps development, + # even for objects in internal packages. Appropriate comments for all + # exported objects should be added and this exclusion removed. + - path: '.*internal/.*' + text: "exported (method|function|type|const) (.+) should have comment or be unexported" linters: - revive - # Yes, they are, but it's okay in a test + # Yes, they are, but it's okay in a test. - path: _test\.go text: "exported func.*returns unexported type.*which can be annoying to use" linters: - revive + # Example test functions should be treated like main. + - path: example.*_test\.go + text: "calls to (.+) only in main[(][)] or init[(][)] functions" + linters: + - revive + include: + # revive exported should have comment or be unexported. + - EXC0012 + # revive package comment should be of the form ... + - EXC0013 linters-settings: - misspell: - locale: US - ignore-words: - - cancelled - goimports: - local-prefixes: go.opentelemetry.io + depguard: + # Check the list against standard lib. + # Default: false + include-go-root: true + # A list of packages for the list type specified. + # Default: [] + packages: + - "crypto/md5" + - "crypto/sha1" + - "crypto/**/pkix" + ignore-file-rules: + - "**/*_test.go" + additional-guards: + # Do not allow testing packages in non-test files. + - list-type: denylist + include-go-root: true + packages: + - testing + - github.com/stretchr/testify + ignore-file-rules: + - "**/*_test.go" + - "**/*test/*.go" + - "**/internal/matchers/*.go" godot: exclude: # Exclude sentence fragments for lists. - '^[ ]*[-•]' # Exclude sentences prefixing a list. - ':$' + goimports: + local-prefixes: go.opentelemetry.io + misspell: + locale: US + ignore-words: + - cancelled + revive: + # Sets the default failure confidence. + # This means that linting errors with less than 0.8 confidence will be ignored. + # Default: 0.8 + confidence: 0.01 + rules: + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#blank-imports + - name: blank-imports + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#bool-literal-in-expr + - name: bool-literal-in-expr + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#constant-logical-expr + - name: constant-logical-expr + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-as-argument + - name: context-as-argument + disabled: false + arguments: + allowTypesBefore: "*testing.T" + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#context-keys-type + - name: context-keys-type + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#deep-exit + - name: deep-exit + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#defer + - name: defer + disabled: false + arguments: + - ["call-chain", "loop"] + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#dot-imports + - name: dot-imports + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#duplicated-imports + - name: duplicated-imports + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#early-return + - name: early-return + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#empty-block + - name: empty-block + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#empty-lines + - name: empty-lines + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-naming + - name: error-naming + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-return + - name: error-return + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#error-strings + - name: error-strings + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#errorf + - name: errorf + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#exported + - name: exported + disabled: false + arguments: + - "sayRepetitiveInsteadOfStutters" + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#flag-parameter + - name: flag-parameter + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#identical-branches + - name: identical-branches + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#if-return + - name: if-return + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#increment-decrement + - name: increment-decrement + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#indent-error-flow + - name: indent-error-flow + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#import-shadowing + - name: import-shadowing + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#package-comments + - name: package-comments + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range + - name: range + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range-val-in-closure + - name: range-val-in-closure + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#range-val-address + - name: range-val-address + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#redefines-builtin-id + - name: redefines-builtin-id + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#string-format + - name: string-format + disabled: false + arguments: + - - panic + - '/^[^\n]*$/' + - must not contain line breaks + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#struct-tag + - name: struct-tag + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#superfluous-else + - name: superfluous-else + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#time-equal + - name: time-equal + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#var-naming + - name: var-naming + disabled: false + arguments: + - ["ID"] # AllowList + - ["Otel", "Aws", "Gcp"] # DenyList + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#var-declaration + - name: var-declaration + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unconditional-recursion + - name: unconditional-recursion + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unexported-return + - name: unexported-return + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unhandled-error + - name: unhandled-error + disabled: false + arguments: + - "fmt.Fprint" + - "fmt.Fprintf" + - "fmt.Fprintln" + - "fmt.Print" + - "fmt.Printf" + - "fmt.Println" + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#unnecessary-stmt + - name: unnecessary-stmt + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#useless-break + - name: useless-break + disabled: false + # https://github.com/mgechev/revive/blob/master/RULES_DESCRIPTIONS.md#waitgroup-by-value + - name: waitgroup-by-value + disabled: false diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e13e50b309..ca0334fbcea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,10 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm - The `crosslink` make target has been updated to use the `go.opentelemetry.io/build-tools/crosslink` package. (#2886) +### Removed + +- Support for go1.16. Support is now only for go1.17 and go1.18 (#2917) + ## [1.7.0/0.30.0] - 2022-04-28 ### Added diff --git a/README.md b/README.md index bd498695d0c..a127ce44ad7 100644 --- a/README.md +++ b/README.md @@ -43,26 +43,18 @@ This project is tested on the following systems. | ------- | ---------- | ------------ | | Ubuntu | 1.18 | amd64 | | Ubuntu | 1.17 | amd64 | -| Ubuntu | 1.16 | amd64 | | Ubuntu | 1.18 | 386 | | Ubuntu | 1.17 | 386 | -| Ubuntu | 1.16 | 386 | | MacOS | 1.18 | amd64 | | MacOS | 1.17 | amd64 | -| MacOS | 1.16 | amd64 | | Windows | 1.18 | amd64 | | Windows | 1.17 | amd64 | -| Windows | 1.16 | amd64 | | Windows | 1.18 | 386 | | Windows | 1.17 | 386 | -| Windows | 1.16 | 386 | While this project should work for other systems, no compatibility guarantees are made for those systems currently. -Go 1.18 was added in March of 2022. -Go 1.16 will be removed around June 2022. - ## Getting Started You can find a getting started guide on [opentelemetry.io](https://opentelemetry.io/docs/go/getting-started/). diff --git a/attribute/encoder.go b/attribute/encoder.go index dae1d8f61fd..fe2bc5766cf 100644 --- a/attribute/encoder.go +++ b/attribute/encoder.go @@ -133,9 +133,9 @@ func copyAndEscape(buf *bytes.Buffer, val string) { for _, ch := range val { switch ch { case '=', ',', escapeChar: - buf.WriteRune(escapeChar) + _, _ = buf.WriteRune(escapeChar) } - buf.WriteRune(ch) + _, _ = buf.WriteRune(ch) } } diff --git a/attribute/iterator_test.go b/attribute/iterator_test.go index 0a6ea92e172..a40432aaacc 100644 --- a/attribute/iterator_test.go +++ b/attribute/iterator_test.go @@ -56,7 +56,6 @@ func TestEmptyIterator(t *testing.T) { } func TestMergedIterator(t *testing.T) { - type inputs struct { name string keys1 []string diff --git a/attribute/set.go b/attribute/set.go index 5c24700866d..26be5983223 100644 --- a/attribute/set.go +++ b/attribute/set.go @@ -71,8 +71,8 @@ func EmptySet() *Set { return emptySet } -// reflect abbreviates reflect.ValueOf. -func (d Distinct) reflect() reflect.Value { +// reflectValue abbreviates reflect.ValueOf(d). +func (d Distinct) reflectValue() reflect.Value { return reflect.ValueOf(d.iface) } @@ -86,7 +86,7 @@ func (l *Set) Len() int { if l == nil || !l.equivalent.Valid() { return 0 } - return l.equivalent.reflect().Len() + return l.equivalent.reflectValue().Len() } // Get returns the KeyValue at ordered position idx in this set. @@ -94,7 +94,7 @@ func (l *Set) Get(idx int) (KeyValue, bool) { if l == nil { return KeyValue{}, false } - value := l.equivalent.reflect() + value := l.equivalent.reflectValue() if idx >= 0 && idx < value.Len() { // Note: The Go compiler successfully avoids an allocation for @@ -110,7 +110,7 @@ func (l *Set) Value(k Key) (Value, bool) { if l == nil { return Value{}, false } - rValue := l.equivalent.reflect() + rValue := l.equivalent.reflectValue() vlen := rValue.Len() idx := sort.Search(vlen, func(idx int) bool { diff --git a/attribute/value.go b/attribute/value.go index 6ec5cb290df..57899f682e7 100644 --- a/attribute/value.go +++ b/attribute/value.go @@ -25,7 +25,7 @@ import ( //go:generate stringer -type=Type // Type describes the type of the data Value holds. -type Type int +type Type int // nolint: revive // redefines builtin Type. // Value represents the value part in key-value pairs. type Value struct { diff --git a/baggage/baggage.go b/baggage/baggage.go index 824c67b27a3..9f82a2507b8 100644 --- a/baggage/baggage.go +++ b/baggage/baggage.go @@ -68,6 +68,9 @@ type Property struct { hasData bool } +// NewKeyProperty returns a new Property for key. +// +// If key is invalid, an error will be returned. func NewKeyProperty(key string) (Property, error) { if !keyRe.MatchString(key) { return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key) @@ -77,6 +80,9 @@ func NewKeyProperty(key string) (Property, error) { return p, nil } +// NewKeyValueProperty returns a new Property for key with value. +// +// If key or value are invalid, an error will be returned. func NewKeyValueProperty(key, value string) (Property, error) { if !keyRe.MatchString(key) { return newInvalidProperty(), fmt.Errorf("%w: %q", errInvalidKey, key) diff --git a/baggage/baggage_test.go b/baggage/baggage_test.go index 8cc4832ad00..609d6d05de9 100644 --- a/baggage/baggage_test.go +++ b/baggage/baggage_test.go @@ -612,7 +612,7 @@ func TestBaggageMembers(t *testing.T) { }, } - baggage := Baggage{list: baggage.List{ + bag := Baggage{list: baggage.List{ "foo": { Value: "1", Properties: []baggage.Property{ @@ -626,13 +626,13 @@ func TestBaggageMembers(t *testing.T) { }, }} - assert.ElementsMatch(t, members, baggage.Members()) + assert.ElementsMatch(t, members, bag.Members()) } func TestBaggageMember(t *testing.T) { - baggage := Baggage{list: baggage.List{"foo": {Value: "1"}}} - assert.Equal(t, Member{key: "foo", value: "1"}, baggage.Member("foo")) - assert.Equal(t, Member{}, baggage.Member("bar")) + bag := Baggage{list: baggage.List{"foo": {Value: "1"}}} + assert.Equal(t, Member{key: "foo", value: "1"}, bag.Member("foo")) + assert.Equal(t, Member{}, bag.Member("bar")) } func TestMemberKey(t *testing.T) { diff --git a/bridge/opentracing/bridge.go b/bridge/opentracing/bridge.go index 6b0e102e331..947321debc0 100644 --- a/bridge/opentracing/bridge.go +++ b/bridge/opentracing/bridge.go @@ -349,10 +349,14 @@ func (t *BridgeTracer) SetOpenTelemetryTracer(tracer trace.Tracer) { t.setTracer.isSet = true } +// SetTextMapPropagator sets propagator as the TextMapPropagator to use by the +// BridgeTracer. func (t *BridgeTracer) SetTextMapPropagator(propagator propagation.TextMapPropagator) { t.propagator = propagator } +// NewHookedContext returns a Context that has ctx as its parent and is +// wrapped to handle baggage set and get operations. func (t *BridgeTracer) NewHookedContext(ctx context.Context) context.Context { ctx = iBaggage.ContextWithSetHook(ctx, t.baggageSetHook) ctx = iBaggage.ContextWithGetHook(ctx, t.baggageGetHook) @@ -671,9 +675,9 @@ func (t *BridgeTracer) Extract(format interface{}, carrier interface{}) (ot.Span } header := http.Header(hhcarrier) ctx := t.getPropagator().Extract(context.Background(), propagation.HeaderCarrier(header)) - baggage := baggage.FromContext(ctx) + bag := baggage.FromContext(ctx) bridgeSC := &bridgeSpanContext{ - bag: baggage, + bag: bag, otelSpanContext: trace.SpanContextFromContext(ctx), } if !bridgeSC.otelSpanContext.IsValid() { diff --git a/bridge/opentracing/go.mod b/bridge/opentracing/go.mod index 5e362031cc9..ef802c32103 100644 --- a/bridge/opentracing/go.mod +++ b/bridge/opentracing/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/bridge/opentracing -go 1.16 +go 1.17 replace go.opentelemetry.io/otel => ../.. @@ -10,4 +10,9 @@ require ( go.opentelemetry.io/otel/trace v1.7.0 ) +require ( + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect +) + replace go.opentelemetry.io/otel/trace => ../../trace diff --git a/bridge/opentracing/internal/mock.go b/bridge/opentracing/internal/mock.go index 159e94d4048..4aeaad0096b 100644 --- a/bridge/opentracing/internal/mock.go +++ b/bridge/opentracing/internal/mock.go @@ -155,7 +155,7 @@ func (t *MockTracer) getRandSpanID() trace.SpanID { defer t.randLock.Unlock() sid := trace.SpanID{} - t.rand.Read(sid[:]) + _, _ = t.rand.Read(sid[:]) return sid } @@ -165,7 +165,7 @@ func (t *MockTracer) getRandTraceID() trace.TraceID { defer t.randLock.Unlock() tid := trace.TraceID{} - t.rand.Read(tid[:]) + _, _ = t.rand.Read(tid[:]) return tid } diff --git a/bridge/opentracing/util.go b/bridge/opentracing/util.go index 4914607f7f8..d770bacec42 100644 --- a/bridge/opentracing/util.go +++ b/bridge/opentracing/util.go @@ -33,6 +33,9 @@ func NewTracerPair(tracer trace.Tracer) (*BridgeTracer, *WrapperTracerProvider) return bridgeTracer, wrapperProvider } +// NewTracerPairWithContext is a convience function. It calls NewTracerPair +// and returns a hooked version of ctx with the created BridgeTracer along +// with the BridgeTracer and WrapperTracerProvider. func NewTracerPairWithContext(ctx context.Context, tracer trace.Tracer) (context.Context, *BridgeTracer, *WrapperTracerProvider) { bridgeTracer, wrapperProvider := NewTracerPair(tracer) ctx = bridgeTracer.NewHookedContext(ctx) diff --git a/bridge/opentracing/wrapper.go b/bridge/opentracing/wrapper.go index 3b6fa7bdb9a..8016ea2a87c 100644 --- a/bridge/opentracing/wrapper.go +++ b/bridge/opentracing/wrapper.go @@ -21,6 +21,8 @@ import ( "go.opentelemetry.io/otel/trace" ) +// WrapperTracerProvider is an OpenTelemetry TracerProvider that wraps an +// OpenTracing Tracer. type WrapperTracerProvider struct { wTracer *WrapperTracer } diff --git a/example/fib/go.mod b/example/fib/go.mod index 3a401f92ee2..ab7f0b26dc6 100644 --- a/example/fib/go.mod +++ b/example/fib/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/example/fib -go 1.16 +go 1.17 require ( go.opentelemetry.io/otel v1.7.0 @@ -9,6 +9,12 @@ require ( go.opentelemetry.io/otel/trace v1.7.0 ) +require ( + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 // indirect +) + replace go.opentelemetry.io/otel => ../.. replace go.opentelemetry.io/otel/exporters/stdout/stdouttrace => ../../exporters/stdout/stdouttrace diff --git a/example/jaeger/go.mod b/example/jaeger/go.mod index dfa5b00d5d8..08730f4584e 100644 --- a/example/jaeger/go.mod +++ b/example/jaeger/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/example/jaeger -go 1.16 +go 1.17 replace ( go.opentelemetry.io/otel => ../.. @@ -14,4 +14,13 @@ require ( go.opentelemetry.io/otel/sdk v1.7.0 ) +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/stretchr/objx v0.4.0 // indirect + go.opentelemetry.io/otel/trace v1.7.0 // indirect + golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 // indirect +) + replace go.opentelemetry.io/otel/trace => ../../trace diff --git a/example/jaeger/go.sum b/example/jaeger/go.sum index d739c043586..233cfd29693 100644 --- a/example/jaeger/go.sum +++ b/example/jaeger/go.sum @@ -1,5 +1,6 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -9,8 +10,9 @@ github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 h1:iGu644GcxtEcrInvDsQRCwJjtCIOlT2V7IRt6ah2Whw= diff --git a/example/namedtracer/go.mod b/example/namedtracer/go.mod index c35fe5bf676..86006a44c7c 100644 --- a/example/namedtracer/go.mod +++ b/example/namedtracer/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/example/namedtracer -go 1.16 +go 1.17 replace ( go.opentelemetry.io/otel => ../.. @@ -15,6 +15,11 @@ require ( go.opentelemetry.io/otel/trace v1.7.0 ) +require ( + github.com/go-logr/logr v1.2.3 // indirect + golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 // indirect +) + replace go.opentelemetry.io/otel/trace => ../../trace replace go.opentelemetry.io/otel/exporters/stdout/stdouttrace => ../../exporters/stdout/stdouttrace diff --git a/example/namedtracer/main.go b/example/namedtracer/main.go index bde51637f8b..68c51ce45c8 100644 --- a/example/namedtracer/main.go +++ b/example/namedtracer/main.go @@ -16,6 +16,7 @@ package main import ( "context" + "fmt" "log" "github.com/go-logr/stdr" @@ -38,12 +39,10 @@ var ( var tp *sdktrace.TracerProvider // initTracer creates and registers trace provider instance. -func initTracer() { - var err error +func initTracer() error { exp, err := stdouttrace.New(stdouttrace.WithPrettyPrint()) if err != nil { - log.Panicf("failed to initialize stdouttrace exporter %v\n", err) - return + return fmt.Errorf("failed to initialize stdouttrace exporter: %w", err) } bsp := sdktrace.NewBatchSpanProcessor(exp) tp = sdktrace.NewTracerProvider( @@ -51,6 +50,7 @@ func initTracer() { sdktrace.WithSpanProcessor(bsp), ) otel.SetTracerProvider(tp) + return nil } func main() { @@ -58,7 +58,9 @@ func main() { stdr.SetVerbosity(5) // initialize trace provider. - initTracer() + if err := initTracer(); err != nil { + log.Panic(err) + } // Create a named tracer with package path as its name. tracer := tp.Tracer("example/namedtracer/main") diff --git a/example/otel-collector/go.mod b/example/otel-collector/go.mod index 5232c23bf15..502d4f1d4f6 100644 --- a/example/otel-collector/go.mod +++ b/example/otel-collector/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/example/otel-collector -go 1.16 +go 1.17 replace ( go.opentelemetry.io/otel => ../.. @@ -15,6 +15,22 @@ require ( google.golang.org/grpc v1.46.2 ) +require ( + github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 // indirect + go.opentelemetry.io/proto/otlp v0.16.0 // indirect + golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect + golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect + golang.org/x/text v0.3.5 // indirect + google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect + google.golang.org/protobuf v1.28.0 // indirect +) + replace go.opentelemetry.io/otel/trace => ../../trace replace go.opentelemetry.io/otel/exporters/otlp/otlptrace => ../../exporters/otlp/otlptrace diff --git a/example/otel-collector/main.go b/example/otel-collector/main.go index 855a55e14bd..c3372ab482a 100644 --- a/example/otel-collector/main.go +++ b/example/otel-collector/main.go @@ -21,6 +21,8 @@ import ( "context" "fmt" "log" + "os" + "os/signal" "time" "google.golang.org/grpc" @@ -38,7 +40,7 @@ import ( // Initializes an OTLP exporter, and configures the corresponding trace and // metric providers. -func initProvider() func() { +func initProvider() (func(context.Context) error, error) { ctx := context.Background() res, err := resource.New(ctx, @@ -47,7 +49,9 @@ func initProvider() func() { semconv.ServiceNameKey.String("test-service"), ), ) - handleErr(err, "failed to create resource") + if err != nil { + return nil, fmt.Errorf("failed to create resource: %w", err) + } // If the OpenTelemetry Collector is running on a local cluster (minikube or // microk8s), it should be accessible through the NodePort service at the @@ -55,11 +59,15 @@ func initProvider() func() { // endpoint of your cluster. If you run the app inside k8s, then you can // probably connect directly to the service through dns conn, err := grpc.DialContext(ctx, "localhost:30080", grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithBlock()) - handleErr(err, "failed to create gRPC connection to collector") + if err != nil { + return nil, fmt.Errorf("failed to create gRPC connection to collector: %w", err) + } // Set up a trace exporter traceExporter, err := otlptracegrpc.New(ctx, otlptracegrpc.WithGRPCConn(conn)) - handleErr(err, "failed to create trace exporter") + if err != nil { + return nil, fmt.Errorf("failed to create trace exporter: %w", err) + } // Register the trace exporter with a TracerProvider, using a batch // span processor to aggregate spans before export. @@ -74,17 +82,25 @@ func initProvider() func() { // set global propagator to tracecontext (the default is no-op). otel.SetTextMapPropagator(propagation.TraceContext{}) - return func() { - // Shutdown will flush any remaining spans and shut down the exporter. - handleErr(tracerProvider.Shutdown(ctx), "failed to shutdown TracerProvider") - } + // Shutdown will flush any remaining spans and shut down the exporter. + return tracerProvider.Shutdown, nil } func main() { log.Printf("Waiting for connection...") - shutdown := initProvider() - defer shutdown() + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) + defer cancel() + + shutdown, err := initProvider() + if err != nil { + log.Fatal(err) + } + defer func() { + if err := shutdown(ctx); err != nil { + log.Fatal("failed to shutdown TracerProvider: %w", err) + } + }() tracer := otel.Tracer("test-tracer") @@ -98,7 +114,7 @@ func main() { // work begins ctx, span := tracer.Start( - context.Background(), + ctx, "CollectorExporter-Example", trace.WithAttributes(commonAttrs...)) defer span.End() @@ -112,9 +128,3 @@ func main() { log.Printf("Done!") } - -func handleErr(err error, message string) { - if err != nil { - log.Fatalf("%s: %v", message, err) - } -} diff --git a/example/passthrough/go.mod b/example/passthrough/go.mod index 4aa81e1666e..309ab90fda2 100644 --- a/example/passthrough/go.mod +++ b/example/passthrough/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/example/passthrough -go 1.16 +go 1.17 require ( go.opentelemetry.io/otel v1.7.0 @@ -9,6 +9,12 @@ require ( go.opentelemetry.io/otel/trace v1.7.0 ) +require ( + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 // indirect +) + replace ( go.opentelemetry.io/otel => ../.. go.opentelemetry.io/otel/sdk => ../../sdk diff --git a/example/passthrough/handler/handler.go b/example/passthrough/handler/handler.go index 1ba439deac2..b199dd2cf94 100644 --- a/example/passthrough/handler/handler.go +++ b/example/passthrough/handler/handler.go @@ -34,6 +34,8 @@ type Handler struct { next func(r *http.Request) } +// New returns a new Handler that will trace requests before handing them off +// to next. func New(next func(r *http.Request)) *Handler { // Like most instrumentation packages, this handler defaults to using the // global progatators and tracer providers. diff --git a/example/passthrough/main.go b/example/passthrough/main.go index cfab1dabb21..edd8f443016 100644 --- a/example/passthrough/main.go +++ b/example/passthrough/main.go @@ -16,6 +16,7 @@ package main import ( "context" + "fmt" "log" "net/http" "time" @@ -32,7 +33,10 @@ func main() { ctx := context.Background() initPassthroughGlobals() - tp := nonGlobalTracer() + tp, err := nonGlobalTracer() + if err != nil { + log.Fatal(err) + } defer func() { _ = tp.Shutdown(ctx) }() // make an initial http request @@ -74,16 +78,15 @@ func initPassthroughGlobals() { // nonGlobalTracer creates a trace provider instance for testing, but doesn't // set it as the global tracer provider. -func nonGlobalTracer() *sdktrace.TracerProvider { - var err error +func nonGlobalTracer() (*sdktrace.TracerProvider, error) { exp, err := stdouttrace.New(stdouttrace.WithPrettyPrint()) if err != nil { - log.Panicf("failed to initialize stdouttrace exporter %v\n", err) + return nil, fmt.Errorf("failed to initialize stdouttrace exporter: %w", err) } bsp := sdktrace.NewBatchSpanProcessor(exp) tp := sdktrace.NewTracerProvider( sdktrace.WithSampler(sdktrace.AlwaysSample()), sdktrace.WithSpanProcessor(bsp), ) - return tp + return tp, nil } diff --git a/example/zipkin/Dockerfile b/example/zipkin/Dockerfile index e269b63c56c..d7984583006 100644 --- a/example/zipkin/Dockerfile +++ b/example/zipkin/Dockerfile @@ -11,7 +11,7 @@ # 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. -FROM golang:1.16-alpine +FROM golang:1.17-alpine COPY . /go/src/github.com/open-telemetry/opentelemetry-go/ WORKDIR /go/src/github.com/open-telemetry/opentelemetry-go/example/zipkin/ RUN go install ./main.go diff --git a/example/zipkin/go.mod b/example/zipkin/go.mod index 12867fd9f45..ee973ef4c18 100644 --- a/example/zipkin/go.mod +++ b/example/zipkin/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/example/zipkin -go 1.16 +go 1.17 replace ( go.opentelemetry.io/otel => ../.. @@ -15,4 +15,11 @@ require ( go.opentelemetry.io/otel/trace v1.7.0 ) +require ( + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/openzipkin/zipkin-go v0.4.0 // indirect + golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect +) + replace go.opentelemetry.io/otel/trace => ../../trace diff --git a/example/zipkin/main.go b/example/zipkin/main.go index 4b6b2c396ba..c2e4a5f57b1 100644 --- a/example/zipkin/main.go +++ b/example/zipkin/main.go @@ -21,6 +21,7 @@ import ( "flag" "log" "os" + "os/signal" "time" "go.opentelemetry.io/otel" @@ -34,7 +35,7 @@ import ( var logger = log.New(os.Stderr, "zipkin-example", log.Ldate|log.Ltime|log.Llongfile) // initTracer creates a new trace provider instance and registers it as global trace provider. -func initTracer(url string) func() { +func initTracer(url string) (func(context.Context) error, error) { // Create Zipkin Exporter and install it as a global tracer. // // For demoing purposes, always sample. In a production application, you should @@ -45,7 +46,7 @@ func initTracer(url string) func() { zipkin.WithLogger(logger), ) if err != nil { - log.Fatal(err) + return nil, err } batcher := sdktrace.NewBatchSpanProcessor(exporter) @@ -59,19 +60,25 @@ func initTracer(url string) func() { ) otel.SetTracerProvider(tp) - return func() { - _ = tp.Shutdown(context.Background()) - } + return tp.Shutdown, nil } func main() { url := flag.String("zipkin", "http://localhost:9411/api/v2/spans", "zipkin url") flag.Parse() - shutdown := initTracer(*url) - defer shutdown() + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) + defer cancel() - ctx := context.Background() + shutdown, err := initTracer(*url) + if err != nil { + log.Fatal(err) + } + defer func() { + if err := shutdown(ctx); err != nil { + log.Fatal("failed to shutdown TracerProvider: %w", err) + } + }() tr := otel.GetTracerProvider().Tracer("component-main") ctx, span := tr.Start(ctx, "foo", trace.WithSpanKind(trace.SpanKindServer)) diff --git a/exporters/jaeger/go.mod b/exporters/jaeger/go.mod index c246328a566..d3565af55c8 100644 --- a/exporters/jaeger/go.mod +++ b/exporters/jaeger/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/exporters/jaeger -go 1.16 +go 1.17 require ( github.com/google/go-cmp v0.5.8 @@ -10,6 +10,16 @@ require ( go.opentelemetry.io/otel/trace v1.7.0 ) +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/stretchr/objx v0.1.0 // indirect + golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) + replace go.opentelemetry.io/otel/trace => ../../trace replace go.opentelemetry.io/otel => ../.. diff --git a/exporters/jaeger/jaeger.go b/exporters/jaeger/jaeger.go index 819db82c149..d9b58ec4f82 100644 --- a/exporters/jaeger/jaeger.go +++ b/exporters/jaeger/jaeger.go @@ -263,8 +263,8 @@ func keyValueToTag(keyValue attribute.KeyValue) *gen.Tag { attribute.INT64SLICE, attribute.FLOAT64SLICE, attribute.STRINGSLICE: - json, _ := json.Marshal(keyValue.Value.AsInterface()) - a := (string)(json) + data, _ := json.Marshal(keyValue.Value.AsInterface()) + a := (string)(data) tag = &gen.Tag{ Key: string(keyValue.Key), VStr: &a, diff --git a/exporters/jaeger/reconnecting_udp_client_test.go b/exporters/jaeger/reconnecting_udp_client_test.go index f21d4c13b0f..ba4b6cbef31 100644 --- a/exporters/jaeger/reconnecting_udp_client_test.go +++ b/exporters/jaeger/reconnecting_udp_client_test.go @@ -67,13 +67,15 @@ func newUDPConn() (net.PacketConn, *net.UDPConn, error) { addr, err := net.ResolveUDPAddr("udp", mockServer.LocalAddr().String()) if err != nil { - mockServer.Close() + // Best effort. + _ = mockServer.Close() return nil, nil, err } conn, err := net.DialUDP("udp", nil, addr) if err != nil { - mockServer.Close() + // Best effort. + _ = mockServer.Close() return nil, nil, err } diff --git a/exporters/jaeger/uploader.go b/exporters/jaeger/uploader.go index c5cdb0040c0..0b9d6e14d3e 100644 --- a/exporters/jaeger/uploader.go +++ b/exporters/jaeger/uploader.go @@ -34,6 +34,7 @@ type batchUploader interface { shutdown(context.Context) error } +// EndpointOption configures a Jaeger endpoint. type EndpointOption interface { newBatchUploader() (batchUploader, error) } @@ -75,6 +76,7 @@ func WithAgentEndpoint(options ...AgentEndpointOption) EndpointOption { }) } +// AgentEndpointOption configures a Jaeger agent endpoint. type AgentEndpointOption interface { apply(agentEndpointConfig) agentEndpointConfig } @@ -175,6 +177,7 @@ func WithCollectorEndpoint(options ...CollectorEndpointOption) EndpointOption { }) } +// CollectorEndpointOption configures a Jaeger collector endpoint. type CollectorEndpointOption interface { apply(collectorEndpointConfig) collectorEndpointConfig } @@ -306,7 +309,9 @@ func (c *collectorUploader) upload(ctx context.Context, batch *gen.Batch) error } _, _ = io.Copy(ioutil.Discard, resp.Body) - resp.Body.Close() + if err = resp.Body.Close(); err != nil { + return err + } if resp.StatusCode < 200 || resp.StatusCode >= 300 { return fmt.Errorf("failed to upload traces; HTTP status code: %d", resp.StatusCode) diff --git a/exporters/otlp/internal/retry/go.mod b/exporters/otlp/internal/retry/go.mod index 5f5641a4f3a..932a47ef7c6 100644 --- a/exporters/otlp/internal/retry/go.mod +++ b/exporters/otlp/internal/retry/go.mod @@ -1,8 +1,14 @@ module go.opentelemetry.io/otel/exporters/otlp/internal/retry -go 1.16 +go 1.17 require ( github.com/cenkalti/backoff/v4 v4.1.3 github.com/stretchr/testify v1.7.1 ) + +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) diff --git a/exporters/otlp/otlptrace/go.mod b/exporters/otlp/otlptrace/go.mod index bd2046ee07e..1046997b7a6 100644 --- a/exporters/otlp/otlptrace/go.mod +++ b/exporters/otlp/otlptrace/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/exporters/otlp/otlptrace -go 1.16 +go 1.17 require ( github.com/google/go-cmp v0.5.8 @@ -14,6 +14,21 @@ require ( google.golang.org/protobuf v1.28.0 ) +require ( + github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect + golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect + golang.org/x/text v0.3.5 // indirect + google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) + replace go.opentelemetry.io/otel => ../../.. replace go.opentelemetry.io/otel/sdk => ../../../sdk diff --git a/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go b/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go index c2c56595985..2fafbcd82bf 100644 --- a/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go +++ b/exporters/otlp/otlptrace/internal/otlpconfig/envconfig.go @@ -118,8 +118,7 @@ func WithEnvCompression(n string, fn func(Compression)) func(e *envconfig.EnvOpt return func(e *envconfig.EnvOptionsReader) { if v, ok := e.GetEnvValue(n); ok { cp := NoCompression - switch v { - case "gzip": + if v == "gzip" { cp = GzipCompression } diff --git a/exporters/otlp/otlptrace/internal/otlpconfig/options_test.go b/exporters/otlp/otlptrace/internal/otlpconfig/options_test.go index 3d50e057bef..adbdc932f53 100644 --- a/exporters/otlp/otlptrace/internal/otlpconfig/options_test.go +++ b/exporters/otlp/otlptrace/internal/otlpconfig/options_test.go @@ -60,7 +60,7 @@ func (f *fileReader) readFile(filename string) ([]byte, error) { if b, ok := (*f)[filename]; ok { return b, nil } - return nil, errors.New("File not found") + return nil, errors.New("file not found") } func TestConfigs(t *testing.T) { diff --git a/exporters/otlp/otlptrace/internal/tracetransform/attribute.go b/exporters/otlp/otlptrace/internal/tracetransform/attribute.go index d9086a390de..ec74f1aad75 100644 --- a/exporters/otlp/otlptrace/internal/tracetransform/attribute.go +++ b/exporters/otlp/otlptrace/internal/tracetransform/attribute.go @@ -48,8 +48,8 @@ func Iterator(iter attribute.Iterator) []*commonpb.KeyValue { } // ResourceAttributes transforms a Resource OTLP key-values. -func ResourceAttributes(resource *resource.Resource) []*commonpb.KeyValue { - return Iterator(resource.Iter()) +func ResourceAttributes(res *resource.Resource) []*commonpb.KeyValue { + return Iterator(res.Iter()) } // KeyValue transforms an attribute KeyValue into an OTLP key-value. diff --git a/exporters/otlp/otlptrace/internal/tracetransform/attribute_test.go b/exporters/otlp/otlptrace/internal/tracetransform/attribute_test.go index 09f6a4c335d..3f335f12392 100644 --- a/exporters/otlp/otlptrace/internal/tracetransform/attribute_test.go +++ b/exporters/otlp/otlptrace/internal/tracetransform/attribute_test.go @@ -168,7 +168,6 @@ func TestArrayAttributes(t *testing.T) { assertExpectedArrayValues(t, expected.Values, actual.Values) } } - } } diff --git a/exporters/otlp/otlptrace/internal/tracetransform/span_test.go b/exporters/otlp/otlptrace/internal/tracetransform/span_test.go index b091b81c921..3bb203eae80 100644 --- a/exporters/otlp/otlptrace/internal/tracetransform/span_test.go +++ b/exporters/otlp/otlptrace/internal/tracetransform/span_test.go @@ -175,7 +175,6 @@ func TestStatus(t *testing.T) { expected := &tracepb.Status{Code: test.otlpStatus, Message: test.message} assert.Equal(t, expected, status(test.code, test.message)) } - } func TestNilSpan(t *testing.T) { diff --git a/exporters/otlp/otlptrace/otlptracegrpc/client.go b/exporters/otlp/otlptrace/otlptracegrpc/client.go index 31ed8190b67..6be3fec8626 100644 --- a/exporters/otlp/otlptrace/otlptracegrpc/client.go +++ b/exporters/otlp/otlptrace/otlptracegrpc/client.go @@ -265,8 +265,8 @@ func retryable(err error) (bool, time.Duration) { // throttleDelay returns a duration to wait for if an explicit throttle time // is included in the response status. -func throttleDelay(status *status.Status) time.Duration { - for _, detail := range status.Details() { +func throttleDelay(s *status.Status) time.Duration { + for _, detail := range s.Details() { if t, ok := detail.(*errdetails.RetryInfo); ok { return t.RetryDelay.AsDuration() } diff --git a/exporters/otlp/otlptrace/otlptracegrpc/go.mod b/exporters/otlp/otlptrace/otlptracegrpc/go.mod index 06b8c21fb4c..bd28d8dcf7c 100644 --- a/exporters/otlp/otlptrace/otlptracegrpc/go.mod +++ b/exporters/otlp/otlptrace/otlptracegrpc/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc -go 1.16 +go 1.17 require ( github.com/stretchr/testify v1.7.1 @@ -15,6 +15,21 @@ require ( google.golang.org/protobuf v1.28.0 ) +require ( + github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.opentelemetry.io/otel/trace v1.7.0 // indirect + golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect + golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect + golang.org/x/text v0.3.5 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) + replace go.opentelemetry.io/otel => ../../../.. replace go.opentelemetry.io/otel/sdk => ../../../../sdk diff --git a/exporters/otlp/otlptrace/otlptracegrpc/options.go b/exporters/otlp/otlptrace/otlptracegrpc/options.go index e2e5bd696f6..3d09ce590d0 100644 --- a/exporters/otlp/otlptrace/otlptracegrpc/options.go +++ b/exporters/otlp/otlptrace/otlptracegrpc/options.go @@ -84,8 +84,7 @@ func WithReconnectionPeriod(rp time.Duration) Option { } func compressorToCompression(compressor string) otlpconfig.Compression { - switch compressor { - case "gzip": + if compressor == "gzip" { return otlpconfig.GzipCompression } diff --git a/exporters/otlp/otlptrace/otlptracehttp/example_test.go b/exporters/otlp/otlptrace/otlptracehttp/example_test.go index 10027c03e9f..459ee94d6f8 100644 --- a/exporters/otlp/otlptrace/otlptracehttp/example_test.go +++ b/exporters/otlp/otlptrace/otlptracehttp/example_test.go @@ -16,6 +16,7 @@ package otlptracehttp_test import ( "context" + "fmt" "log" "go.opentelemetry.io/otel" @@ -64,11 +65,11 @@ func newResource() *resource.Resource { ) } -func installExportPipeline(ctx context.Context) func() { +func installExportPipeline(ctx context.Context) (func(context.Context) error, error) { client := otlptracehttp.NewClient() exporter, err := otlptrace.New(ctx, client) if err != nil { - log.Fatalf("creating OTLP trace exporter: %v", err) + return nil, fmt.Errorf("creating OTLP trace exporter: %w", err) } tracerProvider := sdktrace.NewTracerProvider( @@ -77,18 +78,21 @@ func installExportPipeline(ctx context.Context) func() { ) otel.SetTracerProvider(tracerProvider) - return func() { - if err := tracerProvider.Shutdown(ctx); err != nil { - log.Fatalf("stopping tracer provider: %v", err) - } - } + return tracerProvider.Shutdown, nil } func Example() { ctx := context.Background() // Registers a tracer Provider globally. - cleanup := installExportPipeline(ctx) - defer cleanup() + shutdown, err := installExportPipeline(ctx) + if err != nil { + log.Fatal(err) + } + defer func() { + if err := shutdown(ctx); err != nil { + log.Fatal(err) + } + }() log.Println("the answer is", add(ctx, multiply(ctx, multiply(ctx, 2, 2), 10), 2)) } diff --git a/exporters/otlp/otlptrace/otlptracehttp/go.mod b/exporters/otlp/otlptrace/otlptracehttp/go.mod index 23940e9a5c0..0a4943c84ea 100644 --- a/exporters/otlp/otlptrace/otlptracehttp/go.mod +++ b/exporters/otlp/otlptrace/otlptracehttp/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp -go 1.16 +go 1.17 require ( github.com/stretchr/testify v1.7.1 @@ -13,6 +13,22 @@ require ( google.golang.org/protobuf v1.28.0 ) +require ( + github.com/cenkalti/backoff/v4 v4.1.3 // indirect + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect + golang.org/x/sys v0.0.0-20210510120138-977fb7262007 // indirect + golang.org/x/text v0.3.5 // indirect + google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1 // indirect + google.golang.org/grpc v1.46.2 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) + replace go.opentelemetry.io/otel/exporters/otlp/otlptrace => ../ replace go.opentelemetry.io/otel => ../../../.. diff --git a/exporters/stdout/stdouttrace/config.go b/exporters/stdout/stdouttrace/config.go index 6b5a97b04cf..2cb534a75e9 100644 --- a/exporters/stdout/stdouttrace/config.go +++ b/exporters/stdout/stdouttrace/config.go @@ -48,7 +48,6 @@ func newConfig(options ...Option) (config, error) { } for _, opt := range options { cfg = opt.apply(cfg) - } return cfg, nil } diff --git a/exporters/stdout/stdouttrace/doc.go b/exporters/stdout/stdouttrace/doc.go index b76af55960f..8da3268c7c7 100644 --- a/exporters/stdout/stdouttrace/doc.go +++ b/exporters/stdout/stdouttrace/doc.go @@ -12,6 +12,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package stdout contains an OpenTelemetry exporter for tracing +// Package stdouttrace contains an OpenTelemetry exporter for tracing // telemetry to be written to an output destination as JSON. package stdouttrace // import "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" diff --git a/exporters/stdout/stdouttrace/example_test.go b/exporters/stdout/stdouttrace/example_test.go index cedfeae6a60..3a8c1c005d7 100644 --- a/exporters/stdout/stdouttrace/example_test.go +++ b/exporters/stdout/stdouttrace/example_test.go @@ -16,6 +16,7 @@ package stdouttrace_test import ( "context" + "fmt" "log" "go.opentelemetry.io/otel" @@ -63,10 +64,10 @@ func Resource() *resource.Resource { ) } -func InstallExportPipeline(ctx context.Context) func() { +func InstallExportPipeline(ctx context.Context) (func(context.Context) error, error) { exporter, err := stdouttrace.New(stdouttrace.WithPrettyPrint()) if err != nil { - log.Fatalf("creating stdout exporter: %v", err) + return nil, fmt.Errorf("creating stdout exporter: %w", err) } tracerProvider := sdktrace.NewTracerProvider( @@ -75,19 +76,22 @@ func InstallExportPipeline(ctx context.Context) func() { ) otel.SetTracerProvider(tracerProvider) - return func() { - if err := tracerProvider.Shutdown(ctx); err != nil { - log.Fatalf("stopping tracer provider: %v", err) - } - } + return tracerProvider.Shutdown, nil } func Example() { ctx := context.Background() // Registers a tracer Provider globally. - cleanup := InstallExportPipeline(ctx) - defer cleanup() + shutdown, err := InstallExportPipeline(ctx) + if err != nil { + log.Fatal(err) + } + defer func() { + if err := shutdown(ctx); err != nil { + log.Fatal(err) + } + }() log.Println("the answer is", add(ctx, multiply(ctx, multiply(ctx, 2, 2), 10), 2)) } diff --git a/exporters/stdout/stdouttrace/go.mod b/exporters/stdout/stdouttrace/go.mod index 8edf46f1dc5..c88327cb2ae 100644 --- a/exporters/stdout/stdouttrace/go.mod +++ b/exporters/stdout/stdouttrace/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/exporters/stdout/stdouttrace -go 1.16 +go 1.17 replace ( go.opentelemetry.io/otel => ../../.. @@ -14,4 +14,13 @@ require ( go.opentelemetry.io/otel/trace v1.7.0 ) +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) + replace go.opentelemetry.io/otel/trace => ../../../trace diff --git a/exporters/stdout/stdouttrace/trace_test.go b/exporters/stdout/stdouttrace/trace_test.go index 77ceae2baeb..649312bf697 100644 --- a/exporters/stdout/stdouttrace/trace_test.go +++ b/exporters/stdout/stdouttrace/trace_test.go @@ -41,7 +41,7 @@ func TestExporterExportSpan(t *testing.T) { traceState, _ := trace.ParseTraceState("key=val") keyValue := "value" doubleValue := 123.456 - resource := resource.NewSchemaless(attribute.String("rk1", "rv11")) + res := resource.NewSchemaless(attribute.String("rk1", "rv11")) ss := tracetest.SpanStub{ SpanContext: trace.NewSpanContext(trace.SpanContextConfig{ @@ -65,7 +65,7 @@ func TestExporterExportSpan(t *testing.T) { Code: codes.Error, Description: "interesting", }, - Resource: resource, + Resource: res, } tests := []struct { diff --git a/exporters/zipkin/go.mod b/exporters/zipkin/go.mod index 40cc03313a8..fd070111af8 100644 --- a/exporters/zipkin/go.mod +++ b/exporters/zipkin/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/exporters/zipkin -go 1.16 +go 1.17 require ( github.com/google/go-cmp v0.5.8 @@ -11,6 +11,15 @@ require ( go.opentelemetry.io/otel/trace v1.7.0 ) +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect +) + replace go.opentelemetry.io/otel/trace => ../../trace replace go.opentelemetry.io/otel => ../.. diff --git a/exporters/zipkin/model.go b/exporters/zipkin/model.go index e3a84ba6ac9..f733651dac6 100644 --- a/exporters/zipkin/model.go +++ b/exporters/zipkin/model.go @@ -26,7 +26,6 @@ import ( "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/sdk/resource" - sdktrace "go.opentelemetry.io/otel/sdk/trace" tracesdk "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.10.0" "go.opentelemetry.io/otel/trace" @@ -160,8 +159,8 @@ func toZipkinAnnotations(events []tracesdk.Event) []zkmodel.Annotation { func attributesToJSONMapString(attributes []attribute.KeyValue) string { m := make(map[string]interface{}, len(attributes)) - for _, attribute := range attributes { - m[(string)(attribute.Key)] = attribute.Value.AsInterface() + for _, a := range attributes { + m[(string)(a.Key)] = a.Value.AsInterface() } // if an error happens, the result will be an empty string jsonBytes, _ := json.Marshal(m) @@ -173,17 +172,17 @@ func attributeToStringPair(kv attribute.KeyValue) (string, string) { switch kv.Value.Type() { // For slice attributes, serialize as JSON list string. case attribute.BOOLSLICE: - json, _ := json.Marshal(kv.Value.AsBoolSlice()) - return (string)(kv.Key), (string)(json) + data, _ := json.Marshal(kv.Value.AsBoolSlice()) + return (string)(kv.Key), (string)(data) case attribute.INT64SLICE: - json, _ := json.Marshal(kv.Value.AsInt64Slice()) - return (string)(kv.Key), (string)(json) + data, _ := json.Marshal(kv.Value.AsInt64Slice()) + return (string)(kv.Key), (string)(data) case attribute.FLOAT64SLICE: - json, _ := json.Marshal(kv.Value.AsFloat64Slice()) - return (string)(kv.Key), (string)(json) + data, _ := json.Marshal(kv.Value.AsFloat64Slice()) + return (string)(kv.Key), (string)(data) case attribute.STRINGSLICE: - json, _ := json.Marshal(kv.Value.AsStringSlice()) - return (string)(kv.Key), (string)(json) + data, _ := json.Marshal(kv.Value.AsStringSlice()) + return (string)(kv.Key), (string)(data) default: return (string)(kv.Key), kv.Value.Emit() } @@ -245,7 +244,7 @@ var remoteEndpointKeyRank = map[attribute.Key]int{ semconv.DBNameKey: 6, } -func toZipkinRemoteEndpoint(data sdktrace.ReadOnlySpan) *zkmodel.Endpoint { +func toZipkinRemoteEndpoint(data tracesdk.ReadOnlySpan) *zkmodel.Endpoint { // Should be set only for client or producer kind if sk := data.SpanKind(); sk != trace.SpanKindClient && sk != trace.SpanKindProducer { return nil diff --git a/exporters/zipkin/model_test.go b/exporters/zipkin/model_test.go index 5bf169baf7d..f8869988e7a 100644 --- a/exporters/zipkin/model_test.go +++ b/exporters/zipkin/model_test.go @@ -37,7 +37,7 @@ import ( ) func TestModelConversion(t *testing.T) { - resource := resource.NewSchemaless( + res := resource.NewSchemaless( semconv.ServiceNameKey.String("model-test"), semconv.ServiceVersionKey.String("0.1.0"), attribute.Int64("resource-attr1", 42), @@ -82,7 +82,7 @@ func TestModelConversion(t *testing.T) { Code: codes.Error, Description: "404, file not found", }, - Resource: resource, + Resource: res, }, // span data with no parent (same as typical, but has // invalid parent) @@ -117,7 +117,7 @@ func TestModelConversion(t *testing.T) { Code: codes.Error, Description: "404, file not found", }, - Resource: resource, + Resource: res, }, // span data of unspecified kind { @@ -155,7 +155,7 @@ func TestModelConversion(t *testing.T) { Code: codes.Error, Description: "404, file not found", }, - Resource: resource, + Resource: res, }, // span data of internal kind { @@ -193,7 +193,7 @@ func TestModelConversion(t *testing.T) { Code: codes.Error, Description: "404, file not found", }, - Resource: resource, + Resource: res, }, // span data of client kind { @@ -234,7 +234,7 @@ func TestModelConversion(t *testing.T) { Code: codes.Error, Description: "404, file not found", }, - Resource: resource, + Resource: res, }, // span data of producer kind { @@ -272,7 +272,7 @@ func TestModelConversion(t *testing.T) { Code: codes.Error, Description: "404, file not found", }, - Resource: resource, + Resource: res, }, // span data of consumer kind { @@ -310,7 +310,7 @@ func TestModelConversion(t *testing.T) { Code: codes.Error, Description: "404, file not found", }, - Resource: resource, + Resource: res, }, // span data with no events { @@ -335,7 +335,7 @@ func TestModelConversion(t *testing.T) { Code: codes.Error, Description: "404, file not found", }, - Resource: resource, + Resource: res, }, // span data with an "error" attribute set to "false" { @@ -368,7 +368,7 @@ func TestModelConversion(t *testing.T) { Attributes: nil, }, }, - Resource: resource, + Resource: res, }, }.Snapshots() diff --git a/exporters/zipkin/zipkin_test.go b/exporters/zipkin/zipkin_test.go index bd2ed89f878..183a536b9c2 100644 --- a/exporters/zipkin/zipkin_test.go +++ b/exporters/zipkin/zipkin_test.go @@ -198,7 +198,7 @@ func logStoreLogger(s *logStore) *log.Logger { } func TestExportSpans(t *testing.T) { - resource := resource.NewSchemaless( + res := resource.NewSchemaless( semconv.ServiceNameKey.String("exporter-test"), semconv.ServiceVersionKey.String("0.1.0"), ) @@ -220,7 +220,7 @@ func TestExportSpans(t *testing.T) { Code: codes.Error, Description: "404, file not found", }, - Resource: resource, + Resource: res, }, // child { @@ -242,7 +242,7 @@ func TestExportSpans(t *testing.T) { Code: codes.Error, Description: "403, forbidden", }, - Resource: resource, + Resource: res, }, }.Snapshots() models := []zkmodel.SpanModel{ diff --git a/go.mod b/go.mod index cb6feb023fd..fb8ce985ea6 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel -go 1.16 +go 1.17 require ( github.com/go-logr/logr v1.2.3 @@ -10,4 +10,10 @@ require ( go.opentelemetry.io/otel/trace v1.7.0 ) +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) + replace go.opentelemetry.io/otel/trace => ./trace diff --git a/handler.go b/handler.go index b5797bceaa9..36cf09f7290 100644 --- a/handler.go +++ b/handler.go @@ -56,7 +56,6 @@ func defaultErrorHandler() *delegator { lock: &sync.RWMutex{}, eh: &errLogger{l: log.New(os.Stderr, "", log.LstdFlags)}, } - } // errLogger logs errors if no delegate is set, otherwise they are delegated. diff --git a/handler_test.go b/handler_test.go index b06fea071eb..8a7c4301543 100644 --- a/handler_test.go +++ b/handler_test.go @@ -125,7 +125,7 @@ func TestHandlerTestSuite(t *testing.T) { func TestHandlerRace(t *testing.T) { go SetErrorHandler(&errLogger{log.New(os.Stderr, "", 0)}) - go Handle(errors.New("Error")) + go Handle(errors.New("error")) } func BenchmarkErrorHandler(b *testing.B) { @@ -135,7 +135,7 @@ func BenchmarkErrorHandler(b *testing.B) { globalErrorHandler.setDelegate(primary) - err := errors.New("BenchmarkErrorHandler") + err := errors.New("benchmark error handler") b.ReportAllocs() b.ResetTimer() @@ -184,7 +184,7 @@ func BenchmarkDefaultErrorHandlerHandle(b *testing.B) { ) eh := GetErrorHandler() - err := errors.New("BenchmarkDefaultErrorHandlerHandle") + err := errors.New("benchmark default error handler handle") b.ReportAllocs() b.ResetTimer() @@ -198,7 +198,7 @@ func BenchmarkDefaultErrorHandlerHandle(b *testing.B) { func BenchmarkDelegatedErrorHandlerHandle(b *testing.B) { eh := GetErrorHandler() SetErrorHandler(&errLogger{l: log.New(ioutil.Discard, "", 0)}) - err := errors.New("BenchmarkDelegatedErrorHandlerHandle") + err := errors.New("benchmark delegated error handler handle") b.ReportAllocs() b.ResetTimer() diff --git a/internal/baggage/context.go b/internal/baggage/context.go index 3c2784eea33..4469700d9cb 100644 --- a/internal/baggage/context.go +++ b/internal/baggage/context.go @@ -39,8 +39,7 @@ type baggageState struct { // Passing nil SetHookFunc creates a context with no set hook to call. func ContextWithSetHook(parent context.Context, hook SetHookFunc) context.Context { var s baggageState - switch v := parent.Value(baggageKey).(type) { - case baggageState: + if v, ok := parent.Value(baggageKey).(baggageState); ok { s = v } @@ -54,8 +53,7 @@ func ContextWithSetHook(parent context.Context, hook SetHookFunc) context.Contex // Passing nil GetHookFunc creates a context with no get hook to call. func ContextWithGetHook(parent context.Context, hook GetHookFunc) context.Context { var s baggageState - switch v := parent.Value(baggageKey).(type) { - case baggageState: + if v, ok := parent.Value(baggageKey).(baggageState); ok { s = v } @@ -67,8 +65,7 @@ func ContextWithGetHook(parent context.Context, hook GetHookFunc) context.Contex // returns a context without any baggage. func ContextWithList(parent context.Context, list List) context.Context { var s baggageState - switch v := parent.Value(baggageKey).(type) { - case baggageState: + if v, ok := parent.Value(baggageKey).(baggageState); ok { s = v } diff --git a/internal/matchers/expectation.go b/internal/matchers/expectation.go index 49200aafee3..0bf26266925 100644 --- a/internal/matchers/expectation.go +++ b/internal/matchers/expectation.go @@ -64,7 +64,7 @@ func (e *Expectation) NotToBeNil() { func (e *Expectation) ToBeTrue() { switch a := e.actual.(type) { case bool: - if e.actual == false { + if !a { e.fail(fmt.Sprintf("Expected\n\t%v\nto be true", e.actual)) } default: @@ -75,7 +75,7 @@ func (e *Expectation) ToBeTrue() { func (e *Expectation) ToBeFalse() { switch a := e.actual.(type) { case bool: - if e.actual == true { + if a { e.fail(fmt.Sprintf("Expected\n\t%v\nto be false", e.actual)) } default: @@ -253,32 +253,33 @@ func (e *Expectation) ToMatchInAnyOrder(expected interface{}) { func (e *Expectation) ToBeTemporally(matcher TemporalMatcher, compareTo interface{}) { if actual, ok := e.actual.(time.Time); ok { - if ct, ok := compareTo.(time.Time); ok { - switch matcher { - case Before: - if !actual.Before(ct) { - e.fail(fmt.Sprintf("Expected\n\t%v\nto be temporally before\n\t%v", e.actual, compareTo)) - } - case BeforeOrSameTime: - if actual.After(ct) { - e.fail(fmt.Sprintf("Expected\n\t%v\nto be temporally before or at the same time as\n\t%v", e.actual, compareTo)) - } - case After: - if !actual.After(ct) { - e.fail(fmt.Sprintf("Expected\n\t%v\nto be temporally after\n\t%v", e.actual, compareTo)) - } - case AfterOrSameTime: - if actual.Before(ct) { - e.fail(fmt.Sprintf("Expected\n\t%v\nto be temporally after or at the same time as\n\t%v", e.actual, compareTo)) - } - default: - e.fail("Cannot compare times with unexpected temporal matcher") - } - } else { + ct, ok := compareTo.(time.Time) + if !ok { e.fail(fmt.Sprintf("Cannot compare to non-temporal value\n\t%v", compareTo)) return } + switch matcher { + case Before: + if !actual.Before(ct) { + e.fail(fmt.Sprintf("Expected\n\t%v\nto be temporally before\n\t%v", e.actual, compareTo)) + } + case BeforeOrSameTime: + if actual.After(ct) { + e.fail(fmt.Sprintf("Expected\n\t%v\nto be temporally before or at the same time as\n\t%v", e.actual, compareTo)) + } + case After: + if !actual.After(ct) { + e.fail(fmt.Sprintf("Expected\n\t%v\nto be temporally after\n\t%v", e.actual, compareTo)) + } + case AfterOrSameTime: + if actual.Before(ct) { + e.fail(fmt.Sprintf("Expected\n\t%v\nto be temporally after or at the same time as\n\t%v", e.actual, compareTo)) + } + default: + e.fail("Cannot compare times with unexpected temporal matcher") + } + return } diff --git a/internal/rawhelpers.go b/internal/rawhelpers.go index ce7afaa1880..e07e7940004 100644 --- a/internal/rawhelpers.go +++ b/internal/rawhelpers.go @@ -19,7 +19,7 @@ import ( "unsafe" ) -func BoolToRaw(b bool) uint64 { +func BoolToRaw(b bool) uint64 { // nolint:revive // b is not a control flag. if b { return 1 } diff --git a/internal/tools/go.mod b/internal/tools/go.mod index 8821a9cb5a2..8cbe5097d3b 100644 --- a/internal/tools/go.mod +++ b/internal/tools/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/internal/tools -go 1.16 +go 1.17 require ( github.com/client9/misspell v0.3.4 @@ -16,3 +16,176 @@ require ( golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 golang.org/x/tools v0.1.10 ) + +require ( + 4d63.com/gochecknoglobals v0.1.0 // indirect + github.com/Antonboom/errname v0.1.5 // indirect + github.com/Antonboom/nilnil v0.1.0 // indirect + github.com/BurntSushi/toml v1.0.0 // indirect + github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 // indirect + github.com/Masterminds/semver v1.5.0 // indirect + github.com/Microsoft/go-winio v0.4.16 // indirect + github.com/OpenPeeDeeP/depguard v1.1.0 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 // indirect + github.com/acomagu/bufpipe v1.0.3 // indirect + github.com/alexkohler/prealloc v1.0.0 // indirect + github.com/ashanbrown/forbidigo v1.3.0 // indirect + github.com/ashanbrown/makezero v1.1.1 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bkielbasa/cyclop v1.2.0 // indirect + github.com/blizzy78/varnamelen v0.8.0 // indirect + github.com/bombsimon/wsl/v3 v3.3.0 // indirect + github.com/breml/bidichk v0.2.3 // indirect + github.com/breml/errchkjson v0.3.0 // indirect + github.com/butuzov/ireturn v0.1.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/charithe/durationcheck v0.0.9 // indirect + github.com/chavacava/garif v0.0.0-20210405164556-e8a0a408d6af // indirect + github.com/daixiang0/gci v0.3.3 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/denis-tingaikin/go-header v0.4.3 // indirect + github.com/emirpasic/gods v1.12.0 // indirect + github.com/esimonov/ifshort v1.0.4 // indirect + github.com/ettle/strcase v0.1.1 // indirect + github.com/fatih/color v1.13.0 // indirect + github.com/fatih/structtag v1.2.0 // indirect + github.com/fsnotify/fsnotify v1.5.1 // indirect + github.com/fzipp/gocyclo v0.4.0 // indirect + github.com/go-critic/go-critic v0.6.2 // indirect + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-billy/v5 v5.3.1 // indirect + github.com/go-git/go-git/v5 v5.4.2 // indirect + github.com/go-toolsmith/astcast v1.0.0 // indirect + github.com/go-toolsmith/astcopy v1.0.0 // indirect + github.com/go-toolsmith/astequal v1.0.1 // indirect + github.com/go-toolsmith/astfmt v1.0.0 // indirect + github.com/go-toolsmith/astp v1.0.0 // indirect + github.com/go-toolsmith/strparse v1.0.0 // indirect + github.com/go-toolsmith/typep v1.0.2 // indirect + github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/gofrs/flock v0.8.1 // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 // indirect + github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a // indirect + github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613 // indirect + github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a // indirect + github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 // indirect + github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca // indirect + github.com/golangci/misspell v0.3.5 // indirect + github.com/golangci/revgrep v0.0.0-20210930125155-c22e5001d4f2 // indirect + github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 // indirect + github.com/google/go-cmp v0.5.8 // indirect + github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 // indirect + github.com/gostaticanalysis/analysisutil v0.7.1 // indirect + github.com/gostaticanalysis/comment v1.4.2 // indirect + github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect + github.com/gostaticanalysis/nilerr v0.1.1 // indirect + github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect + github.com/hashicorp/go-version v1.4.0 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hexops/gotextdiff v1.0.3 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/itchyny/timefmt-go v0.1.3 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/jgautheron/goconst v1.5.1 // indirect + github.com/jingyugao/rowserrcheck v1.1.1 // indirect + github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af // indirect + github.com/julz/importas v0.1.0 // indirect + github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect + github.com/kisielk/errcheck v1.6.0 // indirect + github.com/kisielk/gotool v1.0.0 // indirect + github.com/kulti/thelper v0.5.1 // indirect + github.com/kunwardeep/paralleltest v1.0.3 // indirect + github.com/kyoh86/exportloopref v0.1.8 // indirect + github.com/ldez/gomoddirectives v0.2.2 // indirect + github.com/ldez/tagliatelle v0.3.1 // indirect + github.com/leonklingele/grouper v1.1.0 // indirect + github.com/lufeee/execinquery v1.0.0 // indirect + github.com/magiconair/properties v1.8.5 // indirect + github.com/maratori/testpackage v1.0.1 // indirect + github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/mbilski/exhaustivestruct v1.2.0 // indirect + github.com/mgechev/revive v1.1.4 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/moricho/tparallel v0.2.1 // indirect + github.com/nakabonne/nestif v0.3.1 // indirect + github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 // indirect + github.com/nishanths/exhaustive v0.7.11 // indirect + github.com/nishanths/predeclared v0.2.1 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/otiai10/copy v1.7.0 // indirect + github.com/pelletier/go-toml v1.9.4 // indirect + github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/polyfloyd/go-errorlint v0.0.0-20211125173453-6d6d39c5bb8b // indirect + github.com/prometheus/client_golang v1.7.1 // indirect + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.10.0 // indirect + github.com/prometheus/procfs v0.6.0 // indirect + github.com/quasilyte/go-ruleguard v0.3.15 // indirect + github.com/quasilyte/gogrep v0.0.0-20220103110004-ffaa07af02e3 // indirect + github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 // indirect + github.com/ryancurrah/gomodguard v1.2.3 // indirect + github.com/ryanrolds/sqlclosecheck v0.3.0 // indirect + github.com/sanposhiho/wastedassign/v2 v2.0.6 // indirect + github.com/securego/gosec/v2 v2.10.0 // indirect + github.com/sergi/go-diff v1.1.0 // indirect + github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/sivchari/containedctx v1.0.2 // indirect + github.com/sivchari/tenv v1.4.7 // indirect + github.com/sonatard/noctx v0.0.1 // indirect + github.com/sourcegraph/go-diff v0.6.1 // indirect + github.com/spf13/afero v1.6.0 // indirect + github.com/spf13/cast v1.4.1 // indirect + github.com/spf13/cobra v1.4.0 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.10.1 // indirect + github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect + github.com/stretchr/objx v0.1.1 // indirect + github.com/stretchr/testify v1.7.1 // indirect + github.com/subosito/gotenv v1.2.0 // indirect + github.com/sylvia7788/contextcheck v1.0.4 // indirect + github.com/tdakkota/asciicheck v0.1.1 // indirect + github.com/tetafro/godot v1.4.11 // indirect + github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 // indirect + github.com/tomarrell/wrapcheck/v2 v2.6.0 // indirect + github.com/tommy-muehle/go-mnd/v2 v2.5.0 // indirect + github.com/ultraware/funlen v0.0.3 // indirect + github.com/ultraware/whitespace v0.0.5 // indirect + github.com/uudashr/gocognit v1.0.5 // indirect + github.com/xanzy/ssh-agent v0.3.0 // indirect + github.com/yagipy/maintidx v1.0.0 // indirect + github.com/yeya24/promlinter v0.1.1-0.20210918184747-d757024714a1 // indirect + gitlab.com/bosi/decorder v0.2.1 // indirect + go.opentelemetry.io/build-tools v0.0.0-20220321164008-b8e03aff061a // indirect + go.uber.org/atomic v1.9.0 // indirect + go.uber.org/multierr v1.7.0 // indirect + go.uber.org/zap v1.21.0 // indirect + golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect + golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect + google.golang.org/protobuf v1.27.1 // indirect + gopkg.in/ini.v1 v1.66.2 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect + honnef.co/go/tools v0.2.2 // indirect + mvdan.cc/gofumpt v0.3.1 // indirect + mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed // indirect + mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b // indirect + mvdan.cc/unparam v0.0.0-20211214103731-d0ef000c54e5 // indirect +) diff --git a/metric/example_test.go b/metric/example_test.go index 9c18b9a6890..49b2e2ca663 100644 --- a/metric/example_test.go +++ b/metric/example_test.go @@ -44,7 +44,6 @@ func ExampleMeter_synchronous() { // Do work // ... workDuration.Record(ctx, time.Since(startTime).Milliseconds()) - } //nolint:govet // Meter doesn't register for go vet @@ -111,6 +110,4 @@ func ExampleMeter_asynchronous_multiple() { } //This is just an example, see the the contrib runtime instrumentation for real implementation. -func computeGCPauses(ctx context.Context, recorder syncfloat64.Histogram, pauseBuff []uint64) { - -} +func computeGCPauses(ctx context.Context, recorder syncfloat64.Histogram, pauseBuff []uint64) {} diff --git a/metric/go.mod b/metric/go.mod index 223f1e9fcd9..2f376123d6e 100644 --- a/metric/go.mod +++ b/metric/go.mod @@ -1,12 +1,21 @@ module go.opentelemetry.io/otel/metric -go 1.16 +go 1.17 require ( github.com/stretchr/testify v1.7.1 go.opentelemetry.io/otel v1.7.0 ) +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.opentelemetry.io/otel/trace v1.7.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) + replace go.opentelemetry.io/otel => ../ replace go.opentelemetry.io/otel/trace => ../trace diff --git a/metric/instrument/config.go b/metric/instrument/config.go index d6ea25a8da2..842c65336d2 100644 --- a/metric/instrument/config.go +++ b/metric/instrument/config.go @@ -61,9 +61,9 @@ func WithDescription(desc string) Option { } // WithUnit applies provided unit. -func WithUnit(unit unit.Unit) Option { +func WithUnit(u unit.Unit) Option { return optionFunc(func(cfg Config) Config { - cfg.unit = unit + cfg.unit = u return cfg }) } diff --git a/metric/internal/global/instruments.go b/metric/internal/global/instruments.go index 605771d105f..aed8b6660a5 100644 --- a/metric/internal/global/instruments.go +++ b/metric/internal/global/instruments.go @@ -38,14 +38,12 @@ type afCounter struct { } func (i *afCounter) setDelegate(m metric.Meter) { - ctr, err := m.AsyncFloat64().Counter(i.name, i.opts...) if err != nil { otel.Handle(err) return } i.delegate.Store(ctr) - } func (i *afCounter) Observe(ctx context.Context, x float64, attrs ...attribute.KeyValue) { @@ -71,14 +69,12 @@ type afUpDownCounter struct { } func (i *afUpDownCounter) setDelegate(m metric.Meter) { - ctr, err := m.AsyncFloat64().UpDownCounter(i.name, i.opts...) if err != nil { otel.Handle(err) return } i.delegate.Store(ctr) - } func (i *afUpDownCounter) Observe(ctx context.Context, x float64, attrs ...attribute.KeyValue) { @@ -104,14 +100,12 @@ type afGauge struct { } func (i *afGauge) setDelegate(m metric.Meter) { - ctr, err := m.AsyncFloat64().Gauge(i.name, i.opts...) if err != nil { otel.Handle(err) return } i.delegate.Store(ctr) - } func (i *afGauge) Observe(ctx context.Context, x float64, attrs ...attribute.KeyValue) { @@ -137,14 +131,12 @@ type aiCounter struct { } func (i *aiCounter) setDelegate(m metric.Meter) { - ctr, err := m.AsyncInt64().Counter(i.name, i.opts...) if err != nil { otel.Handle(err) return } i.delegate.Store(ctr) - } func (i *aiCounter) Observe(ctx context.Context, x int64, attrs ...attribute.KeyValue) { @@ -170,14 +162,12 @@ type aiUpDownCounter struct { } func (i *aiUpDownCounter) setDelegate(m metric.Meter) { - ctr, err := m.AsyncInt64().UpDownCounter(i.name, i.opts...) if err != nil { otel.Handle(err) return } i.delegate.Store(ctr) - } func (i *aiUpDownCounter) Observe(ctx context.Context, x int64, attrs ...attribute.KeyValue) { @@ -203,14 +193,12 @@ type aiGauge struct { } func (i *aiGauge) setDelegate(m metric.Meter) { - ctr, err := m.AsyncInt64().Gauge(i.name, i.opts...) if err != nil { otel.Handle(err) return } i.delegate.Store(ctr) - } func (i *aiGauge) Observe(ctx context.Context, x int64, attrs ...attribute.KeyValue) { @@ -237,14 +225,12 @@ type sfCounter struct { } func (i *sfCounter) setDelegate(m metric.Meter) { - ctr, err := m.SyncFloat64().Counter(i.name, i.opts...) if err != nil { otel.Handle(err) return } i.delegate.Store(ctr) - } func (i *sfCounter) Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue) { @@ -263,14 +249,12 @@ type sfUpDownCounter struct { } func (i *sfUpDownCounter) setDelegate(m metric.Meter) { - ctr, err := m.SyncFloat64().UpDownCounter(i.name, i.opts...) if err != nil { otel.Handle(err) return } i.delegate.Store(ctr) - } func (i *sfUpDownCounter) Add(ctx context.Context, incr float64, attrs ...attribute.KeyValue) { @@ -295,7 +279,6 @@ func (i *sfHistogram) setDelegate(m metric.Meter) { return } i.delegate.Store(ctr) - } func (i *sfHistogram) Record(ctx context.Context, x float64, attrs ...attribute.KeyValue) { @@ -314,14 +297,12 @@ type siCounter struct { } func (i *siCounter) setDelegate(m metric.Meter) { - ctr, err := m.SyncInt64().Counter(i.name, i.opts...) if err != nil { otel.Handle(err) return } i.delegate.Store(ctr) - } func (i *siCounter) Add(ctx context.Context, x int64, attrs ...attribute.KeyValue) { @@ -340,14 +321,12 @@ type siUpDownCounter struct { } func (i *siUpDownCounter) setDelegate(m metric.Meter) { - ctr, err := m.SyncInt64().UpDownCounter(i.name, i.opts...) if err != nil { otel.Handle(err) return } i.delegate.Store(ctr) - } func (i *siUpDownCounter) Add(ctx context.Context, x int64, attrs ...attribute.KeyValue) { @@ -366,14 +345,12 @@ type siHistogram struct { } func (i *siHistogram) setDelegate(m metric.Meter) { - ctr, err := m.SyncInt64().Histogram(i.name, i.opts...) if err != nil { otel.Handle(err) return } i.delegate.Store(ctr) - } func (i *siHistogram) Record(ctx context.Context, x int64, attrs ...attribute.KeyValue) { diff --git a/metric/internal/global/meter_test.go b/metric/internal/global/meter_test.go index 447db967d84..8865f06d57b 100644 --- a/metric/internal/global/meter_test.go +++ b/metric/internal/global/meter_test.go @@ -45,7 +45,6 @@ func TestMeterProviderRace(t *testing.T) { mp.setDelegate(metric.NewNoopMeterProvider()) close(finish) - } func TestMeterRace(t *testing.T) { @@ -88,7 +87,6 @@ func TestMeterRace(t *testing.T) { } func testSetupAllInstrumentTypes(t *testing.T, m metric.Meter) (syncfloat64.Counter, asyncfloat64.Counter) { - afcounter, err := m.AsyncFloat64().Counter("test_Async_Counter") require.NoError(t, err) _, err = m.AsyncFloat64().UpDownCounter("test_Async_UpDownCounter") @@ -142,7 +140,6 @@ func testCollect(t *testing.T, m metric.Meter) { } func TestMeterProviderDelegatesCalls(t *testing.T) { - // The global MeterProvider should directly call the underlying MeterProvider // if it is set prior to Meter() being called. @@ -184,7 +181,6 @@ func TestMeterProviderDelegatesCalls(t *testing.T) { } func TestMeterDelegatesCalls(t *testing.T) { - // The global MeterProvider should directly provide a Meter instance that // can be updated. If the SetMeterProvider is called after a Meter was // obtained, but before instruments only the instrument should be generated @@ -227,7 +223,6 @@ func TestMeterDelegatesCalls(t *testing.T) { } func TestMeterDefersDelegations(t *testing.T) { - // If SetMeterProvider is called after instruments are registered, the // instruments should be recreated with the new meter. diff --git a/metric/unit/unit.go b/metric/unit/unit.go index 4615eb16f69..647d77302de 100644 --- a/metric/unit/unit.go +++ b/metric/unit/unit.go @@ -14,6 +14,7 @@ package unit // import "go.opentelemetry.io/otel/metric/unit" +// Unit is a determinate standard quantity of measurement. type Unit string // Units defined by OpenTelemetry. diff --git a/schema/go.mod b/schema/go.mod index e2127999806..9114ff31a8f 100644 --- a/schema/go.mod +++ b/schema/go.mod @@ -1,9 +1,15 @@ module go.opentelemetry.io/otel/schema -go 1.16 +go 1.17 require ( github.com/Masterminds/semver/v3 v3.1.1 github.com/stretchr/testify v1.7.1 gopkg.in/yaml.v2 v2.4.0 ) + +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) diff --git a/sdk/go.mod b/sdk/go.mod index 4f4212332c6..78069e9d4f2 100644 --- a/sdk/go.mod +++ b/sdk/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/sdk -go 1.16 +go 1.17 replace go.opentelemetry.io/otel => ../ @@ -13,4 +13,11 @@ require ( golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 ) +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) + replace go.opentelemetry.io/otel/trace => ../trace diff --git a/sdk/internal/env/env_test.go b/sdk/internal/env/env_test.go index e150f108c5d..f456ae10817 100644 --- a/sdk/internal/env/env_test.go +++ b/sdk/internal/env/env_test.go @@ -114,7 +114,6 @@ func TestEnvParse(t *testing.T) { require.NoError(t, os.Setenv(key, invalid)) assert.Equal(t, defVal, tc.f(defVal), "invalid value") }) - } }) } diff --git a/sdk/metric/go.mod b/sdk/metric/go.mod index a818f0ec846..07226ebfd9e 100644 --- a/sdk/metric/go.mod +++ b/sdk/metric/go.mod @@ -1,13 +1,22 @@ module go.opentelemetry.io/otel/sdk/metric -go 1.16 +go 1.17 require ( github.com/go-logr/logr v1.2.3 github.com/stretchr/testify v1.7.1 go.opentelemetry.io/otel v1.7.0 go.opentelemetry.io/otel/metric v0.0.0-00010101000000-000000000000 - go.opentelemetry.io/otel/sdk v1.7.0 + go.opentelemetry.io/otel/sdk v0.0.0-00010101000000-000000000000 +) + +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + go.opentelemetry.io/otel/trace v1.7.0 // indirect + golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect ) replace go.opentelemetry.io/otel => ../.. diff --git a/sdk/resource/auto_test.go b/sdk/resource/auto_test.go index f05036fdd68..ad490c11c00 100644 --- a/sdk/resource/auto_test.go +++ b/sdk/resource/auto_test.go @@ -27,7 +27,6 @@ import ( ) func TestDetect(t *testing.T) { - cases := []struct { name string schema1, schema2 string diff --git a/sdk/resource/benchmark_test.go b/sdk/resource/benchmark_test.go index 918ec332da8..ea72c5a2186 100644 --- a/sdk/resource/benchmark_test.go +++ b/sdk/resource/benchmark_test.go @@ -45,7 +45,6 @@ func makeAttrs(n int) (_, _ *resource.Resource) { } else { l2[i] = attribute.String(k, fmt.Sprint("v", rand.Intn(1000000000))) } - } return resource.NewSchemaless(l1...), resource.NewSchemaless(l2...) } diff --git a/sdk/resource/builtin_test.go b/sdk/resource/builtin_test.go index 04c8ee9909e..20a4e350a93 100644 --- a/sdk/resource/builtin_test.go +++ b/sdk/resource/builtin_test.go @@ -45,9 +45,9 @@ func TestStringDetectorErrors(t *testing.T) { { desc: "explicit error from func should be returned", s: resource.StringDetector("", attribute.Key("K"), func() (string, error) { - return "", fmt.Errorf("K-IS-MISSING") + return "", fmt.Errorf("k-is-missing") }), - errContains: "K-IS-MISSING", + errContains: "k-is-missing", }, { desc: "empty key is an invalid", @@ -74,5 +74,4 @@ func TestStringDetectorErrors(t *testing.T) { } require.EqualValues(t, map[string]string{"A": "B"}, m) } - } diff --git a/sdk/resource/os_unix_test.go b/sdk/resource/os_unix_test.go index 2f03980c4a8..af6178613e1 100644 --- a/sdk/resource/os_unix_test.go +++ b/sdk/resource/os_unix_test.go @@ -39,7 +39,7 @@ func fakeUnameProvider(buf *unix.Utsname) error { } func fakeUnameProviderWithError(buf *unix.Utsname) error { - return fmt.Errorf("Error invoking uname(2)") + return fmt.Errorf("error invoking uname(2)") } func TestUname(t *testing.T) { diff --git a/sdk/resource/process_test.go b/sdk/resource/process_test.go index 408d0a5a300..7ddb66acdd4 100644 --- a/sdk/resource/process_test.go +++ b/sdk/resource/process_test.go @@ -56,10 +56,10 @@ var ( var ( fakeExecutablePathProviderWithError = func() (string, error) { - return "", fmt.Errorf("Unable to get process executable") + return "", fmt.Errorf("unable to get process executable") } fakeOwnerProviderWithError = func() (*user.User, error) { - return nil, fmt.Errorf("Unable to get process user") + return nil, fmt.Errorf("unable to get process user") } ) diff --git a/sdk/resource/resource.go b/sdk/resource/resource.go index 155edfa12cc..c425ff05db5 100644 --- a/sdk/resource/resource.go +++ b/sdk/resource/resource.go @@ -129,6 +129,7 @@ func (r *Resource) Attributes() []attribute.KeyValue { return r.attrs.ToSlice() } +// SchemaURL returns the schema URL associated with Resource r. func (r *Resource) SchemaURL() string { if r == nil { return "" @@ -179,13 +180,14 @@ func Merge(a, b *Resource) (*Resource, error) { // Merge the schema URL. var schemaURL string - if a.schemaURL == "" { + switch true { + case a.schemaURL == "": schemaURL = b.schemaURL - } else if b.schemaURL == "" { + case b.schemaURL == "": schemaURL = a.schemaURL - } else if a.schemaURL == b.schemaURL { + case a.schemaURL == b.schemaURL: schemaURL = a.schemaURL - } else { + default: return Empty(), errMergeConflictSchemaURL } diff --git a/sdk/trace/batch_span_processor.go b/sdk/trace/batch_span_processor.go index 56847d9ccba..a2d7db49001 100644 --- a/sdk/trace/batch_span_processor.go +++ b/sdk/trace/batch_span_processor.go @@ -35,8 +35,11 @@ const ( DefaultMaxExportBatchSize = 512 ) +// BatchSpanProcessorOption configures a BatchSpanProcessor. type BatchSpanProcessorOption func(o *BatchSpanProcessorOptions) +// BatchSpanProcessorOptions is configuration settings for a +// BatchSpanProcessor. type BatchSpanProcessorOptions struct { // MaxQueueSize is the maximum queue size to buffer spans for delayed processing. If the // queue gets full it drops the spans. Use BlockOnQueueFull to change this behavior. @@ -181,7 +184,7 @@ func (bsp *batchSpanProcessor) ForceFlush(ctx context.Context) error { var err error if bsp.e != nil { flushCh := make(chan struct{}) - if bsp.enqueueBlockOnQueueFull(ctx, forceFlushSpan{flushed: flushCh}, true) { + if bsp.enqueueBlockOnQueueFull(ctx, forceFlushSpan{flushed: flushCh}) { select { case <-flushCh: // Processed any items in queue prior to ForceFlush being called @@ -205,30 +208,43 @@ func (bsp *batchSpanProcessor) ForceFlush(ctx context.Context) error { return err } +// WithMaxQueueSize returns a BatchSpanProcessorOption that configures the +// maximum queue size allowed for a BatchSpanProcessor. func WithMaxQueueSize(size int) BatchSpanProcessorOption { return func(o *BatchSpanProcessorOptions) { o.MaxQueueSize = size } } +// WithMaxExportBatchSize returns a BatchSpanProcessorOption that configures +// the maximum export batch size allowed for a BatchSpanProcessor. func WithMaxExportBatchSize(size int) BatchSpanProcessorOption { return func(o *BatchSpanProcessorOptions) { o.MaxExportBatchSize = size } } +// WithBatchTimeout returns a BatchSpanProcessorOption that configures the +// maximum delay allowed for a BatchSpanProcessor before it will export any +// held span (whether the queue is full or not). func WithBatchTimeout(delay time.Duration) BatchSpanProcessorOption { return func(o *BatchSpanProcessorOptions) { o.BatchTimeout = delay } } +// WithExportTimeout returns a BatchSpanProcessorOption that configures the +// amount of time a BatchSpanProcessor waits for an exporter to export before +// abandoning the export. func WithExportTimeout(timeout time.Duration) BatchSpanProcessorOption { return func(o *BatchSpanProcessorOptions) { o.ExportTimeout = timeout } } +// WithBlocking returns a BatchSpanProcessorOption that configures a +// BatchSpanProcessor to wait for enqueue operations to succeed instead of +// dropping data when the queue is full. func WithBlocking() BatchSpanProcessorOption { return func(o *BatchSpanProcessorOptions) { o.BlockOnQueueFull = true @@ -237,7 +253,6 @@ func WithBlocking() BatchSpanProcessorOption { // exportSpans is a subroutine of processing and draining the queue. func (bsp *batchSpanProcessor) exportSpans(ctx context.Context) error { - bsp.timer.Reset(bsp.o.BatchTimeout) bsp.batchMutex.Lock() @@ -335,28 +350,35 @@ func (bsp *batchSpanProcessor) drainQueue() { } func (bsp *batchSpanProcessor) enqueue(sd ReadOnlySpan) { - bsp.enqueueBlockOnQueueFull(context.TODO(), sd, bsp.o.BlockOnQueueFull) + ctx := context.TODO() + if bsp.o.BlockOnQueueFull { + bsp.enqueueBlockOnQueueFull(ctx, sd) + } else { + bsp.enqueueDrop(ctx, sd) + } } -func (bsp *batchSpanProcessor) enqueueBlockOnQueueFull(ctx context.Context, sd ReadOnlySpan, block bool) bool { +func recoverSendOnClosedChan() { + x := recover() + switch err := x.(type) { + case nil: + return + case runtime.Error: + if err.Error() == "send on closed channel" { + return + } + } + panic(x) +} + +func (bsp *batchSpanProcessor) enqueueBlockOnQueueFull(ctx context.Context, sd ReadOnlySpan) bool { if !sd.SpanContext().IsSampled() { return false } // This ensures the bsp.queue<- below does not panic as the // processor shuts down. - defer func() { - x := recover() - switch err := x.(type) { - case nil: - return - case runtime.Error: - if err.Error() == "send on closed channel" { - return - } - } - panic(x) - }() + defer recoverSendOnClosedChan() select { case <-bsp.stopCh: @@ -364,13 +386,27 @@ func (bsp *batchSpanProcessor) enqueueBlockOnQueueFull(ctx context.Context, sd R default: } - if block { - select { - case bsp.queue <- sd: - return true - case <-ctx.Done(): - return false - } + select { + case bsp.queue <- sd: + return true + case <-ctx.Done(): + return false + } +} + +func (bsp *batchSpanProcessor) enqueueDrop(ctx context.Context, sd ReadOnlySpan) bool { + if !sd.SpanContext().IsSampled() { + return false + } + + // This ensures the bsp.queue<- below does not panic as the + // processor shuts down. + defer recoverSendOnClosedChan() + + select { + case <-bsp.stopCh: + return false + default: } select { diff --git a/sdk/trace/batch_span_processor_test.go b/sdk/trace/batch_span_processor_test.go index 255f8621160..a033b6a0082 100644 --- a/sdk/trace/batch_span_processor_test.go +++ b/sdk/trace/batch_span_processor_test.go @@ -206,7 +206,11 @@ func TestNewBatchSpanProcessorWithOptions(t *testing.T) { tp.RegisterSpanProcessor(ssp) tr := tp.Tracer("BatchSpanProcessorWithOptions") - generateSpan(t, option.parallel, tr, option) + if option.parallel { + generateSpanParallel(t, tr, option) + } else { + generateSpan(t, tr, option) + } tp.UnregisterSpanProcessor(ssp) @@ -285,7 +289,11 @@ func TestNewBatchSpanProcessorWithEnvOptions(t *testing.T) { tp.RegisterSpanProcessor(ssp) tr := tp.Tracer("BatchSpanProcessorWithOptions") - generateSpan(t, option.parallel, tr, option) + if option.parallel { + generateSpanParallel(t, tr, option) + } else { + generateSpan(t, tr, option) + } tp.UnregisterSpanProcessor(ssp) @@ -328,7 +336,7 @@ func TestBatchSpanProcessorExportTimeout(t *testing.T) { tp.RegisterSpanProcessor(bsp) tr := tp.Tracer("BatchSpanProcessorExportTimeout") - generateSpan(t, false, tr, testOption{genNumSpans: 1}) + generateSpan(t, tr, testOption{genNumSpans: 1}) tp.UnregisterSpanProcessor(bsp) if exp.err != context.DeadlineExceeded { @@ -342,27 +350,34 @@ func createAndRegisterBatchSP(option testOption, te *testBatchExporter) sdktrace return sdktrace.NewBatchSpanProcessor(te, options...) } -func generateSpan(t *testing.T, parallel bool, tr trace.Tracer, option testOption) { +func generateSpan(t *testing.T, tr trace.Tracer, option testOption) { sc := getSpanContext() - wg := &sync.WaitGroup{} for i := 0; i < option.genNumSpans; i++ { tid := sc.TraceID() binary.BigEndian.PutUint64(tid[0:8], uint64(i+1)) newSc := sc.WithTraceID(tid) + ctx := trace.ContextWithRemoteSpanContext(context.Background(), newSc) + _, span := tr.Start(ctx, option.name) + span.End() + } +} + +func generateSpanParallel(t *testing.T, tr trace.Tracer, option testOption) { + sc := getSpanContext() + + wg := &sync.WaitGroup{} + for i := 0; i < option.genNumSpans; i++ { + tid := sc.TraceID() + binary.BigEndian.PutUint64(tid[0:8], uint64(i+1)) wg.Add(1) - f := func(sc trace.SpanContext) { + go func(sc trace.SpanContext) { ctx := trace.ContextWithRemoteSpanContext(context.Background(), sc) _, span := tr.Start(ctx, option.name) span.End() wg.Done() - } - if parallel { - go f(newSc) - } else { - f(newSc) - } + }(sc.WithTraceID(tid)) } wg.Wait() } @@ -403,7 +418,7 @@ func TestBatchSpanProcessorPostShutdown(t *testing.T) { tp.RegisterSpanProcessor(bsp) tr := tp.Tracer("Normal") - generateSpan(t, true, tr, testOption{ + generateSpanParallel(t, tr, testOption{ o: []sdktrace.BatchSpanProcessorOption{ sdktrace.WithMaxExportBatchSize(50), }, @@ -439,7 +454,11 @@ func TestBatchSpanProcessorForceFlushSucceeds(t *testing.T) { } tp.RegisterSpanProcessor(ssp) tr := tp.Tracer("BatchSpanProcessorWithOption") - generateSpan(t, option.parallel, tr, option) + if option.parallel { + generateSpanParallel(t, tr, option) + } else { + generateSpan(t, tr, option) + } // Force flush any held span batches err := ssp.ForceFlush(context.Background()) @@ -475,7 +494,11 @@ func TestBatchSpanProcessorDropBatchIfFailed(t *testing.T) { } tp.RegisterSpanProcessor(ssp) tr := tp.Tracer("BatchSpanProcessorWithOption") - generateSpan(t, option.parallel, tr, option) + if option.parallel { + generateSpanParallel(t, tr, option) + } else { + generateSpan(t, tr, option) + } // Force flush any held span batches err := ssp.ForceFlush(context.Background()) @@ -488,7 +511,11 @@ func TestBatchSpanProcessorDropBatchIfFailed(t *testing.T) { assert.Equal(t, 0, te.getBatchCount()) // Generate a new batch, this will succeed - generateSpan(t, option.parallel, tr, option) + if option.parallel { + generateSpanParallel(t, tr, option) + } else { + generateSpan(t, tr, option) + } // Force flush any held span batches err = ssp.ForceFlush(context.Background()) diff --git a/sdk/trace/id_generator.go b/sdk/trace/id_generator.go index c9e2802ac53..bba246041a4 100644 --- a/sdk/trace/id_generator.go +++ b/sdk/trace/id_generator.go @@ -52,7 +52,7 @@ func (gen *randomIDGenerator) NewSpanID(ctx context.Context, traceID trace.Trace gen.Lock() defer gen.Unlock() sid := trace.SpanID{} - gen.randSource.Read(sid[:]) + _, _ = gen.randSource.Read(sid[:]) return sid } @@ -62,9 +62,9 @@ func (gen *randomIDGenerator) NewIDs(ctx context.Context) (trace.TraceID, trace. gen.Lock() defer gen.Unlock() tid := trace.TraceID{} - gen.randSource.Read(tid[:]) + _, _ = gen.randSource.Read(tid[:]) sid := trace.SpanID{} - gen.randSource.Read(sid[:]) + _, _ = gen.randSource.Read(sid[:]) return tid, sid } diff --git a/sdk/trace/provider.go b/sdk/trace/provider.go index 82246af593c..3f526c1d3cf 100644 --- a/sdk/trace/provider.go +++ b/sdk/trace/provider.go @@ -70,6 +70,8 @@ func (cfg tracerProviderConfig) MarshalLog() interface{} { } } +// TracerProvider is an OpenTelemetry TracerProvider. It provides Tracers to +// instrumentation so it can trace operational flow through a system. type TracerProvider struct { mu sync.Mutex namedTracer map[instrumentation.Library]*tracer @@ -261,6 +263,7 @@ func (p *TracerProvider) Shutdown(ctx context.Context) error { return nil } +// TracerProviderOption configures a TracerProvider. type TracerProviderOption interface { apply(tracerProviderConfig) tracerProviderConfig } diff --git a/sdk/trace/provider_test.go b/sdk/trace/provider_test.go index 0cfe584c926..1f5d460d739 100644 --- a/sdk/trace/provider_test.go +++ b/sdk/trace/provider_test.go @@ -53,7 +53,7 @@ func TestShutdownTraceProvider(t *testing.T) { _ = stp.Shutdown(context.Background()) - if sp.running != false { + if sp.running { t.Errorf("Error shutdown basicSpanProcesor\n") } } diff --git a/sdk/trace/sampler_env.go b/sdk/trace/sampler_env.go index 97f80576e68..02053b318ae 100644 --- a/sdk/trace/sampler_env.go +++ b/sdk/trace/sampler_env.go @@ -73,25 +73,26 @@ func samplerFromEnv() (Sampler, error) { case samplerAlwaysOff: return NeverSample(), nil case samplerTraceIDRatio: - ratio, err := parseTraceIDRatio(samplerArg, hasSamplerArg) - return ratio, err + if !hasSamplerArg { + return TraceIDRatioBased(1.0), nil + } + return parseTraceIDRatio(samplerArg) case samplerParentBasedAlwaysOn: return ParentBased(AlwaysSample()), nil case samplerParsedBasedAlwaysOff: return ParentBased(NeverSample()), nil case samplerParentBasedTraceIDRatio: - ratio, err := parseTraceIDRatio(samplerArg, hasSamplerArg) + if !hasSamplerArg { + return ParentBased(TraceIDRatioBased(1.0)), nil + } + ratio, err := parseTraceIDRatio(samplerArg) return ParentBased(ratio), err default: return nil, errUnsupportedSampler(sampler) } - } -func parseTraceIDRatio(arg string, hasSamplerArg bool) (Sampler, error) { - if !hasSamplerArg { - return TraceIDRatioBased(1.0), nil - } +func parseTraceIDRatio(arg string) (Sampler, error) { v, err := strconv.ParseFloat(arg, 64) if err != nil { return TraceIDRatioBased(1.0), samplerArgParseError{err} diff --git a/sdk/trace/sampling_test.go b/sdk/trace/sampling_test.go index 28e3e7736b3..a675ba93f0c 100644 --- a/sdk/trace/sampling_test.go +++ b/sdk/trace/sampling_test.go @@ -177,7 +177,6 @@ func TestParentBasedDefaultDescription(t *testing.T) { sampler.Description(), ) } - } // TraceIDRatioBased sampler requirements state diff --git a/sdk/trace/trace_test.go b/sdk/trace/trace_test.go index f359eef99d6..7ea04a86f05 100644 --- a/sdk/trace/trace_test.go +++ b/sdk/trace/trace_test.go @@ -223,8 +223,8 @@ func TestSpanIsRecording(t *testing.T) { } { tp := NewTracerProvider(WithSampler(tc.sampler)) _, span := tp.Tracer(name).Start(context.Background(), "StartSpan") - defer span.End() got := span.IsRecording() + span.End() assert.Equal(t, got, tc.want, name) } }) @@ -425,8 +425,8 @@ func TestSamplerAttributesLocalChildSpan(t *testing.T) { tp := NewTracerProvider(WithSampler(sampler), WithSyncer(te), WithResource(resource.Empty())) ctx := context.Background() - ctx, span := startLocalSpan(tp, ctx, "SpanOne", "span0") - _, spanTwo := startLocalSpan(tp, ctx, "SpanTwo", "span1") + ctx, span := startLocalSpan(ctx, tp, "SpanOne", "span0") + _, spanTwo := startLocalSpan(ctx, tp, "SpanTwo", "span1") spanTwo.End() span.End() @@ -950,7 +950,7 @@ func startNamedSpan(tp *TracerProvider, trName, name string, args ...trace.SpanS // passed name and with the passed context. The context is returned // along with the span so this parent can be used to create child // spans. -func startLocalSpan(tp *TracerProvider, ctx context.Context, trName, name string, args ...trace.SpanStartOption) (context.Context, trace.Span) { +func startLocalSpan(ctx context.Context, tp *TracerProvider, trName, name string, args ...trace.SpanStartOption) (context.Context, trace.Span) { ctx, span := tp.Tracer(trName).Start( ctx, name, @@ -970,10 +970,10 @@ func startLocalSpan(tp *TracerProvider, ctx context.Context, trName, name string // It also clears spanID in the to make the comparison easier. func endSpan(te *testExporter, span trace.Span) (*snapshot, error) { if !span.IsRecording() { - return nil, fmt.Errorf("IsRecording: got false, want true") + return nil, fmt.Errorf("method IsRecording: got false, want true") } if !span.SpanContext().IsSampled() { - return nil, fmt.Errorf("IsSampled: got false, want true") + return nil, fmt.Errorf("method IsSampled: got false, want true") } span.End() if te.Len() != 1 { @@ -1172,10 +1172,10 @@ func TestCustomStartEndTime(t *testing.T) { t.Fatalf("got %d exported spans, want one span", te.Len()) } got := te.Spans()[0] - if got.StartTime() != startTime { + if !got.StartTime().Equal(startTime) { t.Errorf("expected start time to be %s, got %s", startTime, got.StartTime()) } - if got.EndTime() != endTime { + if !got.EndTime().Equal(endTime) { t.Errorf("expected end time to be %s, got %s", endTime, got.EndTime()) } } @@ -1630,7 +1630,6 @@ func TestReadWriteSpan(t *testing.T) { // Verify the span can be written to. rw.SetName("bar") assert.Equal(t, "bar", rw.Name()) - // NOTE: This function tests ReadWriteSpan which is an interface which // embeds trace.Span and ReadOnlySpan. Since both of these interfaces have // their own tests, there is no point in testing all the possible methods @@ -1902,7 +1901,6 @@ func TestSamplerTraceState(t *testing.T) { } }) } - } type testIDGenerator struct { diff --git a/sdk/trace/tracetest/recorder.go b/sdk/trace/tracetest/recorder.go index dcf32c148dd..06673a1c049 100644 --- a/sdk/trace/tracetest/recorder.go +++ b/sdk/trace/tracetest/recorder.go @@ -32,6 +32,7 @@ type SpanRecorder struct { var _ sdktrace.SpanProcessor = (*SpanRecorder)(nil) +// NewSpanRecorder returns a new initialized SpanRecorder. func NewSpanRecorder() *SpanRecorder { return new(SpanRecorder) } diff --git a/sdk/trace/tracetest/span.go b/sdk/trace/tracetest/span.go index ece4633c525..b5f47735c1f 100644 --- a/sdk/trace/tracetest/span.go +++ b/sdk/trace/tracetest/span.go @@ -24,6 +24,7 @@ import ( "go.opentelemetry.io/otel/trace" ) +// SpanStubs is a slice of SpanStub use for testing an SDK. type SpanStubs []SpanStub // SpanStubsFromReadOnlySpans returns SpanStubs populated from ro. diff --git a/semconv/internal/http_test.go b/semconv/internal/http_test.go index 11f7ce57b59..302c3e0ea0a 100644 --- a/semconv/internal/http_test.go +++ b/semconv/internal/http_test.go @@ -1008,16 +1008,16 @@ func protoToInts(proto string) (int, int) { func kvStr(kvs []attribute.KeyValue) string { sb := strings.Builder{} - sb.WriteRune('[') + _, _ = sb.WriteRune('[') for idx, attr := range kvs { if idx > 0 { - sb.WriteString(", ") + _, _ = sb.WriteString(", ") } - sb.WriteString((string)(attr.Key)) - sb.WriteString(": ") - sb.WriteString(attr.Value.Emit()) + _, _ = sb.WriteString((string)(attr.Key)) + _, _ = sb.WriteString(": ") + _, _ = sb.WriteString(attr.Value.Emit()) } - sb.WriteRune(']') + _, _ = sb.WriteRune(']') return sb.String() } diff --git a/trace/go.mod b/trace/go.mod index 1a8d9723229..d5fde13218b 100644 --- a/trace/go.mod +++ b/trace/go.mod @@ -1,6 +1,6 @@ module go.opentelemetry.io/otel/trace -go 1.16 +go 1.17 replace go.opentelemetry.io/otel => ../ @@ -9,3 +9,9 @@ require ( github.com/stretchr/testify v1.7.1 go.opentelemetry.io/otel v1.7.0 ) + +require ( + github.com/davecgh/go-spew v1.1.0 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect +) diff --git a/trace/trace.go b/trace/trace.go index 1bc040c2764..e1f61e0735b 100644 --- a/trace/trace.go +++ b/trace/trace.go @@ -160,7 +160,7 @@ func (tf TraceFlags) IsSampled() bool { } // WithSampled sets the sampling bit in a new copy of the TraceFlags. -func (tf TraceFlags) WithSampled(sampled bool) TraceFlags { +func (tf TraceFlags) WithSampled(sampled bool) TraceFlags { // nolint:revive // sampled is not a control flag. if sampled { return tf | FlagsSampled } diff --git a/trace/trace_test.go b/trace/trace_test.go index c9ffbf69572..42003822037 100644 --- a/trace/trace_test.go +++ b/trace/trace_test.go @@ -83,11 +83,11 @@ func TestSpanContextEqual(t *testing.T) { spanID: [8]byte{42}, } - if a.Equal(b) != true { + if !a.Equal(b) { t.Error("Want: true, but have: false") } - if a.Equal(c) != false { + if a.Equal(c) { t.Error("Want: false, but have: true") } } diff --git a/trace/tracestate.go b/trace/tracestate.go index 7b7af6955f9..5e775ce5fbe 100644 --- a/trace/tracestate.go +++ b/trace/tracestate.go @@ -68,7 +68,6 @@ func parseMember(m string) (member, error) { Key: matches[1], Value: matches[4], }, nil - } // String encodes member into a string compliant with the W3C Trace Context