Skip to content

Commit 838c797

Browse files
committed
improve test structure
1 parent 696360a commit 838c797

File tree

1 file changed

+91
-99
lines changed

1 file changed

+91
-99
lines changed

enterprise/coderd/prebuilds/metricscollector_test.go

+91-99
Original file line numberDiff line numberDiff line change
@@ -22,94 +22,97 @@ import (
2222
"github.com/coder/quartz"
2323
)
2424

25-
type metricCheck struct {
26-
name string
27-
value *float64
28-
isCounter bool
29-
}
30-
3125
func TestMetricsCollector(t *testing.T) {
3226
t.Parallel()
3327

3428
if !dbtestutil.WillUsePostgres() {
3529
t.Skip("this test requires postgres")
3630
}
3731

32+
type metricCheck struct {
33+
name string
34+
value *float64
35+
isCounter bool
36+
}
37+
3838
type testCase struct {
39-
name string
40-
transitions []database.WorkspaceTransition
41-
jobStatuses []database.ProvisionerJobStatus
42-
initiatorIDs []uuid.UUID
43-
ownerIDs []uuid.UUID
44-
shouldIncrementPrebuildsCreated *float64
45-
shouldIncrementPrebuildsFailed *float64
46-
shouldIncrementPrebuildsAssigned *float64
47-
shouldSetDesiredPrebuilds *float64
48-
shouldSetActualPrebuilds *float64
49-
shouldSetEligiblePrebuilds *float64
39+
name string
40+
transitions []database.WorkspaceTransition
41+
jobStatuses []database.ProvisionerJobStatus
42+
initiatorIDs []uuid.UUID
43+
ownerIDs []uuid.UUID
44+
metrics []metricCheck
5045
}
5146

5247
tests := []testCase{
5348
{
54-
name: "prebuild created",
55-
// A prebuild is a workspace, for which the first build was a start transition
56-
// initiated by the prebuilds user. Whether or not the build was successful, it
57-
// is still a prebuild. It might just not be a running prebuild.
58-
transitions: allTransitions,
59-
jobStatuses: allJobStatuses,
60-
initiatorIDs: []uuid.UUID{prebuilds.OwnerID},
61-
ownerIDs: []uuid.UUID{prebuilds.OwnerID, uuid.New()},
62-
shouldIncrementPrebuildsCreated: ptr.To(1.0),
63-
shouldSetDesiredPrebuilds: ptr.To(1.0),
64-
shouldSetEligiblePrebuilds: ptr.To(0.0),
49+
name: "prebuild created",
50+
transitions: allTransitions,
51+
jobStatuses: allJobStatuses,
52+
initiatorIDs: []uuid.UUID{prebuilds.OwnerID},
53+
// TODO: reexamine and refactor the test cases and assertions:
54+
// * a running prebuild that is not elibible to be claimed currently seems to be eligible.
55+
// * a prebuild that was claimed should not be deemed running, not eligible.
56+
ownerIDs: []uuid.UUID{prebuilds.OwnerID, uuid.New()},
57+
metrics: []metricCheck{
58+
{"coderd_prebuilds_created", ptr.To(1.0), true},
59+
{"coderd_prebuilds_desired", ptr.To(1.0), false},
60+
// {"coderd_prebuilds_running", ptr.To(0.0), false},
61+
// {"coderd_prebuilds_eligible", ptr.To(0.0), false},
62+
},
6563
},
6664
{
67-
name: "prebuild running",
68-
transitions: []database.WorkspaceTransition{database.WorkspaceTransitionStart},
69-
jobStatuses: []database.ProvisionerJobStatus{database.ProvisionerJobStatusSucceeded},
70-
initiatorIDs: []uuid.UUID{prebuilds.OwnerID},
71-
ownerIDs: []uuid.UUID{prebuilds.OwnerID},
72-
shouldIncrementPrebuildsCreated: ptr.To(1.0),
73-
shouldSetDesiredPrebuilds: ptr.To(1.0),
74-
shouldSetActualPrebuilds: ptr.To(1.0),
75-
shouldSetEligiblePrebuilds: ptr.To(0.0),
65+
name: "prebuild running",
66+
transitions: []database.WorkspaceTransition{database.WorkspaceTransitionStart},
67+
jobStatuses: []database.ProvisionerJobStatus{database.ProvisionerJobStatusSucceeded},
68+
initiatorIDs: []uuid.UUID{prebuilds.OwnerID},
69+
ownerIDs: []uuid.UUID{prebuilds.OwnerID},
70+
metrics: []metricCheck{
71+
{"coderd_prebuilds_created", ptr.To(1.0), true},
72+
{"coderd_prebuilds_desired", ptr.To(1.0), false},
73+
{"coderd_prebuilds_running", ptr.To(1.0), false},
74+
{"coderd_prebuilds_eligible", ptr.To(0.0), false},
75+
},
7676
},
7777
{
78-
name: "prebuild failed",
79-
transitions: allTransitions,
80-
jobStatuses: []database.ProvisionerJobStatus{database.ProvisionerJobStatusFailed},
81-
initiatorIDs: []uuid.UUID{prebuilds.OwnerID},
82-
ownerIDs: []uuid.UUID{prebuilds.OwnerID, uuid.New()},
83-
shouldIncrementPrebuildsCreated: ptr.To(1.0),
84-
shouldIncrementPrebuildsFailed: ptr.To(1.0),
85-
shouldSetDesiredPrebuilds: ptr.To(1.0),
86-
shouldSetActualPrebuilds: ptr.To(0.0),
87-
shouldSetEligiblePrebuilds: ptr.To(0.0),
78+
name: "prebuild failed",
79+
transitions: allTransitions,
80+
jobStatuses: []database.ProvisionerJobStatus{database.ProvisionerJobStatusFailed},
81+
initiatorIDs: []uuid.UUID{prebuilds.OwnerID},
82+
ownerIDs: []uuid.UUID{prebuilds.OwnerID, uuid.New()},
83+
metrics: []metricCheck{
84+
{"coderd_prebuilds_created", ptr.To(1.0), true},
85+
{"coderd_prebuilds_failed", ptr.To(1.0), true},
86+
{"coderd_prebuilds_desired", ptr.To(1.0), false},
87+
{"coderd_prebuilds_running", ptr.To(0.0), false},
88+
{"coderd_prebuilds_eligible", ptr.To(0.0), false},
89+
},
8890
},
8991
{
90-
name: "prebuild assigned",
91-
transitions: allTransitions,
92-
jobStatuses: allJobStatuses,
93-
initiatorIDs: []uuid.UUID{prebuilds.OwnerID},
94-
ownerIDs: []uuid.UUID{uuid.New()},
95-
shouldIncrementPrebuildsCreated: ptr.To(1.0),
96-
shouldIncrementPrebuildsAssigned: ptr.To(1.0),
97-
shouldSetDesiredPrebuilds: ptr.To(1.0),
98-
shouldSetActualPrebuilds: ptr.To(0.0),
99-
shouldSetEligiblePrebuilds: ptr.To(0.0),
92+
name: "prebuild assigned",
93+
transitions: allTransitions,
94+
jobStatuses: allJobStatuses,
95+
initiatorIDs: []uuid.UUID{prebuilds.OwnerID},
96+
ownerIDs: []uuid.UUID{uuid.New()},
97+
metrics: []metricCheck{
98+
{"coderd_prebuilds_created", ptr.To(1.0), true},
99+
{"coderd_prebuilds_claimed", ptr.To(1.0), true},
100+
{"coderd_prebuilds_desired", ptr.To(1.0), false},
101+
{"coderd_prebuilds_running", ptr.To(0.0), false},
102+
{"coderd_prebuilds_eligible", ptr.To(0.0), false},
103+
},
100104
},
101105
{
102-
name: "workspaces that were not created by the prebuilds user are not counted",
103-
transitions: allTransitions,
104-
jobStatuses: allJobStatuses,
105-
initiatorIDs: []uuid.UUID{uuid.New()},
106-
ownerIDs: []uuid.UUID{uuid.New()},
107-
shouldIncrementPrebuildsCreated: nil,
108-
shouldIncrementPrebuildsFailed: nil,
109-
shouldIncrementPrebuildsAssigned: nil,
110-
shouldSetDesiredPrebuilds: ptr.To(1.0),
111-
shouldSetActualPrebuilds: ptr.To(0.0),
112-
shouldSetEligiblePrebuilds: ptr.To(0.0),
106+
name: "workspaces that were not created by the prebuilds user are not counted",
107+
transitions: allTransitions,
108+
jobStatuses: allJobStatuses,
109+
initiatorIDs: []uuid.UUID{uuid.New()},
110+
ownerIDs: []uuid.UUID{uuid.New()},
111+
metrics: []metricCheck{
112+
{"coderd_prebuilds_desired", ptr.To(1.0), false},
113+
{"coderd_prebuilds_running", ptr.To(0.0), false},
114+
{"coderd_prebuilds_eligible", ptr.To(0.0), false},
115+
},
113116
},
114117
}
115118
for _, test := range tests {
@@ -179,27 +182,19 @@ func TestMetricsCollector(t *testing.T) {
179182
require.Equal(t, 1, len(presets))
180183

181184
for _, preset := range presets {
182-
checks := []metricCheck{
183-
{"coderd_prebuilds_created", test.shouldIncrementPrebuildsCreated, true},
184-
{"coderd_prebuilds_failed", test.shouldIncrementPrebuildsFailed, true},
185-
{"coderd_prebuilds_claimed", test.shouldIncrementPrebuildsAssigned, true},
186-
{"coderd_prebuilds_desired", test.shouldSetDesiredPrebuilds, false},
187-
{"coderd_prebuilds_running", test.shouldSetActualPrebuilds, false},
188-
{"coderd_prebuilds_eligible", test.shouldSetEligiblePrebuilds, false},
189-
}
190-
191185
labels := map[string]string{
192186
"template_name": template.Name,
193187
"preset_name": preset.Name,
194188
}
195189

196-
for _, check := range checks {
190+
for _, check := range test.metrics {
197191
metric := findMetric(metricsFamilies, check.name, labels)
198192
if check.value == nil {
199193
continue
200194
}
201195

202196
require.NotNil(t, metric, "metric %s should exist", check.name)
197+
203198
if check.isCounter {
204199
require.Equal(t, *check.value, metric.GetCounter().GetValue(), "counter %s value mismatch", check.name)
205200
} else {
@@ -218,30 +213,27 @@ func TestMetricsCollector(t *testing.T) {
218213

219214
func findMetric(metricsFamilies []*prometheus_client.MetricFamily, name string, labels map[string]string) *prometheus_client.Metric {
220215
for _, metricFamily := range metricsFamilies {
221-
if metricFamily.GetName() == name {
222-
for _, metric := range metricFamily.GetMetric() {
223-
matches := true
224-
labelPairs := metric.GetLabel()
225-
226-
// Check if all requested labels match
227-
for wantName, wantValue := range labels {
228-
found := false
229-
for _, label := range labelPairs {
230-
if label.GetName() == wantName && label.GetValue() == wantValue {
231-
found = true
232-
break
233-
}
234-
}
235-
if !found {
236-
matches = false
237-
break
238-
}
239-
}
216+
if metricFamily.GetName() != name {
217+
continue
218+
}
219+
220+
for _, metric := range metricFamily.GetMetric() {
221+
labelPairs := metric.GetLabel()
240222

241-
if matches {
242-
return metric
223+
// Convert label pairs to map for easier lookup
224+
metricLabels := make(map[string]string, len(labelPairs))
225+
for _, label := range labelPairs {
226+
metricLabels[label.GetName()] = label.GetValue()
227+
}
228+
229+
// Check if all requested labels match
230+
for wantName, wantValue := range labels {
231+
if metricLabels[wantName] != wantValue {
232+
continue
243233
}
244234
}
235+
236+
return metric
245237
}
246238
}
247239
return nil

0 commit comments

Comments
 (0)