Skip to content

Commit 2ed42a3

Browse files
committed
Clear gauges if no db entries are found
Light refactoring Signed-off-by: Danny Kopping <danny@coder.com>
1 parent 843d650 commit 2ed42a3

File tree

1 file changed

+21
-15
lines changed

1 file changed

+21
-15
lines changed

coderd/prometheusmetrics/prometheusmetrics.go

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -77,36 +77,37 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
7777
duration = 5 * time.Minute
7878
}
7979

80-
workspacesByStatus := prometheus.NewGaugeVec(prometheus.GaugeOpts{
80+
workspaceStatuses := prometheus.NewGaugeVec(prometheus.GaugeOpts{
8181
Namespace: "coderd",
8282
Subsystem: "api",
8383
Name: "workspace_latest_build_total",
8484
Help: "The current number of workspace builds by status.",
8585
}, []string{"status"})
86-
if err := registerer.Register(workspacesByStatus); err != nil {
86+
if err := registerer.Register(workspaceStatuses); err != nil {
8787
return nil, err
8888
}
8989

90-
workspacesDetail := prometheus.NewGaugeVec(prometheus.GaugeOpts{
90+
workspaceDetails := prometheus.NewGaugeVec(prometheus.GaugeOpts{
9191
Namespace: "coderd",
9292
Subsystem: "api",
9393
Name: "workspace_detail",
9494
Help: "The current workspace details by template, transition, owner, and status.",
9595
}, []string{"status", "template_name", "template_version", "workspace_name", "workspace_owner", "workspace_transition"})
96-
if err := registerer.Register(workspacesDetail); err != nil {
96+
if err := registerer.Register(workspaceDetails); err != nil {
9797
return nil, err
9898
}
99-
// This exists so the prometheus metric exports immediately when set.
100-
// It helps with tests so they don't have to wait for a tick.
101-
workspacesByStatus.WithLabelValues(string(database.ProvisionerJobStatusPending)).Set(0)
102-
workspacesDetail.WithLabelValues(string(database.ProvisionerJobStatusPending), "", "", "", "", "").Set(0)
10399

104100
ctx, cancelFunc := context.WithCancel(ctx)
105101
done := make(chan struct{})
106102

107-
updateWorkspacesByStatus := func() {
103+
updateWorkspaceStatuses := func() {
108104
builds, err := db.GetLatestWorkspaceBuilds(ctx)
109105
if err != nil {
106+
if errors.Is(err, sql.ErrNoRows) {
107+
// clear all series if there are no database entries
108+
workspaceStatuses.Reset()
109+
}
110+
110111
logger.Warn(ctx, "failed to load latest workspace builds", slog.Error(err))
111112
return
112113
}
@@ -125,24 +126,29 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
125126
return
126127
}
127128

128-
workspacesByStatus.Reset()
129+
workspaceStatuses.Reset()
129130
for _, job := range jobs {
130131
status := codersdk.ProvisionerJobStatus(job.JobStatus)
131-
workspacesByStatus.WithLabelValues(string(status)).Add(1)
132+
workspaceStatuses.WithLabelValues(string(status)).Add(1)
132133
}
133134
}
134135

135-
updateWorkspacesDetail := func() {
136+
updateWorkspaceDetails := func() {
136137
ws, err := db.GetWorkspaces(ctx, database.GetWorkspacesParams{
137138
Deleted: false,
138139
WithSummary: false,
139140
})
140141
if err != nil {
142+
if errors.Is(err, sql.ErrNoRows) {
143+
// clear all series if there are no database entries
144+
workspaceDetails.Reset()
145+
}
146+
141147
logger.Warn(ctx, "failed to load active workspaces", slog.Error(err))
142148
return
143149
}
144150

145-
workspacesDetail.Reset()
151+
workspaceDetails.Reset()
146152
for _, w := range ws {
147153
// TODO: there may be a more elegant/idiomatic way to do this?
148154
buildStatus := string(database.ProvisionerJobStatusUnknown)
@@ -162,8 +168,8 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
162168
doTick := func() {
163169
defer ticker.Reset(duration)
164170

165-
updateWorkspacesByStatus()
166-
updateWorkspacesDetail()
171+
updateWorkspaceStatuses()
172+
updateWorkspaceDetails()
167173
}
168174

169175
go func() {

0 commit comments

Comments
 (0)