Skip to content

Commit c432979

Browse files
authored
feat: Add Kubernetes and resource metadata telemetry (#3548)
Fixes #3524.
1 parent f142345 commit c432979

File tree

6 files changed

+102
-11
lines changed

6 files changed

+102
-11
lines changed

.vscode/settings.json

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"Jobf",
3838
"Keygen",
3939
"kirsle",
40+
"Kubernetes",
4041
"ldflags",
4142
"manifoldco",
4243
"mapstructure",

coderd/database/databasefake/databasefake.go

+20
Original file line numberDiff line numberDiff line change
@@ -1361,6 +1361,26 @@ func (q *fakeQuerier) GetWorkspaceResourcesCreatedAfter(_ context.Context, after
13611361
return resources, nil
13621362
}
13631363

1364+
func (q *fakeQuerier) GetWorkspaceResourceMetadataCreatedAfter(ctx context.Context, after time.Time) ([]database.WorkspaceResourceMetadatum, error) {
1365+
resources, err := q.GetWorkspaceResourcesCreatedAfter(ctx, after)
1366+
if err != nil {
1367+
return nil, err
1368+
}
1369+
resourceIDs := map[uuid.UUID]struct{}{}
1370+
for _, resource := range resources {
1371+
resourceIDs[resource.ID] = struct{}{}
1372+
}
1373+
metadata := make([]database.WorkspaceResourceMetadatum, 0)
1374+
for _, m := range q.provisionerJobResourceMetadata {
1375+
_, ok := resourceIDs[m.WorkspaceResourceID]
1376+
if !ok {
1377+
continue
1378+
}
1379+
metadata = append(metadata, m)
1380+
}
1381+
return metadata, nil
1382+
}
1383+
13641384
func (q *fakeQuerier) GetWorkspaceResourceMetadataByResourceID(_ context.Context, id uuid.UUID) ([]database.WorkspaceResourceMetadatum, error) {
13651385
q.mutex.RLock()
13661386
defer q.mutex.RUnlock()

coderd/database/querier.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

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

coderd/database/queries/workspaceresources.sql

+5
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,8 @@ INSERT INTO
4444
workspace_resource_metadata (workspace_resource_id, key, value, sensitive)
4545
VALUES
4646
($1, $2, $3, $4) RETURNING *;
47+
48+
-- name: GetWorkspaceResourceMetadataCreatedAfter :many
49+
SELECT * FROM workspace_resource_metadata WHERE workspace_resource_id = ANY(
50+
SELECT id FROM workspace_resources WHERE created_at > $1
51+
);

coderd/telemetry/telemetry.go

+41-11
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"net"
1111
"net/http"
1212
"net/url"
13+
"os"
1314
"runtime"
1415
"strings"
1516
"sync"
@@ -230,6 +231,7 @@ func (r *remoteReporter) deployment() error {
230231
Architecture: sysInfo.Architecture,
231232
BuiltinPostgres: r.options.BuiltinPostgres,
232233
Containerized: containerized,
234+
Kubernetes: os.Getenv("KUBERNETES_SERVICE_HOST") != "",
233235
GitHubOAuth: r.options.GitHubOAuth,
234236
OIDCAuth: r.options.OIDCAuth,
235237
OIDCIssuerURL: r.options.OIDCIssuerURL,
@@ -423,6 +425,17 @@ func (r *remoteReporter) createSnapshot() (*Snapshot, error) {
423425
}
424426
return nil
425427
})
428+
eg.Go(func() error {
429+
workspaceMetadata, err := r.options.Database.GetWorkspaceResourceMetadataCreatedAfter(ctx, createdAfter)
430+
if err != nil {
431+
return xerrors.Errorf("get workspace resource metadata: %w", err)
432+
}
433+
snapshot.WorkspaceResourceMetadata = make([]WorkspaceResourceMetadata, 0, len(workspaceMetadata))
434+
for _, metadata := range workspaceMetadata {
435+
snapshot.WorkspaceResourceMetadata = append(snapshot.WorkspaceResourceMetadata, ConvertWorkspaceResourceMetadata(metadata))
436+
}
437+
return nil
438+
})
426439

427440
err := eg.Wait()
428441
if err != nil {
@@ -531,6 +544,15 @@ func ConvertWorkspaceResource(resource database.WorkspaceResource) WorkspaceReso
531544
}
532545
}
533546

