Skip to content

Commit 80cdfd2

Browse files
jsternbergcorhere
authored andcommitted
detect: sever semconv relationship to otel sdk
Copies over the telemetry sdk detection to utilize our own version of semconv rather than mix the versions between different packages. This will keep a consistent schema url instead of constantly chasing whichever one the otel sdk is using. The only thing left from the otel sdk is `WithFromEnv` which is schemaless and won't conflict for that reason so we can continue to use it. Signed-off-by: Jonathan A. Sternberg <jonathan.sternberg@docker.com> (cherry picked from commit 9863dd3) Signed-off-by: Cory Snider <csnider@mirantis.com>
1 parent 175fecf commit 80cdfd2

3 files changed

Lines changed: 73 additions & 9 deletions

File tree

util/tracing/detect/detect.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,7 @@ func detect() error {
101101
bklog.EnableLogWithTraceID(true)
102102

103103
if Resource == nil {
104-
res, err := resource.Detect(context.Background(), serviceNameDetector{})
105-
if err != nil {
106-
return err
107-
}
108-
res, err = resource.Merge(resource.Default(), res)
109-
if err != nil {
110-
return err
111-
}
112-
Resource = res
104+
Resource = detectResource()
113105
}
114106

115107
sp := sdktrace.NewBatchSpanProcessor(exp)

util/tracing/detect/resource.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Copyright The OpenTelemetry Authors
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
package detect
5+
6+
import (
7+
"context"
8+
9+
"go.opentelemetry.io/otel"
10+
"go.opentelemetry.io/otel/sdk"
11+
"go.opentelemetry.io/otel/sdk/resource"
12+
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
13+
)
14+
15+
func detectResource() *resource.Resource {
16+
res, err := resource.New(context.Background(),
17+
resource.WithDetectors(serviceNameDetector{}),
18+
resource.WithFromEnv(),
19+
resource.WithDetectors(telemetrySDK{}),
20+
)
21+
if err != nil {
22+
otel.Handle(err)
23+
}
24+
return res
25+
}
26+
27+
type (
28+
telemetrySDK struct{}
29+
)
30+
31+
var (
32+
_ resource.Detector = telemetrySDK{}
33+
)
34+
35+
// Detect returns a *Resource that describes the OpenTelemetry SDK used.
36+
func (telemetrySDK) Detect(context.Context) (*resource.Resource, error) {
37+
return resource.NewWithAttributes(
38+
semconv.SchemaURL,
39+
semconv.TelemetrySDKName("opentelemetry"),
40+
semconv.TelemetrySDKLanguageGo,
41+
semconv.TelemetrySDKVersion(sdk.Version()),
42+
), nil
43+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package detect
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/require"
7+
"go.opentelemetry.io/otel"
8+
)
9+
10+
func TestResource(t *testing.T) {
11+
prevHandler := otel.GetErrorHandler()
12+
t.Cleanup(func() {
13+
otel.SetErrorHandler(prevHandler)
14+
})
15+
16+
var resourceErr error
17+
otel.SetErrorHandler(otel.ErrorHandlerFunc(func(err error) {
18+
resourceErr = err
19+
}))
20+
21+
res := detectResource()
22+
23+
// Should not have an empty schema url. Only happens when
24+
// there is a schema conflict.
25+
require.NotEqual(t, "", res.SchemaURL())
26+
27+
// No error should have been invoked.
28+
require.NoError(t, resourceErr)
29+
}

0 commit comments

Comments
 (0)