From 88fc4ce171f7bfdf7ad46eca260966207ae56745 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Tue, 7 Mar 2023 05:23:38 +0000 Subject: [PATCH] chore: use nil map on agent stats to check if report interval should be returned 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 e0ac02dbcfeb5..fdd447767d8aa 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 fd7381512bc97..c96dc967bc942 100644 --- a/coderd/database/queries.sql.go +++ b/coderd/database/queries.sql.go @@ -5391,6 +5391,8 @@ SELECT user_id FROM workspace_agent_stats +WHERE + connection_count > 0 GROUP BY date, user_id ORDER BY @@ -5432,7 +5434,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 57225711bde7e..0aa5f131e1b10 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 e8e3a3e9cfbb4..e5ed25e30072a 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 0505c6057c1aa..9fd6f143c7ff9 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 eedeaf4a0226a..7035fbefcdbd9 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)