Skip to content

Commit b59ebad

Browse files
committed
chore: add provisionerdserver metrics
1 parent 3cde491 commit b59ebad

8 files changed

Lines changed: 204 additions & 183 deletions

File tree

cli/server.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ import (
5353
"gopkg.in/yaml.v3"
5454
"tailscale.com/tailcfg"
5555

56+
"github.com/coder/coder/v2/coderd/provisionerdserver"
57+
5658
"cdr.dev/slog"
5759
"cdr.dev/slog/sloggers/sloghuman"
5860
"github.com/coder/coder/v2/coderd/pproflabel"
@@ -236,12 +238,11 @@ func enablePrometheus(
236238
}
237239
afterCtx(ctx, closeUsersFunc)
238240

239-
closeWorkspacesFunc, updateWorkspaceTimingsMetrics, err := prometheusmetrics.Workspaces(ctx, options.Logger.Named("workspaces_metrics"), options.PrometheusRegistry, options.Database, 0)
241+
closeWorkspacesFunc, err := prometheusmetrics.Workspaces(ctx, options.Logger.Named("workspaces_metrics"), options.PrometheusRegistry, options.Database, 0)
240242
if err != nil {
241243
return nil, xerrors.Errorf("register workspaces prometheus metric: %w", err)
242244
}
243245
afterCtx(ctx, closeWorkspacesFunc)
244-
options.UpdateWorkspaceTimingMetricsFn = updateWorkspaceTimingsMetrics
245246

246247
insightsMetricsCollector, err := insights.NewMetricsCollector(options.Database, options.Logger, 0, 0)
247248
if err != nil {
@@ -281,6 +282,12 @@ func enablePrometheus(
281282
}
282283
}
283284

285+
provisionerdserverMetrics := provisionerdserver.NewMetrics(logger)
286+
if err := provisionerdserverMetrics.Register(options.PrometheusRegistry); err != nil {
287+
return nil, xerrors.Errorf("failed to register provisionerd_server metrics: %w", err)
288+
}
289+
options.ProvisionerdServerMetrics = provisionerdserverMetrics
290+
284291
//nolint:revive
285292
return ServeHandler(
286293
ctx, logger, promhttp.InstrumentMetricHandler(

coderd/coderd.go

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -241,8 +241,7 @@ type Options struct {
241241
UpdateAgentMetrics func(ctx context.Context, labels prometheusmetrics.AgentMetricLabels, metrics []*agentproto.Stats_Metric)
242242
StatsBatcher workspacestats.Batcher
243243

244-
// Function to update workspace timing metrics from provisionerdserver
245-
UpdateWorkspaceTimingMetricsFn prometheusmetrics.UpdateWorkspaceTimingMetricsFn
244+
ProvisionerdServerMetrics *provisionerdserver.Metrics
246245

247246
// WorkspaceAppAuditSessionTimeout allows changing the timeout for audit
248247
// sessions. Raising or lowering this value will directly affect the write
@@ -1927,13 +1926,13 @@ func (api *API) CreateInMemoryTaggedProvisionerDaemon(dialCtx context.Context, n
19271926
api.UsageInserter,
19281927
api.DeploymentValues,
19291928
provisionerdserver.Options{
1930-
OIDCConfig: api.OIDCConfig,
1931-
ExternalAuthConfigs: api.ExternalAuthConfigs,
1932-
Clock: api.Clock,
1933-
UpdateWorkspaceTimingMetricsFn: api.UpdateWorkspaceTimingMetricsFn,
1929+
OIDCConfig: api.OIDCConfig,
1930+
ExternalAuthConfigs: api.ExternalAuthConfigs,
1931+
Clock: api.Clock,
19341932
},
19351933
api.NotificationsEnqueuer,
19361934
&api.PrebuildsReconciler,
1935+
api.ProvisionerdServerMetrics,
19371936
)
19381937
if err != nil {
19391938
return nil, err

coderd/prometheusmetrics/prometheusmetrics.go

Lines changed: 6 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func Users(ctx context.Context, logger slog.Logger, clk quartz.Clock, registerer
128128
}
129129

130130
// Workspaces tracks the total number of workspaces with labels on status.
131-
func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.Registerer, db database.Store, duration time.Duration) (func(), UpdateWorkspaceTimingMetricsFn, error) {
131+
func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.Registerer, db database.Store, duration time.Duration) (func(), error) {
132132
if duration == 0 {
133133
duration = defaultRefreshRate
134134
}
@@ -143,7 +143,7 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
143143
Help: "DEPRECATED: use coderd_api_workspace_latest_build instead",
144144
}, []string{"status"})
145145
if err := registerer.Register(workspaceLatestBuildTotalsDeprecated); err != nil {
146-
return nil, nil, err
146+
return nil, err
147147
}
148148

149149
workspaceLatestBuildTotals := prometheus.NewGaugeVec(prometheus.GaugeOpts{
@@ -153,7 +153,7 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
153153
Help: "The current number of workspace builds by status for all non-deleted workspaces.",
154154
}, []string{"status"})
155155
if err := registerer.Register(workspaceLatestBuildTotals); err != nil {
156-
return nil, nil, err
156+
return nil, err
157157
}
158158

159159
workspaceLatestBuildStatuses := prometheus.NewGaugeVec(prometheus.GaugeOpts{
@@ -162,7 +162,7 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
162162
Help: "The current workspace statuses by template, transition, and owner for all non-deleted workspaces.",
163163
}, []string{"status", "template_name", "template_version", "workspace_owner", "workspace_transition"})
164164
if err := registerer.Register(workspaceLatestBuildStatuses); err != nil {
165-
return nil, nil, err
165+
return nil, err
166166
}
167167

168168
workspaceCreationTotal := prometheus.NewCounterVec(
@@ -175,65 +175,7 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
175175
[]string{"organization_name", "template_name", "preset_name"},
176176
)
177177
if err := registerer.Register(workspaceCreationTotal); err != nil {
178-
return nil, nil, err
179-
}
180-
181-
workspaceCreationTimings := prometheus.NewHistogramVec(prometheus.HistogramOpts{
182-
Namespace: "coderd",
183-
Subsystem: "",
184-
Name: "workspace_creation_duration_seconds",
185-
Help: "Time to create a workspace by organization, template, preset, and type (regular or prebuild).",
186-
Buckets: []float64{
187-
1, // 1s
188-
10,
189-
30,
190-
60, // 1min
191-
60 * 5,
192-
60 * 10,
193-
60 * 30, // 30min
194-
60 * 60, // 1hr
195-
},
196-
NativeHistogramBucketFactor: 1.1,
197-
// Max number of native buckets kept at once to bound memory.
198-
NativeHistogramMaxBucketNumber: 100,
199-
// Merge/flush small buckets periodically to control churn.
200-
NativeHistogramMinResetDuration: time.Hour,
201-
// Treat tiny values as zero (helps with noisy near-zero latencies).
202-
NativeHistogramZeroThreshold: 0,
203-
NativeHistogramMaxZeroThreshold: 0,
204-
}, []string{"organization_name", "template_name", "preset_name", "type"})
205-
if err := registerer.Register(workspaceCreationTimings); err != nil {
206-
return nil, nil, err
207-
}
208-
209-
workspaceClaimTimings := prometheus.NewHistogramVec(prometheus.HistogramOpts{
210-
Namespace: "coderd",
211-
Subsystem: "",
212-
Name: "prebuilt_workspace_claim_duration_seconds",
213-
Help: "Time to claim a prebuilt workspace by organization, template, and preset.",
214-
Buckets: []float64{
215-
1, // 1s
216-
5,
217-
10,
218-
20,
219-
30,
220-
60, // 1m
221-
120, // 2m
222-
180, // 3m
223-
240, // 4m
224-
300, // 5m
225-
},
226-
NativeHistogramBucketFactor: 1.1,
227-
// Max number of native buckets kept at once to bound memory.
228-
NativeHistogramMaxBucketNumber: 100,
229-
// Merge/flush small buckets periodically to control churn.
230-
NativeHistogramMinResetDuration: time.Hour,
231-
// Treat tiny values as zero (helps with noisy near-zero latencies).
232-
NativeHistogramZeroThreshold: 0,
233-
NativeHistogramMaxZeroThreshold: 0,
234-
}, []string{"organization_name", "template_name", "preset_name"})
235-
if err := registerer.Register(workspaceClaimTimings); err != nil {
236-
return nil, nil, err
178+
return nil, err
237179
}
238180

239181
ctx, cancelFunc := context.WithCancel(ctx)
@@ -318,71 +260,7 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
318260
return func() {
319261
cancelFunc()
320262
<-done
321-
}, updateWorkspaceTimingsMetrics(workspaceCreationTimings, workspaceClaimTimings), nil
322-
}
323-
324-
type WorkspaceTimingType int
325-
326-
const (
327-
Unsupported WorkspaceTimingType = iota
328-
WorkspaceCreation
329-
PrebuildCreation
330-
PrebuildClaim
331-
)
332-
333-
const (
334-
workspaceTypeRegular = "regular"
335-
workspaceTypePrebuild = "prebuild"
336-
)
337-
338-
type UpdateWorkspaceTimingMetricsFn func(
339-
workspaceTimingType WorkspaceTimingType,
340-
organizationName string,
341-
templateName string,
342-
presetName string,
343-
buildTime float64,
344-
)
345-
346-
func GetTimingType(isPrebuild bool, isClaim bool, isWorkspaceFirstBuild bool) WorkspaceTimingType {
347-
switch {
348-
case isPrebuild:
349-
return PrebuildCreation
350-
case isClaim:
351-
return PrebuildClaim
352-
case isWorkspaceFirstBuild:
353-
return WorkspaceCreation
354-
default:
355-
return Unsupported
356-
}
357-
}
358-
359-
func updateWorkspaceTimingsMetrics(
360-
workspaceCreationTimings *prometheus.HistogramVec,
361-
workspaceClaimTimings *prometheus.HistogramVec,
362-
) UpdateWorkspaceTimingMetricsFn {
363-
return func(
364-
workspaceTimingType WorkspaceTimingType,
365-
organizationName string,
366-
templateName string,
367-
presetName string,
368-
buildTime float64,
369-
) {
370-
switch workspaceTimingType {
371-
case WorkspaceCreation:
372-
// Regular workspace creation (without prebuild pool)
373-
workspaceCreationTimings.
374-
WithLabelValues(organizationName, templateName, presetName, workspaceTypeRegular).Observe(buildTime)
375-
case PrebuildCreation:
376-
// Prebuilt workspace creation duration
377-
workspaceCreationTimings.
378-
WithLabelValues(organizationName, templateName, presetName, workspaceTypePrebuild).Observe(buildTime)
379-
case PrebuildClaim:
380-
// Prebuilt workspace claim duration
381-
workspaceClaimTimings.
382-
WithLabelValues(organizationName, templateName, presetName).Observe(buildTime)
383-
default:
384-
}
385-
}
263+
}, nil
386264
}
387265

388266
// Agents tracks the total number of workspaces with labels on status.

coderd/prometheusmetrics/prometheusmetrics_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ func TestWorkspaceLatestBuildTotals(t *testing.T) {
277277
t.Run(tc.Name, func(t *testing.T) {
278278
t.Parallel()
279279
registry := prometheus.NewRegistry()
280-
closeFunc, _, err := prometheusmetrics.Workspaces(context.Background(), testutil.Logger(t).Leveled(slog.LevelWarn), registry, tc.Database(), testutil.IntervalFast)
280+
closeFunc, err := prometheusmetrics.Workspaces(context.Background(), testutil.Logger(t).Leveled(slog.LevelWarn), registry, tc.Database(), testutil.IntervalFast)
281281
require.NoError(t, err)
282282
t.Cleanup(closeFunc)
283283

@@ -380,7 +380,7 @@ func TestWorkspaceLatestBuildStatuses(t *testing.T) {
380380
t.Run(tc.Name, func(t *testing.T) {
381381
t.Parallel()
382382
registry := prometheus.NewRegistry()
383-
closeFunc, _, err := prometheusmetrics.Workspaces(context.Background(), testutil.Logger(t), registry, tc.Database(), testutil.IntervalFast)
383+
closeFunc, err := prometheusmetrics.Workspaces(context.Background(), testutil.Logger(t), registry, tc.Database(), testutil.IntervalFast)
384384
require.NoError(t, err)
385385
t.Cleanup(closeFunc)
386386

0 commit comments

Comments
 (0)