@@ -14,6 +14,7 @@ package collector
14
14
15
15
import (
16
16
"context"
17
+ "fmt"
17
18
"testing"
18
19
19
20
"github.com/DATA-DOG/go-sqlmock"
@@ -35,7 +36,7 @@ func TestPGStateStatementsCollector(t *testing.T) {
35
36
columns := []string {"user" , "datname" , "queryid" , "calls_total" , "seconds_total" , "rows_total" , "block_read_seconds_total" , "block_write_seconds_total" }
36
37
rows := sqlmock .NewRows (columns ).
37
38
AddRow ("postgres" , "postgres" , 1500 , 5 , 0.4 , 100 , 0.1 , 0.2 )
38
- mock .ExpectQuery (sanitizeQuery (pgStatStatementsQuery )).WillReturnRows (rows )
39
+ mock .ExpectQuery (sanitizeQuery (fmt . Sprintf ( pgStatStatementsQuery , "" ) )).WillReturnRows (rows )
39
40
40
41
ch := make (chan prometheus.Metric )
41
42
go func () {
@@ -66,6 +67,50 @@ func TestPGStateStatementsCollector(t *testing.T) {
66
67
}
67
68
}
68
69
70
+ func TestPGStateStatementsCollectorWithStatement (t * testing.T ) {
71
+ db , mock , err := sqlmock .New ()
72
+ if err != nil {
73
+ t .Fatalf ("Error opening a stub db connection: %s" , err )
74
+ }
75
+ defer db .Close ()
76
+
77
+ inst := & instance {db : db , version : semver .MustParse ("12.0.0" )}
78
+
79
+ columns := []string {"user" , "datname" , "queryid" , "query" , "calls_total" , "seconds_total" , "rows_total" , "block_read_seconds_total" , "block_write_seconds_total" }
80
+ rows := sqlmock .NewRows (columns ).
81
+ AddRow ("postgres" , "postgres" , 1500 , "select 1 from foo" , 5 , 0.4 , 100 , 0.1 , 0.2 )
82
+ mock .ExpectQuery (sanitizeQuery (fmt .Sprintf (pgStatStatementsQuery , pgStatStatementQuerySelect ))).WillReturnRows (rows )
83
+
84
+ ch := make (chan prometheus.Metric )
85
+ go func () {
86
+ defer close (ch )
87
+ c := PGStatStatementsCollector {includeQueryStatement : true }
88
+
89
+ if err := c .Update (context .Background (), inst , ch ); err != nil {
90
+ t .Errorf ("Error calling PGStatStatementsCollector.Update: %s" , err )
91
+ }
92
+ }()
93
+
94
+ expected := []MetricResult {
95
+ {labels : labelMap {"user" : "postgres" , "datname" : "postgres" , "queryid" : "1500" }, metricType : dto .MetricType_COUNTER , value : 5 },
96
+ {labels : labelMap {"user" : "postgres" , "datname" : "postgres" , "queryid" : "1500" }, metricType : dto .MetricType_COUNTER , value : 0.4 },
97
+ {labels : labelMap {"user" : "postgres" , "datname" : "postgres" , "queryid" : "1500" }, metricType : dto .MetricType_COUNTER , value : 100 },
98
+ {labels : labelMap {"user" : "postgres" , "datname" : "postgres" , "queryid" : "1500" }, metricType : dto .MetricType_COUNTER , value : 0.1 },
99
+ {labels : labelMap {"user" : "postgres" , "datname" : "postgres" , "queryid" : "1500" }, metricType : dto .MetricType_COUNTER , value : 0.2 },
100
+ {labels : labelMap {"queryid" : "1500" , "query" : "select 1 from foo" }, metricType : dto .MetricType_COUNTER , value : 1 },
101
+ }
102
+
103
+ convey .Convey ("Metrics comparison" , t , func () {
104
+ for _ , expect := range expected {
105
+ m := readMetric (<- ch )
106
+ convey .So (expect , convey .ShouldResemble , m )
107
+ }
108
+ })
109
+ if err := mock .ExpectationsWereMet (); err != nil {
110
+ t .Errorf ("there were unfulfilled exceptions: %s" , err )
111
+ }
112
+ }
113
+
69
114
func TestPGStateStatementsCollectorNull (t * testing.T ) {
70
115
db , mock , err := sqlmock .New ()
71
116
if err != nil {
@@ -78,7 +123,7 @@ func TestPGStateStatementsCollectorNull(t *testing.T) {
78
123
columns := []string {"user" , "datname" , "queryid" , "calls_total" , "seconds_total" , "rows_total" , "block_read_seconds_total" , "block_write_seconds_total" }
79
124
rows := sqlmock .NewRows (columns ).
80
125
AddRow (nil , nil , nil , nil , nil , nil , nil , nil )
81
- mock .ExpectQuery (sanitizeQuery (pgStatStatementsNewQuery )).WillReturnRows (rows )
126
+ mock .ExpectQuery (sanitizeQuery (fmt . Sprintf ( pgStatStatementsNewQuery , "" ) )).WillReturnRows (rows )
82
127
83
128
ch := make (chan prometheus.Metric )
84
129
go func () {
@@ -109,6 +154,50 @@ func TestPGStateStatementsCollectorNull(t *testing.T) {
109
154
}
110
155
}
111
156
157
+ func TestPGStateStatementsCollectorNullWithStatement (t * testing.T ) {
158
+ db , mock , err := sqlmock .New ()
159
+ if err != nil {
160
+ t .Fatalf ("Error opening a stub db connection: %s" , err )
161
+ }
162
+ defer db .Close ()
163
+
164
+ inst := & instance {db : db , version : semver .MustParse ("13.3.7" )}
165
+
166
+ columns := []string {"user" , "datname" , "queryid" , "query" , "calls_total" , "seconds_total" , "rows_total" , "block_read_seconds_total" , "block_write_seconds_total" }
167
+ rows := sqlmock .NewRows (columns ).
168
+ AddRow (nil , nil , nil , nil , nil , nil , nil , nil , nil )
169
+ mock .ExpectQuery (sanitizeQuery (fmt .Sprintf (pgStatStatementsNewQuery , pgStatStatementQuerySelect ))).WillReturnRows (rows )
170
+
171
+ ch := make (chan prometheus.Metric )
172
+ go func () {
173
+ defer close (ch )
174
+ c := PGStatStatementsCollector {includeQueryStatement : true }
175
+
176
+ if err := c .Update (context .Background (), inst , ch ); err != nil {
177
+ t .Errorf ("Error calling PGStatStatementsCollector.Update: %s" , err )
178
+ }
179
+ }()
180
+
181
+ expected := []MetricResult {
182
+ {labels : labelMap {"user" : "unknown" , "datname" : "unknown" , "queryid" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
183
+ {labels : labelMap {"user" : "unknown" , "datname" : "unknown" , "queryid" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
184
+ {labels : labelMap {"user" : "unknown" , "datname" : "unknown" , "queryid" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
185
+ {labels : labelMap {"user" : "unknown" , "datname" : "unknown" , "queryid" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
186
+ {labels : labelMap {"user" : "unknown" , "datname" : "unknown" , "queryid" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 0 },
187
+ {labels : labelMap {"queryid" : "unknown" , "query" : "unknown" }, metricType : dto .MetricType_COUNTER , value : 1 },
188
+ }
189
+
190
+ convey .Convey ("Metrics comparison" , t , func () {
191
+ for _ , expect := range expected {
192
+ m := readMetric (<- ch )
193
+ convey .So (expect , convey .ShouldResemble , m )
194
+ }
195
+ })
196
+ if err := mock .ExpectationsWereMet (); err != nil {
197
+ t .Errorf ("there were unfulfilled exceptions: %s" , err )
198
+ }
199
+ }
200
+
112
201
func TestPGStateStatementsCollectorNewPG (t * testing.T ) {
113
202
db , mock , err := sqlmock .New ()
114
203
if err != nil {
@@ -121,7 +210,7 @@ func TestPGStateStatementsCollectorNewPG(t *testing.T) {
121
210
columns := []string {"user" , "datname" , "queryid" , "calls_total" , "seconds_total" , "rows_total" , "block_read_seconds_total" , "block_write_seconds_total" }
122
211
rows := sqlmock .NewRows (columns ).
123
212
AddRow ("postgres" , "postgres" , 1500 , 5 , 0.4 , 100 , 0.1 , 0.2 )
124
- mock .ExpectQuery (sanitizeQuery (pgStatStatementsNewQuery )).WillReturnRows (rows )
213
+ mock .ExpectQuery (sanitizeQuery (fmt . Sprintf ( pgStatStatementsNewQuery , "" ) )).WillReturnRows (rows )
125
214
126
215
ch := make (chan prometheus.Metric )
127
216
go func () {
@@ -151,3 +240,47 @@ func TestPGStateStatementsCollectorNewPG(t *testing.T) {
151
240
t .Errorf ("there were unfulfilled exceptions: %s" , err )
152
241
}
153
242
}
243
+
244
+ func TestPGStateStatementsCollectorNewPGWithStatement (t * testing.T ) {
245
+ db , mock , err := sqlmock .New ()
246
+ if err != nil {
247
+ t .Fatalf ("Error opening a stub db connection: %s" , err )
248
+ }
249
+ defer db .Close ()
250
+
251
+ inst := & instance {db : db , version : semver .MustParse ("13.3.7" )}
252
+
253
+ columns := []string {"user" , "datname" , "queryid" , "query" , "calls_total" , "seconds_total" , "rows_total" , "block_read_seconds_total" , "block_write_seconds_total" }
254
+ rows := sqlmock .NewRows (columns ).
255
+ AddRow ("postgres" , "postgres" , 1500 , "select 1 from foo" , 5 , 0.4 , 100 , 0.1 , 0.2 )
256
+ mock .ExpectQuery (sanitizeQuery (fmt .Sprintf (pgStatStatementsNewQuery , pgStatStatementQuerySelect ))).WillReturnRows (rows )
257
+
258
+ ch := make (chan prometheus.Metric )
259
+ go func () {
260
+ defer close (ch )
261
+ c := PGStatStatementsCollector {includeQueryStatement : true }
262
+
263
+ if err := c .Update (context .Background (), inst , ch ); err != nil {
264
+ t .Errorf ("Error calling PGStatStatementsCollector.Update: %s" , err )
265
+ }
266
+ }()
267
+
268
+ expected := []MetricResult {
269
+ {labels : labelMap {"user" : "postgres" , "datname" : "postgres" , "queryid" : "1500" }, metricType : dto .MetricType_COUNTER , value : 5 },
270
+ {labels : labelMap {"user" : "postgres" , "datname" : "postgres" , "queryid" : "1500" }, metricType : dto .MetricType_COUNTER , value : 0.4 },
271
+ {labels : labelMap {"user" : "postgres" , "datname" : "postgres" , "queryid" : "1500" }, metricType : dto .MetricType_COUNTER , value : 100 },
272
+ {labels : labelMap {"user" : "postgres" , "datname" : "postgres" , "queryid" : "1500" }, metricType : dto .MetricType_COUNTER , value : 0.1 },
273
+ {labels : labelMap {"user" : "postgres" , "datname" : "postgres" , "queryid" : "1500" }, metricType : dto .MetricType_COUNTER , value : 0.2 },
274
+ {labels : labelMap {"queryid" : "1500" , "query" : "select 1 from foo" }, metricType : dto .MetricType_COUNTER , value : 1 },
275
+ }
276
+
277
+ convey .Convey ("Metrics comparison" , t , func () {
278
+ for _ , expect := range expected {
279
+ m := readMetric (<- ch )
280
+ convey .So (expect , convey .ShouldResemble , m )
281
+ }
282
+ })
283
+ if err := mock .ExpectationsWereMet (); err != nil {
284
+ t .Errorf ("there were unfulfilled exceptions: %s" , err )
285
+ }
286
+ }
0 commit comments