@@ -9,14 +9,17 @@ import (
9
9
"github.com/stretchr/testify/require"
10
10
"tailscale.com/types/ptr"
11
11
12
- promtestutil "github.com/prometheus/client_golang/prometheus/testutil"
12
+ "github.com/prometheus/client_golang/prometheus"
13
+ prometheus_client "github.com/prometheus/client_model/go"
13
14
14
15
"cdr.dev/slog/sloggers/slogtest"
15
16
"github.com/coder/coder/v2/coderd/database"
16
17
"github.com/coder/coder/v2/coderd/database/dbgen"
17
18
"github.com/coder/coder/v2/coderd/database/dbtestutil"
19
+ "github.com/coder/coder/v2/codersdk"
18
20
"github.com/coder/coder/v2/enterprise/coderd/prebuilds"
19
21
"github.com/coder/coder/v2/testutil"
22
+ "github.com/coder/quartz"
20
23
)
21
24
22
25
func TestMetricsCollector (t * testing.T ) {
@@ -97,6 +100,7 @@ func TestMetricsCollector(t *testing.T) {
97
100
}
98
101
})
99
102
db , pubsub := dbtestutil .NewDB (t )
103
+ reconciler := prebuilds .NewStoreReconciler (db , pubsub , codersdk.PrebuildsConfig {}, logger , quartz .NewMock (t ))
100
104
ctx := testutil .Context (t , testutil .WaitLong )
101
105
102
106
createdUsers := []uuid.UUID {prebuilds .OwnerID }
@@ -109,32 +113,79 @@ func TestMetricsCollector(t *testing.T) {
109
113
}
110
114
}
111
115
112
- collector := prebuilds .NewMetricsCollector (db , logger )
116
+ collector := prebuilds .NewMetricsCollector (db , logger , reconciler )
117
+ registry := prometheus .NewPedanticRegistry ()
118
+ registry .Register (collector )
113
119
114
- iterations := 3
115
- for i := 0 ; i < iterations ; i ++ {
116
- orgID , templateID := setupTestDBTemplate (t , db , createdUsers [ 0 ] )
117
- templateVersionID := setupTestDBTemplateVersion (t , ctx , db , pubsub , orgID , createdUsers [ 0 ] , templateID )
118
- presetID := setupTestDBPreset (t , ctx , db , pubsub , templateVersionID )
120
+ numTemplates := 2
121
+ for i := 0 ; i < numTemplates ; i ++ {
122
+ orgID , templateID := setupTestDBTemplate (t , db , ownerID )
123
+ templateVersionID := setupTestDBTemplateVersion (t , ctx , db , pubsub , orgID , ownerID , templateID )
124
+ preset := setupTestDBPreset (t , ctx , db , pubsub , templateVersionID , 1 )
119
125
setupTestDBPrebuild (
120
126
t , ctx , db , pubsub ,
121
- transition , jobStatus , orgID , templateID , templateVersionID , presetID , initiatorID , ownerID ,
127
+ transition , jobStatus , orgID , templateID , templateVersionID , preset . ID , initiatorID , ownerID ,
122
128
)
123
129
}
124
130
125
- if test .shouldIncrementPrebuildsCreated != nil {
126
- createdCount := promtestutil .CollectAndCount (collector , "coderd_prebuilds_created" )
127
- require .Equal (t , * test .shouldIncrementPrebuildsCreated , createdCount == iterations , "createdCount: %d" , createdCount )
128
- }
131
+ metricsFamilies , err := registry .Gather ()
132
+ require .NoError (t , err )
129
133
130
- if test .shouldIncrementPrebuildsFailed != nil {
131
- failedCount := promtestutil .CollectAndCount (collector , "coderd_prebuilds_failed" )
132
- require .Equal (t , * test .shouldIncrementPrebuildsFailed , failedCount == iterations , "failedCount: %d" , failedCount )
133
- }
134
+ templates , err := db .GetTemplates (ctx )
135
+ require .NoError (t , err )
136
+ require .Equal (t , numTemplates , len (templates ))
137
+
138
+ for _ , template := range templates {
139
+ templateVersions , err := db .GetTemplateVersionsByTemplateID (ctx , database.GetTemplateVersionsByTemplateIDParams {
140
+ TemplateID : template .ID ,
141
+ })
142
+ require .NoError (t , err )
143
+ require .Equal (t , 1 , len (templateVersions ))
144
+
145
+ presets , err := db .GetPresetsByTemplateVersionID (ctx , templateVersions [0 ].ID )
146
+ require .NoError (t , err )
147
+ require .Equal (t , 1 , len (presets ))
148
+
149
+ for _ , preset := range presets {
150
+ if test .shouldIncrementPrebuildsCreated != nil {
151
+ metric := findMetric (metricsFamilies , "coderd_prebuilds_created" , map [string ]string {
152
+ "template_name" : template .Name ,
153
+ "preset_name" : preset .Name ,
154
+ })
155
+ if * test .shouldIncrementPrebuildsCreated {
156
+ require .NotNil (t , metric )
157
+ require .Equal (t , metric .GetCounter ().GetValue (), 1.0 )
158
+ } else {
159
+ require .Nil (t , metric )
160
+ }
161
+ }
134
162
135
- if test .shouldIncrementPrebuildsAssigned != nil {
136
- assignedCount := promtestutil .CollectAndCount (collector , "coderd_prebuilds_assigned" )
137
- require .Equal (t , * test .shouldIncrementPrebuildsAssigned , assignedCount == iterations , "assignedCount: %d" , assignedCount )
163
+ if test .shouldIncrementPrebuildsFailed != nil {
164
+ metric := findMetric (metricsFamilies , "coderd_prebuilds_failed" , map [string ]string {
165
+ "template_name" : template .Name ,
166
+ "preset_name" : preset .Name ,
167
+ })
168
+ if * test .shouldIncrementPrebuildsFailed {
169
+ require .NotNil (t , metric )
170
+ require .Equal (t , metric .GetCounter ().GetValue (), 1.0 )
171
+ } else {
172
+ require .Nil (t , metric )
173
+ }
174
+ }
175
+
176
+ if test .shouldIncrementPrebuildsAssigned != nil {
177
+ metric := findMetric (metricsFamilies , "coderd_prebuilds_assigned" , map [string ]string {
178
+ "template_name" : template .Name ,
179
+ "preset_name" : preset .Name ,
180
+ })
181
+ if * test .shouldIncrementPrebuildsAssigned {
182
+ require .NotNil (t , metric )
183
+ require .Equal (t , metric .GetCounter ().GetValue (), 1.0 )
184
+ } else {
185
+ require .Nil (t , metric )
186
+ }
187
+ }
188
+ }
138
189
}
139
190
})
140
191
}
@@ -143,3 +194,34 @@ func TestMetricsCollector(t *testing.T) {
143
194
}
144
195
}
145
196
}
197
+
198
+ func findMetric (metricsFamilies []* prometheus_client.MetricFamily , name string , labels map [string ]string ) * prometheus_client.Metric {
199
+ for _ , metricFamily := range metricsFamilies {
200
+ if metricFamily .GetName () == name {
201
+ for _ , metric := range metricFamily .GetMetric () {
202
+ matches := true
203
+ labelPairs := metric .GetLabel ()
204
+
205
+ // Check if all requested labels match
206
+ for wantName , wantValue := range labels {
207
+ found := false
208
+ for _ , label := range labelPairs {
209
+ if label .GetName () == wantName && label .GetValue () == wantValue {
210
+ found = true
211
+ break
212
+ }
213
+ }
214
+ if ! found {
215
+ matches = false
216
+ break
217
+ }
218
+ }
219
+
220
+ if matches {
221
+ return metric
222
+ }
223
+ }
224
+ }
225
+ }
226
+ return nil
227
+ }
0 commit comments