Skip to content

Commit 7214c45

Browse files
Merge branch 'PMM-8849_panic_on_timeout' into release-0.20.8
2 parents 6558bd9 + 4060101 commit 7214c45

File tree

4 files changed

+86
-36
lines changed

4 files changed

+86
-36
lines changed

.github/workflows/go.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ jobs:
2020
fail-fast: false
2121
matrix:
2222
go-version:
23+
- 1.17.x
2324
- 1.16.x
2425
image:
2526
- mongo:3.6

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ help: ## Display this help message.
101101
awk -F ':.*?## ' 'NF==2 {printf " %-26s%s\n", $$1, $$2}'
102102

103103
test: env ## Run all tests.
104-
go test -v -timeout 30s ./...
104+
go test -v -count 1 -timeout 30s ./...
105105

106106
test-race: env ## Run all tests with race flag.
107107
go test -race -v -timeout 30s ./...

exporter/diagnostic_data_collector_test.go

Lines changed: 81 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,20 @@ package exporter
1919
import (
2020
"context"
2121
"fmt"
22-
"io/ioutil"
2322
"sort"
2423
"strings"
2524
"testing"
2625
"time"
2726

2827
"github.com/percona/exporter_shared/helpers"
28+
"github.com/pkg/errors"
2929
"github.com/prometheus/client_golang/prometheus"
3030
"github.com/prometheus/client_golang/prometheus/testutil"
3131
"github.com/sirupsen/logrus"
3232
"github.com/stretchr/testify/assert"
3333
"github.com/stretchr/testify/require"
34+
"go.mongodb.org/mongo-driver/bson"
35+
"go.mongodb.org/mongo-driver/mongo"
3436

3537
"github.com/percona/mongodb_exporter/internal/tu"
3638
)
@@ -121,51 +123,95 @@ func TestAllDiagnosticDataCollectorMetrics(t *testing.T) {
121123
}
122124
}
123125

124-
func TestDisconnectedDiagnosticDataCollector(t *testing.T) {
125-
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
126-
defer cancel()
126+
func TestContextTimeout(t *testing.T) {
127+
ctx := context.Background()
127128

128129
client := tu.DefaultTestClient(ctx, t)
129-
err := client.Disconnect(ctx)
130+
131+
ti, err := newTopologyInfo(ctx, client)
132+
require.NoError(t, err)
133+
134+
dbCount := 100
135+
136+
err = addTestData(ctx, client, dbCount)
130137
assert.NoError(t, err)
131138

132-
logger := logrus.New()
133-
logger.Out = ioutil.Discard // diable logs in tests
139+
defer cleanTestData(ctx, client, dbCount) //nolint:errcheck
134140

135-
ti := labelsGetterMock{}
141+
cctx, ccancel := context.WithCancel(context.Background())
142+
ccancel()
136143

137144
c := &diagnosticDataCollector{
138145
client: client,
139-
logger: logger,
140-
topologyInfo: ti,
146+
logger: logrus.New(),
141147
compatibleMode: true,
148+
topologyInfo: ti,
149+
ctx: cctx,
142150
}
151+
// it should not panic
152+
helpers.CollectMetrics(c)
153+
}
143154

144-
// The last \n at the end of this string is important
145-
expected := strings.NewReader(`
146-
# HELP mongodb_mongod_replset_my_state An integer between 0 and 10 that represents the replica state of the current member
147-
# TYPE mongodb_mongod_replset_my_state gauge
148-
mongodb_mongod_replset_my_state{set=""} 6
149-
# HELP mongodb_mongod_storage_engine The storage engine used by the MongoDB instance
150-
# TYPE mongodb_mongod_storage_engine gauge
151-
mongodb_mongod_storage_engine{engine="Engine is unavailable"} 1
152-
# HELP mongodb_version_info The server version
153-
# TYPE mongodb_version_info gauge
154-
mongodb_version_info{mongodb="server version is unavailable"} 1
155-
` + "\n")
156-
// Filter metrics for 2 reasons:
157-
// 1. The result is huge
158-
// 2. We need to check against know values. Don't use metrics that return counters like uptime
159-
// or counters like the number of transactions because they won't return a known value to compare
160-
filter := []string{
161-
"mongodb_mongod_replset_my_state",
162-
"mongodb_mongod_storage_engine",
163-
"mongodb_version_info",
155+
func addTestData(ctx context.Context, client *mongo.Client, count int) error {
156+
session, err := client.StartSession()
157+
if err != nil {
158+
return errors.Wrap(err, "cannot create session to add test data")
164159
}
165160

166-
reg := prometheus.NewRegistry()
167-
err = reg.Register(c)
168-
require.NoError(t, err)
169-
err = testutil.GatherAndCompare(reg, expected, filter...)
170-
assert.NoError(t, err)
161+
if err := session.StartTransaction(); err != nil {
162+
return errors.Wrap(err, "cannot start session to add test data")
163+
}
164+
165+
if err = mongo.WithSession(ctx, session, func(sc mongo.SessionContext) error {
166+
for i := 0; i < count; i++ {
167+
dbName := fmt.Sprintf("testdb_%06d", i)
168+
doc := bson.D{{Key: "field1", Value: "value 1"}}
169+
_, err := client.Database(dbName).Collection("test_col").InsertOne(ctx, doc)
170+
if err != nil {
171+
return errors.Wrap(err, "cannot add test data")
172+
}
173+
}
174+
175+
if err = session.CommitTransaction(sc); err != nil {
176+
return errors.Wrap(err, "cannot commit add test data transaction")
177+
}
178+
179+
return nil
180+
}); err != nil {
181+
return errors.Wrap(err, "cannot add data inside a session")
182+
}
183+
184+
session.EndSession(ctx)
185+
186+
return nil
187+
}
188+
189+
func cleanTestData(ctx context.Context, client *mongo.Client, count int) error {
190+
session, err := client.StartSession()
191+
if err != nil {
192+
return errors.Wrap(err, "cannot create session to add test data")
193+
}
194+
195+
if err := session.StartTransaction(); err != nil {
196+
return errors.Wrap(err, "cannot start session to add test data")
197+
}
198+
199+
if err = mongo.WithSession(ctx, session, func(sc mongo.SessionContext) error {
200+
for i := 0; i < count; i++ {
201+
dbName := fmt.Sprintf("testdb_%06d", i)
202+
client.Database(dbName).Drop(ctx) //nolint:errcheck
203+
}
204+
205+
if err = session.CommitTransaction(sc); err != nil {
206+
return errors.Wrap(err, "cannot commit add test data transaction")
207+
}
208+
209+
return nil
210+
}); err != nil {
211+
return errors.Wrap(err, "cannot add data inside a session")
212+
}
213+
214+
session.EndSession(ctx)
215+
216+
return nil
171217
}

exporter/v1_compatibility.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,9 @@ func dbstatsMetrics(ctx context.Context, client *mongo.Client, l *logrus.Logger)
13081308
var metrics []prometheus.Metric
13091309

13101310
dbStatList := getDatabaseStatList(ctx, client, l)
1311+
if dbStatList == nil {
1312+
return metrics
1313+
}
13111314

13121315
for _, member := range dbStatList.Members {
13131316
if len(member.Shards) > 0 {

0 commit comments

Comments
 (0)