Skip to content

Commit 21171cf

Browse files
committed
chore!: adopt log/slog, drop go-kit/log
Requires: prometheus/common#697 This PR includes: - linter updates to enable sloglint linter - Go dep updates for prometheus/{client_golang,common,exporter-toolkit} libs - refactorings to adopt log/slog in favor of go-kit/log The bulk of this PR was automated by the following script which is being used to aid in converting the various exporters/projects to use slog: https://gist.github.com/tjhop/49f96fb7ebbe55b12deee0b0312d8434 Builds and passes tests locally with go workspaces and up-to-date main branch of prometheus/common. Signed-off-by: TJ Hoplock <[email protected]>
1 parent 49e616d commit 21171cf

File tree

7 files changed

+49
-59
lines changed

7 files changed

+49
-59
lines changed

Diff for: cmd/memcached_exporter/main.go

+13-15
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,13 @@ import (
2121
"strings"
2222

2323
"github.com/alecthomas/kingpin/v2"
24-
"github.com/go-kit/log/level"
2524
"github.com/prometheus/client_golang/prometheus"
2625
"github.com/prometheus/client_golang/prometheus/collectors"
2726
versioncollector "github.com/prometheus/client_golang/prometheus/collectors/version"
2827
"github.com/prometheus/client_golang/prometheus/promhttp"
2928
promconfig "github.com/prometheus/common/config"
30-
"github.com/prometheus/common/promlog"
31-
"github.com/prometheus/common/promlog/flag"
29+
"github.com/prometheus/common/promslog"
30+
"github.com/prometheus/common/promslog/flag"
3231
"github.com/prometheus/common/version"
3332
"github.com/prometheus/exporter-toolkit/web"
3433
webflag "github.com/prometheus/exporter-toolkit/web/kingpinflag"
@@ -53,15 +52,15 @@ func main() {
5352
scrapePath = kingpin.Flag("web.scrape-path", "Path under which to receive scrape requests.").Default("/scrape").String()
5453
)
5554

56-
promlogConfig := &promlog.Config{}
57-
flag.AddFlags(kingpin.CommandLine, promlogConfig)
55+
promslogConfig := &promslog.Config{}
56+
flag.AddFlags(kingpin.CommandLine, promslogConfig)
5857
kingpin.HelpFlag.Short('h')
5958
kingpin.Version(version.Print("memcached_exporter"))
6059
kingpin.Parse()
61-
logger := promlog.New(promlogConfig)
60+
logger := promslog.New(promslogConfig)
6261

63-
level.Info(logger).Log("msg", "Starting memcached_exporter", "version", version.Info())
64-
level.Info(logger).Log("msg", "Build context", "context", version.BuildContext())
62+
logger.Info("Starting memcached_exporter", "version", version.Info())
63+
logger.Info("Build context", "context", version.BuildContext())
6564

6665
var (
6766
tlsConfig *tls.Config
@@ -72,11 +71,10 @@ func main() {
7271
*serverName, _, err = net.SplitHostPort(*address)
7372
if err != nil {
7473
if strings.Contains(*address, "/") {
75-
level.Error(logger).Log("msg",
76-
"If --memcached.tls.enable is set and --memcached.address is a unix socket, "+
77-
"you must also specify --memcached.tls.server-name")
74+
logger.Error("If --memcached.tls.enable is set and --memcached.address is a unix socket, " +
75+
"you must also specify --memcached.tls.server-name")
7876
} else {
79-
level.Error(logger).Log("msg", "Error parsing memcached address", "err", err)
77+
logger.Error("Error parsing memcached address", "err", err)
8078
}
8179
os.Exit(1)
8280
}
@@ -89,7 +87,7 @@ func main() {
8987
InsecureSkipVerify: *insecureSkipVerify,
9088
})
9189
if err != nil {
92-
level.Error(logger).Log("msg", "Failed to create TLS config", "err", err)
90+
logger.Error("Failed to create TLS config", "err", err)
9391
os.Exit(1)
9492
}
9593
}
@@ -126,15 +124,15 @@ func main() {
126124
}
127125
landingPage, err := web.NewLandingPage(landingConfig)
128126
if err != nil {
129-
level.Error(logger).Log("err", err)
127+
logger.Error("Error creating landing page", "err", err)
130128
os.Exit(1)
131129
}
132130
http.Handle("/", landingPage)
133131
}
134132

