Skip to content

Commit 7eeba15

Browse files
authored
feat(coderd): add support for sending batched agent metadata (#10223)
Part of #9782
1 parent 1b1ab97 commit 7eeba15

File tree

18 files changed

+469
-143
lines changed

18 files changed

+469
-143
lines changed

agent/agent.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ type Client interface {
9090
PostLifecycle(ctx context.Context, state agentsdk.PostLifecycleRequest) error
9191
PostAppHealth(ctx context.Context, req agentsdk.PostAppHealthsRequest) error
9292
PostStartup(ctx context.Context, req agentsdk.PostStartupRequest) error
93-
PostMetadata(ctx context.Context, key string, req agentsdk.PostMetadataRequest) error
93+
PostMetadata(ctx context.Context, key string, req agentsdk.PostMetadataRequestDeprecated) error
9494
PatchLogs(ctx context.Context, req agentsdk.PatchLogs) error
9595
GetServiceBanner(ctx context.Context) (codersdk.ServiceBannerConfig, error)
9696
}

agent/agent_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,7 @@ func TestAgent_Metadata(t *testing.T) {
10791079
opts.ReportMetadataInterval = 100 * time.Millisecond
10801080
})
10811081

1082-
var gotMd map[string]agentsdk.PostMetadataRequest
1082+
var gotMd map[string]agentsdk.PostMetadataRequestDeprecated
10831083
require.Eventually(t, func() bool {
10841084
gotMd = client.GetMetadata()
10851085
return len(gotMd) == 1
@@ -1112,7 +1112,7 @@ func TestAgent_Metadata(t *testing.T) {
11121112
opts.ReportMetadataInterval = testutil.IntervalFast
11131113
})
11141114

1115-
var gotMd map[string]agentsdk.PostMetadataRequest
1115+
var gotMd map[string]agentsdk.PostMetadataRequestDeprecated
11161116
require.Eventually(t, func() bool {
11171117
gotMd = client.GetMetadata()
11181118
return len(gotMd) == 1

agent/agenttest/client.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ type Client struct {
4545
logger slog.Logger
4646
agentID uuid.UUID
4747
manifest agentsdk.Manifest
48-
metadata map[string]agentsdk.PostMetadataRequest
48+
metadata map[string]agentsdk.PostMetadataRequestDeprecated
4949
statsChan chan *agentsdk.Stats
5050
coordinator tailnet.Coordinator
5151
LastWorkspaceAgent func()
@@ -136,17 +136,17 @@ func (c *Client) GetStartup() agentsdk.PostStartupRequest {
136136
return c.startup
137137
}
138138

139-
func (c *Client) GetMetadata() map[string]agentsdk.PostMetadataRequest {
139+
func (c *Client) GetMetadata() map[string]agentsdk.PostMetadataRequestDeprecated {
140140
c.mu.Lock()
141141
defer c.mu.Unlock()
142142
return maps.Clone(c.metadata)
143143
}
144144

145-
func (c *Client) PostMetadata(ctx context.Context, key string, req agentsdk.PostMetadataRequest) error {
145+
func (c *Client) PostMetadata(ctx context.Context, key string, req agentsdk.PostMetadataRequestDeprecated) error {
146146
c.mu.Lock()
147147
defer c.mu.Unlock()
148148
if c.metadata == nil {
149-
c.metadata = make(map[string]agentsdk.PostMetadataRequest)
149+
c.metadata = make(map[string]agentsdk.PostMetadataRequestDeprecated)
150150
}
151151
c.metadata[key] = req
152152
c.logger.Debug(ctx, "post metadata", slog.F("key", key), slog.F("req", req))

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/coderd.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -821,7 +821,8 @@ func New(options *Options) *API {
821821
r.Get("/coordinate", api.workspaceAgentCoordinate)
822822
r.Post("/report-stats", api.workspaceAgentReportStats)
823823
r.Post("/report-lifecycle", api.workspaceAgentReportLifecycle)
824-
r.Post("/metadata/{key}", api.workspaceAgentPostMetadata)
824+
r.Post("/metadata", api.workspaceAgentPostMetadata)
825+
r.Post("/metadata/{key}", api.workspaceAgentPostMetadataDeprecated)
825826
})
826827
r.Route("/{workspaceagent}", func(r chi.Router) {
827828
r.Use(

coderd/database/dbauthz/dbauthz.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1643,8 +1643,8 @@ func (q *querier) GetWorkspaceAgentLogsAfter(ctx context.Context, arg database.G
16431643
return q.db.GetWorkspaceAgentLogsAfter(ctx, arg)
16441644
}
16451645

1646-
func (q *querier) GetWorkspaceAgentMetadata(ctx context.Context, workspaceAgentID uuid.UUID) ([]database.WorkspaceAgentMetadatum, error) {
1647-
workspace, err := q.db.GetWorkspaceByAgentID(ctx, workspaceAgentID)
1646+
func (q *querier) GetWorkspaceAgentMetadata(ctx context.Context, arg database.GetWorkspaceAgentMetadataParams) ([]database.WorkspaceAgentMetadatum, error) {
1647+
workspace, err := q.db.GetWorkspaceByAgentID(ctx, arg.WorkspaceAgentID)
16481648
if err != nil {
16491649
return nil, err
16501650
}
@@ -1654,7 +1654,7 @@ func (q *querier) GetWorkspaceAgentMetadata(ctx context.Context, workspaceAgentI
16541654
return nil, err
16551655
}
16561656

1657-
return q.db.GetWorkspaceAgentMetadata(ctx, workspaceAgentID)
1657+
return q.db.GetWorkspaceAgentMetadata(ctx, arg)
16581658
}
16591659

16601660
func (q *querier) GetWorkspaceAgentScriptsByAgentIDs(ctx context.Context, ids []uuid.UUID) ([]database.WorkspaceAgentScript, error) {

coderd/database/dbfake/dbfake.go

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3518,13 +3518,20 @@ func (q *FakeQuerier) GetWorkspaceAgentLogsAfter(_ context.Context, arg database
35183518
return logs, nil
35193519
}
35203520

3521-
func (q *FakeQuerier) GetWorkspaceAgentMetadata(_ context.Context, workspaceAgentID uuid.UUID) ([]database.WorkspaceAgentMetadatum, error) {
3521+
func (q *FakeQuerier) GetWorkspaceAgentMetadata(_ context.Context, arg database.GetWorkspaceAgentMetadataParams) ([]database.WorkspaceAgentMetadatum, error) {
3522+
if err := validateDatabaseType(arg); err != nil {
3523+
return nil, err
3524+
}
3525+
35223526
q.mutex.RLock()
35233527
defer q.mutex.RUnlock()
35243528

35253529
metadata := make([]database.WorkspaceAgentMetadatum, 0)
35263530
for _, m := range q.workspaceAgentMetadata {
3527-
if m.WorkspaceAgentID == workspaceAgentID {
3531+
if m.WorkspaceAgentID == arg.WorkspaceAgentID {
3532+
if len(arg.Keys) > 0 && !slices.Contains(arg.Keys, m.Key) {
3533+
continue
3534+
}
35283535
metadata = append(metadata, m)
35293536
}
35303537
}
@@ -6133,19 +6140,17 @@ func (q *FakeQuerier) UpdateWorkspaceAgentMetadata(_ context.Context, arg databa
61336140
q.mutex.Lock()
61346141
defer q.mutex.Unlock()
61356142

6136-
//nolint:gosimple
6137-
updated := database.WorkspaceAgentMetadatum{
6138-
WorkspaceAgentID: arg.WorkspaceAgentID,
6139-
Key: arg.Key,
6140-
Value: arg.Value,
6141-
Error: arg.Error,
6142-
CollectedAt: arg.CollectedAt,
6143-
}
6144-
61456143
for i, m := range q.workspaceAgentMetadata {
6146-
if m.WorkspaceAgentID == arg.WorkspaceAgentID && m.Key == arg.Key {
6147-
q.workspaceAgentMetadata[i] = updated
6148-
return nil
6144+
if m.WorkspaceAgentID != arg.WorkspaceAgentID {
6145+
continue
6146+
}
6147+
for j := 0; j < len(arg.Key); j++ {
6148+
if m.Key == arg.Key[j] {
6149+
q.workspaceAgentMetadata[i].Value = arg.Value[j]
6150+
q.workspaceAgentMetadata[i].Error = arg.Error[j]
6151+
q.workspaceAgentMetadata[i].CollectedAt = arg.CollectedAt[j]
6152+
return nil
6153+
}
61496154
}
61506155
}
61516156

coderd/database/dbmetrics/dbmetrics.go

Lines changed: 1 addition & 1 deletion
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: 1 addition & 1 deletion
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 & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)