pangolin_exporter
151 строка · 4.9 Кб
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"time"
19
20"github.com/DATA-DOG/go-sqlmock"
21"github.com/prometheus/client_golang/prometheus"
22dto "github.com/prometheus/client_model/go"
23"github.com/smartystreets/goconvey/convey"
24)
25
26func TestPGStatBGWriterCollector(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}
34
35columns := []string{
36"checkpoints_timed",
37"checkpoints_req",
38"checkpoint_write_time",
39"checkpoint_sync_time",
40"buffers_checkpoint",
41"buffers_clean",
42"maxwritten_clean",
43"buffers_backend",
44"buffers_backend_fsync",
45"buffers_alloc",
46"stats_reset"}
47
48srT, err := time.Parse("2006-01-02 15:04:05.00000-07", "2023-05-25 17:10:42.81132-07")
49if err != nil {
50t.Fatalf("Error parsing time: %s", err)
51}
52
53rows := sqlmock.NewRows(columns).
54AddRow(354, 4945, 289097744, 1242257, int64(3275602074), 89320867, 450139, 2034563757, 0, int64(2725688749), srT)
55mock.ExpectQuery(sanitizeQuery(statBGWriterQuery)).WillReturnRows(rows)
56
57ch := make(chan prometheus.Metric)
58go func() {
59defer close(ch)
60c := PGStatBGWriterCollector{}
61
62if err := c.Update(context.Background(), inst, ch); err != nil {
63t.Errorf("Error calling PGStatBGWriterCollector.Update: %s", err)
64}
65}()
66
67expected := []MetricResult{
68{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 354},
69{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 4945},
70{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 289097744},
71{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 1242257},
72{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 3275602074},
73{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 89320867},
74{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 450139},
75{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 2034563757},
76{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
77{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 2725688749},
78{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 1685059842},
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 TestPGStatBGWriterCollectorNullValues(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"checkpoints_timed",
103"checkpoints_req",
104"checkpoint_write_time",
105"checkpoint_sync_time",
106"buffers_checkpoint",
107"buffers_clean",
108"maxwritten_clean",
109"buffers_backend",
110"buffers_backend_fsync",
111"buffers_alloc",
112"stats_reset"}
113
114rows := sqlmock.NewRows(columns).
115AddRow(nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil)
116mock.ExpectQuery(sanitizeQuery(statBGWriterQuery)).WillReturnRows(rows)
117
118ch := make(chan prometheus.Metric)
119go func() {
120defer close(ch)
121c := PGStatBGWriterCollector{}
122
123if err := c.Update(context.Background(), inst, ch); err != nil {
124t.Errorf("Error calling PGStatBGWriterCollector.Update: %s", err)
125}
126}()
127
128expected := []MetricResult{
129{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
130{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
131{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
132{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
133{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
134{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
135{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
136{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
137{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
138{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
139{labels: labelMap{}, metricType: dto.MetricType_COUNTER, value: 0},
140}
141
142convey.Convey("Metrics comparison", t, func() {
143for _, expect := range expected {
144m := readMetric(<-ch)
145convey.So(expect, convey.ShouldResemble, m)
146}
147})
148if err := mock.ExpectationsWereMet(); err != nil {
149t.Errorf("there were unfulfilled exceptions: %s", err)
150}
151}
152