Skip to content

Commit 613fd30

Browse files
committed
feat: unified tracing between coderd<->provisionerd
1 parent e6931d6 commit 613fd30

26 files changed

+576
-321
lines changed

cli/server.go

+2
Original file line numberDiff line numberDiff line change
@@ -1185,6 +1185,7 @@ func newProvisionerDaemon(
11851185
return nil, xerrors.Errorf("mkdir %q: %w", cacheDir, err)
11861186
}
11871187

1188+
tracer := coderAPI.TracerProvider.Tracer(tracing.TracerName)
11881189
terraformClient, terraformServer := provisionersdk.MemTransportPipe()
11891190
wg.Add(1)
11901191
go func() {
@@ -1204,6 +1205,7 @@ func newProvisionerDaemon(
12041205
},
12051206
CachePath: cacheDir,
12061207
Logger: logger,
1208+
Tracer: tracer,
12071209
})
12081210
if err != nil && !xerrors.Is(err, context.Canceled) {
12091211
select {

coderd/coderd.go

+14-7
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,9 @@ func New(options *Options) *API {
236236
if options.SSHConfig.HostnamePrefix == "" {
237237
options.SSHConfig.HostnamePrefix = "coder."
238238
}
239+
if options.TracerProvider == nil {
240+
options.TracerProvider = trace.NewNoopTracerProvider()
241+
}
239242
if options.SetUserGroups == nil {
240243
options.SetUserGroups = func(ctx context.Context, _ database.Store, id uuid.UUID, groups []string) error {
241244
options.Logger.Warn(ctx, "attempted to assign OIDC groups without enterprise license",
@@ -898,6 +901,7 @@ func compressHandler(h http.Handler) http.Handler {
898901
// CreateInMemoryProvisionerDaemon is an in-memory connection to a provisionerd.
899902
// Useful when starting coderd and provisionerd in the same process.
900903
func (api *API) CreateInMemoryProvisionerDaemon(ctx context.Context, debounce time.Duration) (client proto.DRPCProvisionerDaemonClient, err error) {
904+
tracer := api.TracerProvider.Tracer(tracing.TracerName)
901905
clientSession, serverSession := provisionersdk.MemTransportPipe()
902906
defer func() {
903907
if err != nil {
@@ -937,6 +941,7 @@ func (api *API) CreateInMemoryProvisionerDaemon(ctx context.Context, debounce ti
937941
Provisioners: daemon.Provisioners,
938942
GitAuthConfigs: api.GitAuthConfigs,
939943
Telemetry: api.Telemetry,
944+
Tracer: tracer,
940945
Tags: tags,
941946
QuotaCommitter: &api.QuotaCommitter,
942947
Auditor: &api.Auditor,
@@ -947,14 +952,16 @@ func (api *API) CreateInMemoryProvisionerDaemon(ctx context.Context, debounce ti
947952
if err != nil {
948953
return nil, err
949954
}
950-
server := drpcserver.NewWithOptions(mux, drpcserver.Options{
951-
Log: func(err error) {
952-
if xerrors.Is(err, io.EOF) {
953-
return
954-
}
955-
api.Logger.Debug(ctx, "drpc server error", slog.Error(err))
955+
server := drpcserver.NewWithOptions(&tracing.DRPCHandler{Handler: mux},
956+
drpcserver.Options{
957+
Log: func(err error) {
958+
if xerrors.Is(err, io.EOF) {
959+
return
960+
}
961+
api.Logger.Debug(ctx, "drpc server error", slog.Error(err))
962+
},
956963
},
957-
})
964+
)
958965
go func() {
959966
err := server.Serve(ctx, serverSession)
960967
if err != nil && !xerrors.Is(err, io.EOF) {

coderd/database/dump.sql

+2-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE provisioner_jobs DROP COLUMN metadata;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE provisioner_jobs ADD COLUMN metadata jsonb;

coderd/database/models.go

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

+14-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/provisionerjobs.sql

+3-2
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,11 @@ INSERT INTO
6363
file_id,
6464
"type",
6565
"input",
66-
tags
66+
tags,
67+
metadata
6768
)
6869
VALUES
69-
($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING *;
70+
($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12) RETURNING *;
7071

7172
-- name: UpdateProvisionerJobByID :exec
7273
UPDATE

coderd/provisionerdserver/provisionerdserver.go

+32
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import (
1717

1818
"github.com/google/uuid"
1919
"github.com/tabbed/pqtype"
20+
semconv "go.opentelemetry.io/otel/semconv/v1.14.0"
21+
"go.opentelemetry.io/otel/trace"
2022
"golang.org/x/exp/maps"
2123
"golang.org/x/exp/slices"
2224
"golang.org/x/oauth2"
@@ -33,6 +35,7 @@ import (
3335
"github.com/coder/coder/coderd/parameter"
3436
"github.com/coder/coder/coderd/schedule"
3537
"github.com/coder/coder/coderd/telemetry"
38+
"github.com/coder/coder/coderd/tracing"
3639
"github.com/coder/coder/codersdk"
3740
"github.com/coder/coder/provisioner"
3841
"github.com/coder/coder/provisionerd/proto"
@@ -55,6 +58,7 @@ type Server struct {
5558
Database database.Store
5659
Pubsub database.Pubsub
5760
Telemetry telemetry.Reporter
61+
Tracer trace.Tracer
5862
QuotaCommitter *atomic.Pointer[proto.QuotaCommitter]
5963
Auditor *atomic.Pointer[audit.Auditor]
6064
TemplateScheduleStore *atomic.Pointer[schedule.TemplateScheduleStore]
@@ -129,12 +133,22 @@ func (server *Server) AcquireJob(ctx context.Context, _ *proto.Empty) (*proto.Ac
129133
return nil, failJob(fmt.Sprintf("get user: %s", err))
130134
}
131135

136+
jobMetadata := map[string]string{}
137+
if job.Metadata.Valid {
138+
err := json.Unmarshal(job.Metadata.RawMessage, &jobMetadata)
139+
if err != nil {
140+
return nil, failJob(fmt.Sprintf("unmarshal metadata: %s", err))
141+
}
142+
}
143+
132144
protoJob := &proto.AcquiredJob{
133145
JobId: job.ID.String(),
134146
CreatedAt: job.CreatedAt.UnixMilli(),
135147
Provisioner: string(job.Provisioner),
136148
UserName: user.Username,
149+
Metadata: jobMetadata,
137150
}
151+
138152
switch job.Type {
139153
case database.ProvisionerJobTypeWorkspaceBuild:
140154
var input WorkspaceProvisionJob
@@ -411,6 +425,9 @@ func (server *Server) includeLastVariableValues(ctx context.Context, templateVer
411425
}
412426

413427
func (server *Server) CommitQuota(ctx context.Context, request *proto.CommitQuotaRequest) (*proto.CommitQuotaResponse, error) {
428+
ctx, span := server.startTrace(ctx, tracing.FuncName())
429+
defer span.End()
430+
414431
//nolint:gocritic // Provisionerd has specific authz rules.
415432
ctx = dbauthz.AsProvisionerd(ctx)
416433
jobID, err := uuid.Parse(request.JobId)
@@ -442,6 +459,9 @@ func (server *Server) CommitQuota(ctx context.Context, request *proto.CommitQuot
442459
}
443460

444461
func (server *Server) UpdateJob(ctx context.Context, request *proto.UpdateJobRequest) (*proto.UpdateJobResponse, error) {
462+
ctx, span := server.startTrace(ctx, tracing.FuncName())
463+
defer span.End()
464+
445465
//nolint:gocritic // Provisionerd has specific authz rules.
446466
ctx = dbauthz.AsProvisionerd(ctx)
447467
parsedID, err := uuid.Parse(request.JobId)
@@ -671,6 +691,9 @@ func (server *Server) UpdateJob(ctx context.Context, request *proto.UpdateJobReq
671691
}
672692

673693
func (server *Server) FailJob(ctx context.Context, failJob *proto.FailedJob) (*proto.Empty, error) {
694+
ctx, span := server.startTrace(ctx, tracing.FuncName())
695+
defer span.End()
696+
674697
//nolint:gocritic // Provisionerd has specific authz rules.
675698
ctx = dbauthz.AsProvisionerd(ctx)
676699
jobID, err := uuid.Parse(failJob.JobId)
@@ -822,6 +845,9 @@ func (server *Server) FailJob(ctx context.Context, failJob *proto.FailedJob) (*p
822845
//
823846
//nolint:gocyclo
824847
func (server *Server) CompleteJob(ctx context.Context, completed *proto.CompletedJob) (*proto.Empty, error) {
848+
ctx, span := server.startTrace(ctx, tracing.FuncName())
849+
defer span.End()
850+
825851
//nolint:gocritic // Provisionerd has specific authz rules.
826852
ctx = dbauthz.AsProvisionerd(ctx)
827853
jobID, err := uuid.Parse(completed.JobId)
@@ -1192,6 +1218,12 @@ func (server *Server) CompleteJob(ctx context.Context, completed *proto.Complete
11921218
return &proto.Empty{}, nil
11931219
}
11941220

1221+
func (server *Server) startTrace(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, trace.Span) {
1222+
return server.Tracer.Start(ctx, name, append(opts, trace.WithAttributes(
1223+
semconv.ServiceNameKey.String("coderd.provisionerd"),
1224+
))...)
1225+
}
1226+
11951227
func InsertWorkspaceResource(ctx context.Context, db database.Store, jobID uuid.UUID, transition database.WorkspaceTransition, protoResource *sdkproto.Resource, snapshot *telemetry.Snapshot) error {
11961228
resource, err := db.InsertWorkspaceResource(ctx, database.InsertWorkspaceResourceParams{
11971229
ID: uuid.New(),

coderd/templateversions.go

+23
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"github.com/go-chi/chi/v5"
1414
"github.com/google/uuid"
1515
"github.com/moby/moby/pkg/namesgenerator"
16+
"github.com/tabbed/pqtype"
1617
"golang.org/x/xerrors"
1718

1819
"cdr.dev/slog"
@@ -25,6 +26,7 @@ import (
2526
"github.com/coder/coder/coderd/parameter"
2627
"github.com/coder/coder/coderd/provisionerdserver"
2728
"github.com/coder/coder/coderd/rbac"
29+
"github.com/coder/coder/coderd/tracing"
2830
"github.com/coder/coder/codersdk"
2931
"github.com/coder/coder/examples"
3032
sdkproto "github.com/coder/coder/provisionersdk/proto"
@@ -574,6 +576,15 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques
574576
return
575577
}
576578

579+
metadataRaw, err := json.Marshal(tracing.MetadataFromContext(ctx))
580+
if err != nil {
581+
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
582+
Message: "Internal error unmarshalling metadata.",
583+
Detail: err.Error(),
584+
})
585+
return
586+
}
587+
577588
// Create a dry-run job
578589
jobID := uuid.New()
579590
provisionerJob, err := api.Database.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{
@@ -589,6 +600,10 @@ func (api *API) postTemplateVersionDryRun(rw http.ResponseWriter, r *http.Reques
589600
Input: input,
590601
// Copy tags from the previous run.
591602
Tags: job.Tags,
603+
Metadata: pqtype.NullRawMessage{
604+
Valid: true,
605+
RawMessage: metadataRaw,
606+
},
592607
})
593608
if err != nil {
594609
httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
@@ -1408,6 +1423,10 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
14081423
if err != nil {
14091424
return xerrors.Errorf("marshal job input: %w", err)
14101425
}
1426+
metadataRaw, err := json.Marshal(tracing.MetadataFromContext(ctx))
1427+
if err != nil {
1428+
return xerrors.Errorf("marshal job metadata: %w", err)
1429+
}
14111430

14121431
provisionerJob, err = tx.InsertProvisionerJob(ctx, database.InsertProvisionerJobParams{
14131432
ID: jobID,
@@ -1421,6 +1440,10 @@ func (api *API) postTemplateVersionsByOrganization(rw http.ResponseWriter, r *ht
14211440
Type: database.ProvisionerJobTypeTemplateVersionImport,
14221441
Input: jobInput,
14231442
Tags: tags,
1443+
Metadata: pqtype.NullRawMessage{
1444+
Valid: true,
1445+
RawMessage: metadataRaw,
1446+
},
14241447
})
14251448
if err != nil {
14261449
return xerrors.Errorf("insert provisioner job: %w", err)

0 commit comments

Comments
 (0)