@@ -80,6 +80,7 @@ func TestPGStatDatabaseCollector(t *testing.T) {
80
80
16 ,
81
81
823 ,
82
82
srT )
83
+
83
84
mock .ExpectQuery (sanitizeQuery (statDatabaseQuery )).WillReturnRows (rows )
84
85
85
86
ch := make (chan prometheus.Metric )
@@ -218,3 +219,141 @@ func TestPGStatDatabaseCollectorNullValues(t *testing.T) {
218
219
t .Errorf ("there were unfulfilled exceptions: %s" , err )
219
220
}
220
221
}
222
+ func TestPGStatDatabaseCollectorRowLeakTest (t * testing.T ) {
223
+ db , mock , err := sqlmock .New ()
224
+ if err != nil {
225
+ t .Fatalf ("Error opening a stub db connection: %s" , err )
226
+ }
227
+ defer db .Close ()
228
+
229
+ inst := & instance {db : db }
230
+
231
+ columns := []string {
232
+ "datid" ,
233
+ "datname" ,
234
+ "numbackends" ,
235
+ "xact_commit" ,
236
+ "xact_rollback" ,
237
+ "blks_read" ,
238
+ "blks_hit" ,
239
+ "tup_returned" ,
240
+ "tup_fetched" ,
241
+ "tup_inserted" ,
242
+ "tup_updated" ,
243
+ "tup_deleted" ,
244
+ "conflicts" ,
245
+ "temp_files" ,
246
+ "temp_bytes" ,
247
+ "deadlocks" ,
248
+ "blk_read_time" ,
249
+ "blk_write_time" ,
250
+ "stats_reset" ,
251
+ }
252
+
253
+ srT , err := time .Parse ("2006-01-02 15:04:05.00000-07" , "2023-05-25 17:10:42.81132-07" )
254
+ if err != nil {
255
+ t .Fatalf ("Error parsing time: %s" , err )
256
+ }
257
+
258
+ rows := sqlmock .NewRows (columns ).
259
+ AddRow (
260
+ "pid" ,
261
+ "postgres" ,
262
+ 354 ,
263
+ 4945 ,
264
+ 289097744 ,
265
+ 1242257 ,
266
+ 3275602074 ,
267
+ 89320867 ,
268
+ 450139 ,
269
+ 2034563757 ,
270
+ 0 ,
271
+ 2725688749 ,
272
+ 23 ,
273
+ 52 ,
274
+ 74 ,
275
+ 925 ,
276
+ 16 ,
277
+ 823 ,
278
+ srT ).
279
+ AddRow (
280
+ nil ,
281
+ nil ,
282
+ nil ,
283
+ nil ,
284
+ nil ,
285
+ nil ,
286
+ nil ,
287
+ nil ,
288
+ nil ,
289
+ nil ,
290
+ nil ,
291
+ nil ,
292
+ nil ,
293
+ nil ,
294
+ nil ,
295
+ nil ,
296
+ nil ,
297
+ nil ,
298
+ nil ,
299
+ )
300
+
301
+ mock .ExpectQuery (sanitizeQuery (statDatabaseQuery )).WillReturnRows (rows )
302
+
303
+ ch := make (chan prometheus.Metric )
304
+ go func () {
305
+ defer close (ch )
306
+ c := PGStatDatabaseCollector {}
307
+
308
+ if err := c .Update (context .Background (), inst , ch ); err != nil {
309
+ t .Errorf ("Error calling PGStatDatabaseCollector.Update: %s" , err )
310
+ }
311
+ }()
312
+
313
+ expected := []MetricResult {
314
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_GAUGE , value : 354 },
315
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 4945 },
316
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 289097744 },
317
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 1242257 },
318
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 3275602074 },
319
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 89320867 },
320
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 450139 },
321
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 2034563757 },
322
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 0 },
323
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 2725688749 },
324
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 23 },
325
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 52 },
326
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 74 },
327
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 925 },
328
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 16 },
329
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 823 },
330
+ {labels : labelMap {"datid" : "pid" , "datname" : "postgres" }, metricType : dto .MetricType_COUNTER , value : 1685059842 },
331
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_GAUGE , value : 0 },
332
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
333
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
334
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
335
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
336
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
337
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
338
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
339
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
340
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
341
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
342
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
343
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
344
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
345
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
346
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
347
+ {labels : labelMap {"datid" : "unknown" , "datname" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
348
+ }
349
+
350
+ convey .Convey ("Metrics comparison" , t , func () {
351
+ for _ , expect := range expected {
352
+ m := readMetric (<- ch )
353
+ convey .So (expect , convey .ShouldResemble , m )
354
+ }
355
+ })
356
+ if err := mock .ExpectationsWereMet (); err != nil {
357
+ t .Errorf ("there were unfulfilled exceptions: %s" , err )
358
+ }
359
+ }
0 commit comments