Skip to content

Commit 703ad9d

Browse files
committed
add workspace modules and workspace resources's ModulePath to telemetry
1 parent 82e1582 commit 703ad9d

File tree

12 files changed

+151
-6
lines changed

12 files changed

+151
-6
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2673,6 +2673,13 @@ func (q *querier) GetWorkspaceModulesByJobID(ctx context.Context, jobID uuid.UUI
26732673
return q.db.GetWorkspaceModulesByJobID(ctx, jobID)
26742674
}
26752675

2676+
func (q *querier) GetWorkspaceModulesCreatedAfter(ctx context.Context, createdAt time.Time) ([]database.WorkspaceModule, error) {
2677+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceSystem); err != nil {
2678+
return nil, err
2679+
}
2680+
return q.db.GetWorkspaceModulesCreatedAfter(ctx, createdAt)
2681+
}
2682+
26762683
func (q *querier) GetWorkspaceProxies(ctx context.Context) ([]database.WorkspaceProxy, error) {
26772684
return fetchWithPostFilter(q.auth, policy.ActionRead, func(ctx context.Context, _ interface{}) ([]database.WorkspaceProxy, error) {
26782685
return q.db.GetWorkspaceProxies(ctx)

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2919,6 +2919,9 @@ func (s *MethodTestSuite) TestSystemFunctions() {
29192919
s.Run("GetWorkspaceModulesByJobID", s.Subtest(func(db database.Store, check *expects) {
29202920
check.Args(uuid.New()).Asserts(rbac.ResourceSystem, policy.ActionRead)
29212921
}))
2922+
s.Run("GetWorkspaceModulesCreatedAfter", s.Subtest(func(db database.Store, check *expects) {
2923+
check.Args(dbtime.Now()).Asserts(rbac.ResourceSystem, policy.ActionRead)
2924+
}))
29222925
}
29232926

29242927
func (s *MethodTestSuite) TestNotifications() {

coderd/database/dbgen/dbgen.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,20 @@ func WorkspaceResource(t testing.TB, db database.Store, orig database.WorkspaceR
666666
return resource
667667
}
668668

669+
func WorkspaceModule(t testing.TB, db database.Store, orig database.WorkspaceModule) database.WorkspaceModule {
670+
module, err := db.InsertWorkspaceModule(genCtx, database.InsertWorkspaceModuleParams{
671+
ID: takeFirst(orig.ID, uuid.New()),
672+
JobID: takeFirst(orig.JobID, uuid.New()),
673+
Transition: takeFirst(orig.Transition, database.WorkspaceTransitionStart),
674+
Source: takeFirst(orig.Source, "test-source"),
675+
Version: takeFirst(orig.Version, "v1.0.0"),
676+
Key: takeFirst(orig.Key, "test-key"),
677+
CreatedAt: takeFirst(orig.CreatedAt, dbtime.Now()),
678+
})
679+
require.NoError(t, err, "insert workspace module")
680+
return module
681+
}
682+
669683
func WorkspaceResourceMetadatums(t testing.TB, db database.Store, seed database.WorkspaceResourceMetadatum) []database.WorkspaceResourceMetadatum {
670684
meta, err := db.InsertWorkspaceResourceMetadata(genCtx, database.InsertWorkspaceResourceMetadataParams{
671685
WorkspaceResourceID: takeFirst(seed.WorkspaceResourceID, uuid.New()),

coderd/database/dbmem/dbmem.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6674,6 +6674,19 @@ func (q *FakeQuerier) GetWorkspaceModulesByJobID(_ context.Context, jobID uuid.U
66746674
return modules, nil
66756675
}
66766676

6677+
func (q *FakeQuerier) GetWorkspaceModulesCreatedAfter(_ context.Context, createdAt time.Time) ([]database.WorkspaceModule, error) {
6678+
q.mutex.RLock()
6679+
defer q.mutex.RUnlock()
6680+
6681+
modules := make([]database.WorkspaceModule, 0)
6682+
for _, module := range q.workspaceModules {
6683+
if module.CreatedAt.After(createdAt) {
6684+
modules = append(modules, module)
6685+
}
6686+
}
6687+
return modules, nil
6688+
}
6689+
66776690
func (q *FakeQuerier) GetWorkspaceProxies(_ context.Context) ([]database.WorkspaceProxy, error) {
66786691
q.mutex.RLock()
66796692
defer q.mutex.RUnlock()

coderd/database/dbmetrics/querymetrics.go

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/dbmock/dbmock.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/querier.go

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries.sql.go

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/workspacemodules.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,6 @@ FROM
1111
workspace_modules
1212
WHERE
1313
job_id = $1;
14+
15+
-- name: GetWorkspaceModulesCreatedAfter :many
16+
SELECT * FROM workspace_modules WHERE created_at > $1;

coderd/provisionerdserver/provisionerdserver.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,7 +1279,7 @@ func (s *server) CompleteJob(ctx context.Context, completed *proto.CompletedJob)
12791279
slog.F("module_key", module.Key),
12801280
slog.F("transition", transition))
12811281

1282-
err = InsertWorkspaceModule(ctx, s.Database, jobID, transition, module)
1282+
err = InsertWorkspaceModule(ctx, s.Database, jobID, transition, module, telemetrySnapshot)
12831283
if err != nil {
12841284
return nil, xerrors.Errorf("insert module: %w", err)
12851285
}
@@ -1491,7 +1491,7 @@ func (s *server) CompleteJob(ctx context.Context, completed *proto.CompletedJob)
14911491
}
14921492
}
14931493
for _, module := range jobType.WorkspaceBuild.Modules {
1494-
err = InsertWorkspaceModule(ctx, db, job.ID, workspaceBuild.Transition, module)
1494+
err = InsertWorkspaceModule(ctx, db, job.ID, workspaceBuild.Transition, module, telemetrySnapshot)
14951495
if err != nil {
14961496
return xerrors.Errorf("insert provisioner job module: %w", err)
14971497
}
@@ -1683,7 +1683,7 @@ func (s *server) CompleteJob(ctx context.Context, completed *proto.CompletedJob)
16831683
slog.F("module_source", module.Source),
16841684
)
16851685

1686-
err = InsertWorkspaceModule(ctx, s.Database, jobID, database.WorkspaceTransitionStart, module)
1686+
err = InsertWorkspaceModule(ctx, s.Database, jobID, database.WorkspaceTransitionStart, module, telemetrySnapshot)
16871687
if err != nil {
16881688
return nil, xerrors.Errorf("insert module: %w", err)
16891689
}
@@ -1769,8 +1769,8 @@ func (s *server) startTrace(ctx context.Context, name string, opts ...trace.Span
17691769
))...)
17701770
}
17711771

1772-
func InsertWorkspaceModule(ctx context.Context, db database.Store, jobID uuid.UUID, transition database.WorkspaceTransition, protoModule *sdkproto.Module) error {
1773-
_, err := db.InsertWorkspaceModule(ctx, database.InsertWorkspaceModuleParams{
1772+
func InsertWorkspaceModule(ctx context.Context, db database.Store, jobID uuid.UUID, transition database.WorkspaceTransition, protoModule *sdkproto.Module, snapshot *telemetry.Snapshot) error {
1773+
module, err := db.InsertWorkspaceModule(ctx, database.InsertWorkspaceModuleParams{
17741774
ID: uuid.New(),
17751775
CreatedAt: dbtime.Now(),
17761776
JobID: jobID,
@@ -1782,6 +1782,7 @@ func InsertWorkspaceModule(ctx context.Context, db database.Store, jobID uuid.UU
17821782
if err != nil {
17831783
return xerrors.Errorf("insert provisioner job module %q: %w", protoModule.Source, err)
17841784
}
1785+
snapshot.WorkspaceModules = append(snapshot.WorkspaceModules, telemetry.ConvertWorkspaceModule(module))
17851786
return nil
17861787
}
17871788

coderd/telemetry/telemetry.go

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,17 @@ func (r *remoteReporter) createSnapshot() (*Snapshot, error) {
456456
}
457457
return nil
458458
})
459+
eg.Go(func() error {
460+
workspaceModules, err := r.options.Database.GetWorkspaceModulesCreatedAfter(ctx, createdAfter)
461+
if err != nil {
462+
return xerrors.Errorf("get workspace modules: %w", err)
463+
}
464+
snapshot.WorkspaceModules = make([]WorkspaceModule, 0, len(workspaceModules))
465+
for _, module := range workspaceModules {
466+
snapshot.WorkspaceModules = append(snapshot.WorkspaceModules, ConvertWorkspaceModule(module))
467+
}
468+
return nil
469+
})
459470
eg.Go(func() error {
460471
licenses, err := r.options.Database.GetUnexpiredLicenses(ctx)
461472
if err != nil {
@@ -642,14 +653,18 @@ func ConvertWorkspaceApp(app database.WorkspaceApp) WorkspaceApp {
642653

643654
// ConvertWorkspaceResource anonymizes a workspace resource.
644655
func ConvertWorkspaceResource(resource database.WorkspaceResource) WorkspaceResource {
645-
return WorkspaceResource{
656+
r := WorkspaceResource{
646657
ID: resource.ID,
647658
JobID: resource.JobID,
648659
CreatedAt: resource.CreatedAt,
649660
Transition: resource.Transition,
650661
Type: resource.Type,
651662
InstanceType: resource.InstanceType.String,
652663
}
664+
if resource.ModulePath.Valid {
665+
r.ModulePath = &resource.ModulePath.String
666+
}
667+
return r
653668
}
654669

655670
// ConvertWorkspaceResourceMetadata anonymizes workspace metadata.
@@ -661,6 +676,18 @@ func ConvertWorkspaceResourceMetadata(metadata database.WorkspaceResourceMetadat
661676
}
662677
}
663678

679+
func ConvertWorkspaceModule(module database.WorkspaceModule) WorkspaceModule {
680+
return WorkspaceModule{
681+
ID: module.ID,
682+
JobID: module.JobID,
683+
Transition: module.Transition,
684+
Source: module.Source,
685+
Version: module.Version,
686+
Key: module.Key,
687+
CreatedAt: module.CreatedAt,
688+
}
689+
}
690+
664691
// ConvertUser anonymizes a user.
665692
func ConvertUser(dbUser database.User) User {
666693
emailHashed := ""
@@ -810,6 +837,7 @@ type Snapshot struct {
810837
WorkspaceProxies []WorkspaceProxy `json:"workspace_proxies"`
811838
WorkspaceResourceMetadata []WorkspaceResourceMetadata `json:"workspace_resource_metadata"`
812839
WorkspaceResources []WorkspaceResource `json:"workspace_resources"`
840+
WorkspaceModules []WorkspaceModule `json:"workspace_modules"`
813841
Workspaces []Workspace `json:"workspaces"`
814842
NetworkEvents []NetworkEvent `json:"network_events"`
815843
}
@@ -878,6 +906,11 @@ type WorkspaceResource struct {
878906
Transition database.WorkspaceTransition `json:"transition"`
879907
Type string `json:"type"`
880908
InstanceType string `json:"instance_type"`
909+
// ModulePath is nullable because it was added a long time after the
910+
// original workspace resource telemetry was added. All new resources
911+
// will have a module path, but deployments with older resources still
912+
// in the database will not.
913+
ModulePath *string `json:"module_path"`
881914
}
882915

883916
type WorkspaceResourceMetadata struct {
@@ -886,6 +919,16 @@ type WorkspaceResourceMetadata struct {
886919
Sensitive bool `json:"sensitive"`
887920
}
888921

922+
type WorkspaceModule struct {
923+
ID uuid.UUID `json:"id"`
924+
CreatedAt time.Time `json:"created_at"`
925+
JobID uuid.UUID `json:"job_id"`
926+
Transition database.WorkspaceTransition `json:"transition"`
927+
Key string `json:"key"`
928+
Version string `json:"version"`
929+
Source string `json:"source"`
930+
}
931+
889932
type WorkspaceAgent struct {
890933
ID uuid.UUID `json:"id"`
891934
CreatedAt time.Time `json:"created_at"`

coderd/telemetry/telemetry_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ func TestTelemetry(t *testing.T) {
8787
assert.NoError(t, err)
8888
_, _ = dbgen.WorkspaceProxy(t, db, database.WorkspaceProxy{})
8989

90+
_ = dbgen.WorkspaceModule(t, db, database.WorkspaceModule{})
91+
9092
_, snapshot := collectSnapshot(t, db, nil)
9193
require.Len(t, snapshot.ProvisionerJobs, 1)
9294
require.Len(t, snapshot.Licenses, 1)
@@ -103,6 +105,7 @@ func TestTelemetry(t *testing.T) {
103105
require.Len(t, snapshot.WorkspaceResources, 1)
104106
require.Len(t, snapshot.WorkspaceAgentStats, 1)
105107
require.Len(t, snapshot.WorkspaceProxies, 1)
108+
require.Len(t, snapshot.WorkspaceModules, 1)
106109

107110
wsa := snapshot.WorkspaceAgents[0]
108111
require.Len(t, wsa.Subsystems, 2)

0 commit comments

Comments
 (0)