Skip to content

Commit 155664f

Browse files
committed
feat(coderd): add support for sending batched agent metadata
1 parent 98a076f commit 155664f

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
@@ -3500,13 +3500,20 @@ func (q *FakeQuerier) GetWorkspaceAgentLogsAfter(_ context.Context, arg database
35003500
return logs, nil
35013501
}
35023502

3503-
func (q *FakeQuerier) GetWorkspaceAgentMetadata(_ context.Context, workspaceAgentID uuid.UUID) ([]database.WorkspaceAgentMetadatum, error) {
3503+
func (q *FakeQuerier) GetWorkspaceAgentMetadata(_ context.Context, arg database.GetWorkspaceAgentMetadataParams) ([]database.WorkspaceAgentMetadatum, error) {
3504+
if err := validateDatabaseType(arg); err != nil {
3505+
return nil, err
3506+
}
3507+
35043508
q.mutex.RLock()
35053509
defer q.mutex.RUnlock()
35063510

35073511
metadata := make([]database.WorkspaceAgentMetadatum, 0)
35083512
for _, m := range q.workspaceAgentMetadata {
3509-
if m.WorkspaceAgentID == workspaceAgentID {
3513+
if m.WorkspaceAgentID == arg.WorkspaceAgentID {
3514+
if len(arg.Keys) > 0 && !slices.Contains(arg.Keys, m.Key) {
3515+
continue
3516+
}
35103517
metadata = append(metadata, m)
35113518
}
35123519
}
@@ -6115,19 +6122,17 @@ func (q *FakeQuerier) UpdateWorkspaceAgentMetadata(_ context.Context, arg databa
61156122
q.mutex.Lock()
61166123
defer q.mutex.Unlock()
61176124

6118-
//nolint:gosimple
6119-
updated := database.WorkspaceAgentMetadatum{
6120-
WorkspaceAgentID: arg.WorkspaceAgentID,
6121-
Key: arg.Key,
6122-
Value: arg.Value,
6123-
Error: arg.Error,
6124-
CollectedAt: arg.CollectedAt,
6125-
}
6126-
61276125
for i, m := range q.workspaceAgentMetadata {
6128-
if m.WorkspaceAgentID == arg.WorkspaceAgentID && m.Key == arg.Key {
6129-
q.workspaceAgentMetadata[i] = updated
6130-
return nil
6126+
if m.WorkspaceAgentID != arg.WorkspaceAgentID {
6127+
continue
6128+
}
6129+
for j := 0; j < len(arg.Key); j++ {
6130+
if m.Key == arg.Key[j] {
6131+
q.workspaceAgentMetadata[i].Value = arg.Value[j]
6132+
q.workspaceAgentMetadata[i].Error = arg.Error[j]
6133+
q.workspaceAgentMetadata[i].CollectedAt = arg.CollectedAt[j]
6134+
return nil
6135+
}
61316136
}
61326137
}
61336138

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)