From 06ca51b5f56614ecb00548b364a7164d97b44bf5 Mon Sep 17 00:00:00 2001 From: Garrett Date: Wed, 18 May 2022 18:52:35 +0000 Subject: [PATCH 01/17] feat: Move from datadog to generic otel --- cli/server.go | 4 ++++ coderd/coderd.go | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/cli/server.go b/cli/server.go index 780f8197c5489..d898c3088cd18 100644 --- a/cli/server.go +++ b/cli/server.go @@ -33,8 +33,11 @@ import ( "golang.org/x/xerrors" "google.golang.org/api/idtoken" "google.golang.org/api/option" +<<<<<<< HEAD sdktrace "go.opentelemetry.io/otel/sdk/trace" +======= +>>>>>>> feat: Move from datadog to generic otel "cdr.dev/slog" "cdr.dev/slog/sloggers/sloghuman" @@ -55,6 +58,7 @@ import ( "github.com/coder/coder/provisionerd" "github.com/coder/coder/provisionersdk" "github.com/coder/coder/provisionersdk/proto" + "github.com/coder/coder/telemetry" ) // nolint:gocyclo diff --git a/coderd/coderd.go b/coderd/coderd.go index 343da27bf55cf..de8a02f39e8a9 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -15,8 +15,6 @@ import ( "golang.org/x/xerrors" "google.golang.org/api/idtoken" - sdktrace "go.opentelemetry.io/otel/sdk/trace" - "cdr.dev/slog" "github.com/coder/coder/buildinfo" "github.com/coder/coder/coderd/awsidentity" @@ -30,6 +28,7 @@ import ( "github.com/coder/coder/codersdk" "github.com/coder/coder/provisionerd/proto" "github.com/coder/coder/site" + sdktrace "go.opentelemetry.io/otel/sdk/trace" ) // Options are requires parameters for Coder to start. From f8c3ab70b28d437d92392806d84627762f6c8df0 Mon Sep 17 00:00:00 2001 From: Garrett Date: Wed, 18 May 2022 18:53:34 +0000 Subject: [PATCH 02/17] add telemetry pkg --- telemetry/exporter.go | 40 +++++++++++++++++++++++++++++++++ telemetry/httpmw.go | 52 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 telemetry/exporter.go create mode 100644 telemetry/httpmw.go diff --git a/telemetry/exporter.go b/telemetry/exporter.go new file mode 100644 index 0000000000000..29f5401d3b5df --- /dev/null +++ b/telemetry/exporter.go @@ -0,0 +1,40 @@ +package telemetry + +import ( + "context" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + "golang.org/x/xerrors" +) + +// Exporter creates a grpc otlp exporter and sets it as the global trace provider. +// Caller is responsible for closing exporter to ensure all data is flushed. +func Exporter(ctx context.Context, service string) (func(), error) { + res, err := resource.New(ctx, + resource.WithAttributes( + // the service name used to display traces in backends + semconv.ServiceNameKey.String(service), + ), + ) + + otlptracegrpc.NewClient() + exporter, err := otlptrace.New(ctx, otlptracegrpc.NewClient()) + if err != nil { + return nil, xerrors.Errorf("creating otlp exporter: %w", err) + } + + tracerProvider := sdktrace.NewTracerProvider( + sdktrace.WithBatcher(exporter), + sdktrace.WithResource(res), + ) + otel.SetTracerProvider(tracerProvider) + + return func() { + _ = tracerProvider.Shutdown(ctx) + }, nil +} diff --git a/telemetry/httpmw.go b/telemetry/httpmw.go new file mode 100644 index 0000000000000..90e7a306a6385 --- /dev/null +++ b/telemetry/httpmw.go @@ -0,0 +1,52 @@ +package telemetry + +import ( + "fmt" + "net/http" + + "github.com/go-chi/chi/middleware" + "github.com/go-chi/chi/v5" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" +) + +// HTTPMW adds tracing to http routes. +func HTTPMW(tracer string) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + // start span with default span name. Span name will be updated once request finishes + _, span := otel.Tracer(tracer).Start(r.Context(), "http.request") + defer span.End() + + wrw := middleware.NewWrapResponseWriter(rw, r.ProtoMajor) + + // pass the span through the request context and serve the request to the next middleware + next.ServeHTTP(rw, r) + + // set the resource name as we get it only once the handler is executed + resourceName := chi.RouteContext(r.Context()).RoutePattern() + if resourceName == "" { + resourceName = "unknown" + } + resourceName = r.Method + " " + resourceName + span.SetName(resourceName) + + // set the status code + status := wrw.Status() + // 0 status means one has not yet been sent in which case net/http library will write StatusOK + if status == 0 { + status = http.StatusOK + } + span.SetAttributes(attribute.KeyValue{ + Key: "http.status_code", + Value: attribute.IntValue(status), + }) + + // if 5XX we set the span to "error" status + if status >= 500 { + span.SetStatus(codes.Error, fmt.Sprintf("%d: %s", status, http.StatusText(status))) + } + }) + } +} From 93ec8180d47bb5ec8609db50f2be8415548d7897 Mon Sep 17 00:00:00 2001 From: Garrett Date: Wed, 18 May 2022 20:28:24 +0000 Subject: [PATCH 03/17] add telemetry package --- cli/server.go | 1 + go.mod | 1 + go.sum | 3 +++ telemetry/exporter.go | 17 ++++++----------- telemetry/httpmw.go | 13 ++++++++++--- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/cli/server.go b/cli/server.go index d898c3088cd18..0c67ae23a7687 100644 --- a/cli/server.go +++ b/cli/server.go @@ -59,6 +59,7 @@ import ( "github.com/coder/coder/provisionersdk" "github.com/coder/coder/provisionersdk/proto" "github.com/coder/coder/telemetry" + sdktrace "go.opentelemetry.io/otel/sdk/trace" ) // nolint:gocyclo diff --git a/go.mod b/go.mod index acc12fe967b8c..6066f56e42a5c 100644 --- a/go.mod +++ b/go.mod @@ -240,6 +240,7 @@ require ( go.opentelemetry.io/otel v1.7.0 go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 go.opentelemetry.io/otel/sdk v1.7.0 go.opentelemetry.io/otel/trace v1.7.0 // indirect go.opentelemetry.io/proto/otlp v0.16.0 // indirect diff --git a/go.sum b/go.sum index 123d5cec3ad49..8e586520ed7bf 100644 --- a/go.sum +++ b/go.sum @@ -1601,6 +1601,7 @@ go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwk go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= +go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= 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 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= diff --git a/telemetry/exporter.go b/telemetry/exporter.go index 29f5401d3b5df..5ad8bd8ab2159 100644 --- a/telemetry/exporter.go +++ b/telemetry/exporter.go @@ -3,18 +3,17 @@ package telemetry import ( "context" - "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.4.0" "golang.org/x/xerrors" ) -// Exporter creates a grpc otlp exporter and sets it as the global trace provider. -// Caller is responsible for closing exporter to ensure all data is flushed. -func Exporter(ctx context.Context, service string) (func(), error) { +// TracerProvider creates a grpc otlp exporter and configures a trace provider. +// Caller is responsible for calling TracerProvider.Shutdown to ensure all data is flushed. +func TracerProvider(ctx context.Context, service string) (*sdktrace.TracerProvider, error) { res, err := resource.New(ctx, resource.WithAttributes( // the service name used to display traces in backends @@ -22,8 +21,7 @@ func Exporter(ctx context.Context, service string) (func(), error) { ), ) - otlptracegrpc.NewClient() - exporter, err := otlptrace.New(ctx, otlptracegrpc.NewClient()) + exporter, err := otlptrace.New(ctx, otlptracehttp.NewClient()) if err != nil { return nil, xerrors.Errorf("creating otlp exporter: %w", err) } @@ -32,9 +30,6 @@ func Exporter(ctx context.Context, service string) (func(), error) { sdktrace.WithBatcher(exporter), sdktrace.WithResource(res), ) - otel.SetTracerProvider(tracerProvider) - return func() { - _ = tracerProvider.Shutdown(ctx) - }, nil + return tracerProvider, nil } diff --git a/telemetry/httpmw.go b/telemetry/httpmw.go index 90e7a306a6385..5901d5dafae31 100644 --- a/telemetry/httpmw.go +++ b/telemetry/httpmw.go @@ -6,17 +6,23 @@ import ( "github.com/go-chi/chi/middleware" "github.com/go-chi/chi/v5" - "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/codes" + sdktrace "go.opentelemetry.io/otel/sdk/trace" ) // HTTPMW adds tracing to http routes. -func HTTPMW(tracer string) func(http.Handler) http.Handler { +func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + // // do not trace if exporter has not be initialized + if tracerProvider == nil { + next.ServeHTTP(rw, r) + return + } + // start span with default span name. Span name will be updated once request finishes - _, span := otel.Tracer(tracer).Start(r.Context(), "http.request") + _, span := tracerProvider.Tracer(name).Start(r.Context(), "http.request") defer span.End() wrw := middleware.NewWrapResponseWriter(rw, r.ProtoMajor) @@ -30,6 +36,7 @@ func HTTPMW(tracer string) func(http.Handler) http.Handler { resourceName = "unknown" } resourceName = r.Method + " " + resourceName + fmt.Println(resourceName) span.SetName(resourceName) // set the status code From b839175e3b48f140279772f32064e111fb56d2a3 Mon Sep 17 00:00:00 2001 From: Garrett Date: Wed, 18 May 2022 20:55:10 +0000 Subject: [PATCH 04/17] cleanup data we send --- telemetry/exporter.go | 4 ++-- telemetry/httpmw.go | 22 ++++++++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/telemetry/exporter.go b/telemetry/exporter.go index 5ad8bd8ab2159..304ae9fe305e2 100644 --- a/telemetry/exporter.go +++ b/telemetry/exporter.go @@ -4,7 +4,7 @@ import ( "context" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.4.0" @@ -21,7 +21,7 @@ func TracerProvider(ctx context.Context, service string) (*sdktrace.TracerProvid ), ) - exporter, err := otlptrace.New(ctx, otlptracehttp.NewClient()) + exporter, err := otlptrace.New(ctx, otlptracegrpc.NewClient(otlptracegrpc.WithInsecure())) if err != nil { return nil, xerrors.Errorf("creating otlp exporter: %w", err) } diff --git a/telemetry/httpmw.go b/telemetry/httpmw.go index 5901d5dafae31..920f5b853a5d1 100644 --- a/telemetry/httpmw.go +++ b/telemetry/httpmw.go @@ -31,13 +31,23 @@ func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Hand next.ServeHTTP(rw, r) // set the resource name as we get it only once the handler is executed - resourceName := chi.RouteContext(r.Context()).RoutePattern() - if resourceName == "" { - resourceName = "unknown" + route := chi.RouteContext(r.Context()).RoutePattern() + if route == "" { + route = "unknown" } - resourceName = r.Method + " " + resourceName - fmt.Println(resourceName) - span.SetName(resourceName) + span.SetName(fmt.Sprintf("%s %s", r.Method, route)) + span.SetAttributes(attribute.KeyValue{ + Key: "http.method", + Value: attribute.StringValue(r.Method), + }) + span.SetAttributes(attribute.KeyValue{ + Key: "http.route", + Value: attribute.StringValue(route), + }) + span.SetAttributes(attribute.KeyValue{ + Key: "http.path", + Value: attribute.StringValue(r.URL.EscapedPath()), + }) // set the status code status := wrw.Status() From 25d5cb1e46a4dbea01b4d746b2bd38e272dd0eed Mon Sep 17 00:00:00 2001 From: Garrett Date: Wed, 18 May 2022 21:04:37 +0000 Subject: [PATCH 05/17] add doc comment --- telemetry/exporter.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/telemetry/exporter.go b/telemetry/exporter.go index 304ae9fe305e2..408a5f4667f7b 100644 --- a/telemetry/exporter.go +++ b/telemetry/exporter.go @@ -21,6 +21,9 @@ func TracerProvider(ctx context.Context, service string) (*sdktrace.TracerProvid ), ) + // By default we send span data to a local otel collector. + // The endpoint we push to can be configured with env vars. + // See https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md exporter, err := otlptrace.New(ctx, otlptracegrpc.NewClient(otlptracegrpc.WithInsecure())) if err != nil { return nil, xerrors.Errorf("creating otlp exporter: %w", err) From 3eeda21f205e0d6300e4a4c427b62842bbfe41f1 Mon Sep 17 00:00:00 2001 From: Garrett Date: Wed, 18 May 2022 21:08:32 +0000 Subject: [PATCH 06/17] rename to tracing --- cli/server.go | 6 ---- telemetry/exporter.go | 38 ------------------------ telemetry/httpmw.go | 69 ------------------------------------------- 3 files changed, 113 deletions(-) delete mode 100644 telemetry/exporter.go delete mode 100644 telemetry/httpmw.go diff --git a/cli/server.go b/cli/server.go index 0c67ae23a7687..d0ccb23c7abd9 100644 --- a/cli/server.go +++ b/cli/server.go @@ -33,11 +33,6 @@ import ( "golang.org/x/xerrors" "google.golang.org/api/idtoken" "google.golang.org/api/option" -<<<<<<< HEAD - - sdktrace "go.opentelemetry.io/otel/sdk/trace" -======= ->>>>>>> feat: Move from datadog to generic otel "cdr.dev/slog" "cdr.dev/slog/sloggers/sloghuman" @@ -58,7 +53,6 @@ import ( "github.com/coder/coder/provisionerd" "github.com/coder/coder/provisionersdk" "github.com/coder/coder/provisionersdk/proto" - "github.com/coder/coder/telemetry" sdktrace "go.opentelemetry.io/otel/sdk/trace" ) diff --git a/telemetry/exporter.go b/telemetry/exporter.go deleted file mode 100644 index 408a5f4667f7b..0000000000000 --- a/telemetry/exporter.go +++ /dev/null @@ -1,38 +0,0 @@ -package telemetry - -import ( - "context" - - "go.opentelemetry.io/otel/exporters/otlp/otlptrace" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" - "go.opentelemetry.io/otel/sdk/resource" - sdktrace "go.opentelemetry.io/otel/sdk/trace" - semconv "go.opentelemetry.io/otel/semconv/v1.4.0" - "golang.org/x/xerrors" -) - -// TracerProvider creates a grpc otlp exporter and configures a trace provider. -// Caller is responsible for calling TracerProvider.Shutdown to ensure all data is flushed. -func TracerProvider(ctx context.Context, service string) (*sdktrace.TracerProvider, error) { - res, err := resource.New(ctx, - resource.WithAttributes( - // the service name used to display traces in backends - semconv.ServiceNameKey.String(service), - ), - ) - - // By default we send span data to a local otel collector. - // The endpoint we push to can be configured with env vars. - // See https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md - exporter, err := otlptrace.New(ctx, otlptracegrpc.NewClient(otlptracegrpc.WithInsecure())) - if err != nil { - return nil, xerrors.Errorf("creating otlp exporter: %w", err) - } - - tracerProvider := sdktrace.NewTracerProvider( - sdktrace.WithBatcher(exporter), - sdktrace.WithResource(res), - ) - - return tracerProvider, nil -} diff --git a/telemetry/httpmw.go b/telemetry/httpmw.go deleted file mode 100644 index 920f5b853a5d1..0000000000000 --- a/telemetry/httpmw.go +++ /dev/null @@ -1,69 +0,0 @@ -package telemetry - -import ( - "fmt" - "net/http" - - "github.com/go-chi/chi/middleware" - "github.com/go-chi/chi/v5" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/codes" - sdktrace "go.opentelemetry.io/otel/sdk/trace" -) - -// HTTPMW adds tracing to http routes. -func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Handler) http.Handler { - return func(next http.Handler) http.Handler { - return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - // // do not trace if exporter has not be initialized - if tracerProvider == nil { - next.ServeHTTP(rw, r) - return - } - - // start span with default span name. Span name will be updated once request finishes - _, span := tracerProvider.Tracer(name).Start(r.Context(), "http.request") - defer span.End() - - wrw := middleware.NewWrapResponseWriter(rw, r.ProtoMajor) - - // pass the span through the request context and serve the request to the next middleware - next.ServeHTTP(rw, r) - - // set the resource name as we get it only once the handler is executed - route := chi.RouteContext(r.Context()).RoutePattern() - if route == "" { - route = "unknown" - } - span.SetName(fmt.Sprintf("%s %s", r.Method, route)) - span.SetAttributes(attribute.KeyValue{ - Key: "http.method", - Value: attribute.StringValue(r.Method), - }) - span.SetAttributes(attribute.KeyValue{ - Key: "http.route", - Value: attribute.StringValue(route), - }) - span.SetAttributes(attribute.KeyValue{ - Key: "http.path", - Value: attribute.StringValue(r.URL.EscapedPath()), - }) - - // set the status code - status := wrw.Status() - // 0 status means one has not yet been sent in which case net/http library will write StatusOK - if status == 0 { - status = http.StatusOK - } - span.SetAttributes(attribute.KeyValue{ - Key: "http.status_code", - Value: attribute.IntValue(status), - }) - - // if 5XX we set the span to "error" status - if status >= 500 { - span.SetStatus(codes.Error, fmt.Sprintf("%d: %s", status, http.StatusText(status))) - } - }) - } -} From 69ca22747fb147d175340731e4eb76f6d0237b81 Mon Sep 17 00:00:00 2001 From: Garrett Date: Wed, 18 May 2022 21:14:44 +0000 Subject: [PATCH 07/17] rename to tracing for real --- tracing/exporter.go | 41 +++++++++++++++++++++++++++ tracing/httpmw.go | 69 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 tracing/exporter.go create mode 100644 tracing/httpmw.go diff --git a/tracing/exporter.go b/tracing/exporter.go new file mode 100644 index 0000000000000..6b85bc2af17a7 --- /dev/null +++ b/tracing/exporter.go @@ -0,0 +1,41 @@ +package tracing + +import ( + "context" + + "go.opentelemetry.io/otel/exporters/otlp/otlptrace" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/sdk/resource" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + "golang.org/x/xerrors" +) + +// TracerProvider creates a grpc otlp exporter and configures a trace provider. +// Caller is responsible for calling TracerProvider.Shutdown to ensure all data is flushed. +func TracerProvider(ctx context.Context, service string) (*sdktrace.TracerProvider, error) { + res, err := resource.New(ctx, + resource.WithAttributes( + // the service name used to display traces in backends + semconv.ServiceNameKey.String(service), + ), + ) + if err != nil { + return nil, xerrors.Errorf("creating otlp resource: %w", err) + } + + // By default we send span data to a local otel collector. + // The endpoint we push to can be configured with env vars. + // See https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md + exporter, err := otlptrace.New(ctx, otlptracegrpc.NewClient(otlptracegrpc.WithInsecure())) + if err != nil { + return nil, xerrors.Errorf("creating otlp exporter: %w", err) + } + + tracerProvider := sdktrace.NewTracerProvider( + sdktrace.WithBatcher(exporter), + sdktrace.WithResource(res), + ) + + return tracerProvider, nil +} diff --git a/tracing/httpmw.go b/tracing/httpmw.go new file mode 100644 index 0000000000000..501540868b754 --- /dev/null +++ b/tracing/httpmw.go @@ -0,0 +1,69 @@ +package tracing + +import ( + "fmt" + "net/http" + + "github.com/go-chi/chi/middleware" + "github.com/go-chi/chi/v5" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + sdktrace "go.opentelemetry.io/otel/sdk/trace" +) + +// HTTPMW adds tracing to http routes. +func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { + // // do not trace if exporter has not be initialized + if tracerProvider == nil { + next.ServeHTTP(rw, r) + return + } + + // start span with default span name. Span name will be updated once request finishes + _, span := tracerProvider.Tracer(name).Start(r.Context(), "http.request") + defer span.End() + + wrw := middleware.NewWrapResponseWriter(rw, r.ProtoMajor) + + // pass the span through the request context and serve the request to the next middleware + next.ServeHTTP(rw, r) + + // set the resource name as we get it only once the handler is executed + route := chi.RouteContext(r.Context()).RoutePattern() + if route == "" { + route = "unknown" + } + span.SetName(fmt.Sprintf("%s %s", r.Method, route)) + span.SetAttributes(attribute.KeyValue{ + Key: "http.method", + Value: attribute.StringValue(r.Method), + }) + span.SetAttributes(attribute.KeyValue{ + Key: "http.route", + Value: attribute.StringValue(route), + }) + span.SetAttributes(attribute.KeyValue{ + Key: "http.path", + Value: attribute.StringValue(r.URL.EscapedPath()), + }) + + // set the status code + status := wrw.Status() + // 0 status means one has not yet been sent in which case net/http library will write StatusOK + if status == 0 { + status = http.StatusOK + } + span.SetAttributes(attribute.KeyValue{ + Key: "http.status_code", + Value: attribute.IntValue(status), + }) + + // if 5XX we set the span to "error" status + if status >= 500 { + span.SetStatus(codes.Error, fmt.Sprintf("%d: %s", status, http.StatusText(status))) + } + }) + } +} From af7c5ef04949d624cc2ac1f57042ac8856449823 Mon Sep 17 00:00:00 2001 From: Garrett Date: Wed, 18 May 2022 21:59:40 +0000 Subject: [PATCH 08/17] move to coderd --- coderd/coderd.go | 4 +++ coderd/tracing/httpmw.go | 1 - go.mod | 1 - go.sum | 3 -- tracing/exporter.go | 41 ------------------------ tracing/httpmw.go | 69 ---------------------------------------- 6 files changed, 4 insertions(+), 115 deletions(-) delete mode 100644 tracing/exporter.go delete mode 100644 tracing/httpmw.go diff --git a/coderd/coderd.go b/coderd/coderd.go index de8a02f39e8a9..797cc06fdda0f 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -102,7 +102,11 @@ func newRouter(options *Options, a *api) chi.Router { }) }, httpmw.Prometheus, +<<<<<<< HEAD tracing.HTTPMW(a.TracerProvider, "coderd.http"), +======= + tracing.HTTPMW(api.TracerProvider, "coderd.http"), +>>>>>>> move to coderd ) r.Route("/api/v2", func(r chi.Router) { diff --git a/coderd/tracing/httpmw.go b/coderd/tracing/httpmw.go index 9360ebd68af6f..ad19de95ff3b4 100644 --- a/coderd/tracing/httpmw.go +++ b/coderd/tracing/httpmw.go @@ -15,7 +15,6 @@ import ( func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - // do not trace if exporter has not be initialized if tracerProvider == nil { next.ServeHTTP(rw, r) return diff --git a/go.mod b/go.mod index 6066f56e42a5c..acc12fe967b8c 100644 --- a/go.mod +++ b/go.mod @@ -240,7 +240,6 @@ require ( go.opentelemetry.io/otel v1.7.0 go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 go.opentelemetry.io/otel/sdk v1.7.0 go.opentelemetry.io/otel/trace v1.7.0 // indirect go.opentelemetry.io/proto/otlp v0.16.0 // indirect diff --git a/go.sum b/go.sum index 8e586520ed7bf..123d5cec3ad49 100644 --- a/go.sum +++ b/go.sum @@ -1601,7 +1601,6 @@ go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwk go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= -go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.3/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40= @@ -1616,8 +1615,6 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.3/go.mod h1 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= diff --git a/tracing/exporter.go b/tracing/exporter.go deleted file mode 100644 index 6b85bc2af17a7..0000000000000 --- a/tracing/exporter.go +++ /dev/null @@ -1,41 +0,0 @@ -package tracing - -import ( - "context" - - "go.opentelemetry.io/otel/exporters/otlp/otlptrace" - "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" - "go.opentelemetry.io/otel/sdk/resource" - sdktrace "go.opentelemetry.io/otel/sdk/trace" - semconv "go.opentelemetry.io/otel/semconv/v1.4.0" - "golang.org/x/xerrors" -) - -// TracerProvider creates a grpc otlp exporter and configures a trace provider. -// Caller is responsible for calling TracerProvider.Shutdown to ensure all data is flushed. -func TracerProvider(ctx context.Context, service string) (*sdktrace.TracerProvider, error) { - res, err := resource.New(ctx, - resource.WithAttributes( - // the service name used to display traces in backends - semconv.ServiceNameKey.String(service), - ), - ) - if err != nil { - return nil, xerrors.Errorf("creating otlp resource: %w", err) - } - - // By default we send span data to a local otel collector. - // The endpoint we push to can be configured with env vars. - // See https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/protocol/exporter.md - exporter, err := otlptrace.New(ctx, otlptracegrpc.NewClient(otlptracegrpc.WithInsecure())) - if err != nil { - return nil, xerrors.Errorf("creating otlp exporter: %w", err) - } - - tracerProvider := sdktrace.NewTracerProvider( - sdktrace.WithBatcher(exporter), - sdktrace.WithResource(res), - ) - - return tracerProvider, nil -} diff --git a/tracing/httpmw.go b/tracing/httpmw.go deleted file mode 100644 index 501540868b754..0000000000000 --- a/tracing/httpmw.go +++ /dev/null @@ -1,69 +0,0 @@ -package tracing - -import ( - "fmt" - "net/http" - - "github.com/go-chi/chi/middleware" - "github.com/go-chi/chi/v5" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/codes" - sdktrace "go.opentelemetry.io/otel/sdk/trace" -) - -// HTTPMW adds tracing to http routes. -func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Handler) http.Handler { - return func(next http.Handler) http.Handler { - return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - // // do not trace if exporter has not be initialized - if tracerProvider == nil { - next.ServeHTTP(rw, r) - return - } - - // start span with default span name. Span name will be updated once request finishes - _, span := tracerProvider.Tracer(name).Start(r.Context(), "http.request") - defer span.End() - - wrw := middleware.NewWrapResponseWriter(rw, r.ProtoMajor) - - // pass the span through the request context and serve the request to the next middleware - next.ServeHTTP(rw, r) - - // set the resource name as we get it only once the handler is executed - route := chi.RouteContext(r.Context()).RoutePattern() - if route == "" { - route = "unknown" - } - span.SetName(fmt.Sprintf("%s %s", r.Method, route)) - span.SetAttributes(attribute.KeyValue{ - Key: "http.method", - Value: attribute.StringValue(r.Method), - }) - span.SetAttributes(attribute.KeyValue{ - Key: "http.route", - Value: attribute.StringValue(route), - }) - span.SetAttributes(attribute.KeyValue{ - Key: "http.path", - Value: attribute.StringValue(r.URL.EscapedPath()), - }) - - // set the status code - status := wrw.Status() - // 0 status means one has not yet been sent in which case net/http library will write StatusOK - if status == 0 { - status = http.StatusOK - } - span.SetAttributes(attribute.KeyValue{ - Key: "http.status_code", - Value: attribute.IntValue(status), - }) - - // if 5XX we set the span to "error" status - if status >= 500 { - span.SetStatus(codes.Error, fmt.Sprintf("%d: %s", status, http.StatusText(status))) - } - }) - } -} From 46d9217600a35f44322aff16cd9a1c6a76f410c9 Mon Sep 17 00:00:00 2001 From: Garrett Date: Thu, 19 May 2022 18:24:24 +0000 Subject: [PATCH 09/17] wip --- cli/server.go | 20 +++++++++++--- coderd/coderd.go | 3 ++- coderd/database/postgres/postgres.go | 4 +-- coderd/tracing/httpmw.go | 39 ++++++++++------------------ coderd/tracing/postgres.go | 26 +++++++++++++++++++ go.mod | 3 +++ go.sum | 4 +++ 7 files changed, 67 insertions(+), 32 deletions(-) create mode 100644 coderd/tracing/postgres.go diff --git a/cli/server.go b/cli/server.go index d0ccb23c7abd9..16ca8b58b79be 100644 --- a/cli/server.go +++ b/cli/server.go @@ -43,6 +43,7 @@ import ( "github.com/coder/coder/coderd/autobuild/executor" "github.com/coder/coder/coderd/database" "github.com/coder/coder/coderd/database/databasefake" + "github.com/coder/coder/coderd/database/postgres" "github.com/coder/coder/coderd/devtunnel" "github.com/coder/coder/coderd/gitsshkey" "github.com/coder/coder/coderd/tracing" @@ -102,8 +103,11 @@ func server() *cobra.Command { logger = logger.Leveled(slog.LevelDebug) } - var tracerProvider *sdktrace.TracerProvider - var err error + var ( + tracerProvider *sdktrace.TracerProvider + err error + sqlDriver = "postgres" + ) if trace { tracerProvider, err = tracing.TracerProvider(cmd.Context(), "coderd") if err != nil { @@ -116,6 +120,11 @@ func server() *cobra.Command { _ = tracerProvider.Shutdown(ctx) }() } + + sqlDriver, err = tracing.PostgresDriver(tracerProvider, "coderd.database") + if err != nil { + logger.Warn(cmd.Context(), "failed to start postgres tracing driver", slog.Error(err)) + } } printLogo(cmd, spooky) @@ -244,7 +253,12 @@ func server() *cobra.Command { _, _ = fmt.Fprintln(cmd.ErrOrStderr()) if !dev { - sqlDB, err := sql.Open("postgres", postgresURL) + postgresURL, cleanup, err := postgres.Open() + if err != nil { + return xerrors.Errorf("open postgres: %w", err) + } + defer cleanup() + sqlDB, err := sql.Open(sqlDriver, postgresURL) if err != nil { return xerrors.Errorf("dial postgres: %w", err) } diff --git a/coderd/coderd.go b/coderd/coderd.go index 797cc06fdda0f..3c392a41005fa 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -12,6 +12,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/pion/webrtc/v3" + "go.opentelemetry.io/otel/trace" "golang.org/x/xerrors" "google.golang.org/api/idtoken" @@ -52,7 +53,7 @@ type Options struct { SSHKeygenAlgorithm gitsshkey.Algorithm TURNServer *turnconn.Server Authorizer rbac.Authorizer - TracerProvider *sdktrace.TracerProvider + TracerProvider trace.TracerProvider } type CoderD interface { diff --git a/coderd/database/postgres/postgres.go b/coderd/database/postgres/postgres.go index 73306eb88b4c0..45d63bb00bcc8 100644 --- a/coderd/database/postgres/postgres.go +++ b/coderd/database/postgres/postgres.go @@ -110,12 +110,12 @@ func Open() (string, func(), error) { dbURL := fmt.Sprintf("postgres://postgres:postgres@%s/postgres?sslmode=disable", hostAndPort) // Docker should hard-kill the container after 120 seconds. - err = resource.Expire(120) + err = resource.Expire(600) if err != nil { return "", nil, xerrors.Errorf("expire resource: %w", err) } - pool.MaxWait = 120 * time.Second + pool.MaxWait = 600 * time.Second err = pool.Retry(func() error { db, err := sql.Open("postgres", dbURL) if err != nil { diff --git a/coderd/tracing/httpmw.go b/coderd/tracing/httpmw.go index ad19de95ff3b4..badbef26df173 100644 --- a/coderd/tracing/httpmw.go +++ b/coderd/tracing/httpmw.go @@ -6,13 +6,12 @@ import ( "github.com/go-chi/chi/middleware" "github.com/go-chi/chi/v5" - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/codes" - sdktrace "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.10.0" + "go.opentelemetry.io/otel/trace" ) // HTTPMW adds tracing to http routes. -func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Handler) http.Handler { +func HTTPMW(tracerProvider trace.TracerProvider, name string) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { if tracerProvider == nil { @@ -21,8 +20,9 @@ func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Hand } // start span with default span name. Span name will be updated to "method route" format once request finishes. - _, span := tracerProvider.Tracer(name).Start(r.Context(), fmt.Sprintf("%s %s", r.Method, r.RequestURI)) + ctx, span := tracerProvider.Tracer(name).Start(r.Context(), fmt.Sprintf("%s %s", r.Method, r.RequestURI)) defer span.End() + r = r.WithContext(ctx) wrw := middleware.NewWrapResponseWriter(rw, r.ProtoMajor) @@ -34,18 +34,11 @@ func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Hand if route != "" { span.SetName(fmt.Sprintf("%s %s", r.Method, route)) } - span.SetAttributes(attribute.KeyValue{ - Key: "http.method", - Value: attribute.StringValue(r.Method), - }) - span.SetAttributes(attribute.KeyValue{ - Key: "http.route", - Value: attribute.StringValue(route), - }) - span.SetAttributes(attribute.KeyValue{ - Key: "http.path", - Value: attribute.StringValue(r.URL.EscapedPath()), - }) + span.SetName(fmt.Sprintf("%s %s", r.Method, route)) + span.SetAttributes(semconv.NetAttributesFromHTTPRequest("tcp", r)...) + span.SetAttributes(semconv.EndUserAttributesFromHTTPRequest(r)...) + span.SetAttributes(semconv.HTTPServerAttributesFromHTTPRequest("", route, r)...) + span.SetAttributes(semconv.HTTPRouteKey.String(route)) // set the status code status := wrw.Status() @@ -53,15 +46,9 @@ func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Hand if status == 0 { status = http.StatusOK } - span.SetAttributes(attribute.KeyValue{ - Key: "http.status_code", - Value: attribute.IntValue(status), - }) - - // if 5XX we set the span to "error" status - if status >= 500 { - span.SetStatus(codes.Error, fmt.Sprintf("%d: %s", status, http.StatusText(status))) - } + span.SetAttributes(semconv.HTTPStatusCodeKey.Int(status)) + spanStatus, spanMessage := semconv.SpanStatusFromHTTPStatusCode(status) + span.SetStatus(spanStatus, spanMessage) }) } } diff --git a/coderd/tracing/postgres.go b/coderd/tracing/postgres.go new file mode 100644 index 0000000000000..bd359dcddb155 --- /dev/null +++ b/coderd/tracing/postgres.go @@ -0,0 +1,26 @@ +package tracing + +import ( + "github.com/nhatthm/otelsql" + semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + "go.opentelemetry.io/otel/trace" + "golang.org/x/xerrors" +) + +// Postgres driver will register a new tracing sql driver and return the driver name. +func PostgresDriver(tp trace.TracerProvider, service string) (string, error) { + // Register the otelsql wrapper for the provided postgres driver. + driverName, err := otelsql.Register("postgres", + otelsql.WithDefaultAttributes( + semconv.ServiceNameKey.String(service), + ), + otelsql.TraceQueryWithoutArgs(), + otelsql.WithSystem(semconv.DBSystemPostgreSQL), + otelsql.WithTracerProvider(tp), + ) + if err != nil { + return "", xerrors.Errorf("registering postgres tracing driver: %w", err) + } + + return driverName, nil +} diff --git a/go.mod b/go.mod index acc12fe967b8c..65c47394ca497 100644 --- a/go.mod +++ b/go.mod @@ -125,6 +125,8 @@ require ( storj.io/drpc v0.0.30 ) +require go.opentelemetry.io/otel/metric v0.30.0 // indirect + require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect @@ -196,6 +198,7 @@ require ( github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70 // indirect github.com/muesli/reflow v0.3.0 // indirect github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739 // indirect + github.com/nhatthm/otelsql v0.3.0 github.com/niklasfasching/go-org v1.6.2 // indirect github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect github.com/opencontainers/go-digest v1.0.0 // indirect diff --git a/go.sum b/go.sum index 123d5cec3ad49..3a0d3e04d9fa2 100644 --- a/go.sum +++ b/go.sum @@ -1190,6 +1190,8 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+ github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI= +github.com/nhatthm/otelsql v0.3.0 h1:BvqFgk6FkkmlY2KrtSyxILkPJL5oI2Bzny/s7d134N8= +github.com/nhatthm/otelsql v0.3.0/go.mod h1:6OmgQmHfKwLqNQp+nNh5xHOrMl19y8n4v44FLRZWYlQ= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/niklasfasching/go-org v1.6.2 h1:kQBIZlfL4oRNApJCrBgaeNBfzxWzP6XlC7/b744Polk= github.com/niklasfasching/go-org v1.6.2/go.mod h1:wn76Xgu4/KRe43WZhsgZjxYMaloSrl3BSweGV74SwHs= @@ -1617,6 +1619,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw= +go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c= +go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= From 2005d4cbd0b3b20a1ea72d11e83ea5509cb07134 Mon Sep 17 00:00:00 2001 From: Garrett Date: Thu, 19 May 2022 22:51:26 +0000 Subject: [PATCH 10/17] fix merge --- cli/server.go | 1 + coderd/coderd.go | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/cli/server.go b/cli/server.go index 16ca8b58b79be..980be8d30d973 100644 --- a/cli/server.go +++ b/cli/server.go @@ -28,6 +28,7 @@ import ( "github.com/pion/webrtc/v3" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/spf13/cobra" + sdktrace "go.opentelemetry.io/otel/sdk/trace" "golang.org/x/oauth2" xgithub "golang.org/x/oauth2/github" "golang.org/x/xerrors" diff --git a/coderd/coderd.go b/coderd/coderd.go index 3c392a41005fa..cf1fa1c388c16 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -29,7 +29,6 @@ import ( "github.com/coder/coder/codersdk" "github.com/coder/coder/provisionerd/proto" "github.com/coder/coder/site" - sdktrace "go.opentelemetry.io/otel/sdk/trace" ) // Options are requires parameters for Coder to start. @@ -103,11 +102,7 @@ func newRouter(options *Options, a *api) chi.Router { }) }, httpmw.Prometheus, -<<<<<<< HEAD tracing.HTTPMW(a.TracerProvider, "coderd.http"), -======= - tracing.HTTPMW(api.TracerProvider, "coderd.http"), ->>>>>>> move to coderd ) r.Route("/api/v2", func(r chi.Router) { From cc5e0b00e401e25ce3af4b63f3df5d91ec718fec Mon Sep 17 00:00:00 2001 From: Garrett Date: Thu, 19 May 2022 23:35:44 +0000 Subject: [PATCH 11/17] Add span formatter --- coderd/tracing/postgres.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/coderd/tracing/postgres.go b/coderd/tracing/postgres.go index bd359dcddb155..475253b346e44 100644 --- a/coderd/tracing/postgres.go +++ b/coderd/tracing/postgres.go @@ -1,8 +1,12 @@ package tracing import ( + "context" + "fmt" + "strings" + "github.com/nhatthm/otelsql" - semconv "go.opentelemetry.io/otel/semconv/v1.4.0" + semconv "go.opentelemetry.io/otel/semconv/v1.7.0" "go.opentelemetry.io/otel/trace" "golang.org/x/xerrors" ) @@ -17,6 +21,7 @@ func PostgresDriver(tp trace.TracerProvider, service string) (string, error) { otelsql.TraceQueryWithoutArgs(), otelsql.WithSystem(semconv.DBSystemPostgreSQL), otelsql.WithTracerProvider(tp), + otelsql.WithSpanNameFormatter(formatPostgresSpan), ) if err != nil { return "", xerrors.Errorf("registering postgres tracing driver: %w", err) @@ -24,3 +29,14 @@ func PostgresDriver(tp trace.TracerProvider, service string) (string, error) { return driverName, nil } + +func formatPostgresSpan(ctx context.Context, op string) string { + const qPrefix = "-- name: " + q := otelsql.QueryFromContext(ctx) + if q == "" || !strings.HasPrefix(q, qPrefix) { + return strings.ToUpper(op) + } + + s := strings.Split(strings.TrimPrefix(q, qPrefix), " ")[0] + return fmt.Sprintf("%s %s", strings.ToUpper(op), s) +} From 5b9b6545f5e22b9ddea3cea5c793e646f07bc075 Mon Sep 17 00:00:00 2001 From: Garrett Date: Thu, 19 May 2022 23:38:16 +0000 Subject: [PATCH 12/17] lint --- cli/logout_test.go | 3 +-- coderd/database/postgres/postgres.go | 4 ++-- go.mod | 5 ++--- go.sum | 9 +++++++++ 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/cli/logout_test.go b/cli/logout_test.go index 2e36d114aa047..2c98d92e29d43 100644 --- a/cli/logout_test.go +++ b/cli/logout_test.go @@ -3,11 +3,10 @@ package cli_test import ( "testing" - "github.com/stretchr/testify/require" - "github.com/coder/coder/cli/clitest" "github.com/coder/coder/coderd/coderdtest" "github.com/coder/coder/pty/ptytest" + "github.com/stretchr/testify/require" ) func TestLogout(t *testing.T) { diff --git a/coderd/database/postgres/postgres.go b/coderd/database/postgres/postgres.go index 45d63bb00bcc8..73306eb88b4c0 100644 --- a/coderd/database/postgres/postgres.go +++ b/coderd/database/postgres/postgres.go @@ -110,12 +110,12 @@ func Open() (string, func(), error) { dbURL := fmt.Sprintf("postgres://postgres:postgres@%s/postgres?sslmode=disable", hostAndPort) // Docker should hard-kill the container after 120 seconds. - err = resource.Expire(600) + err = resource.Expire(120) if err != nil { return "", nil, xerrors.Errorf("expire resource: %w", err) } - pool.MaxWait = 600 * time.Second + pool.MaxWait = 120 * time.Second err = pool.Retry(func() error { db, err := sql.Open("postgres", dbURL) if err != nil { diff --git a/go.mod b/go.mod index 65c47394ca497..74ac72c3fd465 100644 --- a/go.mod +++ b/go.mod @@ -125,8 +125,6 @@ require ( storj.io/drpc v0.0.30 ) -require go.opentelemetry.io/otel/metric v0.30.0 // indirect - require ( github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect @@ -243,8 +241,9 @@ require ( go.opentelemetry.io/otel v1.7.0 go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 + go.opentelemetry.io/otel/metric v0.30.0 // indirect go.opentelemetry.io/otel/sdk v1.7.0 - go.opentelemetry.io/otel/trace v1.7.0 // indirect + go.opentelemetry.io/otel/trace v1.7.0 go.opentelemetry.io/proto/otlp v0.16.0 // indirect golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/go.sum b/go.sum index 3a0d3e04d9fa2..95c0ee4e6e793 100644 --- a/go.sum +++ b/go.sum @@ -97,6 +97,7 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= +github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= @@ -228,6 +229,7 @@ github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqO github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= +github.com/bool64/shared v0.1.4 h1:zwtb1dl2QzDa9TJOq2jzDTdb5IPf9XlxTGKN8cySWT0= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bshuster-repo/logrus-logstash-hook v1.0.0/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= @@ -896,6 +898,7 @@ github.com/hashicorp/yamux v0.0.0-20211028200310-0bc27b27de87/go.mod h1:CtWFDAQg github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/iancoleman/orderedmap v0.2.0 h1:sq1N/TFpYH++aViPcaKjys3bDClUEU7s5B+z6jq8pNA= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -1492,6 +1495,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/swaggest/assertjson v1.6.8 h1:1O/9UI5M+2OJI7BeEWKGj0wTvpRXZt5FkOJ4nRkY4rA= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -1556,6 +1560,8 @@ github.com/xtaci/lossyconn v0.0.0-20200209145036-adba10fffc37/go.mod h1:HpMP7DB2 github.com/yashtewari/glob-intersection v0.1.0 h1:6gJvMYQlTDOL3dMsPF6J0+26vwX9MB8/1q3uAdhmTrg= github.com/yashtewari/glob-intersection v0.1.0/go.mod h1:LK7pIC3piUjovexikBbJ26Yml7g8xa5bsjfx2v1fwok= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= +github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA= +github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1617,6 +1623,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.3/go.mod h1 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v0.30.0 h1:2glg1ZFVVZf47zFuX0iwBPPid4tqzBYYWTVVu0pc+us= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.7.0 h1:8hPcgCg0rUJiKE6VWahRvjgLUrNl7rW2hffUEPKXVEM= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw= go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c= @@ -1629,6 +1637,7 @@ go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1 go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU= go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= +go.opentelemetry.io/otel/sdk/metric v0.30.0 h1:XTqQ4y3erR2Oj8xSAOL5ovO5011ch2ELg51z4fVkpME= go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE= From a2ddd7728e12a79da1f00179239b550cce4642f3 Mon Sep 17 00:00:00 2001 From: Garrett Date: Thu, 19 May 2022 23:39:10 +0000 Subject: [PATCH 13/17] remove postgres dev hack --- cli/server.go | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cli/server.go b/cli/server.go index 980be8d30d973..3e329882c8e52 100644 --- a/cli/server.go +++ b/cli/server.go @@ -44,7 +44,6 @@ import ( "github.com/coder/coder/coderd/autobuild/executor" "github.com/coder/coder/coderd/database" "github.com/coder/coder/coderd/database/databasefake" - "github.com/coder/coder/coderd/database/postgres" "github.com/coder/coder/coderd/devtunnel" "github.com/coder/coder/coderd/gitsshkey" "github.com/coder/coder/coderd/tracing" @@ -254,11 +253,6 @@ func server() *cobra.Command { _, _ = fmt.Fprintln(cmd.ErrOrStderr()) if !dev { - postgresURL, cleanup, err := postgres.Open() - if err != nil { - return xerrors.Errorf("open postgres: %w", err) - } - defer cleanup() sqlDB, err := sql.Open(sqlDriver, postgresURL) if err != nil { return xerrors.Errorf("dial postgres: %w", err) From 4f401e19a224297bd480f68fc4d9356f4cabea30 Mon Sep 17 00:00:00 2001 From: Garrett Date: Fri, 20 May 2022 00:09:48 +0000 Subject: [PATCH 14/17] try to fix tests --- cli/server.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cli/server.go b/cli/server.go index 3e329882c8e52..3d08460e9c4e6 100644 --- a/cli/server.go +++ b/cli/server.go @@ -119,11 +119,11 @@ func server() *cobra.Command { defer cancel() _ = tracerProvider.Shutdown(ctx) }() - } - sqlDriver, err = tracing.PostgresDriver(tracerProvider, "coderd.database") - if err != nil { - logger.Warn(cmd.Context(), "failed to start postgres tracing driver", slog.Error(err)) + sqlDriver, err = tracing.PostgresDriver(tracerProvider, "coderd.database") + if err != nil { + logger.Warn(cmd.Context(), "failed to start postgres tracing driver", slog.Error(err)) + } } } From 2cb35aa695bcd20a79007356e81a65b8e0a86ff3 Mon Sep 17 00:00:00 2001 From: Garrett Date: Fri, 20 May 2022 00:12:41 +0000 Subject: [PATCH 15/17] dont use interface --- coderd/coderd.go | 4 ++-- coderd/tracing/httpmw.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/coderd/coderd.go b/coderd/coderd.go index cf1fa1c388c16..de8a02f39e8a9 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -12,7 +12,6 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/pion/webrtc/v3" - "go.opentelemetry.io/otel/trace" "golang.org/x/xerrors" "google.golang.org/api/idtoken" @@ -29,6 +28,7 @@ import ( "github.com/coder/coder/codersdk" "github.com/coder/coder/provisionerd/proto" "github.com/coder/coder/site" + sdktrace "go.opentelemetry.io/otel/sdk/trace" ) // Options are requires parameters for Coder to start. @@ -52,7 +52,7 @@ type Options struct { SSHKeygenAlgorithm gitsshkey.Algorithm TURNServer *turnconn.Server Authorizer rbac.Authorizer - TracerProvider trace.TracerProvider + TracerProvider *sdktrace.TracerProvider } type CoderD interface { diff --git a/coderd/tracing/httpmw.go b/coderd/tracing/httpmw.go index badbef26df173..6e22e68e970f6 100644 --- a/coderd/tracing/httpmw.go +++ b/coderd/tracing/httpmw.go @@ -6,12 +6,12 @@ import ( "github.com/go-chi/chi/middleware" "github.com/go-chi/chi/v5" + sdktrace "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.10.0" - "go.opentelemetry.io/otel/trace" ) // HTTPMW adds tracing to http routes. -func HTTPMW(tracerProvider trace.TracerProvider, name string) func(http.Handler) http.Handler { +func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { if tracerProvider == nil { From a4c46832667ebda21cf6fec40e003b2fbe87d4dd Mon Sep 17 00:00:00 2001 From: Garrett Date: Fri, 20 May 2022 15:27:19 +0000 Subject: [PATCH 16/17] pr comments --- cli/server.go | 4 +++- coderd/tracing/postgres.go | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/cli/server.go b/cli/server.go index 3d08460e9c4e6..a226fd3444716 100644 --- a/cli/server.go +++ b/cli/server.go @@ -120,9 +120,11 @@ func server() *cobra.Command { _ = tracerProvider.Shutdown(ctx) }() - sqlDriver, err = tracing.PostgresDriver(tracerProvider, "coderd.database") + d, err := tracing.PostgresDriver(tracerProvider, "coderd.database") if err != nil { logger.Warn(cmd.Context(), "failed to start postgres tracing driver", slog.Error(err)) + } else { + sqlDriver = d } } } diff --git a/coderd/tracing/postgres.go b/coderd/tracing/postgres.go index 475253b346e44..f71ec358b207b 100644 --- a/coderd/tracing/postgres.go +++ b/coderd/tracing/postgres.go @@ -37,6 +37,9 @@ func formatPostgresSpan(ctx context.Context, op string) string { return strings.ToUpper(op) } - s := strings.Split(strings.TrimPrefix(q, qPrefix), " ")[0] + // Remove the qPrefix and then grab the method name. + // We expect the first line of the query to be in + // the format "-- name: GetAPIKeyByID :one". + s := strings.SplitN(strings.TrimPrefix(q, qPrefix), " ", 2)[0] return fmt.Sprintf("%s %s", strings.ToUpper(op), s) } From 0f5519bb251dad7b33be42668d58cbc23df0d3da Mon Sep 17 00:00:00 2001 From: Garrett Date: Fri, 20 May 2022 15:34:53 +0000 Subject: [PATCH 17/17] lint --- cli/logout_test.go | 3 ++- cli/server.go | 1 - coderd/coderd.go | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cli/logout_test.go b/cli/logout_test.go index 2c98d92e29d43..2e36d114aa047 100644 --- a/cli/logout_test.go +++ b/cli/logout_test.go @@ -3,10 +3,11 @@ package cli_test import ( "testing" + "github.com/stretchr/testify/require" + "github.com/coder/coder/cli/clitest" "github.com/coder/coder/coderd/coderdtest" "github.com/coder/coder/pty/ptytest" - "github.com/stretchr/testify/require" ) func TestLogout(t *testing.T) { diff --git a/cli/server.go b/cli/server.go index a226fd3444716..c778e0a220235 100644 --- a/cli/server.go +++ b/cli/server.go @@ -54,7 +54,6 @@ import ( "github.com/coder/coder/provisionerd" "github.com/coder/coder/provisionersdk" "github.com/coder/coder/provisionersdk/proto" - sdktrace "go.opentelemetry.io/otel/sdk/trace" ) // nolint:gocyclo diff --git a/coderd/coderd.go b/coderd/coderd.go index de8a02f39e8a9..343da27bf55cf 100644 --- a/coderd/coderd.go +++ b/coderd/coderd.go @@ -15,6 +15,8 @@ import ( "golang.org/x/xerrors" "google.golang.org/api/idtoken" + sdktrace "go.opentelemetry.io/otel/sdk/trace" + "cdr.dev/slog" "github.com/coder/coder/buildinfo" "github.com/coder/coder/coderd/awsidentity" @@ -28,7 +30,6 @@ import ( "github.com/coder/coder/codersdk" "github.com/coder/coder/provisionerd/proto" "github.com/coder/coder/site" - sdktrace "go.opentelemetry.io/otel/sdk/trace" ) // Options are requires parameters for Coder to start.