@@ -80,6 +80,7 @@ func TestPGStatDatabaseCollector(t *testing.T) {
8080 16 ,
8181 823 ,
8282 srT )
83+
8384 mock .ExpectQuery (sanitizeQuery (statDatabaseQuery )).WillReturnRows (rows )
8485
8586 ch := make (chan prometheus.Metric )
@@ -218,3 +219,141 @@ func TestPGStatDatabaseCollectorNullValues(t *testing.T) {
218219 t .Errorf ("there were unfulfilled exceptions: %s" , err )
219220 }
220221}
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