Skip to content

Commit a21a53b

Browse files
committed
sirupsen/log --> log/slog
1 parent 9edec39 commit a21a53b

25 files changed

+288
-270
lines changed

exporter/clients.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package exporter
22

33
import (
4+
"log/slog"
45
"regexp"
56
"strconv"
67
"strings"
78
"time"
89

910
"github.com/gomodule/redigo/redis"
1011
"github.com/prometheus/client_golang/prometheus"
11-
log "github.com/sirupsen/logrus"
1212
)
1313

1414
type ClientInfo struct {
@@ -50,7 +50,7 @@ func parseClientListString(clientInfo string) (*ClientInfo, bool) {
5050
for _, kvPart := range strings.Split(clientInfo, " ") {
5151
vPart := strings.Split(kvPart, "=")
5252
if len(vPart) != 2 {
53-
log.Debugf("Invalid format for client list string, got: %s", kvPart)
53+
slog.Debug("Invalid format for client list string", "kvPart", kvPart)
5454
return nil, false
5555
}
5656

@@ -64,14 +64,14 @@ func parseClientListString(clientInfo string) (*ClientInfo, bool) {
6464
case "age":
6565
createdAt, err := durationFieldToTimestamp(vPart[1])
6666
if err != nil {
67-
log.Debugf("could not parse 'age' field(%s): %s", vPart[1], err.Error())
67+
slog.Debug("could not parse 'age' field", "value", vPart[1], "error", err.Error())
6868
return nil, false
6969
}
7070
connectedClient.CreatedAt = createdAt
7171
case "idle":
7272
idleSinceTs, err := durationFieldToTimestamp(vPart[1])
7373
if err != nil {
74-
log.Debugf("could not parse 'idle' field(%s): %s", vPart[1], err.Error())
74+
slog.Debug("could not parse 'idle' field", "value", vPart[1], "error", err.Error())
7575
return nil, false
7676
}
7777
connectedClient.IdleSince = idleSinceTs
@@ -102,7 +102,7 @@ func parseClientListString(clientInfo string) (*ClientInfo, bool) {
102102
case "addr":
103103
hostPortString := strings.Split(vPart[1], ":")
104104
if len(hostPortString) < 2 {
105-
log.Debug("Invalid value for 'addr' found in client info")
105+
slog.Debug("Invalid value for 'addr' found in client info")
106106
return nil, false
107107
}
108108
connectedClient.Host = strings.Join(hostPortString[:len(hostPortString)-1], ":")
@@ -126,7 +126,7 @@ func durationFieldToTimestamp(field string) (int64, error) {
126126
func (e *Exporter) extractConnectedClientMetrics(ch chan<- prometheus.Metric, c redis.Conn) {
127127
reply, err := redis.String(doRedisCmd(c, "CLIENT", "LIST"))
128128
if err != nil {
129-
log.Errorf("CLIENT LIST err: %s", err)
129+
slog.Error("CLIENT LIST err", "error", err)
130130
return
131131
}
132132
e.parseConnectedClientMetrics(reply, ch)
@@ -137,7 +137,7 @@ func (e *Exporter) parseConnectedClientMetrics(input string, ch chan<- prometheu
137137
for _, s := range strings.Split(input, "\n") {
138138
info, ok := parseClientListString(s)
139139
if !ok {
140-
log.Debugf("parseClientListString( %s ) - couldn';t parse input", s)
140+
slog.Debug("parseClientListString - couldn't parse input", "input", s)
141141
continue
142142
}
143143
clientInfoLabels := []string{"id", "name", "flags", "db", "host"}

exporter/exporter.go

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package exporter
22

33
import (
44
"fmt"
5+
"log/slog"
56
"net/http"
67
"net/url"
78
"runtime"
@@ -16,7 +17,6 @@ import (
1617
"github.com/gomodule/redigo/redis"
1718
"github.com/prometheus/client_golang/prometheus"
1819
"github.com/prometheus/client_golang/prometheus/promhttp"
19-
log "github.com/sirupsen/logrus"
2020
)
2121

2222
type BuildInfo struct {
@@ -93,7 +93,7 @@ type Options struct {
9393

9494
// NewRedisExporter returns a new exporter of Redis metrics.
9595
func NewRedisExporter(uri string, opts Options) (*Exporter, error) {
96-
log.Debugf("NewRedisExporter options: %#v", opts)
96+
slog.Debug("NewRedisExporter options", "options", opts)
9797

9898
switch {
9999
case strings.HasPrefix(uri, "valkey://"):
@@ -102,7 +102,7 @@ func NewRedisExporter(uri string, opts Options) (*Exporter, error) {
102102
uri = strings.Replace(uri, "valkeys://", "rediss://", 1)
103103
}
104104

105-
log.Debugf("NewRedisExporter = using redis uri: %s", uri)
105+
slog.Debug("Using redis URI", "uri", uri)
106106

107107
e := &Exporter{
108108
redisAddr: uri,
@@ -403,31 +403,31 @@ func NewRedisExporter(uri string, opts Options) (*Exporter, error) {
403403
if keys, err := parseKeyArg(opts.CheckKeys); err != nil {
404404
return nil, fmt.Errorf("couldn't parse check-keys: %s", err)
405405
} else {
406-
log.Debugf("keys: %#v", keys)
406+
slog.Debug("keys", "keys", keys)
407407
}
408408

409409
if singleKeys, err := parseKeyArg(opts.CheckSingleKeys); err != nil {
410410
return nil, fmt.Errorf("couldn't parse check-single-keys: %s", err)
411411
} else {
412-
log.Debugf("singleKeys: %#v", singleKeys)
412+
slog.Debug("singleKeys", "singleKeys", singleKeys)
413413
}
414414

415415
if streams, err := parseKeyArg(opts.CheckStreams); err != nil {
416416
return nil, fmt.Errorf("couldn't parse check-streams: %s", err)
417417
} else {
418-
log.Debugf("streams: %#v", streams)
418+
slog.Debug("streams", "streams", streams)
419419
}
420420

421421
if singleStreams, err := parseKeyArg(opts.CheckSingleStreams); err != nil {
422422
return nil, fmt.Errorf("couldn't parse check-single-streams: %s", err)
423423
} else {
424-
log.Debugf("singleStreams: %#v", singleStreams)
424+
slog.Debug("singleStreams", "singleStreams", singleStreams)
425425
}
426426

427427
if countKeys, err := parseKeyArg(opts.CountKeys); err != nil {
428428
return nil, fmt.Errorf("couldn't parse count-keys: %s", err)
429429
} else {
430-
log.Debugf("countKeys: %#v", countKeys)
430+
slog.Debug("countKeys", "countKeys", countKeys)
431431
}
432432

433433
if opts.InclSystemMetrics {
@@ -603,13 +603,13 @@ func (e *Exporter) extractConfigMetrics(ch chan<- prometheus.Metric, config []in
603603
for pos := 0; pos < len(config)/2; pos++ {
604604
strKey, err := redis.String(config[pos*2], nil)
605605
if err != nil {
606-
log.Errorf("invalid config key name, err: %s, skipped", err)
606+
slog.Error("invalid config key name, skipped", "error", err)
607607
continue
608608
}
609609

610610
strVal, err := redis.String(config[pos*2+1], nil)
611611
if err != nil {
612-
log.Debugf("invalid config value for key name %s, err: %s, skipped", strKey, err)
612+
slog.Debug("invalid config value for key name, skipped", "key", strKey, "error", err)
613613
continue
614614
}
615615

@@ -665,7 +665,7 @@ func (e *Exporter) extractConfigMetrics(ch chan<- prometheus.Metric, config []in
665665
}
666666

667667
func (e *Exporter) scrapeRedisHost(ch chan<- prometheus.Metric) error {
668-
defer log.Debugf("scrapeRedisHost() done")
668+
defer slog.Debug("Finished scraping Redis host")
669669

670670
startTime := time.Now()
671671
c, err := e.connectToRedis()
@@ -675,63 +675,63 @@ func (e *Exporter) scrapeRedisHost(ch chan<- prometheus.Metric) error {
675675
if err != nil {
676676
var redactedAddr string
677677
if redisURL, err2 := url.Parse(e.redisAddr); err2 != nil {
678-
log.Debugf("url.Parse( %s ) err: %s", e.redisAddr, err2)
678+
slog.Debug("Failed to parse URL", "address", e.redisAddr, "error", err2)
679679
redactedAddr = "<redacted>"
680680
} else {
681681
redactedAddr = redisURL.Redacted()
682682
}
683-
log.Errorf("Couldn't connect to redis instance (%s)", redactedAddr)
684-
log.Debugf("connectToRedis( %s ) err: %s", e.redisAddr, err)
683+
slog.Error("Couldn't connect to redis instance", "address", redactedAddr)
684+
slog.Debug("Connect to redis failed", "address", e.redisAddr, "error", err)
685685
return err
686686
}
687687
defer c.Close()
688688

689-
log.Debugf("connected to: %s", e.redisAddr)
690-
log.Debugf("connecting took %f seconds", connectTookSeconds)
689+
slog.Debug("Connected to redis", "address", e.redisAddr)
690+
slog.Debug("connecting took seconds", "seconds", connectTookSeconds)
691691

692692
if e.options.PingOnConnect {
693693
startTime := time.Now()
694694

695695
if _, err := doRedisCmd(c, "PING"); err != nil {
696-
log.Errorf("Couldn't PING server, err: %s", err)
696+
slog.Error("Couldn't PING server", "error", err)
697697
} else {
698698
pingTookSeconds := time.Since(startTime).Seconds()
699699
e.registerConstMetricGauge(ch, "exporter_last_scrape_ping_time_seconds", pingTookSeconds)
700-
log.Debugf("PING took %f seconds", pingTookSeconds)
700+
slog.Debug("PING took seconds", "seconds", pingTookSeconds)
701701
}
702702
}
703703

704704
if e.options.SetClientName {
705705
if _, err := doRedisCmd(c, "CLIENT", "SETNAME", "redis_exporter"); err != nil {
706-
log.Errorf("Couldn't set client name, err: %s", err)
706+
slog.Error("Couldn't set client name", "error", err)
707707
}
708708
}
709709

710710
dbCount := 0
711711
if e.options.ConfigCommandName == "-" {
712-
log.Debugf("Skipping extractConfigMetrics()")
712+
slog.Debug("Skipping config metrics extraction")
713713
} else {
714714
if config, err := redis.Values(doRedisCmd(c, e.options.ConfigCommandName, "GET", "*")); err == nil {
715715
dbCount, err = e.extractConfigMetrics(ch, config)
716716
if err != nil {
717-
log.Errorf("Redis extractConfigMetrics() err: %s", err)
717+
slog.Error("Failed to extract config metrics", "error", err)
718718
return err
719719
}
720720
} else {
721-
log.Debugf("Redis CONFIG err: %s", err)
721+
slog.Debug("Redis CONFIG err", "error", err)
722722
}
723723
}
724724

725725
infoAll, err := redis.String(doRedisCmd(c, "INFO", "ALL"))
726726
if err != nil || infoAll == "" {
727-
log.Debugf("Redis INFO ALL err: %s", err)
727+
slog.Debug("Redis INFO ALL err", "error", err)
728728
infoAll, err = redis.String(doRedisCmd(c, "INFO"))
729729
if err != nil {
730-
log.Errorf("Redis INFO err: %s", err)
730+
slog.Error("Redis INFO err", "error", err)
731731
return err
732732
}
733733
}
734-
log.Debugf("Redis INFO ALL result: [%#v]", infoAll)
734+
slog.Debug("Redis INFO ALL result", "result", infoAll)
735735

736736
if strings.Contains(infoAll, "cluster_enabled:1") {
737737
if clusterInfo, err := redis.String(doRedisCmd(c, "CLUSTER", "INFO")); err == nil {
@@ -740,7 +740,7 @@ func (e *Exporter) scrapeRedisHost(ch chan<- prometheus.Metric) error {
740740
// in cluster mode Redis only supports one database, so no extra DB number padding needed
741741
dbCount = 1
742742
} else {
743-
log.Errorf("Redis CLUSTER INFO err: %s", err)
743+
slog.Error("Redis CLUSTER INFO err", "error", err)
744744
}
745745
} else if dbCount == 0 {
746746
// in non-cluster mode, if dbCount is zero, then "CONFIG" failed to retrieve a valid
@@ -749,7 +749,7 @@ func (e *Exporter) scrapeRedisHost(ch chan<- prometheus.Metric) error {
749749
dbCount = 16
750750
}
751751

752-
log.Debugf("dbCount: %d", dbCount)
752+
slog.Debug("dbCount", "count", dbCount)
753753

754754
role := e.extractInfoMetrics(ch, infoAll, dbCount)
755755

@@ -759,17 +759,17 @@ func (e *Exporter) scrapeRedisHost(ch chan<- prometheus.Metric) error {
759759

760760
// skip these metrics for master if SkipCheckKeysForRoleMaster is set
761761
// (can help with reducing workload on the master node)
762-
log.Debugf("checkKeys metric collection for role: %s SkipCheckKeysForRoleMaster flag: %#v", role, e.options.SkipCheckKeysForRoleMaster)
762+
slog.Debug("checkKeys metric collection for role", "role", role, "SkipCheckKeysForRoleMaster", e.options.SkipCheckKeysForRoleMaster)
763763
if role == InstanceRoleSlave || !e.options.SkipCheckKeysForRoleMaster {
764764
if err := e.extractCheckKeyMetrics(ch, c); err != nil {
765-
log.Errorf("extractCheckKeyMetrics() err: %s", err)
765+
slog.Error("Failed to extract check key metrics", "error", err)
766766
}
767767

768768
e.extractCountKeysMetrics(ch, c)
769769

770770
e.extractStreamMetrics(ch, c)
771771
} else {
772-
log.Infof("skipping checkKeys metrics, role: %s flag: %#v", role, e.options.SkipCheckKeysForRoleMaster)
772+
slog.Info("skipping checkKeys metrics", "role", role, "flag", e.options.SkipCheckKeysForRoleMaster)
773773
}
774774

775775
e.extractSlowLogMetrics(ch, c)

exporter/exporter_test.go

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@ package exporter
1010

1111
import (
1212
"fmt"
13-
"github.com/mna/redisc"
1413
"net/http/httptest"
1514
"os"
1615
"strings"
1716
"testing"
1817
"time"
1918

2019
"github.com/gomodule/redigo/redis"
20+
"github.com/mna/redisc"
2121
"github.com/prometheus/client_golang/prometheus"
2222
"github.com/prometheus/client_golang/prometheus/promhttp"
2323
dto "github.com/prometheus/client_model/go"
24-
log "github.com/sirupsen/logrus"
24+
"log/slog"
2525
)
2626

2727
const (
@@ -92,7 +92,7 @@ func getTestExporterWithAddrAndOptions(addr string, opt Options) *Exporter {
9292
func setupKeys(t *testing.T, c redis.Conn, dbNum string) error {
9393
if _, err := doRedisCmd(c, "SELECT", dbNum); err != nil {
9494
// not failing on this one - cluster doesn't allow for SELECT so we log and ignore the error
95-
log.Printf("setupTestKeys() - couldn't setup redis, err: %s ", err)
95+
slog.Error("setupTestKeys() - couldn't setup redis", "error", err)
9696
}
9797

9898
testValue := 1234.56
@@ -198,7 +198,7 @@ func setupKeys(t *testing.T, c redis.Conn, dbNum string) error {
198198

199199
func deleteKeys(c redis.Conn, dbNum string) {
200200
if _, err := doRedisCmd(c, "SELECT", dbNum); err != nil {
201-
log.Printf("deleteTestKeys() - couldn't setup redis, err: %s ", err)
201+
slog.Error("deleteTestKeys() - couldn't setup redis", "error", err)
202202
// not failing on this one - cluster doesn't allow for SELECT so we log and ignore the error
203203
}
204204

@@ -221,7 +221,7 @@ func deleteKeys(c redis.Conn, dbNum string) {
221221
}
222222

223223
func setupTestKeys(t *testing.T, uri string) {
224-
log.Debugf("setupTestKeys uri: %s", uri)
224+
slog.Debug("setupTestKeys uri", "uri", uri)
225225
c, err := redis.DialURL(uri)
226226
if err != nil {
227227
t.Fatalf("couldn't setup redis for uri %s, err: %s ", uri, err)
@@ -241,7 +241,7 @@ func setupTestKeys(t *testing.T, uri string) {
241241
}
242242

243243
func setupTestKeysCluster(t *testing.T, uri string) {
244-
log.Debugf("Creating cluster object")
244+
slog.Debug("Creating cluster object")
245245
cluster := redisc.Cluster{
246246
StartupNodes: []string{
247247
strings.Replace(uri, "redis://", "", 1),
@@ -250,17 +250,17 @@ func setupTestKeysCluster(t *testing.T, uri string) {
250250
}
251251

252252
if err := cluster.Refresh(); err != nil {
253-
log.Fatalf("Refresh failed: %v", err)
253+
slog.Error("Refresh failed", "error", err)
254254
}
255255

256256
conn, err := cluster.Dial()
257257
if err != nil {
258-
log.Errorf("Dial() failed: %v", err)
258+
slog.Error("Dial() failed", "error", err)
259259
}
260260

261261
c, err := redisc.RetryConn(conn, 10, 100*time.Millisecond)
262262
if err != nil {
263-
log.Errorf("RetryConn() failed: %v", err)
263+
slog.Error("RetryConn() failed", "error", err)
264264
}
265265

266266
// cluster only supports db==0
@@ -539,14 +539,8 @@ func TestKeyDbMetrics(t *testing.T) {
539539
}
540540

541541
func init() {
542-
ll := strings.ToLower(os.Getenv("LOG_LEVEL"))
543-
if pl, err := log.ParseLevel(ll); err == nil {
544-
log.Printf("Setting log level to: %s", ll)
545-
log.SetLevel(pl)
546-
} else {
547-
log.SetLevel(log.InfoLevel)
548-
}
549-
542+
// Note: slog level is configured via handler options in main application
543+
// For tests, we'll use the default slog configuration
550544
testTimestamp := time.Now().Unix()
551545

552546
for _, n := range []string{"john", "paul", "ringo", "george"} {

0 commit comments

Comments
 (0)