Skip to content

Commit 497ac65

Browse files
PMM-7 logrus to slog (#1062)
* Bump github.com/prometheus/common from 0.62.0 to 0.63.0 Bumps [github.com/prometheus/common](https://github.com/prometheus/common) from 0.62.0 to 0.63.0. - [Release notes](https://github.com/prometheus/common/releases) - [Changelog](https://github.com/prometheus/common/blob/main/RELEASE.md) - [Commits](prometheus/common@v0.62.0...v0.63.0) --- updated-dependencies: - dependency-name: github.com/prometheus/common dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> * update promslog levels * baseline for logrus -> slog migration * enable diagnostic data tests * use custom logger for promhttp * satisfy linter * tidy go.mod * surpress linters * fix formatting * satisfy linter * add license headers * drop format string * fix formatting --------- Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
1 parent 30c130f commit 497ac65

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+401
-323
lines changed

exporter/base_collector.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,23 @@ package exporter
1717

1818
import (
1919
"context"
20+
"log/slog"
2021
"sync"
2122

2223
"github.com/prometheus/client_golang/prometheus"
23-
"github.com/sirupsen/logrus"
2424
"go.mongodb.org/mongo-driver/mongo"
2525
)
2626

2727
type baseCollector struct {
2828
client *mongo.Client
29-
logger *logrus.Entry
29+
logger *slog.Logger
3030

3131
lock sync.Mutex
3232
metricsCache []prometheus.Metric
3333
}
3434

3535
// newBaseCollector creates a skeletal collector, which is used to create other collectors.
36-
func newBaseCollector(client *mongo.Client, logger *logrus.Entry) *baseCollector {
36+
func newBaseCollector(client *mongo.Client, logger *slog.Logger) *baseCollector {
3737
return &baseCollector{
3838
client: client,
3939
logger: logger,

exporter/collstats_collector.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ package exporter
1717

1818
import (
1919
"context"
20+
"log/slog"
2021
"strings"
2122

2223
"github.com/prometheus/client_golang/prometheus"
23-
"github.com/sirupsen/logrus"
2424
"go.mongodb.org/mongo-driver/bson"
2525
"go.mongodb.org/mongo-driver/mongo"
2626
)
@@ -38,10 +38,10 @@ type collstatsCollector struct {
3838
}
3939

4040
// newCollectionStatsCollector creates a collector for statistics about collections.
41-
func newCollectionStatsCollector(ctx context.Context, client *mongo.Client, logger *logrus.Logger, discovery bool, topology labelsGetter, collections []string, enableDetails bool) *collstatsCollector {
41+
func newCollectionStatsCollector(ctx context.Context, client *mongo.Client, logger *slog.Logger, discovery bool, topology labelsGetter, collections []string, enableDetails bool) *collstatsCollector {
4242
return &collstatsCollector{
4343
ctx: ctx,
44-
base: newBaseCollector(client, logger.WithFields(logrus.Fields{"collector": "collstats"})),
44+
base: newBaseCollector(client, logger.With("collector", "collstats")),
4545

4646
compatibleMode: false, // there are no compatible metrics for this collector.
4747
discoveringMode: discovery,
@@ -70,7 +70,7 @@ func (d *collstatsCollector) collect(ch chan<- prometheus.Metric) {
7070
if d.discoveringMode {
7171
onlyCollectionsNamespaces, err := listAllCollections(d.ctx, client, d.collections, systemDBs, true)
7272
if err != nil {
73-
logger.Errorf("cannot auto discover databases and collections: %s", err.Error())
73+
logger.Error("cannot auto discover databases and collections", "error", err.Error())
7474

7575
return
7676
}
@@ -80,7 +80,7 @@ func (d *collstatsCollector) collect(ch chan<- prometheus.Metric) {
8080
var err error
8181
collections, err = checkNamespacesForViews(d.ctx, client, d.collections)
8282
if err != nil {
83-
logger.Errorf("cannot list collections: %s", err.Error())
83+
logger.Error("cannot list collections", "error", err.Error())
8484
return
8585
}
8686
}
@@ -126,19 +126,19 @@ func (d *collstatsCollector) collect(ch chan<- prometheus.Metric) {
126126

127127
cursor, err := client.Database(database).Collection(collection).Aggregate(d.ctx, pipeline)
128128
if err != nil {
129-
logger.Errorf("cannot get $collstats cursor for collection %s.%s: %s", database, collection, err)
129+
logger.Error("cannot get $collstats cursor for collection", "database", database, "collection", collection, "error", err)
130130

131131
continue
132132
}
133133

134134
var stats []bson.M
135135
if err = cursor.All(d.ctx, &stats); err != nil {
136-
logger.Errorf("cannot get $collstats for collection %s.%s: %s", database, collection, err)
136+
logger.Error("cannot get $collstats for collection", "database", database, "collection", collection, "error", err)
137137

138138
continue
139139
}
140140

141-
logger.Debugf("$collStats metrics for %s.%s", database, collection)
141+
logger.Debug("$collStats metrics", "database", database, "collection", collection)
142142
debugResult(logger, stats)
143143

144144
prefix := "collstats"

exporter/collstats_collector_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
"time"
2424

2525
"github.com/prometheus/client_golang/prometheus/testutil"
26-
"github.com/sirupsen/logrus"
26+
"github.com/prometheus/common/promslog"
2727
"github.com/stretchr/testify/assert"
2828
"go.mongodb.org/mongo-driver/bson"
2929

@@ -53,7 +53,7 @@ func TestCollStatsCollector(t *testing.T) {
5353
ti := labelsGetterMock{}
5454

5555
collection := []string{"testdb.testcol_00", "testdb.testcol_01", "testdb.testcol_02"}
56-
logger := logrus.New()
56+
logger := promslog.New(&promslog.Config{})
5757
c := newCollectionStatsCollector(ctx, client, logger, false, ti, collection, false)
5858

5959
// The last \n at the end of this string is important

exporter/currentop_collector.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,13 @@ package exporter
1717

1818
import (
1919
"context"
20+
"fmt"
21+
"log/slog"
2022
"strconv"
2123
"time"
2224

2325
"github.com/pkg/errors"
2426
"github.com/prometheus/client_golang/prometheus"
25-
"github.com/sirupsen/logrus"
2627
"go.mongodb.org/mongo-driver/bson"
2728
"go.mongodb.org/mongo-driver/bson/primitive"
2829
"go.mongodb.org/mongo-driver/mongo"
@@ -39,12 +40,12 @@ type currentopCollector struct {
3940
var ErrInvalidOrMissingInprogEntry = errors.New("invalid or missing inprog entry in currentop results")
4041

4142
// newCurrentopCollector creates a collector for being processed queries.
42-
func newCurrentopCollector(ctx context.Context, client *mongo.Client, logger *logrus.Logger,
43+
func newCurrentopCollector(ctx context.Context, client *mongo.Client, logger *slog.Logger,
4344
compatible bool, topology labelsGetter, currentOpSlowTime string,
4445
) *currentopCollector {
4546
return &currentopCollector{
4647
ctx: ctx,
47-
base: newBaseCollector(client, logger.WithFields(logrus.Fields{"collector": "currentop"})),
48+
base: newBaseCollector(client, logger.With("collector", "currentop")),
4849
compatibleMode: compatible,
4950
topologyInfo: topology,
5051
currentopslowtime: currentOpSlowTime,
@@ -66,7 +67,7 @@ func (d *currentopCollector) collect(ch chan<- prometheus.Metric) {
6667
client := d.base.client
6768
slowtime, err := time.ParseDuration(d.currentopslowtime)
6869
if err != nil {
69-
logger.Errorf("Failed to parse slowtime: %s", err)
70+
logger.Error("Failed to parse slowtime", "error", err)
7071
ch <- prometheus.NewInvalidMetric(prometheus.NewInvalidDesc(err), err)
7172
return
7273
}
@@ -90,7 +91,7 @@ func (d *currentopCollector) collect(ch chan<- prometheus.Metric) {
9091

9192
var r primitive.M
9293
if err := res.Decode(&r); err != nil {
93-
logger.Errorf("Failed to decode currentOp response: %s", err)
94+
logger.Error("Failed to decode currentOp response", "error", err)
9495
ch <- prometheus.NewInvalidMetric(prometheus.NewInvalidDesc(err), err)
9596
return
9697
}
@@ -101,7 +102,7 @@ func (d *currentopCollector) collect(ch chan<- prometheus.Metric) {
101102
inprog, ok := r["inprog"].(primitive.A)
102103

103104
if !ok {
104-
logger.Errorf("Invalid type primitive.A assertion for 'inprog': %T", r["inprog"])
105+
logger.Error(fmt.Sprintf("Invalid type primitive.A assertion for 'inprog': %T", r["inprog"]))
105106
ch <- prometheus.NewInvalidMetric(prometheus.NewInvalidDesc(ErrInvalidOrMissingInprogEntry),
106107
ErrInvalidOrMissingInprogEntry)
107108
}
@@ -115,33 +116,33 @@ func (d *currentopCollector) collect(ch chan<- prometheus.Metric) {
115116

116117
bsonMapElement, ok := bsonMap.(primitive.M)
117118
if !ok {
118-
logger.Errorf("Invalid type primitive.M assertion for bsonMap: %T", bsonMapElement)
119+
logger.Error(fmt.Sprintf("Invalid type primitive.M assertion for bsonMap: %T", bsonMapElement))
119120
continue
120121
}
121122
opid, ok := bsonMapElement["opid"].(int32)
122123
if !ok {
123-
logger.Errorf("Invalid type int32 assertion for 'opid': %T", bsonMapElement)
124+
logger.Error(fmt.Sprintf("Invalid type int32 assertion for 'opid': %T", bsonMapElement))
124125
continue
125126
}
126127
namespace, ok := bsonMapElement["ns"].(string)
127128
if !ok {
128-
logger.Errorf("Invalid type string assertion for 'ns': %T", bsonMapElement)
129+
logger.Error(fmt.Sprintf("Invalid type string assertion for 'ns': %T", bsonMapElement))
129130
continue
130131
}
131132
db, collection := splitNamespace(namespace)
132133
op, ok := bsonMapElement["op"].(string)
133134
if !ok {
134-
logger.Errorf("Invalid type string assertion for 'op': %T", bsonMapElement)
135+
logger.Error(fmt.Sprintf("Invalid type string assertion for 'op': %T", bsonMapElement))
135136
continue
136137
}
137138
desc, ok := bsonMapElement["desc"].(string)
138139
if !ok {
139-
logger.Errorf("Invalid type string assertion for 'desc': %T", bsonMapElement)
140+
logger.Error(fmt.Sprintf("Invalid type string assertion for 'desc': %T", bsonMapElement))
140141
continue
141142
}
142143
microsecs_running, ok := bsonMapElement["microsecs_running"].(int64)
143144
if !ok {
144-
logger.Errorf("Invalid type int64 assertion for 'microsecs_running': %T", bsonMapElement)
145+
logger.Error(fmt.Sprintf("Invalid type int64 assertion for 'microsecs_running': %T", bsonMapElement))
145146
continue
146147
}
147148

exporter/currentop_collector_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
"time"
2323

2424
"github.com/prometheus/client_golang/prometheus/testutil"
25-
"github.com/sirupsen/logrus"
25+
"github.com/prometheus/common/promslog"
2626
"github.com/stretchr/testify/assert"
2727
"go.mongodb.org/mongo-driver/bson"
2828

@@ -60,7 +60,7 @@ func TestCurrentopCollector(t *testing.T) {
6060
ti := labelsGetterMock{}
6161
st := "0s"
6262

63-
c := newCurrentopCollector(ctx, client, logrus.New(), false, ti, st)
63+
c := newCurrentopCollector(ctx, client, promslog.New(&promslog.Config{}), false, ti, st)
6464

6565
// Filter metrics by reason:
6666
// 1. The result will be different on different hardware

exporter/dbstats_collector.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ package exporter
1717

1818
import (
1919
"context"
20+
"log/slog"
2021

2122
"github.com/prometheus/client_golang/prometheus"
22-
"github.com/sirupsen/logrus"
2323
"go.mongodb.org/mongo-driver/bson"
2424
"go.mongodb.org/mongo-driver/mongo"
2525
)
@@ -37,10 +37,10 @@ type dbstatsCollector struct {
3737
}
3838

3939
// newDBStatsCollector creates a collector for statistics on database storage.
40-
func newDBStatsCollector(ctx context.Context, client *mongo.Client, logger *logrus.Logger, compatible bool, topology labelsGetter, databaseRegex []string, freeStorage bool) *dbstatsCollector {
40+
func newDBStatsCollector(ctx context.Context, client *mongo.Client, logger *slog.Logger, compatible bool, topology labelsGetter, databaseRegex []string, freeStorage bool) *dbstatsCollector {
4141
return &dbstatsCollector{
4242
ctx: ctx,
43-
base: newBaseCollector(client, logger.WithFields(logrus.Fields{"collector": "dbstats"})),
43+
base: newBaseCollector(client, logger.With("collector", "dbstats")),
4444

4545
compatibleMode: compatible,
4646
topologyInfo: topology,
@@ -67,12 +67,12 @@ func (d *dbstatsCollector) collect(ch chan<- prometheus.Metric) {
6767

6868
dbNames, err := databases(d.ctx, client, d.databaseFilter, nil)
6969
if err != nil {
70-
logger.Errorf("Failed to get database names: %s", err)
70+
logger.Error("Failed to get database names", "error", err)
7171

7272
return
7373
}
7474

75-
logger.Debugf("getting stats for databases: %v", dbNames)
75+
logger.Debug("getting stats for databases", "databases", dbNames)
7676
for _, db := range dbNames {
7777
var dbStats bson.M
7878
var cmd bson.D
@@ -84,12 +84,12 @@ func (d *dbstatsCollector) collect(ch chan<- prometheus.Metric) {
8484
r := client.Database(db).RunCommand(d.ctx, cmd)
8585
err := r.Decode(&dbStats)
8686
if err != nil {
87-
logger.Errorf("Failed to get $dbstats for database %s: %s", db, err)
87+
logger.Error("Failed to get $dbstats for database", "database", db, "error", err)
8888

8989
continue
9090
}
9191

92-
logger.Debugf("$dbStats metrics for %s", db)
92+
logger.Debug("$dbStats metrics for", "database", db)
9393
debugResult(logger, dbStats)
9494

9595
prefix := "dbstats"

exporter/dbstats_collector_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import (
2323
"time"
2424

2525
"github.com/prometheus/client_golang/prometheus/testutil"
26-
"github.com/sirupsen/logrus"
26+
"github.com/prometheus/common/promslog"
2727
"github.com/stretchr/testify/assert"
2828
"go.mongodb.org/mongo-driver/bson"
2929

@@ -58,7 +58,7 @@ func TestDBStatsCollector(t *testing.T) {
5858

5959
ti := labelsGetterMock{}
6060

61-
logger := logrus.New()
61+
logger := promslog.New(&promslog.Config{})
6262
c := newDBStatsCollector(ctx, client, logger, false, ti, []string{dbName}, false)
6363
expected := strings.NewReader(`
6464
# HELP mongodb_dbstats_collections dbstats.collections

exporter/debug.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,25 +16,25 @@
1616
package exporter
1717

1818
import (
19+
"context"
1920
"encoding/json"
2021
"fmt"
22+
"log/slog"
2123
"os"
22-
23-
"github.com/sirupsen/logrus"
2424
)
2525

26-
func debugResult(log *logrus.Entry, m interface{}) {
27-
if !log.Logger.IsLevelEnabled(logrus.DebugLevel) {
26+
func debugResult(log *slog.Logger, m interface{}) {
27+
if !log.Enabled(context.TODO(), slog.LevelDebug) {
2828
return
2929
}
3030

3131
debugStr, err := json.MarshalIndent(m, "", " ")
3232
if err != nil {
33-
log.Errorf("cannot marshal struct for debug: %s", err)
33+
log.Error("cannot marshal struct for debug", "error", err)
3434
return
3535
}
3636

37-
// don't use logrus because:
37+
// don't use the passed-in logger because:
3838
// 1. It will escape new lines and " making it harder to read and to use
3939
// 2. It will add timestamp
4040
// 3. This way is easier to copy/paste to put the info in a ticket

exporter/debug_test.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,30 @@ import (
2020
"os"
2121
"testing"
2222

23-
"github.com/sirupsen/logrus"
23+
"github.com/prometheus/common/promslog"
2424
"github.com/stretchr/testify/assert"
25+
"github.com/stretchr/testify/require"
2526
"go.mongodb.org/mongo-driver/bson"
2627
)
2728

2829
func TestDebug(t *testing.T) {
29-
log := logrus.New()
30-
log.SetLevel(logrus.DebugLevel)
30+
logLevel := promslog.NewLevel()
31+
err := logLevel.Set("debug")
32+
require.NoError(t, err)
3133

3234
olderr := os.Stderr
3335
r, w, _ := os.Pipe()
3436

3537
os.Stderr = w
3638
defer func() {
3739
os.Stderr = olderr
38-
logrus.SetLevel(logrus.ErrorLevel)
40+
_ = logLevel.Set("error")
3941
}()
4042

41-
log.Out = w
43+
log := promslog.New(&promslog.Config{
44+
Level: logLevel,
45+
Writer: w,
46+
})
4247

4348
m := bson.M{
4449
"f1": 1,
@@ -55,7 +60,7 @@ func TestDebug(t *testing.T) {
5560
}
5661
}` + "\n"
5762

58-
debugResult(log.WithField("component", "test"), m)
63+
debugResult(log.With("component", "test"), m)
5964
assert.NoError(t, w.Close())
6065
out, _ := io.ReadAll(r)
6166

0 commit comments

Comments
 (0)