Skip to content

Commit bdd60f5

Browse files
committed
add telemetry package
1 parent e0e433c commit bdd60f5

File tree

7 files changed

+32
-19
lines changed

7 files changed

+32
-19
lines changed

cli/server.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import (
5151
"github.com/coder/coder/provisionersdk"
5252
"github.com/coder/coder/provisionersdk/proto"
5353
"github.com/coder/coder/telemetry"
54+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
5455
)
5556

5657
// nolint:gocyclo
@@ -98,12 +99,15 @@ func server() *cobra.Command {
9899
logger = logger.Leveled(slog.LevelDebug)
99100
}
100101

102+
var tracerProvider *sdktrace.TracerProvider
103+
var err error
101104
if trace {
102-
stop, err := telemetry.Exporter(cmd.Context(), "coderd")
105+
tracerProvider, err = telemetry.TracerProvider(cmd.Context(), "coderd")
103106
if err != nil {
104107
logger.Warn(cmd.Context(), "failed to start telemetry exporter", slog.Error(err))
108+
} else {
109+
defer tracerProvider.Shutdown(cmd.Context())
105110
}
106-
defer stop()
107111
}
108112

109113
printLogo(cmd, spooky)
@@ -217,6 +221,7 @@ func server() *cobra.Command {
217221
SecureAuthCookie: secureAuthCookie,
218222
SSHKeygenAlgorithm: sshKeygenAlgorithm,
219223
TURNServer: turnServer,
224+
TracerProvider: tracerProvider,
220225
}
221226

222227
if oauth2GithubClientSecret != "" {

cli/server_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,11 +280,11 @@ func TestServer(t *testing.T) {
280280
require.NoError(t, err)
281281
<-done
282282
})
283-
t.Run("DatadogTracerNoLeak", func(t *testing.T) {
283+
t.Run("TracerNoLeak", func(t *testing.T) {
284284
t.Parallel()
285285
ctx, cancelFunc := context.WithCancel(context.Background())
286286
defer cancelFunc()
287-
root, _ := clitest.New(t, "server", "--dev", "--tunnel=false", "--address", ":0", "--trace-datadog=true")
287+
root, _ := clitest.New(t, "server", "--dev", "--tunnel=false", "--address", ":0", "--trace=true")
288288
done := make(chan struct{})
289289
go func() {
290290
defer close(done)

coderd/coderd.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"github.com/coder/coder/codersdk"
2828
"github.com/coder/coder/site"
2929
"github.com/coder/coder/telemetry"
30+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
3031
)
3132

3233
// Options are requires parameters for Coder to start.
@@ -50,6 +51,7 @@ type Options struct {
5051
SSHKeygenAlgorithm gitsshkey.Algorithm
5152
TURNServer *turnconn.Server
5253
Authorizer rbac.Authorizer
54+
TracerProvider *sdktrace.TracerProvider
5355
}
5456

5557
// New constructs the Coder API into an HTTP handler.
@@ -91,7 +93,7 @@ func New(options *Options) (http.Handler, func()) {
9193
})
9294
},
9395
httpmw.Prometheus,
94-
telemetry.HTTPMW("coderd.http"),
96+
telemetry.HTTPMW(api.TracerProvider, "coderd.http"),
9597
)
9698

9799
r.Route("/api/v2", func(r chi.Router) {

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ require (
240240
go.opentelemetry.io/otel v1.7.0
241241
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect
242242
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0
243+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0
243244
go.opentelemetry.io/otel/sdk v1.7.0
244245
go.opentelemetry.io/otel/trace v1.7.0 // indirect
245246
go.opentelemetry.io/proto/otlp v0.16.0 // indirect

go.sum

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1601,6 +1601,7 @@ go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwk
16011601
go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI=
16021602
go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
16031603
go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
1604+
go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
16041605
go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
16051606
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4=
16061607
go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.3/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40=
@@ -1615,6 +1616,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.3/go.mod h1
16151616
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4=
16161617
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o=
16171618
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE=
1619+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50=
1620+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA=
16181621
go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
16191622
go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw=
16201623
go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=

telemetry/exporter.go

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,25 @@ package telemetry
33
import (
44
"context"
55

6-
"go.opentelemetry.io/otel"
76
"go.opentelemetry.io/otel/exporters/otlp/otlptrace"
8-
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
7+
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
98
"go.opentelemetry.io/otel/sdk/resource"
109
sdktrace "go.opentelemetry.io/otel/sdk/trace"
1110
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
1211
"golang.org/x/xerrors"
1312
)
1413

15-
// Exporter creates a grpc otlp exporter and sets it as the global trace provider.
16-
// Caller is responsible for closing exporter to ensure all data is flushed.
17-
func Exporter(ctx context.Context, service string) (func(), error) {
14+
// TracerProvider creates a grpc otlp exporter and configures a trace provider.
15+
// Caller is responsible for calling TracerProvider.Shutdown to ensure all data is flushed.
16+
func TracerProvider(ctx context.Context, service string) (*sdktrace.TracerProvider, error) {
1817
res, err := resource.New(ctx,
1918
resource.WithAttributes(
2019
// the service name used to display traces in backends
2120
semconv.ServiceNameKey.String(service),
2221
),
2322
)
2423

25-
otlptracegrpc.NewClient()
26-
exporter, err := otlptrace.New(ctx, otlptracegrpc.NewClient())
24+
exporter, err := otlptrace.New(ctx, otlptracehttp.NewClient())
2725
if err != nil {
2826
return nil, xerrors.Errorf("creating otlp exporter: %w", err)
2927
}
@@ -32,9 +30,6 @@ func Exporter(ctx context.Context, service string) (func(), error) {
3230
sdktrace.WithBatcher(exporter),
3331
sdktrace.WithResource(res),
3432
)
35-
otel.SetTracerProvider(tracerProvider)
3633

37-
return func() {
38-
_ = tracerProvider.Shutdown(ctx)
39-
}, nil
34+
return tracerProvider, nil
4035
}

telemetry/httpmw.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,23 @@ import (
66

77
"github.com/go-chi/chi/middleware"
88
"github.com/go-chi/chi/v5"
9-
"go.opentelemetry.io/otel"
109
"go.opentelemetry.io/otel/attribute"
1110
"go.opentelemetry.io/otel/codes"
11+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
1212
)
1313

1414
// HTTPMW adds tracing to http routes.
15-
func HTTPMW(tracer string) func(http.Handler) http.Handler {
15+
func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Handler) http.Handler {
1616
return func(next http.Handler) http.Handler {
1717
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
18+
// // do not trace if exporter has not be initialized
19+
if tracerProvider == nil {
20+
next.ServeHTTP(rw, r)
21+
return
22+
}
23+
1824
// start span with default span name. Span name will be updated once request finishes
19-
_, span := otel.Tracer(tracer).Start(r.Context(), "http.request")
25+
_, span := tracerProvider.Tracer(name).Start(r.Context(), "http.request")
2026
defer span.End()
2127

2228
wrw := middleware.NewWrapResponseWriter(rw, r.ProtoMajor)
@@ -30,6 +36,7 @@ func HTTPMW(tracer string) func(http.Handler) http.Handler {
3036
resourceName = "unknown"
3137
}
3238
resourceName = r.Method + " " + resourceName
39+
fmt.Println(resourceName)
3340
span.SetName(resourceName)
3441

3542
// set the status code

0 commit comments

Comments
 (0)