547+
// ConvertWorkspaceResourceMetadata anonymizes workspace metadata.
548+
func ConvertWorkspaceResourceMetadata(metadata database.WorkspaceResourceMetadatum) WorkspaceResourceMetadata {
549+
return WorkspaceResourceMetadata{
550+
ResourceID: metadata.WorkspaceResourceID,
551+
Key: metadata.Key,
552+
Sensitive: metadata.Sensitive,
553+
}
554+
}
555+
534556
// ConvertUser anonymizes a user.
535557
func ConvertUser(dbUser database.User) User {
536558
emailHashed := ""
@@ -584,17 +606,18 @@ func ConvertTemplateVersion(version database.TemplateVersion) TemplateVersion {
584606
type Snapshot struct {
585607
DeploymentID string `json:"deployment_id"`
586608

587-
APIKeys []APIKey `json:"api_keys"`
588-
ParameterSchemas []ParameterSchema `json:"parameter_schemas"`
589-
ProvisionerJobs []ProvisionerJob `json:"provisioner_jobs"`
590-
Templates []Template `json:"templates"`
591-
TemplateVersions []TemplateVersion `json:"template_versions"`
592-
Users []User `json:"users"`
593-
Workspaces []Workspace `json:"workspaces"`
594-
WorkspaceApps []WorkspaceApp `json:"workspace_apps"`
595-
WorkspaceAgents []WorkspaceAgent `json:"workspace_agents"`
596-
WorkspaceBuilds []WorkspaceBuild `json:"workspace_build"`
597-
WorkspaceResources []WorkspaceResource `json:"workspace_resources"`
609+
APIKeys []APIKey `json:"api_keys"`
610+
ParameterSchemas []ParameterSchema `json:"parameter_schemas"`
611+
ProvisionerJobs []ProvisionerJob `json:"provisioner_jobs"`
612+
Templates []Template `json:"templates"`
613+
TemplateVersions []TemplateVersion `json:"template_versions"`
614+
Users []User `json:"users"`
615+
Workspaces []Workspace `json:"workspaces"`
616+
WorkspaceApps []WorkspaceApp `json:"workspace_apps"`
617+
WorkspaceAgents []WorkspaceAgent `json:"workspace_agents"`
618+
WorkspaceBuilds []WorkspaceBuild `json:"workspace_build"`
619+
WorkspaceResources []WorkspaceResource `json:"workspace_resources"`
620+
WorkspaceResourceMetadata []WorkspaceResourceMetadata `json:"workspace_resource_metadata"`
598621
}
599622

600623
// Deployment contains information about the host running Coder.
@@ -603,6 +626,7 @@ type Deployment struct {
603626
Architecture string `json:"architecture"`
604627
BuiltinPostgres bool `json:"builtin_postgres"`
605628
Containerized bool `json:"containerized"`
629+
Kubernetes bool `json:"kubernetes"`
606630
Tunnel bool `json:"tunnel"`
607631
GitHubOAuth bool `json:"github_oauth"`
608632
OIDCAuth bool `json:"oidc_auth"`
@@ -647,6 +671,12 @@ type WorkspaceResource struct {
647671
Type string `json:"type"`
648672
}
649673

674+
type WorkspaceResourceMetadata struct {
675+
ResourceID uuid.UUID `json:"resource_id"`
676+
Key string `json:"key"`
677+
Sensitive bool `json:"sensitive"`
678+
}
679+
650680
type WorkspaceAgent struct {
651681
ID uuid.UUID `json:"id"`
652682
CreatedAt time.Time `json:"created_at"`

0 commit comments

Comments
 (0)