pangolin_exporter

Форк
0
/
pg_stat_statements_test.go 
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.
13
package collector
14

15
import (
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"
22
	dto "github.com/prometheus/client_model/go"
23
	"github.com/smartystreets/goconvey/convey"
24
)
25

26
func TestPGStateStatementsCollector(t *testing.T) {
27
	db, mock, err := sqlmock.New()
28
	if err != nil {
29
		t.Fatalf("Error opening a stub db connection: %s", err)
30
	}
31
	defer db.Close()
32

33
	inst := &instance{db: db, version: semver.MustParse("12.0.0")}
34

35
	columns := []string{"user", "datname", "queryid", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
36
	rows := sqlmock.NewRows(columns).
37
		AddRow("postgres", "postgres", 1500, 5, 0.4, 100, 0.1, 0.2)
38
	mock.ExpectQuery(sanitizeQuery(pgStatStatementsQuery)).WillReturnRows(rows)
39

40
	ch := make(chan prometheus.Metric)
41
	go func() {
42
		defer close(ch)
43
		c := PGStatStatementsCollector{}
44

45
		if err := c.Update(context.Background(), inst, ch); err != nil {
46
			t.Errorf("Error calling PGStatStatementsCollector.Update: %s", err)
47
		}
48
	}()
49

50
	expected := []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

58
	convey.Convey("Metrics comparison", t, func() {
59
		for _, expect := range expected {
60
			m := readMetric(<-ch)
61
			convey.So(expect, convey.ShouldResemble, m)
62
		}
63
	})
64
	if err := mock.ExpectationsWereMet(); err != nil {
65
		t.Errorf("there were unfulfilled exceptions: %s", err)
66
	}
67
}
68

69
func TestPGStateStatementsCollectorNull(t *testing.T) {
70
	db, mock, err := sqlmock.New()
71
	if err != nil {
72
		t.Fatalf("Error opening a stub db connection: %s", err)
73
	}
74
	defer db.Close()
75

76
	inst := &instance{db: db, version: semver.MustParse("13.3.7")}
77

78
	columns := []string{"user", "datname", "queryid", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
79
	rows := sqlmock.NewRows(columns).
80
		AddRow(nil, nil, nil, nil, nil, nil, nil, nil)
81
	mock.ExpectQuery(sanitizeQuery(pgStatStatementsNewQuery)).WillReturnRows(rows)
82

83
	ch := make(chan prometheus.Metric)
84
	go func() {
85
		defer close(ch)
86
		c := PGStatStatementsCollector{}
87

88
		if err := c.Update(context.Background(), inst, ch); err != nil {
89
			t.Errorf("Error calling PGStatStatementsCollector.Update: %s", err)
90
		}
91
	}()
92

93
	expected := []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

101
	convey.Convey("Metrics comparison", t, func() {
102
		for _, expect := range expected {
103
			m := readMetric(<-ch)
104
			convey.So(expect, convey.ShouldResemble, m)
105
		}
106
	})
107
	if err := mock.ExpectationsWereMet(); err != nil {
108
		t.Errorf("there were unfulfilled exceptions: %s", err)
109
	}
110
}
111

112
func TestPGStateStatementsCollectorNewPG(t *testing.T) {
113
	db, mock, err := sqlmock.New()
114
	if err != nil {
115
		t.Fatalf("Error opening a stub db connection: %s", err)
116
	}
117
	defer db.Close()
118

119
	inst := &instance{db: db, version: semver.MustParse("13.3.7")}
120

121
	columns := []string{"user", "datname", "queryid", "calls_total", "seconds_total", "rows_total", "block_read_seconds_total", "block_write_seconds_total"}
122
	rows := sqlmock.NewRows(columns).
123
		AddRow("postgres", "postgres", 1500, 5, 0.4, 100, 0.1, 0.2)
124
	mock.ExpectQuery(sanitizeQuery(pgStatStatementsNewQuery)).WillReturnRows(rows)
125

126
	ch := make(chan prometheus.Metric)
127
	go func() {
128
		defer close(ch)
129
		c := PGStatStatementsCollector{}
130

131
		if err := c.Update(context.Background(), inst, ch); err != nil {
132
			t.Errorf("Error calling PGStatStatementsCollector.Update: %s", err)
133
		}
134
	}()
135

136
	expected := []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

144
	convey.Convey("Metrics comparison", t, func() {
145
		for _, expect := range expected {
146
			m := readMetric(<-ch)
147
			convey.So(expect, convey.ShouldResemble, m)
148
		}
149
	})
150
	if err := mock.ExpectationsWereMet(); err != nil {
151
		t.Errorf("there were unfulfilled exceptions: %s", err)
152
	}
153
}
154

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.