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. pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy