pangolin_exporter
157 строк · 5.3 Кб
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/prometheus/client_golang/prometheus"
21dto "github.com/prometheus/client_model/go"
22"github.com/smartystreets/goconvey/convey"
23)
24
25func TestPGStatIOUserTablesCollector(t *testing.T) {
26db, mock, err := sqlmock.New()
27if err != nil {
28t.Fatalf("Error opening a stub db connection: %s", err)
29}
30defer db.Close()
31
32inst := &instance{db: db}
33
34columns := []string{
35"datname",
36"schemaname",
37"relname",
38"heap_blks_read",
39"heap_blks_hit",
40"idx_blks_read",
41"idx_blks_hit",
42"toast_blks_read",
43"toast_blks_hit",
44"tidx_blks_read",
45"tidx_blks_hit",
46}
47rows := sqlmock.NewRows(columns).
48AddRow("postgres",
49"public",
50"a_table",
511,
522,
533,
544,
555,
566,
577,
588)
59mock.ExpectQuery(sanitizeQuery(statioUserTablesQuery)).WillReturnRows(rows)
60ch := make(chan prometheus.Metric)
61go func() {
62defer close(ch)
63c := PGStatIOUserTablesCollector{}
64
65if err := c.Update(context.Background(), inst, ch); err != nil {
66t.Errorf("Error calling PGStatIOUserTablesCollector.Update: %s", err)
67}
68}()
69
70expected := []MetricResult{
71{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_COUNTER, value: 1},
72{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_COUNTER, value: 2},
73{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_COUNTER, value: 3},
74{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_COUNTER, value: 4},
75{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_COUNTER, value: 5},
76{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_COUNTER, value: 6},
77{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_COUNTER, value: 7},
78{labels: labelMap{"datname": "postgres", "schemaname": "public", "relname": "a_table"}, metricType: dto.MetricType_COUNTER, value: 8},
79}
80
81convey.Convey("Metrics comparison", t, func() {
82for _, expect := range expected {
83m := readMetric(<-ch)
84convey.So(expect, convey.ShouldResemble, m)
85}
86})
87if err := mock.ExpectationsWereMet(); err != nil {
88t.Errorf("there were unfulfilled exceptions: %s", err)
89}
90}
91
92func TestPGStatIOUserTablesCollectorNullValues(t *testing.T) {
93db, mock, err := sqlmock.New()
94if err != nil {
95t.Fatalf("Error opening a stub db connection: %s", err)
96}
97defer db.Close()
98
99inst := &instance{db: db}
100
101columns := []string{
102"datname",
103"schemaname",
104"relname",
105"heap_blks_read",
106"heap_blks_hit",
107"idx_blks_read",
108"idx_blks_hit",
109"toast_blks_read",
110"toast_blks_hit",
111"tidx_blks_read",
112"tidx_blks_hit",
113}
114rows := sqlmock.NewRows(columns).
115AddRow(nil,
116nil,
117nil,
118nil,
119nil,
120nil,
121nil,
122nil,
123nil,
124nil,
125nil)
126mock.ExpectQuery(sanitizeQuery(statioUserTablesQuery)).WillReturnRows(rows)
127ch := make(chan prometheus.Metric)
128go func() {
129defer close(ch)
130c := PGStatIOUserTablesCollector{}
131
132if err := c.Update(context.Background(), inst, ch); err != nil {
133t.Errorf("Error calling PGStatIOUserTablesCollector.Update: %s", err)
134}
135}()
136
137expected := []MetricResult{
138{labels: labelMap{"datname": "unknown", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
139{labels: labelMap{"datname": "unknown", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
140{labels: labelMap{"datname": "unknown", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
141{labels: labelMap{"datname": "unknown", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
142{labels: labelMap{"datname": "unknown", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
143{labels: labelMap{"datname": "unknown", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
144{labels: labelMap{"datname": "unknown", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
145{labels: labelMap{"datname": "unknown", "schemaname": "unknown", "relname": "unknown"}, metricType: dto.MetricType_COUNTER, value: 0},
146}
147
148convey.Convey("Metrics comparison", t, func() {
149for _, expect := range expected {
150m := readMetric(<-ch)
151convey.So(expect, convey.ShouldResemble, m)
152}
153})
154if err := mock.ExpectationsWereMet(); err != nil {
155t.Errorf("there were unfulfilled exceptions: %s", err)
156}
157}
158