Skip to content

Commit 7b587d0

Browse files
authored
PMM-12848 Refactoring currentop_collector. (#886)
* PMM-12848 Refactoring currentop_collector. * PMM-12848 fix linter. * PMM-12848 fix linter. * PMM-12848 fix linter.
1 parent 6d70eba commit 7b587d0

File tree

2 files changed

+22
-22
lines changed

2 files changed

+22
-22
lines changed

exporter/currentop_collector.go

+10-12
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ func (d *currentopCollector) collect(ch chan<- prometheus.Metric) {
6666
client := d.base.client
6767
slowtime, err := time.ParseDuration(d.currentopslowtime)
6868
if err != nil {
69+
logger.Errorf("Failed to parse slowtime: %s", err)
6970
ch <- prometheus.NewInvalidMetric(prometheus.NewInvalidDesc(err), err)
7071
return
7172
}
@@ -89,6 +90,7 @@ func (d *currentopCollector) collect(ch chan<- prometheus.Metric) {
8990

9091
var r primitive.M
9192
if err := res.Decode(&r); err != nil {
93+
logger.Errorf("Failed to decode currentOp response: %s", err)
9294
ch <- prometheus.NewInvalidMetric(prometheus.NewInvalidDesc(err), err)
9395
return
9496
}
@@ -99,10 +101,16 @@ func (d *currentopCollector) collect(ch chan<- prometheus.Metric) {
99101
inprog, ok := r["inprog"].(primitive.A)
100102

101103
if !ok {
104+
logger.Errorf("Invalid type primitive.A assertion for 'inprog': %T", r["inprog"])
102105
ch <- prometheus.NewInvalidMetric(prometheus.NewInvalidDesc(ErrInvalidOrMissingInprogEntry),
103106
ErrInvalidOrMissingInprogEntry)
104107
}
105108

109+
labels := d.topologyInfo.baseLabels()
110+
ln := []string{"opid", "op", "desc", "database", "collection", "ns"}
111+
const name = "mongodb_currentop_query_uptime"
112+
pd := prometheus.NewDesc(name, " mongodb_currentop_query_uptime currentop_query", ln, labels)
113+
106114
for _, bsonMap := range inprog {
107115

108116
bsonMapElement, ok := bsonMap.(primitive.M)
@@ -137,18 +145,8 @@ func (d *currentopCollector) collect(ch chan<- prometheus.Metric) {
137145
continue
138146
}
139147

140-
labels := d.topologyInfo.baseLabels()
141-
labels["opid"] = strconv.Itoa(int(opid))
142-
labels["op"] = op
143-
labels["desc"] = desc
144-
labels["database"] = db
145-
labels["collection"] = collection
146-
labels["ns"] = namespace
147-
148-
m := primitive.M{"uptime": microsecs_running}
148+
lv := []string{strconv.Itoa(int(opid)), op, desc, db, collection, namespace}
149149

150-
for _, metric := range makeMetrics("currentop_query", m, labels, d.compatibleMode) {
151-
ch <- metric
152-
}
150+
ch <- prometheus.MustNewConstMetric(pd, prometheus.GaugeValue, float64(microsecs_running), lv...)
153151
}
154152
}

exporter/currentop_collector_test.go

+12-10
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ package exporter
1717

1818
import (
1919
"context"
20-
"fmt"
2120
"sync"
2221
"testing"
2322
"time"
@@ -31,32 +30,31 @@ import (
3130
)
3231

3332
func TestCurrentopCollector(t *testing.T) {
34-
// It seems like this test needs the queries to continue running so that current oplog is not empty.
35-
// TODO: figure out how to restore this test.
36-
t.Skip()
37-
38-
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
33+
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
3934
defer cancel()
4035

4136
var wg sync.WaitGroup
4237

4338
client := tu.DefaultTestClient(ctx, t)
4439

4540
database := client.Database("testdb")
46-
database.Drop(ctx)
41+
_ = database.Drop(ctx)
4742

4843
defer func() {
4944
err := database.Drop(ctx)
5045
assert.NoError(t, err)
5146
}()
47+
ch := make(chan struct{})
5248
wg.Add(1)
5349
go func() {
5450
defer wg.Done()
55-
for i := 0; i < 300; i++ {
56-
coll := fmt.Sprintf("testcol_%02d", i)
57-
_, err := database.Collection(coll).InsertOne(ctx, bson.M{"f1": 1, "f2": "2"})
51+
coll := "testcol_01"
52+
for j := 0; j < 100; j++ { //nolint:intrange // false positive
53+
_, err := database.Collection(coll).InsertOne(ctx, bson.M{"f1": j, "f2": "2"})
5854
assert.NoError(t, err)
5955
}
56+
ch <- struct{}{}
57+
_, _ = database.Collection(coll).Find(ctx, bson.M{"$where": "function() {return sleep(100)}"})
6058
}()
6159

6260
ti := labelsGetterMock{}
@@ -76,6 +74,10 @@ func TestCurrentopCollector(t *testing.T) {
7674
"mongodb_currentop_query_uptime",
7775
}
7876

77+
<-ch
78+
79+
time.Sleep(1 * time.Second)
80+
7981
count := testutil.CollectAndCount(c, filter...)
8082
assert.True(t, count > 0)
8183
wg.Wait()

0 commit comments

Comments
 (0)