pangolin_exporter
153 строки · 6.1 Кб
1// Copyright 2023 The Prometheus Authors
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6// http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13package collector
14
15import (
16"context"
17"testing"
18
19"github.com/DATA-DOG/go-sqlmock"
20"github.com/blang/semver/v4"
21"github.com/prometheus/client_golang/prometheus"
22dto "github.com/prometheus/client_model/go"
23"github.com/smartystreets/goconvey/convey"
24)
25
26func TestPGStateStatementsCollector(t *testing.T) {
27db, mock, err := sqlmock.New()
28if err != nil {
29t.Fatalf("Error opening a stub db connection: %s", err)
30}
31defer db.Close()
32
33inst := &instance{db: db, version: semver.MustParse("12.0.0")}
34
35columns := []string{"user", "datname", "queryid", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
36rows := sqlmock.NewRows(columns).
37AddRow("postgres", "postgres", 1500, 5, 0.4, 100, 0.1, 0.2)
38mock.ExpectQuery(sanitizeQuery(pgStatStatementsQuery)).WillReturnRows(rows)
39
40ch := make(chan prometheus.Metric)
41go func() {
42defer close(ch)
43c := PGStatStatementsCollector{}
44
45if err := c.Update(context.Background(), inst, ch); err != nil {
46t.Errorf("Error calling PGStatStatementsCollector.Update: %s", err)
47}
48}()
49
50expected := []MetricResult{
51{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
52{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
53{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
54{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
55{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
56}
57
58convey.Convey("Metrics comparison", t, func() {
59for _, expect := range expected {
60m := readMetric(<-ch)
61convey.So(expect, convey.ShouldResemble, m)
62}
63})
64if err := mock.ExpectationsWereMet(); err != nil {
65t.Errorf("there were unfulfilled exceptions: %s", err)
66}
67}
68
69func TestPGStateStatementsCollectorNull(t *testing.T) {
70db, mock, err := sqlmock.New()
71if err != nil {
72t.Fatalf("Error opening a stub db connection: %s", err)
73}
74defer db.Close()
75
76inst := &instance{db: db, version: semver.MustParse("13.3.7")}
77
78columns := []string{"user", "datname", "queryid", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
79rows := sqlmock.NewRows(columns).
80AddRow(nil, nil, nil, nil, nil, nil, nil, nil)
81mock.ExpectQuery(sanitizeQuery(pgStatStatementsNewQuery)).WillReturnRows(rows)
82
83ch := make(chan prometheus.Metric)
84go func() {
85defer close(ch)
86c := PGStatStatementsCollector{}
87
88if err := c.Update(context.Background(), inst, ch); err != nil {
89t.Errorf("Error calling PGStatStatementsCollector.Update: %s", err)
90}
91}()
92
93expected := []MetricResult{
94{labels: labelMap{"user": "unknown", "datname": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
95{labels: labelMap{"user": "unknown", "datname": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
96{labels: labelMap{"user": "unknown", "datname": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
97{labels: labelMap{"user": "unknown", "datname": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
98{labels: labelMap{"user": "unknown", "datname": "unknown", "queryid": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
99}
100
101convey.Convey("Metrics comparison", t, func() {
102for _, expect := range expected {
103m := readMetric(<-ch)
104convey.So(expect, convey.ShouldResemble, m)
105}
106})
107if err := mock.ExpectationsWereMet(); err != nil {
108t.Errorf("there were unfulfilled exceptions: %s", err)
109}
110}
111
112func TestPGStateStatementsCollectorNewPG(t *testing.T) {
113db, mock, err := sqlmock.New()
114if err != nil {
115t.Fatalf("Error opening a stub db connection: %s", err)
116}
117defer db.Close()
118
119inst := &instance{db: db, version: semver.MustParse("13.3.7")}
120
121columns := []string{"user", "datname", "queryid", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
122rows := sqlmock.NewRows(columns).
123AddRow("postgres", "postgres", 1500, 5, 0.4, 100, 0.1, 0.2)
124mock.ExpectQuery(sanitizeQuery(pgStatStatementsNewQuery)).WillReturnRows(rows)
125
126ch := make(chan prometheus.Metric)
127go func() {
128defer close(ch)
129c := PGStatStatementsCollector{}
130
131if err := c.Update(context.Background(), inst, ch); err != nil {
132t.Errorf("Error calling PGStatStatementsCollector.Update: %s", err)
133}
134}()
135
136expected := []MetricResult{
137{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 5},
138{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.4},
139{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 100},
140{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.1},
141{labels: labelMap{"user": "postgres", "datname": "postgres", "queryid": "1500"}, metricType: dto.MetricType_COUNTER, value: 0.2},
142}
143
144convey.Convey("Metrics comparison", t, func() {
145for _, expect := range expected {
146m := readMetric(<-ch)
147convey.So(expect, convey.ShouldResemble, m)
148}
149})
150if err := mock.ExpectationsWereMet(); err != nil {
151t.Errorf("there were unfulfilled exceptions: %s", err)
152}
153}
154