135133
srv := &http.Server{}
136134
if err := web.ListenAndServe(srv, webConfig, logger); err != nil {
137-
level.Error(logger).Log("msg", "Error running HTTP server", "err", err)
135+
logger.Error("Error running HTTP server", "err", err)
138136
os.Exit(1)
139137
}
140138
}

Diff for: go.mod

-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ go 1.23.0
44

55
require (
66
github.com/alecthomas/kingpin/v2 v2.4.0
7-
github.com/go-kit/log v0.2.1
87
github.com/grobie/gomemcache v0.0.0-20230213081705-239240bbc445
98
github.com/prometheus/client_golang v1.20.4
109
github.com/prometheus/common v0.59.1
@@ -16,7 +15,6 @@ require (
1615
github.com/beorn7/perks v1.0.1 // indirect
1716
github.com/cespare/xxhash/v2 v2.3.0 // indirect
1817
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
19-
github.com/go-logfmt/logfmt v0.6.0 // indirect
2018
github.com/jpillora/backoff v1.0.0 // indirect
2119
github.com/klauspost/compress v1.17.9 // indirect
2220
github.com/mdlayher/socket v0.4.1 // indirect

Diff for: go.sum

-4
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,6 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV
1111
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
1212
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
1313
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
14-
github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
15-
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
16-
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
17-
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
1814
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
1915
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
2016
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=

Diff for: pkg/exporter/exporter.go

+22-23
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@ package exporter
1616
import (
1717
"crypto/tls"
1818
"errors"
19+
"log/slog"
1920
"net"
2021
"strconv"
2122
"strings"
2223
"time"
2324

24-
"github.com/go-kit/log"
25-
"github.com/go-kit/log/level"
2625
"github.com/grobie/gomemcache/memcache"
2726
"github.com/prometheus/client_golang/prometheus"
2827
)
@@ -39,7 +38,7 @@ var errKeyNotFound = errors.New("key not found")
3938
type Exporter struct {
4039
address string
4140
timeout time.Duration
42-
logger log.Logger
41+
logger *slog.Logger
4342
tlsConfig *tls.Config
4443

4544
up *prometheus.Desc
@@ -133,7 +132,7 @@ type Exporter struct {
133132
}
134133

135134
// New returns an initialized exporter.
136-
func New(server string, timeout time.Duration, logger log.Logger, tlsConfig *tls.Config) *Exporter {
135+
func New(server string, timeout time.Duration, logger *slog.Logger, tlsConfig *tls.Config) *Exporter {
137136
return &Exporter{
138137
address: server,
139138
timeout: timeout,
@@ -770,7 +769,7 @@ func (e *Exporter) Collect(ch chan<- prometheus.Metric) {
770769
c, err := memcache.New(e.address)
771770
if err != nil {
772771
ch <- prometheus.MustNewConstMetric(e.up, prometheus.GaugeValue, 0)
773-
level.Error(e.logger).Log("msg", "Failed to connect to memcached", "err", err)
772+
e.logger.Error("Failed to connect to memcached", "err", err)
774773
return
775774
}
776775
c.Timeout = e.timeout
@@ -779,12 +778,12 @@ func (e *Exporter) Collect(ch chan<- prometheus.Metric) {
779778
up := float64(1)
780779
stats, err := c.Stats()
781780
if err != nil {
782-
level.Error(e.logger).Log("msg", "Failed to collect stats from memcached", "err", err)
781+
e.logger.Error("Failed to collect stats from memcached", "err", err)
783782
up = 0
784783
}
785784
statsSettings, err := c.StatsSettings()
786785
if err != nil {
787-
level.Error(e.logger).Log("msg", "Could not query stats settings", "err", err)
786+
e.logger.Error("Could not query stats settings", "err", err)
788787
up = 0
789788
}
790789

@@ -857,11 +856,11 @@ func (e *Exporter) parseStats(ch chan<- prometheus.Metric, stats map[net.Addr]me
857856
if cas, casErr := sum(s, "cas_misses", "cas_hits", "cas_badval"); casErr == nil {
858857
ch <- prometheus.MustNewConstMetric(e.commands, prometheus.CounterValue, setCmd-cas, "set", "hit")
859858
} else {
860-
level.Error(e.logger).Log("msg", "Failed to parse cas", "err", casErr)
859+
e.logger.Error("Failed to parse cas", "err", casErr)
861860
parseError = casErr
862861
}
863862
} else {
864-
level.Error(e.logger).Log("msg", "Failed to parse set", "err", err)
863+
e.logger.Error("Failed to parse set", "err", err)
865864
parseError = err
866865
}
867866

@@ -973,11 +972,11 @@ func (e *Exporter) parseStats(ch chan<- prometheus.Metric, stats map[net.Addr]me
973972
if slabCas, slabCasErr := sum(v, "cas_hits", "cas_badval"); slabCasErr == nil {
974973
ch <- prometheus.MustNewConstMetric(e.slabsCommands, prometheus.CounterValue, slabSetCmd-slabCas, slab, "set", "hit")
975974
} else {
976-
level.Error(e.logger).Log("msg", "Failed to parse cas", "err", slabCasErr)
975+
e.logger.Error("Failed to parse cas", "err", slabCasErr)
977976
parseError = slabCasErr
978977
}
979978
} else {
980-
level.Error(e.logger).Log("msg", "Failed to parse set", "err", err)
979+
e.logger.Error("Failed to parse set", "err", err)
981980
parseError = err
982981
}
983982

@@ -1038,7 +1037,7 @@ func (e *Exporter) parseTimevalAndNewMetric(ch chan<- prometheus.Metric, desc *p
10381037
return e.extractValueAndNewMetric(ch, desc, valueType, parseTimeval, stats, key, labelValues...)
10391038
}
10401039

1041-
func (e *Exporter) extractValueAndNewMetric(ch chan<- prometheus.Metric, desc *prometheus.Desc, valueType prometheus.ValueType, f func(map[string]string, string, log.Logger) (float64, error), stats map[string]string, key string, labelValues ...string) error {
1040+
func (e *Exporter) extractValueAndNewMetric(ch chan<- prometheus.Metric, desc *prometheus.Desc, valueType prometheus.ValueType, f func(map[string]string, string, *slog.Logger) (float64, error), stats map[string]string, key string, labelValues ...string) error {
10421041
v, err := f(stats, key, e.logger)
10431042
if err == errKeyNotFound {
10441043
return nil
@@ -1051,25 +1050,25 @@ func (e *Exporter) extractValueAndNewMetric(ch chan<- prometheus.Metric, desc *p
10511050
return nil
10521051
}
10531052

1054-
func parse(stats map[string]string, key string, logger log.Logger) (float64, error) {
1053+
func parse(stats map[string]string, key string, logger *slog.Logger) (float64, error) {
10551054
value, ok := stats[key]
10561055
if !ok {
1057-
level.Debug(logger).Log("msg", "Key not found", "key", key)
1056+
logger.Debug("Key not found", "key", key)
10581057
return 0, errKeyNotFound
10591058
}
10601059

10611060
v, err := strconv.ParseFloat(value, 64)
10621061
if err != nil {
1063-
level.Error(logger).Log("msg", "Failed to parse", "key", key, "value", value, "err", err)
1062+
logger.Error("Failed to parse", "key", key, "value", value, "err", err)
10641063
return 0, err
10651064
}
10661065
return v, nil
10671066
}
10681067

1069-
func parseBool(stats map[string]string, key string, logger log.Logger) (float64, error) {
1068+
func parseBool(stats map[string]string, key string, logger *slog.Logger) (float64, error) {
10701069
value, ok := stats[key]
10711070
if !ok {
1072-
level.Debug(logger).Log("msg", "Key not found", "key", key)
1071+
logger.Debug("Key not found", "key", key)
10731072
return 0, errKeyNotFound
10741073
}
10751074

@@ -1079,33 +1078,33 @@ func parseBool(stats map[string]string, key string, logger log.Logger) (float64,
10791078
case "no":
10801079
return 0, nil
10811080
default:
1082-
level.Error(logger).Log("msg", "Failed to parse", "key", key, "value", value)
1081+
logger.Error("Failed to parse", "key", key, "value", value)
10831082
return 0, errors.New("failed parse a bool value")
10841083
}
10851084
}
10861085

1087-
func parseTimeval(stats map[string]string, key string, logger log.Logger) (float64, error) {
1086+
func parseTimeval(stats map[string]string, key string, logger *slog.Logger) (float64, error) {
10881087
value, ok := stats[key]
10891088
if !ok {
1090-
level.Debug(logger).Log("msg", "Key not found", "key", key)
1089+
logger.Debug("Key not found", "key", key)
10911090
return 0, errKeyNotFound
10921091
}
10931092
values := strings.Split(value, ".")
10941093

10951094
if len(values) != 2 {
1096-
level.Error(logger).Log("msg", "Failed to parse", "key", key, "value", value)
1095+
logger.Error("Failed to parse", "key", key, "value", value)
10971096
return 0, errors.New("failed parse a timeval value")
10981097
}
10991098

11001099
seconds, err := strconv.ParseFloat(values[0], 64)
11011100
if err != nil {
1102-
level.Error(logger).Log("msg", "Failed to parse", "key", key, "value", value, "err", err)
1101+
logger.Error("Failed to parse", "key", key, "value", value, "err", err)
11031102
return 0, errors.New("failed parse a timeval value")
11041103
}
11051104

11061105
microseconds, err := strconv.ParseFloat(values[1], 64)
11071106
if err != nil {
1108-
level.Error(logger).Log("msg", "Failed to parse", "key", key, "value", value, "err", err)
1107+
logger.Error("Failed to parse", "key", key, "value", value, "err", err)
11091108
return 0, errors.New("failed parse a timeval value")
11101109
}
11111110

Diff for: pkg/exporter/exporter_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ import (
1818
"testing"
1919
"time"
2020

21-
"github.com/go-kit/log"
2221
"github.com/prometheus/client_golang/prometheus"
22+
"github.com/prometheus/common/promslog"
2323
)
2424

2525
func TestParseStatsSettings(t *testing.T) {
@@ -46,7 +46,7 @@ func TestParseStatsSettings(t *testing.T) {
4646
},
4747
}
4848
ch := make(chan prometheus.Metric, 100)
49-
e := New("", 100*time.Millisecond, log.NewNopLogger(), nil)
49+
e := New("", 100*time.Millisecond, promslog.NewNopLogger(), nil)
5050
if err := e.parseStatsSettings(ch, statsSettings); err != nil {
5151
t.Errorf("expect return error, error: %v", err)
5252
}
@@ -69,7 +69,7 @@ func TestParseStatsSettings(t *testing.T) {
6969
},
7070
}
7171
ch := make(chan prometheus.Metric, 100)
72-
e := New("", 100*time.Millisecond, log.NewNopLogger(), nil)
72+
e := New("", 100*time.Millisecond, promslog.NewNopLogger(), nil)
7373
if err := e.parseStatsSettings(ch, statsSettings); err == nil {
7474
t.Error("expect return error but not")
7575
}
@@ -79,15 +79,15 @@ func TestParseStatsSettings(t *testing.T) {
7979
func TestParseTimeval(t *testing.T) {
8080
t.Run("Success", func(t *testing.T) {
8181
t.Parallel()
82-
_, err := parseTimeval(map[string]string{"rusage_system": "3.5"}, "rusage_system", log.NewNopLogger())
82+
_, err := parseTimeval(map[string]string{"rusage_system": "3.5"}, "rusage_system", promslog.NewNopLogger())
8383
if err != nil {
8484
t.Errorf("expect return error, error: %v", err)
8585
}
8686
})
8787

8888
t.Run("Failure", func(t *testing.T) {
8989
t.Parallel()
90-
_, err := parseTimeval(map[string]string{"rusage_system": "35"}, "rusage_system", log.NewNopLogger())
90+
_, err := parseTimeval(map[string]string{"rusage_system": "35"}, "rusage_system", promslog.NewNopLogger())
9191
if err == nil {
9292
t.Error("expect return error but not")
9393
}

Diff for: scraper/scraper.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,26 @@ package scraper
1515

1616
import (
1717
"crypto/tls"
18+
"log/slog"
1819
"net/http"
1920
"time"
2021

21-
"github.com/go-kit/log"
22-
"github.com/go-kit/log/level"
2322
"github.com/prometheus/client_golang/prometheus"
2423
"github.com/prometheus/client_golang/prometheus/promhttp"
2524
"github.com/prometheus/memcached_exporter/pkg/exporter"
2625
)
2726

2827
type Scraper struct {
29-
logger log.Logger
28+
logger *slog.Logger
3029
timeout time.Duration
3130
tlsConfig *tls.Config
3231

3332
scrapeCount prometheus.Counter
3433
scrapeErrors prometheus.Counter
3534
}
3635

37-
func New(timeout time.Duration, logger log.Logger, tlsConfig *tls.Config) *Scraper {
38-
level.Debug(logger).Log("msg", "Started scrapper")
36+
func New(timeout time.Duration, logger *slog.Logger, tlsConfig *tls.Config) *Scraper {
37+
logger.Debug("Started scrapper")
3938
return &Scraper{
4039
logger: logger,
4140
timeout: timeout,
@@ -54,12 +53,12 @@ func New(timeout time.Duration, logger log.Logger, tlsConfig *tls.Config) *Scrap
5453
func (s *Scraper) Handler() http.HandlerFunc {
5554
return func(w http.ResponseWriter, r *http.Request) {
5655
target := r.URL.Query().Get("target")
57-
level.Debug(s.logger).Log("msg", "scrapping memcached", "target", target)
56+
s.logger.Debug("scrapping memcached", "target", target)
5857
s.scrapeCount.Inc()
5958

6059
if target == "" {
6160
errorStr := "'target' parameter must be specified"
62-
level.Warn(s.logger).Log("msg", errorStr)
61+
s.logger.Warn(errorStr)
6362
http.Error(w, errorStr, http.StatusBadRequest)
6463
s.scrapeErrors.Inc()
6564
return

Diff for: scraper/scraper_test.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ import (
2020
"testing"
2121
"time"
2222

23-
"github.com/go-kit/log"
23+
"github.com/prometheus/common/promslog"
2424
)
2525

2626
func TestHandler(t *testing.T) {
2727
t.Run("Success", func(t *testing.T) {
2828
t.Parallel()
2929

30-
s := New(1*time.Second, log.NewNopLogger(), nil)
30+
s := New(1*time.Second, promslog.NewNopLogger(), nil)
3131

3232
req, err := http.NewRequest("GET", "/?target=127.0.0.1:11211", nil)
3333

@@ -55,7 +55,7 @@ func TestHandler(t *testing.T) {
5555
t.Run("No target", func(t *testing.T) {
5656
t.Parallel()
5757

58-
s := New(1*time.Second, log.NewNopLogger(), nil)
58+
s := New(1*time.Second, promslog.NewNopLogger(), nil)
5959

6060
req, err := http.NewRequest("GET", "/", nil)
6161

0 commit comments

Comments
 (0)