mirror of
https://github.com/coder/coder.git
synced 2025-07-03 16:13:58 +00:00
feat(coderd): add support for sending batched agent metadata (#10223)
Part of #9782
This commit is contained in:
committed by
GitHub
parent
1b1ab97c24
commit
7eeba15d16
@ -1643,8 +1643,8 @@ func (q *querier) GetWorkspaceAgentLogsAfter(ctx context.Context, arg database.G
|
||||
return q.db.GetWorkspaceAgentLogsAfter(ctx, arg)
|
||||
}
|
||||
|
||||
func (q *querier) GetWorkspaceAgentMetadata(ctx context.Context, workspaceAgentID uuid.UUID) ([]database.WorkspaceAgentMetadatum, error) {
|
||||
workspace, err := q.db.GetWorkspaceByAgentID(ctx, workspaceAgentID)
|
||||
func (q *querier) GetWorkspaceAgentMetadata(ctx context.Context, arg database.GetWorkspaceAgentMetadataParams) ([]database.WorkspaceAgentMetadatum, error) {
|
||||
workspace, err := q.db.GetWorkspaceByAgentID(ctx, arg.WorkspaceAgentID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -1654,7 +1654,7 @@ func (q *querier) GetWorkspaceAgentMetadata(ctx context.Context, workspaceAgentI
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return q.db.GetWorkspaceAgentMetadata(ctx, workspaceAgentID)
|
||||
return q.db.GetWorkspaceAgentMetadata(ctx, arg)
|
||||
}
|
||||
|
||||
func (q *querier) GetWorkspaceAgentScriptsByAgentIDs(ctx context.Context, ids []uuid.UUID) ([]database.WorkspaceAgentScript, error) {
|
||||
|
@ -3518,13 +3518,20 @@ func (q *FakeQuerier) GetWorkspaceAgentLogsAfter(_ context.Context, arg database
|
||||
return logs, nil
|
||||
}
|
||||
|
||||
func (q *FakeQuerier) GetWorkspaceAgentMetadata(_ context.Context, workspaceAgentID uuid.UUID) ([]database.WorkspaceAgentMetadatum, error) {
|
||||
func (q *FakeQuerier) GetWorkspaceAgentMetadata(_ context.Context, arg database.GetWorkspaceAgentMetadataParams) ([]database.WorkspaceAgentMetadatum, error) {
|
||||
if err := validateDatabaseType(arg); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
q.mutex.RLock()
|
||||
defer q.mutex.RUnlock()
|
||||
|
||||
metadata := make([]database.WorkspaceAgentMetadatum, 0)
|
||||
for _, m := range q.workspaceAgentMetadata {
|
||||
if m.WorkspaceAgentID == workspaceAgentID {
|
||||
if m.WorkspaceAgentID == arg.WorkspaceAgentID {
|
||||
if len(arg.Keys) > 0 && !slices.Contains(arg.Keys, m.Key) {
|
||||
continue
|
||||
}
|
||||
metadata = append(metadata, m)
|
||||
}
|
||||
}
|
||||
@ -6133,19 +6140,17 @@ func (q *FakeQuerier) UpdateWorkspaceAgentMetadata(_ context.Context, arg databa
|
||||
q.mutex.Lock()
|
||||
defer q.mutex.Unlock()
|
||||
|
||||
//nolint:gosimple
|
||||
updated := database.WorkspaceAgentMetadatum{
|
||||
WorkspaceAgentID: arg.WorkspaceAgentID,
|
||||
Key: arg.Key,
|
||||
Value: arg.Value,
|
||||
Error: arg.Error,
|
||||
CollectedAt: arg.CollectedAt,
|
||||
}
|
||||
|
||||
for i, m := range q.workspaceAgentMetadata {
|
||||
if m.WorkspaceAgentID == arg.WorkspaceAgentID && m.Key == arg.Key {
|
||||
q.workspaceAgentMetadata[i] = updated
|
||||
return nil
|
||||
if m.WorkspaceAgentID != arg.WorkspaceAgentID {
|
||||
continue
|
||||
}
|
||||
for j := 0; j < len(arg.Key); j++ {
|
||||
if m.Key == arg.Key[j] {
|
||||
q.workspaceAgentMetadata[i].Value = arg.Value[j]
|
||||
q.workspaceAgentMetadata[i].Error = arg.Error[j]
|
||||
q.workspaceAgentMetadata[i].CollectedAt = arg.CollectedAt[j]
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -900,7 +900,7 @@ func (m metricsStore) GetWorkspaceAgentLogsAfter(ctx context.Context, arg databa
|
||||
return r0, r1
|
||||
}
|
||||
|
||||
func (m metricsStore) GetWorkspaceAgentMetadata(ctx context.Context, workspaceAgentID uuid.UUID) ([]database.WorkspaceAgentMetadatum, error) {
|
||||
func (m metricsStore) GetWorkspaceAgentMetadata(ctx context.Context, workspaceAgentID database.GetWorkspaceAgentMetadataParams) ([]database.WorkspaceAgentMetadatum, error) {
|
||||
start := time.Now()
|
||||
metadata, err := m.s.GetWorkspaceAgentMetadata(ctx, workspaceAgentID)
|
||||
m.queryLatencies.WithLabelValues("GetWorkspaceAgentMetadata").Observe(time.Since(start).Seconds())
|
||||
|
@ -1869,7 +1869,7 @@ func (mr *MockStoreMockRecorder) GetWorkspaceAgentLogsAfter(arg0, arg1 interface
|
||||
}
|
||||
|
||||
// GetWorkspaceAgentMetadata mocks base method.
|
||||
func (m *MockStore) GetWorkspaceAgentMetadata(arg0 context.Context, arg1 uuid.UUID) ([]database.WorkspaceAgentMetadatum, error) {
|
||||
func (m *MockStore) GetWorkspaceAgentMetadata(arg0 context.Context, arg1 database.GetWorkspaceAgentMetadataParams) ([]database.WorkspaceAgentMetadatum, error) {
|
||||
m.ctrl.T.Helper()
|
||||
ret := m.ctrl.Call(m, "GetWorkspaceAgentMetadata", arg0, arg1)
|
||||
ret0, _ := ret[0].([]database.WorkspaceAgentMetadatum)
|
||||
|
@ -192,7 +192,7 @@ type sqlcQuerier interface {
|
||||
GetWorkspaceAgentLifecycleStateByID(ctx context.Context, id uuid.UUID) (GetWorkspaceAgentLifecycleStateByIDRow, error)
|
||||
GetWorkspaceAgentLogSourcesByAgentIDs(ctx context.Context, ids []uuid.UUID) ([]WorkspaceAgentLogSource, error)
|
||||
GetWorkspaceAgentLogsAfter(ctx context.Context, arg GetWorkspaceAgentLogsAfterParams) ([]WorkspaceAgentLog, error)
|
||||
GetWorkspaceAgentMetadata(ctx context.Context, workspaceAgentID uuid.UUID) ([]WorkspaceAgentMetadatum, error)
|
||||
GetWorkspaceAgentMetadata(ctx context.Context, arg GetWorkspaceAgentMetadataParams) ([]WorkspaceAgentMetadatum, error)
|
||||
GetWorkspaceAgentScriptsByAgentIDs(ctx context.Context, ids []uuid.UUID) ([]WorkspaceAgentScript, error)
|
||||
GetWorkspaceAgentStats(ctx context.Context, createdAt time.Time) ([]GetWorkspaceAgentStatsRow, error)
|
||||
GetWorkspaceAgentStatsAndLabels(ctx context.Context, createdAt time.Time) ([]GetWorkspaceAgentStatsAndLabelsRow, error)
|
||||
|
@ -7318,10 +7318,16 @@ FROM
|
||||
workspace_agent_metadata
|
||||
WHERE
|
||||
workspace_agent_id = $1
|
||||
AND CASE WHEN COALESCE(array_length($2::text[], 1), 0) > 0 THEN key = ANY($2::text[]) ELSE TRUE END
|
||||
`
|
||||
|
||||
func (q *sqlQuerier) GetWorkspaceAgentMetadata(ctx context.Context, workspaceAgentID uuid.UUID) ([]WorkspaceAgentMetadatum, error) {
|
||||
rows, err := q.db.QueryContext(ctx, getWorkspaceAgentMetadata, workspaceAgentID)
|
||||
type GetWorkspaceAgentMetadataParams struct {
|
||||
WorkspaceAgentID uuid.UUID `db:"workspace_agent_id" json:"workspace_agent_id"`
|
||||
Keys []string `db:"keys" json:"keys"`
|
||||
}
|
||||
|
||||
func (q *sqlQuerier) GetWorkspaceAgentMetadata(ctx context.Context, arg GetWorkspaceAgentMetadataParams) ([]WorkspaceAgentMetadatum, error) {
|
||||
rows, err := q.db.QueryContext(ctx, getWorkspaceAgentMetadata, arg.WorkspaceAgentID, pq.Array(arg.Keys))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -7880,32 +7886,41 @@ func (q *sqlQuerier) UpdateWorkspaceAgentLogOverflowByID(ctx context.Context, ar
|
||||
}
|
||||
|
||||
const updateWorkspaceAgentMetadata = `-- name: UpdateWorkspaceAgentMetadata :exec
|
||||
WITH metadata AS (
|
||||
SELECT
|
||||
unnest($2::text[]) AS key,
|
||||
unnest($3::text[]) AS value,
|
||||
unnest($4::text[]) AS error,
|
||||
unnest($5::timestamptz[]) AS collected_at
|
||||
)
|
||||
UPDATE
|
||||
workspace_agent_metadata
|
||||
workspace_agent_metadata wam
|
||||
SET
|
||||
value = $3,
|
||||
error = $4,
|
||||
collected_at = $5
|
||||
value = m.value,
|
||||
error = m.error,
|
||||
collected_at = m.collected_at
|
||||
FROM
|
||||
metadata m
|
||||
WHERE
|
||||
workspace_agent_id = $1
|
||||
AND key = $2
|
||||
wam.workspace_agent_id = $1
|
||||
AND wam.key = m.key
|
||||
`
|
||||
|
||||
type UpdateWorkspaceAgentMetadataParams struct {
|
||||
WorkspaceAgentID uuid.UUID `db:"workspace_agent_id" json:"workspace_agent_id"`
|
||||
Key string `db:"key" json:"key"`
|
||||
Value string `db:"value" json:"value"`
|
||||
Error string `db:"error" json:"error"`
|
||||
CollectedAt time.Time `db:"collected_at" json:"collected_at"`
|
||||
WorkspaceAgentID uuid.UUID `db:"workspace_agent_id" json:"workspace_agent_id"`
|
||||
Key []string `db:"key" json:"key"`
|
||||
Value []string `db:"value" json:"value"`
|
||||
Error []string `db:"error" json:"error"`
|
||||
CollectedAt []time.Time `db:"collected_at" json:"collected_at"`
|
||||
}
|
||||
|
||||
func (q *sqlQuerier) UpdateWorkspaceAgentMetadata(ctx context.Context, arg UpdateWorkspaceAgentMetadataParams) error {
|
||||
_, err := q.db.ExecContext(ctx, updateWorkspaceAgentMetadata,
|
||||
arg.WorkspaceAgentID,
|
||||
arg.Key,
|
||||
arg.Value,
|
||||
arg.Error,
|
||||
arg.CollectedAt,
|
||||
pq.Array(arg.Key),
|
||||
pq.Array(arg.Value),
|
||||
pq.Array(arg.Error),
|
||||
pq.Array(arg.CollectedAt),
|
||||
)
|
||||
return err
|
||||
}
|
||||
|
@ -108,15 +108,24 @@ VALUES
|
||||
($1, $2, $3, $4, $5, $6);
|
||||
|
||||
-- name: UpdateWorkspaceAgentMetadata :exec
|
||||
WITH metadata AS (
|
||||
SELECT
|
||||
unnest(sqlc.arg('key')::text[]) AS key,
|
||||
unnest(sqlc.arg('value')::text[]) AS value,
|
||||
unnest(sqlc.arg('error')::text[]) AS error,
|
||||
unnest(sqlc.arg('collected_at')::timestamptz[]) AS collected_at
|
||||
)
|
||||
UPDATE
|
||||
workspace_agent_metadata
|
||||
workspace_agent_metadata wam
|
||||
SET
|
||||
value = $3,
|
||||
error = $4,
|
||||
collected_at = $5
|
||||
value = m.value,
|
||||
error = m.error,
|
||||
collected_at = m.collected_at
|
||||
FROM
|
||||
metadata m
|
||||
WHERE
|
||||
workspace_agent_id = $1
|
||||
AND key = $2;
|
||||
wam.workspace_agent_id = $1
|
||||
AND wam.key = m.key;
|
||||
|
||||
-- name: GetWorkspaceAgentMetadata :many
|
||||
SELECT
|
||||
@ -124,7 +133,8 @@ SELECT
|
||||
FROM
|
||||
workspace_agent_metadata
|
||||
WHERE
|
||||
workspace_agent_id = $1;
|
||||
workspace_agent_id = $1
|
||||
AND CASE WHEN COALESCE(array_length(sqlc.arg('keys')::text[], 1), 0) > 0 THEN key = ANY(sqlc.arg('keys')::text[]) ELSE TRUE END;
|
||||
|
||||
-- name: UpdateWorkspaceAgentLogOverflowByID :exec
|
||||
UPDATE
|
||||
|
Reference in New Issue
Block a user