From 87ed7a7dba246cf7efcb86d733220d37f872e478 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Tue, 7 Mar 2023 08:25:04 -0600 Subject: [PATCH] chore: use nil map on agent stats to check if report interval should be returned (#6479) See https://github.com/coder/coder/actions/runs/4350638262/jobs/7601537088 --- coderd/database/dbfake/databasefake.go | 6 +++++ coderd/database/queries.sql.go | 5 +++- .../database/queries/workspaceagentstats.sql | 5 +++- coderd/metricscache/metricscache_test.go | 1 + coderd/workspaceagents.go | 23 +++++++++++-------- codersdk/agentsdk/agentsdk.go | 2 +- 6 files changed, 30 insertions(+), 12 deletions(-) diff --git a/coderd/database/dbfake/databasefake.go b/coderd/database/dbfake/databasefake.go index 92b305c837..7dca9ccfa1 100644 --- a/coderd/database/dbfake/databasefake.go +++ b/coderd/database/dbfake/databasefake.go @@ -304,6 +304,9 @@ func (q *fakeQuerier) GetTemplateDAUs(_ context.Context, templateID uuid.UUID) ( if as.TemplateID != templateID { continue } + if as.ConnectionCount == 0 { + continue + } date := as.CreatedAt.Truncate(time.Hour * 24) @@ -341,6 +344,9 @@ func (q *fakeQuerier) GetDeploymentDAUs(_ context.Context) ([]database.GetDeploy seens := make(map[time.Time]map[uuid.UUID]struct{}) for _, as := range q.workspaceAgentStats { + if as.ConnectionCount == 0 { + continue + } date := as.CreatedAt.Truncate(time.Hour * 24) dateEntry := seens[date] diff --git a/coderd/database/queries.sql.go b/coderd/database/queries.sql.go index 1a668d78e8..e83f010015 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -5442,6 +5442,8 @@ SELECT user_id FROM workspace_agent_stats +WHERE + connection_count > 0 GROUP BY date, user_id ORDER BY @@ -5483,7 +5485,8 @@ SELECT FROM workspace_agent_stats WHERE - template_id = $1 + template_id = $1 AND + connection_count > 0 GROUP BY date, user_id ORDER BY diff --git a/coderd/database/queries/workspaceagentstats.sql b/coderd/database/queries/workspaceagentstats.sql index 57225711bd..0aa5f131e1 100644 --- a/coderd/database/queries/workspaceagentstats.sql +++ b/coderd/database/queries/workspaceagentstats.sql @@ -29,7 +29,8 @@ SELECT FROM workspace_agent_stats WHERE - template_id = $1 + template_id = $1 AND + connection_count > 0 GROUP BY date, user_id ORDER BY @@ -41,6 +42,8 @@ SELECT user_id FROM workspace_agent_stats +WHERE + connection_count > 0 GROUP BY date, user_id ORDER BY diff --git a/coderd/metricscache/metricscache_test.go b/coderd/metricscache/metricscache_test.go index e8e3a3e9cf..e5ed25e300 100644 --- a/coderd/metricscache/metricscache_test.go +++ b/coderd/metricscache/metricscache_test.go @@ -175,6 +175,7 @@ func TestCache_TemplateUsers(t *testing.T) { for _, row := range tt.args.rows { row.TemplateID = template.ID + row.ConnectionCount = 1 db.InsertWorkspaceAgentStat(context.Background(), row) } diff --git a/coderd/workspaceagents.go b/coderd/workspaceagents.go index 0505c6057c..9fd6f143c7 100644 --- a/coderd/workspaceagents.go +++ b/coderd/workspaceagents.go @@ -921,7 +921,8 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques return } - if req.RxBytes == 0 && req.TxBytes == 0 { + // An empty stat means it's just looking for the report interval. + if req.ConnectionsByProto == nil { httpapi.Write(ctx, rw, http.StatusOK, agentsdk.StatsResponse{ ReportInterval: api.AgentStatsRefreshInterval, }) @@ -935,7 +936,9 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques slog.F("payload", req), ) - activityBumpWorkspace(ctx, api.Logger.Named("activity_bump"), api.Database, workspace.ID) + if req.ConnectionCount > 0 { + activityBumpWorkspace(ctx, api.Logger.Named("activity_bump"), api.Database, workspace.ID) + } payload, err := json.Marshal(req.ConnectionsByProto) if err != nil { @@ -968,13 +971,15 @@ func (api *API) workspaceAgentReportStats(rw http.ResponseWriter, r *http.Reques return } - err = api.Database.UpdateWorkspaceLastUsedAt(ctx, database.UpdateWorkspaceLastUsedAtParams{ - ID: workspace.ID, - LastUsedAt: now, - }) - if err != nil { - httpapi.InternalServerError(rw, err) - return + if req.ConnectionCount > 0 { + err = api.Database.UpdateWorkspaceLastUsedAt(ctx, database.UpdateWorkspaceLastUsedAtParams{ + ID: workspace.ID, + LastUsedAt: now, + }) + if err != nil { + httpapi.InternalServerError(rw, err) + return + } } httpapi.Write(ctx, rw, http.StatusOK, agentsdk.StatsResponse{ diff --git a/codersdk/agentsdk/agentsdk.go b/codersdk/agentsdk/agentsdk.go index eedeaf4a02..7035fbefcd 100644 --- a/codersdk/agentsdk/agentsdk.go +++ b/codersdk/agentsdk/agentsdk.go @@ -399,7 +399,7 @@ func (c *Client) ReportStats(ctx context.Context, log slog.Logger, statsChan <-c } // Send an empty stat to get the interval. - postStat(&Stats{ConnectionsByProto: map[string]int64{}}) + postStat(&Stats{}) go func() { defer close(exited)