Skip to content

Commit ad6ce95

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

File tree

18 files changed

+425
-143
lines changed

18 files changed

+425
-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: 63 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: 59 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.

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