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.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy