Skip to content

Commit 7a232ec

Browse files
committed
wip
1 parent 116ea62 commit 7a232ec

File tree

7 files changed

+67
-34
lines changed

7 files changed

+67
-34
lines changed

cli/server.go

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import (
4848
"github.com/coder/coder/coderd/autobuild/executor"
4949
"github.com/coder/coder/coderd/database"
5050
"github.com/coder/coder/coderd/database/databasefake"
51+
"github.com/coder/coder/coderd/database/postgres"
5152
"github.com/coder/coder/coderd/devtunnel"
5253
"github.com/coder/coder/coderd/gitsshkey"
5354
"github.com/coder/coder/coderd/tracing"
@@ -105,8 +106,11 @@ func server() *cobra.Command {
105106
logger = logger.Leveled(slog.LevelDebug)
106107
}
107108

108-
var tracerProvider *sdktrace.TracerProvider
109-
var err error
109+
var (
110+
tracerProvider *sdktrace.TracerProvider
111+
err error
112+
sqlDriver = "postgres"
113+
)
110114
if trace {
111115
tracerProvider, err = tracing.TracerProvider(cmd.Context(), "coderd")
112116
if err != nil {
@@ -119,6 +123,11 @@ func server() *cobra.Command {
119123
_ = tracerProvider.Shutdown(ctx)
120124
}()
121125
}
126+
127+
sqlDriver, err = tracing.PostgresDriver(tracerProvider, "coderd.database")
128+
if err != nil {
129+
logger.Warn(cmd.Context(), "failed to start postgres tracing driver", slog.Error(err))
130+
}
122131
}
123132

124133
printLogo(cmd, spooky)
@@ -247,7 +256,12 @@ func server() *cobra.Command {
247256
_, _ = fmt.Fprintln(cmd.ErrOrStderr())
248257

249258
if !dev {
250-
sqlDB, err := sql.Open("postgres", postgresURL)
259+
postgresURL, cleanup, err := postgres.Open()
260+
if err != nil {
261+
return xerrors.Errorf("open postgres: %w", err)
262+
}
263+
defer cleanup()
264+
sqlDB, err := sql.Open(sqlDriver, postgresURL)
251265
if err != nil {
252266
return xerrors.Errorf("dial postgres: %w", err)
253267
}

coderd/coderd.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,10 @@ import (
1212
"github.com/go-chi/chi/v5"
1313
"github.com/go-chi/chi/v5/middleware"
1414
"github.com/pion/webrtc/v3"
15+
"go.opentelemetry.io/otel/trace"
1516
"golang.org/x/xerrors"
1617
"google.golang.org/api/idtoken"
1718

18-
sdktrace "go.opentelemetry.io/otel/sdk/trace"
19-
2019
"cdr.dev/slog"
2120
"github.com/coder/coder/buildinfo"
2221
"github.com/coder/coder/coderd/awsidentity"
@@ -54,7 +53,7 @@ type Options struct {
5453
SSHKeygenAlgorithm gitsshkey.Algorithm
5554
TURNServer *turnconn.Server
5655
Authorizer rbac.Authorizer
57-
TracerProvider *sdktrace.TracerProvider
56+
TracerProvider trace.TracerProvider
5857
}
5958

6059
// New constructs the Coder API into an HTTP handler.

coderd/database/postgres/postgres.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,12 @@ func Open() (string, func(), error) {
110110
dbURL := fmt.Sprintf("postgres://postgres:postgres@%s/postgres?sslmode=disable", hostAndPort)
111111

112112
// Docker should hard-kill the container after 120 seconds.
113-
err = resource.Expire(120)
113+
err = resource.Expire(600)
114114
if err != nil {
115115
return "", nil, xerrors.Errorf("expire resource: %w", err)
116116
}
117117

118-
pool.MaxWait = 120 * time.Second
118+
pool.MaxWait = 600 * time.Second
119119
err = pool.Retry(func() error {
120120
db, err := sql.Open("postgres", dbURL)
121121
if err != nil {

coderd/tracing/httpmw.go

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,12 @@ import (
66

77
"github.com/go-chi/chi/middleware"
88
"github.com/go-chi/chi/v5"
9-
"go.opentelemetry.io/otel/attribute"
10-
"go.opentelemetry.io/otel/codes"
11-
sdktrace "go.opentelemetry.io/otel/sdk/trace"
9+
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
10+
"go.opentelemetry.io/otel/trace"
1211
)
1312

1413
// HTTPMW adds tracing to http routes.
15-
func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Handler) http.Handler {
14+
func HTTPMW(tracerProvider trace.TracerProvider, name string) func(http.Handler) http.Handler {
1615
return func(next http.Handler) http.Handler {
1716
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
1817
if tracerProvider == nil {
@@ -21,8 +20,9 @@ func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Hand
2120
}
2221

2322
// start span with default span name. Span name will be updated to "method route" format once request finishes.
24-
_, span := tracerProvider.Tracer(name).Start(r.Context(), fmt.Sprintf("%s %s", r.Method, r.RequestURI))
23+
ctx, span := tracerProvider.Tracer(name).Start(r.Context(), fmt.Sprintf("%s %s", r.Method, r.RequestURI))
2524
defer span.End()
25+
r = r.WithContext(ctx)
2626

2727
wrw := middleware.NewWrapResponseWriter(rw, r.ProtoMajor)
2828

@@ -34,34 +34,21 @@ func HTTPMW(tracerProvider *sdktrace.TracerProvider, name string) func(http.Hand
3434
if route != "" {
3535
span.SetName(fmt.Sprintf("%s %s", r.Method, route))
3636
}
37-
span.SetAttributes(attribute.KeyValue{
38-
Key: "http.method",
39-
Value: attribute.StringValue(r.Method),
40-
})
41-
span.SetAttributes(attribute.KeyValue{
42-
Key: "http.route",
43-
Value: attribute.StringValue(route),
44-
})
45-
span.SetAttributes(attribute.KeyValue{
46-
Key: "http.path",
47-
Value: attribute.StringValue(r.URL.EscapedPath()),
48-
})
37+
span.SetName(fmt.Sprintf("%s %s", r.Method, route))
38+
span.SetAttributes(semconv.NetAttributesFromHTTPRequest("tcp", r)...)
39+
span.SetAttributes(semconv.EndUserAttributesFromHTTPRequest(r)...)
40+
span.SetAttributes(semconv.HTTPServerAttributesFromHTTPRequest("", route, r)...)
41+
span.SetAttributes(semconv.HTTPRouteKey.String(route))
4942

5043
// set the status code
5144
status := wrw.Status()
5245
// 0 status means one has not yet been sent in which case net/http library will write StatusOK
5346
if status == 0 {
5447
status = http.StatusOK
5548
}
56-
span.SetAttributes(attribute.KeyValue{
57-
Key: "http.status_code",
58-
Value: attribute.IntValue(status),
59-
})
60-
61-
// if 5XX we set the span to "error" status
62-
if status >= 500 {
63-
span.SetStatus(codes.Error, fmt.Sprintf("%d: %s", status, http.StatusText(status)))
64-
}
49+
span.SetAttributes(semconv.HTTPStatusCodeKey.Int(status))
50+
spanStatus, spanMessage := semconv.SpanStatusFromHTTPStatusCode(status)
51+
span.SetStatus(spanStatus, spanMessage)
6552
})
6653
}
6754
}

coderd/tracing/postgres.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package tracing
2+
3+
import (
4+
"github.com/nhatthm/otelsql"
5+
semconv "go.opentelemetry.io/otel/semconv/v1.4.0"
6+
"go.opentelemetry.io/otel/trace"
7+
"golang.org/x/xerrors"
8+
)
9+
10+
// Postgres driver will register a new tracing sql driver and return the driver name.
11+
func PostgresDriver(tp trace.TracerProvider, service string) (string, error) {
12+
// Register the otelsql wrapper for the provided postgres driver.
13+
driverName, err := otelsql.Register("postgres",
14+
otelsql.WithDefaultAttributes(
15+
semconv.ServiceNameKey.String(service),
16+
),
17+
otelsql.TraceQueryWithoutArgs(),
18+
otelsql.WithSystem(semconv.DBSystemPostgreSQL),
19+
otelsql.WithTracerProvider(tp),
20+
)
21+
if err != nil {
22+
return "", xerrors.Errorf("registering postgres tracing driver: %w", err)
23+
}
24+
25+
return driverName, nil
26+
}

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ require (
125125
storj.io/drpc v0.0.30
126126
)
127127

128+
require go.opentelemetry.io/otel/metric v0.30.0 // indirect
129+
128130
require (
129131
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect
130132
github.com/Azure/go-ntlmssp v0.0.0-20200615164410-66371956d46c // indirect
@@ -196,6 +198,7 @@ require (
196198
github.com/muesli/ansi v0.0.0-20211031195517-c9f0611b6c70 // indirect
197199
github.com/muesli/reflow v0.3.0 // indirect
198200
github.com/muesli/termenv v0.11.1-0.20220212125758-44cd13922739 // indirect
201+
github.com/nhatthm/otelsql v0.3.0
199202
github.com/niklasfasching/go-org v1.6.2 // indirect
200203
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect
201204
github.com/opencontainers/go-digest v1.0.0 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,6 +1190,8 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+
11901190
github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA=
11911191
github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
11921192
github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba/go.mod h1:ncO5VaFWh0Nrt+4KT4mOZboaczBZcLuHrG+/sUeP8gI=
1193+
github.com/nhatthm/otelsql v0.3.0 h1:BvqFgk6FkkmlY2KrtSyxILkPJL5oI2Bzny/s7d134N8=
1194+
github.com/nhatthm/otelsql v0.3.0/go.mod h1:6OmgQmHfKwLqNQp+nNh5xHOrMl19y8n4v44FLRZWYlQ=
11931195
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
11941196
github.com/niklasfasching/go-org v1.6.2 h1:kQBIZlfL4oRNApJCrBgaeNBfzxWzP6XlC7/b744Polk=
11951197
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
16171619
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE=
16181620
go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
16191621
go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw=
1622+
go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c=
1623+
go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU=
16201624
go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
16211625
go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
16221626
go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=

0 commit comments

Comments
 (0)