Skip to content

Commit dda9bf5

Browse files
committed
Address Mathias' feedback
1 parent 5911ca9 commit dda9bf5

File tree

2 files changed

+18
-25
lines changed

2 files changed

+18
-25
lines changed

coderd/database/queries/workspacebuilds.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ JOIN
200200
templates AS t ON
201201
w.template_id = t.id
202202
WHERE
203-
wb.created_at > @since
203+
wb.created_at >= @since
204204
AND pj.completed_at IS NOT NULL
205205
GROUP BY
206206
w.template_id, template_name, template_display_name, template_organization_id;
@@ -235,6 +235,6 @@ ON
235235
wb.template_version_id = tv.id
236236
WHERE
237237
w.template_id = $1
238-
AND wb.created_at > @since
238+
AND wb.created_at >= @since
239239
AND pj.completed_at IS NOT NULL
240240
AND pj.job_status = 'failed';

coderd/notifications/reports/generator.go

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package reports
33
import (
44
"context"
55
"database/sql"
6-
"fmt"
76
"io"
87
"slices"
98
"sort"
@@ -37,6 +36,7 @@ func NewReportGenerator(ctx context.Context, logger slog.Logger, db database.Sto
3736

3837
// Start the ticker with the initial delay.
3938
ticker := clk.NewTicker(delay)
39+
ticker.Stop()
4040
doTick := func(start time.Time) {
4141
defer ticker.Reset(delay)
4242
// Start a transaction to grab advisory lock, we don't want to run generator jobs at the same time (multiple replicas).
@@ -98,11 +98,14 @@ func (i *reportGenerator) Close() error {
9898
return nil
9999
}
100100

101-
const failedWorkspaceBuildsReportFrequencyDays = 7
101+
const (
102+
failedWorkspaceBuildsReportFrequency = 7 * 24 * time.Hour
103+
failedWorkspaceBuildsReportFrequencyLabel = "week"
104+
)
102105

103106
func reportFailedWorkspaceBuilds(ctx context.Context, logger slog.Logger, db database.Store, enqueuer notifications.Enqueuer, clk quartz.Clock) error {
104107
now := clk.Now()
105-
since := now.Add(-failedWorkspaceBuildsReportFrequencyDays * 24 * time.Hour)
108+
since := now.Add(-failedWorkspaceBuildsReportFrequency)
106109

107110
statsRows, err := db.GetWorkspaceBuildStatsByTemplates(ctx, dbtime.Time(since).UTC())
108111
if err != nil {
@@ -128,7 +131,7 @@ func reportFailedWorkspaceBuilds(ctx context.Context, logger slog.Logger, db dat
128131
}
129132

130133
// There are some failed builds, so we have to prepare input data for the report.
131-
reportData = buildDataForReportFailedWorkspaceBuilds(failedWorkspaceBuildsReportFrequencyDays, stats, failedBuilds)
134+
reportData = buildDataForReportFailedWorkspaceBuilds(stats, failedBuilds)
132135
}
133136

134137
templateAdmins, err := findTemplateAdmins(ctx, db, stats)
@@ -147,7 +150,7 @@ func reportFailedWorkspaceBuilds(ctx context.Context, logger slog.Logger, db dat
147150
continue
148151
}
149152

150-
if !reportLog.LastGeneratedAt.IsZero() && reportLog.LastGeneratedAt.Add(failedWorkspaceBuildsReportFrequencyDays*24*time.Hour).After(now) {
153+
if !reportLog.LastGeneratedAt.IsZero() && reportLog.LastGeneratedAt.Add(failedWorkspaceBuildsReportFrequency).After(now) {
151154
// report generated recently, no need to send it now
152155
continue
153156
}
@@ -191,27 +194,15 @@ func reportFailedWorkspaceBuilds(ctx context.Context, logger slog.Logger, db dat
191194

192195
err = db.DeleteOldReportGeneratorLogs(ctx, database.DeleteOldReportGeneratorLogsParams{
193196
NotificationTemplateID: notifications.TemplateWorkspaceBuildsFailedReport,
194-
Before: dbtime.Time(now.Add(-failedWorkspaceBuildsReportFrequencyDays*24*time.Hour - time.Hour)).UTC(),
197+
Before: dbtime.Time(now.Add(-failedWorkspaceBuildsReportFrequency - time.Hour)).UTC(),
195198
})
196199
if err != nil {
197200
return xerrors.Errorf("unable to delete old report generator logs: %w", err)
198201
}
199202
return nil
200203
}
201204

202-
func buildDataForReportFailedWorkspaceBuilds(frequencyDays int, stats database.GetWorkspaceBuildStatsByTemplatesRow, failedBuilds []database.GetFailedWorkspaceBuildsByTemplateIDRow) map[string]any {
203-
// Format frequency label
204-
var frequencyLabel string
205-
if frequencyDays == 7 {
206-
frequencyLabel = "week"
207-
} else {
208-
var plural string
209-
if frequencyDays > 1 {
210-
plural = "s"
211-
}
212-
frequencyLabel = fmt.Sprintf("%d day%s", frequencyDays, plural)
213-
}
214-
205+
func buildDataForReportFailedWorkspaceBuilds(stats database.GetWorkspaceBuildStatsByTemplatesRow, failedBuilds []database.GetFailedWorkspaceBuildsByTemplateIDRow) map[string]any {
215206
// Sorting order: template_version_name ASC, workspace build number DESC
216207
sort.Slice(failedBuilds, func(i, j int) bool {
217208
if failedBuilds[i].TemplateVersionName != failedBuilds[j].TemplateVersionName {
@@ -240,22 +231,24 @@ func buildDataForReportFailedWorkspaceBuilds(frequencyDays int, stats database.G
240231
continue
241232
}
242233

234+
tv := templateVersions[c-1]
243235
//nolint:errorlint,forcetypeassert // only this function prepares the notification model
244-
builds := templateVersions[c-1]["failed_builds"].([]map[string]any)
236+
builds := tv["failed_builds"].([]map[string]any)
245237
builds = append(builds, map[string]any{
246238
"workspace_owner_username": failedBuild.WorkspaceOwnerUsername,
247239
"workspace_name": failedBuild.WorkspaceName,
248240
"build_number": failedBuild.WorkspaceBuildNumber,
249241
})
250-
templateVersions[c-1]["failed_builds"] = builds
242+
tv["failed_builds"] = builds
251243
//nolint:errorlint,forcetypeassert // only this function prepares the notification model
252-
templateVersions[c-1]["failed_count"] = templateVersions[c-1]["failed_count"].(int) + 1
244+
tv["failed_count"] = tv["failed_count"].(int) + 1
245+
templateVersions[c-1] = tv
253246
}
254247

255248
return map[string]any{
256249
"failed_builds": stats.FailedBuilds,
257250
"total_builds": stats.TotalBuilds,
258-
"report_frequency": frequencyLabel,
251+
"report_frequency": failedWorkspaceBuildsReportFrequencyLabel,
259252
"template_versions": templateVersions,
260253
}
261254
}

0 commit comments

Comments
 (0)