diff --git a/.circleci/config.yml b/.circleci/config.yml index 889fca2..6807695 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,7 +5,7 @@ executors: # Whenever the Go version is updated here, .promu.yml should also be updated. golang: docker: - - image: cimg/go:1.22 + - image: cimg/go:1.23 jobs: test: executor: golang diff --git a/.promu.yml b/.promu.yml index 2ec1cc3..e73945c 100644 --- a/.promu.yml +++ b/.promu.yml @@ -1,7 +1,7 @@ go: # Whenever the Go version is updated here, .circle/config.yml should also # be updated. - version: 1.22 + version: 1.23 repository: path: github.com/prometheus/statsd_exporter build: diff --git a/bridge_test.go b/bridge_test.go index ae2aff7..e3962af 100644 --- a/bridge_test.go +++ b/bridge_test.go @@ -15,14 +15,15 @@ package main import ( "fmt" + "log/slog" "net" "reflect" "testing" "time" - "github.com/go-kit/log" "github.com/prometheus/client_golang/prometheus" dto "github.com/prometheus/client_model/go" + "github.com/prometheus/common/promslog" "github.com/prometheus/statsd_exporter/pkg/clock" "github.com/prometheus/statsd_exporter/pkg/event" @@ -592,7 +593,7 @@ func TestHandlePacket(t *testing.T) { for k, l := range []statsDPacketHandler{&listener.StatsDUDPListener{ Conn: nil, EventHandler: nil, - Logger: log.NewNopLogger(), + Logger: promslog.NewNopLogger(), LineParser: parser, UDPPackets: udpPackets, UDPPacketDrops: udpPacketDrops, @@ -605,7 +606,7 @@ func TestHandlePacket(t *testing.T) { }, &mockStatsDTCPListener{listener.StatsDTCPListener{ Conn: nil, EventHandler: nil, - Logger: log.NewNopLogger(), + Logger: promslog.NewNopLogger(), LineParser: parser, LinesReceived: linesReceived, EventsFlushed: eventsFlushed, @@ -616,7 +617,7 @@ func TestHandlePacket(t *testing.T) { TCPConnections: tcpConnections, TCPErrors: tcpErrors, TCPLineTooLong: tcpLineTooLong, - }, log.NewNopLogger()}} { + }, promslog.NewNopLogger()}} { events := make(chan event.Events, 32) l.SetEventHandler(&event.UnbufferedEventHandler{C: events}) for i, scenario := range scenarios { @@ -649,7 +650,7 @@ type statsDPacketHandler interface { type mockStatsDTCPListener struct { listener.StatsDTCPListener - log.Logger + *slog.Logger } func (ml *mockStatsDTCPListener) HandlePacket(packet []byte) { @@ -710,7 +711,7 @@ mappings: events := make(chan event.Events) defer close(events) go func() { - ex := exporter.NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := exporter.NewExporter(prometheus.DefaultRegisterer, testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) }() diff --git a/exporter_benchmark_test.go b/exporter_benchmark_test.go index 2e13627..f8ab266 100644 --- a/exporter_benchmark_test.go +++ b/exporter_benchmark_test.go @@ -17,9 +17,8 @@ import ( "fmt" "testing" - "github.com/go-kit/log" - "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/common/promslog" "github.com/prometheus/statsd_exporter/pkg/event" "github.com/prometheus/statsd_exporter/pkg/exporter" @@ -43,7 +42,7 @@ func benchmarkUDPListener(times int, b *testing.B) { "some_very_useful_metrics_with_quite_a_log_name:13|c", } bytesInput := make([]string, len(input)*times) - logger := log.NewNopLogger() + logger := promslog.NewNopLogger() for run := 0; run < times; run++ { for i := 0; i < len(input); i++ { bytesInput[run*len(input)+i] = fmt.Sprintf("run%d%s", run, input[i]) @@ -175,7 +174,7 @@ mappings: b.Fatalf("Config load error: %s %s", config, err) } - ex := exporter.NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := exporter.NewExporter(prometheus.DefaultRegisterer, testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) // reset benchmark timer to not measure startup costs b.ResetTimer() diff --git a/go.mod b/go.mod index 513f5b3..3ed6249 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,14 @@ module github.com/prometheus/statsd_exporter -go 1.21 +go 1.22 require ( github.com/alecthomas/kingpin/v2 v2.4.0 - github.com/go-kit/log v0.2.1 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da - github.com/prometheus/client_golang v1.20.3 + github.com/prometheus/client_golang v1.20.4 github.com/prometheus/client_model v0.6.1 - github.com/prometheus/common v0.57.0 - github.com/prometheus/exporter-toolkit v0.11.0 + github.com/prometheus/common v0.60.0 + github.com/prometheus/exporter-toolkit v0.13.0 github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807 gopkg.in/yaml.v2 v2.4.0 ) @@ -19,18 +18,19 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect - github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/klauspost/compress v1.17.9 // indirect + github.com/mdlayher/socket v0.4.1 // indirect + github.com/mdlayher/vsock v1.2.1 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect - golang.org/x/crypto v0.26.0 // indirect - golang.org/x/net v0.28.0 // indirect - golang.org/x/oauth2 v0.22.0 // indirect + golang.org/x/crypto v0.27.0 // indirect + golang.org/x/net v0.29.0 // indirect + golang.org/x/oauth2 v0.23.0 // indirect golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.24.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect google.golang.org/protobuf v1.34.2 // indirect ) diff --git a/go.sum b/go.sum index b101d44..993d436 100644 --- a/go.sum +++ b/go.sum @@ -11,10 +11,6 @@ github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= -github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= -github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -30,20 +26,24 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U= +github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA= +github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ= +github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.20.3 h1:oPksm4K8B+Vt35tUhw6GbSNSgVlVSBH0qELP/7u83l4= -github.com/prometheus/client_golang v1.20.3/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.57.0 h1:Ro/rKjwdq9mZn1K5QPctzh+MA4Lp0BuYk5ZZEVhoNcY= -github.com/prometheus/common v0.57.0/go.mod h1:7uRPFSUTbfZWsJ7MHY56sqt7hLQu3bxXHDnNhl8E9qI= -github.com/prometheus/exporter-toolkit v0.11.0 h1:yNTsuZ0aNCNFQ3aFTD2uhPOvr4iD7fdBvKPAEGkNf+g= -github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrPB/OLRIgN74qlQbV+FK1Q= +github.com/prometheus/common v0.60.0 h1:+V9PAREWNvJMAuJ1x1BaWl9dewMW4YrHZQbx0sJNllA= +github.com/prometheus/common v0.60.0/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw= +github.com/prometheus/exporter-toolkit v0.13.0 h1:lmA0Q+8IaXgmFRKw09RldZmZdnvu9wwcDLIXGmTPw1c= +github.com/prometheus/exporter-toolkit v0.13.0/go.mod h1:2uop99EZl80KdXhv/MxVI2181fMcwlsumFOqBecGkG0= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= @@ -61,18 +61,18 @@ github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807 h1:LUsDduamluc github.com/stvp/go-udp-testing v0.0.0-20201019212854-469649b16807/go.mod h1:7jxmlfBCDBXRzr0eAQJ48XC1hBu1np4CS5+cHEYfwpc= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= -golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= -golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= -golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= -golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A= +golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +golang.org/x/oauth2 v0.23.0 h1:PbgcYx2W7i4LvjJWEbf0ngHV6qJYr86PkAV3bXdLEbs= +golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= -golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= -golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/line_benchmark_test.go b/line_benchmark_test.go index 12a2081..b917bcd 100644 --- a/line_benchmark_test.go +++ b/line_benchmark_test.go @@ -16,7 +16,7 @@ package main import ( "testing" - "github.com/go-kit/log" + "github.com/prometheus/common/promslog" "github.com/prometheus/statsd_exporter/pkg/line" ) @@ -36,7 +36,7 @@ var ( "foo15:200|ms:300|ms:5|c|@0.1:6|g\nfoo15a:1|c:5|ms", "some_very_useful_metrics_with_quite_a_log_name:13|c", } - nopLogger = log.NewNopLogger() + nopLogger = promslog.NewNopLogger() ) func benchmarkLinesToEvents(times int, b *testing.B, input []string) { diff --git a/main.go b/main.go index 29223bf..688e6b1 100644 --- a/main.go +++ b/main.go @@ -16,6 +16,7 @@ package main import ( "bufio" "fmt" + "log/slog" "net" "net/http" _ "net/http/pprof" @@ -25,20 +26,18 @@ import ( "syscall" "github.com/alecthomas/kingpin/v2" - "github.com/go-kit/log" "github.com/prometheus/client_golang/prometheus" versioncollector "github.com/prometheus/client_golang/prometheus/collectors/version" "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/prometheus/common/promlog" - "github.com/prometheus/common/promlog/flag" + "github.com/prometheus/common/promslog" + "github.com/prometheus/common/promslog/flag" "github.com/prometheus/common/version" "github.com/prometheus/exporter-toolkit/web" "github.com/prometheus/statsd_exporter/pkg/address" "github.com/prometheus/statsd_exporter/pkg/event" "github.com/prometheus/statsd_exporter/pkg/exporter" - "github.com/prometheus/statsd_exporter/pkg/level" "github.com/prometheus/statsd_exporter/pkg/line" "github.com/prometheus/statsd_exporter/pkg/listener" "github.com/prometheus/statsd_exporter/pkg/mapper" @@ -174,49 +173,49 @@ var ( ) ) -func serveHTTP(mux http.Handler, listenAddress string, logger log.Logger) { - level.Error(logger).Log("msg", http.ListenAndServe(listenAddress, mux)) +func serveHTTP(mux http.Handler, listenAddress string, logger *slog.Logger) { + logger.Error(http.ListenAndServe(listenAddress, mux).Error()) os.Exit(1) } -func sighupConfigReloader(fileName string, mapper *mapper.MetricMapper, logger log.Logger) { +func sighupConfigReloader(fileName string, mapper *mapper.MetricMapper, logger *slog.Logger) { signals := make(chan os.Signal, 1) signal.Notify(signals, syscall.SIGHUP) for s := range signals { if fileName == "" { - level.Warn(logger).Log("msg", "Received signal but no mapping config to reload", "signal", s) + logger.Warn("Received signal but no mapping config to reload", "signal", s) continue } - level.Info(logger).Log("msg", "Received signal, attempting reload", "signal", s) + logger.Info("Received signal, attempting reload", "signal", s) reloadConfig(fileName, mapper, logger) } } -func reloadConfig(fileName string, mapper *mapper.MetricMapper, logger log.Logger) { +func reloadConfig(fileName string, mapper *mapper.MetricMapper, logger *slog.Logger) { err := mapper.InitFromFile(fileName) if err != nil { - level.Info(logger).Log("msg", "Error reloading config", "error", err) + logger.Info("Error reloading config", "error", err) configLoads.WithLabelValues("failure").Inc() } else { - level.Info(logger).Log("msg", "Config reloaded successfully") + logger.Info("Config reloaded successfully") configLoads.WithLabelValues("success").Inc() } } -func dumpFSM(mapper *mapper.MetricMapper, dumpFilename string, logger log.Logger) error { +func dumpFSM(mapper *mapper.MetricMapper, dumpFilename string, logger *slog.Logger) error { f, err := os.Create(dumpFilename) if err != nil { return err } - level.Info(logger).Log("msg", "Start dumping FSM", "file_name", dumpFilename) + logger.Info("Start dumping FSM", "file_name", dumpFilename) w := bufio.NewWriter(f) mapper.FSM.DumpFSM(w) w.Flush() f.Close() - level.Info(logger).Log("msg", "Finish dumping FSM") + logger.Info("Finish dumping FSM") return nil } @@ -271,17 +270,13 @@ func main() { udpPacketQueueSize = kingpin.Flag("statsd.udp-packet-queue-size", "Size of internal queue for processing UDP packets.").Default("10000").Int() ) - promlogConfig := &promlog.Config{} - flag.AddFlags(kingpin.CommandLine, promlogConfig) + promslogConfig := &promslog.Config{} + flag.AddFlags(kingpin.CommandLine, promslogConfig) kingpin.Version(version.Print("statsd_exporter")) kingpin.CommandLine.UsageWriter(os.Stdout) kingpin.HelpFlag.Short('h') kingpin.Parse() - logger := promlog.New(promlogConfig) - if err := level.SetLogLevel(promlogConfig.Level.String()); err != nil { - level.Error(logger).Log("msg", "failed to set log level", "error", err) - os.Exit(1) - } + logger := promslog.New(promslogConfig) prometheus.MustRegister(versioncollector.NewCollector("statsd_exporter")) parser := line.NewParser() @@ -298,8 +293,8 @@ func main() { parser.EnableSignalFXParsing() } - level.Info(logger).Log("msg", "Starting StatsD -> Prometheus Exporter", "version", version.Info()) - level.Info(logger).Log("msg", "Build context", "context", version.BuildContext()) + logger.Info("Starting StatsD -> Prometheus Exporter", "version", version.Info()) + logger.Info("Build context", "context", version.BuildContext()) events := make(chan event.Events, *eventQueueSize) defer close(events) @@ -309,7 +304,7 @@ func main() { cache, err := getCache(*cacheSize, *cacheType, thisMapper.Registerer) if err != nil { - level.Error(logger).Log("msg", "Unable to setup metric mapper cache", "error", err) + logger.Error("Unable to setup metric mapper cache", "error", err) os.Exit(1) } thisMapper.UseCache(cache) @@ -317,13 +312,13 @@ func main() { if *mappingConfig != "" { err := thisMapper.InitFromFile(*mappingConfig) if err != nil { - level.Error(logger).Log("msg", "error loading config", "error", err) + logger.Error("error loading config", "error", err) os.Exit(1) } if *dumpFSMPath != "" { err := dumpFSM(thisMapper, *dumpFSMPath, logger) if err != nil { - level.Error(logger).Log("msg", "error dumping FSM", "error", err) + logger.Error("error dumping FSM", "error", err) // Failure to dump the FSM is an error (the user asked for it and it // didn't happen) but not fatal (the exporter is fully functional // afterwards). @@ -334,7 +329,7 @@ func main() { exporter := exporter.NewExporter(prometheus.DefaultRegisterer, thisMapper, logger, eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) if *checkConfig { - level.Info(logger).Log("msg", "Configuration check successful, exiting") + logger.Info("Configuration check successful, exiting") return } @@ -343,35 +338,35 @@ func main() { var err error relayTarget, err = relay.NewRelay(logger, *relayAddr, *relayPacketLen) if err != nil { - level.Error(logger).Log("msg", "Unable to create relay", "err", err) + logger.Error("Unable to create relay", "err", err) os.Exit(1) } } - level.Info(logger).Log("msg", "Accepting StatsD Traffic", "udp", *statsdListenUDP, "tcp", *statsdListenTCP, "unixgram", *statsdListenUnixgram) - level.Info(logger).Log("msg", "Accepting Prometheus Requests", "addr", *listenAddress) + logger.Info("Accepting StatsD Traffic", "udp", *statsdListenUDP, "tcp", *statsdListenTCP, "unixgram", *statsdListenUnixgram) + logger.Info("Accepting Prometheus Requests", "addr", *listenAddress) if *statsdListenUDP == "" && *statsdListenTCP == "" && *statsdListenUnixgram == "" { - level.Error(logger).Log("At least one of UDP/TCP/Unixgram listeners must be specified.") + logger.Error("At least one of UDP/TCP/Unixgram listeners must be specified.") os.Exit(1) } if *statsdListenUDP != "" { udpListenAddr, err := address.UDPAddrFromString(*statsdListenUDP) if err != nil { - level.Error(logger).Log("msg", "invalid UDP listen address", "address", *statsdListenUDP, "error", err) + logger.Error("invalid UDP listen address", "address", *statsdListenUDP, "error", err) os.Exit(1) } uconn, err := net.ListenUDP("udp", udpListenAddr) if err != nil { - level.Error(logger).Log("msg", "failed to start UDP listener", "error", err) + logger.Error("failed to start UDP listener", "error", err) os.Exit(1) } if *readBuffer != 0 { err = uconn.SetReadBuffer(*readBuffer) if err != nil { - level.Error(logger).Log("msg", "error setting UDP read buffer", "error", err) + logger.Error("error setting UDP read buffer", "error", err) os.Exit(1) } } @@ -401,12 +396,12 @@ func main() { if *statsdListenTCP != "" { tcpListenAddr, err := address.TCPAddrFromString(*statsdListenTCP) if err != nil { - level.Error(logger).Log("msg", "invalid TCP listen address", "address", *statsdListenUDP, "error", err) + logger.Error("invalid TCP listen address", "address", *statsdListenUDP, "error", err) os.Exit(1) } tconn, err := net.ListenTCP("tcp", tcpListenAddr) if err != nil { - level.Error(logger).Log("msg", err) + logger.Error("failed to start TCP listener", "err", err) os.Exit(1) } defer tconn.Close() @@ -434,7 +429,7 @@ func main() { if *statsdListenUnixgram != "" { var err error if _, err = os.Stat(*statsdListenUnixgram); !os.IsNotExist(err) { - level.Error(logger).Log("msg", "Unixgram socket already exists", "socket_name", *statsdListenUnixgram) + logger.Error("Unixgram socket already exists", "socket_name", *statsdListenUnixgram) os.Exit(1) } uxgconn, err := net.ListenUnixgram("unixgram", &net.UnixAddr{ @@ -442,7 +437,7 @@ func main() { Name: *statsdListenUnixgram, }) if err != nil { - level.Error(logger).Log("msg", "failed to listen on Unixgram socket", "error", err) + logger.Error("failed to listen on Unixgram socket", "error", err) os.Exit(1) } @@ -451,7 +446,7 @@ func main() { if *readBuffer != 0 { err = uxgconn.SetReadBuffer(*readBuffer) if err != nil { - level.Error(logger).Log("msg", "error setting Unixgram read buffer", "error", err) + logger.Error("error setting Unixgram read buffer", "error", err) os.Exit(1) } } @@ -481,11 +476,11 @@ func main() { // convert the string to octet perm, err := strconv.ParseInt("0"+string(*statsdUnixSocketMode), 8, 32) if err != nil { - level.Warn(logger).Log("Bad permission %s: %v, ignoring\n", *statsdUnixSocketMode, err) + logger.Warn("Bad permission %s: %v, ignoring\n", *statsdUnixSocketMode, err) } else { err = os.Chmod(*statsdListenUnixgram, os.FileMode(perm)) if err != nil { - level.Warn(logger).Log("Failed to change unixgram socket permission: %v", err) + logger.Warn("Failed to change unixgram socket permission", "error", err) } } } @@ -507,7 +502,7 @@ func main() { } landingPage, err := web.NewLandingPage(landingConfig) if err != nil { - level.Error(logger).Log("err", err) + logger.Error("error creating landing page", "err", err) os.Exit(1) } mux.Handle("/", landingPage) @@ -520,10 +515,10 @@ func main() { if r.Method == http.MethodPut || r.Method == http.MethodPost { fmt.Fprintf(w, "Requesting reload") if *mappingConfig == "" { - level.Warn(logger).Log("msg", "Received lifecycle api reload but no mapping config to reload") + logger.Warn("Received lifecycle api reload but no mapping config to reload") return } - level.Info(logger).Log("msg", "Received lifecycle api reload, attempting reload") + logger.Info("Received lifecycle api reload, attempting reload") reloadConfig(*mappingConfig, thisMapper, logger) } }) @@ -537,7 +532,7 @@ func main() { mux.HandleFunc("/-/healthy", func(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodGet { - level.Debug(logger).Log("msg", "Received health check") + logger.Debug("Received health check") w.WriteHeader(http.StatusOK) fmt.Fprintf(w, "Statsd Exporter is Healthy.\n") } @@ -545,7 +540,7 @@ func main() { mux.HandleFunc("/-/ready", func(w http.ResponseWriter, r *http.Request) { if r.Method == http.MethodGet { - level.Debug(logger).Log("msg", "Received ready check") + logger.Debug("Received ready check") w.WriteHeader(http.StatusOK) fmt.Fprintf(w, "Statsd Exporter is Ready.\n") } @@ -562,8 +557,8 @@ func main() { // quit if we get a message on either channel select { case sig := <-signals: - level.Info(logger).Log("msg", "Received os signal, exiting", "signal", sig.String()) + logger.Info("Received os signal, exiting", "signal", sig.String()) case <-quitChan: - level.Info(logger).Log("msg", "Received lifecycle api quit, exiting") + logger.Info("Received lifecycle api quit, exiting") } } diff --git a/pkg/exporter/exporter.go b/pkg/exporter/exporter.go index f35cde5..134249e 100644 --- a/pkg/exporter/exporter.go +++ b/pkg/exporter/exporter.go @@ -14,15 +14,14 @@ package exporter import ( + "log/slog" "os" "time" - "github.com/go-kit/log" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/statsd_exporter/pkg/clock" "github.com/prometheus/statsd_exporter/pkg/event" - "github.com/prometheus/statsd_exporter/pkg/level" "github.com/prometheus/statsd_exporter/pkg/mapper" "github.com/prometheus/statsd_exporter/pkg/registry" ) @@ -43,7 +42,7 @@ type Registry interface { type Exporter struct { Mapper *mapper.MetricMapper Registry Registry - Logger log.Logger + Logger *slog.Logger EventsActions *prometheus.CounterVec EventsUnmapped prometheus.Counter ErrorEventStats *prometheus.CounterVec @@ -63,7 +62,7 @@ func (b *Exporter) Listen(e <-chan event.Events) { b.Registry.RemoveStaleMetrics() case events, ok := <-e: if !ok { - level.Debug(b.Logger).Log("msg", "Channel is closed. Break out of Exporter.Listener.") + b.Logger.Debug("Channel is closed. Break out of Exporter.Listener.") removeStaleMetricsTicker.Stop() return } @@ -99,7 +98,7 @@ func (b *Exporter) handleEvent(thisEvent event.Event) { prometheusLabels := thisEvent.Labels() if present { if mapping.Name == "" { - level.Debug(b.Logger).Log("msg", "The mapping generates an empty metric name", "metric_name", thisEvent.MetricName(), "match", mapping.Match) + b.Logger.Debug("The mapping generates an empty metric name", "metric_name", thisEvent.MetricName(), "match", mapping.Match) b.ErrorEventStats.WithLabelValues("empty_metric_name").Inc() return } @@ -127,7 +126,7 @@ func (b *Exporter) handleEvent(thisEvent event.Event) { // We don't accept negative values for counters. Incrementing the counter with a negative number // will cause the exporter to panic. Instead we will warn and continue to the next event. if eventValue < 0.0 { - level.Debug(b.Logger).Log("msg", "counter must be non-negative value", "metric", metricName, "event_value", eventValue) + b.Logger.Debug("counter must be non-negative value", "metric", metricName, "event_value", eventValue) b.ErrorEventStats.WithLabelValues("illegal_negative_counter").Inc() return } @@ -137,7 +136,7 @@ func (b *Exporter) handleEvent(thisEvent event.Event) { counter.Add(eventValue) b.EventStats.WithLabelValues("counter").Inc() } else { - level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + b.Logger.Debug(regErrF, "metric", metricName, "error", err) b.ConflictingEventStats.WithLabelValues("counter").Inc() } @@ -152,7 +151,7 @@ func (b *Exporter) handleEvent(thisEvent event.Event) { } b.EventStats.WithLabelValues("gauge").Inc() } else { - level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + b.Logger.Debug(regErrF, "metric", metricName, "error", err) b.ConflictingEventStats.WithLabelValues("gauge").Inc() } @@ -172,7 +171,7 @@ func (b *Exporter) handleEvent(thisEvent event.Event) { histogram.Observe(eventValue) b.EventStats.WithLabelValues("observer").Inc() } else { - level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + b.Logger.Debug(regErrF, "metric", metricName, "error", err) b.ConflictingEventStats.WithLabelValues("observer").Inc() } @@ -182,22 +181,22 @@ func (b *Exporter) handleEvent(thisEvent event.Event) { summary.Observe(eventValue) b.EventStats.WithLabelValues("observer").Inc() } else { - level.Debug(b.Logger).Log("msg", regErrF, "metric", metricName, "error", err) + b.Logger.Debug(regErrF, "metric", metricName, "error", err) b.ConflictingEventStats.WithLabelValues("observer").Inc() } default: - level.Error(b.Logger).Log("msg", "unknown observer type", "type", t) + b.Logger.Error("unknown observer type", "type", t) os.Exit(1) } default: - level.Debug(b.Logger).Log("msg", "Unsupported event type") + b.Logger.Debug("Unsupported event type") b.EventStats.WithLabelValues("illegal").Inc() } } -func NewExporter(reg prometheus.Registerer, mapper *mapper.MetricMapper, logger log.Logger, eventsActions *prometheus.CounterVec, eventsUnmapped prometheus.Counter, errorEventStats *prometheus.CounterVec, eventStats *prometheus.CounterVec, conflictingEventStats *prometheus.CounterVec, metricsCount *prometheus.GaugeVec) *Exporter { +func NewExporter(reg prometheus.Registerer, mapper *mapper.MetricMapper, logger *slog.Logger, eventsActions *prometheus.CounterVec, eventsUnmapped prometheus.Counter, errorEventStats *prometheus.CounterVec, eventStats *prometheus.CounterVec, conflictingEventStats *prometheus.CounterVec, metricsCount *prometheus.GaugeVec) *Exporter { return &Exporter{ Mapper: mapper, Registry: registry.NewRegistry(reg, mapper), diff --git a/pkg/exporter/exporter_test.go b/pkg/exporter/exporter_test.go index da08aee..8a8d153 100644 --- a/pkg/exporter/exporter_test.go +++ b/pkg/exporter/exporter_test.go @@ -15,13 +15,14 @@ package exporter import ( "fmt" + "log/slog" "net" "testing" "time" - "github.com/go-kit/log" "github.com/prometheus/client_golang/prometheus" dto "github.com/prometheus/client_model/go" + "github.com/prometheus/common/promslog" "github.com/prometheus/statsd_exporter/pkg/clock" "github.com/prometheus/statsd_exporter/pkg/event" @@ -172,7 +173,7 @@ func TestNegativeCounter(t *testing.T) { testMapper := mapper.MetricMapper{} - ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) updated := getTelemetryCounterValue(errorCounter) @@ -253,7 +254,7 @@ mappings: t.Fatalf("Config load error: %s %s", config, err) } - ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) metrics, err := prometheus.DefaultGatherer.Gather() @@ -316,7 +317,7 @@ mappings: t.Fatalf("Config load error: %s %s", config, err) } - ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) metrics, err := prometheus.DefaultGatherer.Gather() @@ -359,14 +360,14 @@ mappings: honor_labels: true ` testMapper := &mapper.MetricMapper{ - Logger: log.NewNopLogger(), + Logger: promslog.NewNopLogger(), } err := testMapper.InitFromYAMLString(config) if err != nil { t.Fatalf("Config load error: %s %s", config, err) } - ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) metrics, err := prometheus.DefaultGatherer.Gather() @@ -647,7 +648,7 @@ mappings: close(events) }() reg := prometheus.NewRegistry() - ex := NewExporter(reg, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(reg, testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) metrics, err := reg.Gather() @@ -702,7 +703,7 @@ mappings: errorCounter := errorEventStats.WithLabelValues("empty_metric_name") prev := getTelemetryCounterValue(errorCounter) - ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) updated := getTelemetryCounterValue(errorCounter) @@ -736,7 +737,7 @@ func TestInvalidUtf8InDatadogTagValue(t *testing.T) { for _, l := range []statsDPacketHandler{&listener.StatsDUDPListener{ Conn: nil, EventHandler: nil, - Logger: log.NewNopLogger(), + Logger: promslog.NewNopLogger(), LineParser: parser, UDPPackets: udpPackets, UDPPacketDrops: udpPacketDrops, @@ -749,7 +750,7 @@ func TestInvalidUtf8InDatadogTagValue(t *testing.T) { }, &mockStatsDTCPListener{listener.StatsDTCPListener{ Conn: nil, EventHandler: nil, - Logger: log.NewNopLogger(), + Logger: promslog.NewNopLogger(), LineParser: parser, LinesReceived: linesReceived, EventsFlushed: eventsFlushed, @@ -760,7 +761,7 @@ func TestInvalidUtf8InDatadogTagValue(t *testing.T) { TCPConnections: tcpConnections, TCPErrors: tcpErrors, TCPLineTooLong: tcpLineTooLong, - }, log.NewNopLogger()}} { + }, promslog.NewNopLogger()}} { l.SetEventHandler(ueh) l.HandlePacket([]byte("bar:200|c|#tag:value\nbar:200|c|#tag:\xc3\x28invalid")) } @@ -769,7 +770,7 @@ func TestInvalidUtf8InDatadogTagValue(t *testing.T) { testMapper := mapper.MetricMapper{} - ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) } @@ -782,7 +783,7 @@ func TestSummaryWithQuantilesEmptyMapping(t *testing.T) { go func() { testMapper := mapper.MetricMapper{} - ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) }() @@ -825,7 +826,7 @@ func TestHistogramUnits(t *testing.T) { events := make(chan event.Events) go func() { testMapper := mapper.MetricMapper{} - ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Mapper.Defaults.ObserverType = mapper.ObserverTypeHistogram ex.Listen(events) }() @@ -861,7 +862,7 @@ func TestCounterIncrement(t *testing.T) { events := make(chan event.Events) go func() { testMapper := mapper.MetricMapper{} - ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) }() @@ -908,7 +909,7 @@ func TestGaugeIncrementDecrement(t *testing.T) { events := make(chan event.Events) go func() { testMapper := mapper.MetricMapper{} - ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) }() @@ -970,7 +971,7 @@ func TestScaledMapping(t *testing.T) { // Start exporter with a synchronous channel go func() { - ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, &testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) }() @@ -1018,7 +1019,7 @@ type statsDPacketHandler interface { type mockStatsDTCPListener struct { listener.StatsDTCPListener - log.Logger + *slog.Logger } func (ml *mockStatsDTCPListener) HandlePacket(packet []byte) { @@ -1079,7 +1080,7 @@ mappings: events := make(chan event.Events) defer close(events) go func() { - ex := NewExporter(prometheus.DefaultRegisterer, testMapper, log.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) + ex := NewExporter(prometheus.DefaultRegisterer, testMapper, promslog.NewNopLogger(), eventsActions, eventsUnmapped, errorEventStats, eventStats, conflictingEventStats, metricsCount) ex.Listen(events) }() @@ -1291,7 +1292,7 @@ func BenchmarkParseDogStatsDTags(b *testing.B) { b.Run(name, func(b *testing.B) { for n := 0; n < b.N; n++ { labels := map[string]string{} - parser.ParseDogStatsDTags(tags, labels, tagErrors, log.NewNopLogger()) + parser.ParseDogStatsDTags(tags, labels, tagErrors, promslog.NewNopLogger()) } }) } diff --git a/pkg/level/level.go b/pkg/level/level.go deleted file mode 100644 index 5b03c6d..0000000 --- a/pkg/level/level.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2021 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package level - -import ( - "fmt" - - "github.com/go-kit/log" - "github.com/go-kit/log/level" -) - -var logLevel = LevelInfo - -// A Level is a logging priority. Higher levels are more important. -type Level int - -const ( - // LevelDebug logs are typically voluminous, and are usually disabled in - // production. - LevelDebug Level = iota - // LevelInfo is the default logging priority. - LevelInfo - // LevelWarn logs are more important than Info, but don't need individual - // human review. - LevelWarn - // LevelError logs are high-priority. If an application is running smoothly, - // it shouldn't generate any error-level logs. - LevelError -) - -var emptyLogger = &EmptyLogger{} - -type EmptyLogger struct{} - -func (l *EmptyLogger) Log(keyvals ...interface{}) error { - return nil -} - -// SetLogLevel sets the log level. -func SetLogLevel(level string) error { - switch level { - case "debug": - logLevel = LevelDebug - case "info": - logLevel = LevelInfo - case "warn": - logLevel = LevelWarn - case "error": - logLevel = LevelError - default: - return fmt.Errorf("unrecognized log level %s", level) - } - return nil -} - -// Error returns a logger that includes a Key/ErrorValue pair. -func Error(logger log.Logger) log.Logger { - if logLevel <= LevelError { - return level.Error(logger) - } - return emptyLogger -} - -// Warn returns a logger that includes a Key/WarnValue pair. -func Warn(logger log.Logger) log.Logger { - if logLevel <= LevelWarn { - return level.Warn(logger) - } - return emptyLogger -} - -// Info returns a logger that includes a Key/InfoValue pair. -func Info(logger log.Logger) log.Logger { - if logLevel <= LevelInfo { - return level.Info(logger) - } - return emptyLogger -} - -// Debug returns a logger that includes a Key/DebugValue pair. -func Debug(logger log.Logger) log.Logger { - if logLevel <= LevelDebug { - return level.Debug(logger) - } - return emptyLogger -} diff --git a/pkg/level/level_test.go b/pkg/level/level_test.go deleted file mode 100644 index 908146f..0000000 --- a/pkg/level/level_test.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2021 The Prometheus Authors -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package level - -import ( - "bytes" - "strings" - "testing" - - "github.com/go-kit/log" -) - -func TestSetLogLevel(t *testing.T) { - tests := []struct { - name string - level string - logLevel Level - wantErr bool - }{ - {"wrong level", "foo", LevelInfo, true}, - {"level debug", "debug", LevelDebug, false}, - {"level info", "info", LevelInfo, false}, - {"level warn", "warn", LevelWarn, false}, - {"level error", "error", LevelError, false}, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if err := SetLogLevel(tt.level); (err != nil) != tt.wantErr { - t.Fatalf("Expected log level to be set successfully, but got %v", err) - } - if tt.logLevel != logLevel { - t.Fatalf("Expected log level %v, but got %v", tt.logLevel, logLevel) - } - }) - } -} - -func TestVariousLevels(t *testing.T) { - tests := []struct { - name string - level string - want string - }{ - { - "level debug", - "debug", - strings.Join([]string{ - "level=debug log=debug", - "level=info log=info", - "level=warn log=warn", - "level=error log=error", - }, "\n"), - }, - { - "level info", - "info", - strings.Join([]string{ - "level=info log=info", - "level=warn log=warn", - "level=error log=error", - }, "\n"), - }, - { - "level warn", - "warn", - strings.Join([]string{ - "level=warn log=warn", - "level=error log=error", - }, "\n"), - }, - { - "level error", - "error", - strings.Join([]string{ - "level=error log=error", - }, "\n"), - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - var buf bytes.Buffer - logger := log.NewLogfmtLogger(&buf) - - if err := SetLogLevel(tt.level); err != nil { - t.Fatalf("Expected log level to be set successfully, but got %v", err) - } - - Debug(logger).Log("log", "debug") - Info(logger).Log("log", "info") - Warn(logger).Log("log", "warn") - Error(logger).Log("log", "error") - - got := strings.TrimSpace(buf.String()) - if tt.want != got { - t.Fatalf("Expected log output %v, but got %v", tt.want, got) - } - }) - } -} diff --git a/pkg/line/line.go b/pkg/line/line.go index 97d669f..7ee3570 100644 --- a/pkg/line/line.go +++ b/pkg/line/line.go @@ -15,15 +15,14 @@ package line import ( "fmt" + "log/slog" "strconv" "strings" "unicode/utf8" - "github.com/go-kit/log" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/statsd_exporter/pkg/event" - "github.com/prometheus/statsd_exporter/pkg/level" "github.com/prometheus/statsd_exporter/pkg/mapper" ) @@ -95,11 +94,11 @@ func buildEvent(statType, metric string, value float64, relative bool, labels ma } } -func parseTag(component, tag string, separator rune, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) { +func parseTag(component, tag string, separator rune, labels map[string]string, tagErrors prometheus.Counter, logger *slog.Logger) { // Entirely empty tag is an error if len(tag) == 0 { tagErrors.Inc() - level.Debug(logger).Log("msg", "Empty name tag", "component", component) + logger.Debug("Empty name tag", "component", component) return } @@ -111,7 +110,7 @@ func parseTag(component, tag string, separator rune, labels map[string]string, t if len(k) == 0 || len(v) == 0 { // Empty key or value is an error tagErrors.Inc() - level.Debug(logger).Log("msg", "Malformed name tag", "k", k, "v", v, "component", component) + logger.Debug("Malformed name tag", "k", k, "v", v, "component", component) } else { labels[mapper.EscapeMetricName(k)] = v } @@ -121,10 +120,10 @@ func parseTag(component, tag string, separator rune, labels map[string]string, t // Missing separator (no value) is an error tagErrors.Inc() - level.Debug(logger).Log("msg", "Malformed name tag", "tag", tag, "component", component) + logger.Debug("Malformed name tag", "tag", tag, "component", component) } -func parseNameTags(component string, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) { +func parseNameTags(component string, labels map[string]string, tagErrors prometheus.Counter, logger *slog.Logger) { lastTagEndIndex := 0 for i, c := range component { if c == ',' { @@ -148,7 +147,7 @@ func trimLeftHash(s string) string { return s } -func (p *Parser) ParseDogStatsDTags(component string, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) { +func (p *Parser) ParseDogStatsDTags(component string, labels map[string]string, tagErrors prometheus.Counter, logger *slog.Logger) { if p.DogstatsdTagsEnabled { lastTagEndIndex := 0 for i, c := range component { @@ -167,7 +166,7 @@ func (p *Parser) ParseDogStatsDTags(component string, labels map[string]string, } } -func (p *Parser) parseNameAndTags(name string, labels map[string]string, tagErrors prometheus.Counter, logger log.Logger) string { +func (p *Parser) parseNameAndTags(name string, labels map[string]string, tagErrors prometheus.Counter, logger *slog.Logger) string { if p.SignalFXTagsEnabled { // check for SignalFx tags first // `[` delimits start of tags by SignalFx @@ -183,7 +182,7 @@ func (p *Parser) parseNameAndTags(name string, labels map[string]string, tagErro return name[:startIdx] + name[endIdx+1:] case (startIdx != -1) != (endIdx != -1): // only one bracket, return unparsed - level.Debug(logger).Log("msg", "invalid SignalFx tags, not parsing", "metric", name) + logger.Debug("invalid SignalFx tags, not parsing", "metric", name) tagErrors.Inc() return name } @@ -202,7 +201,7 @@ func (p *Parser) parseNameAndTags(name string, labels map[string]string, tagErro return name } -func (p *Parser) LineToEvents(line string, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter, logger log.Logger) event.Events { +func (p *Parser) LineToEvents(line string, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter, logger *slog.Logger) event.Events { events := event.Events{} if line == "" { return events @@ -211,7 +210,7 @@ func (p *Parser) LineToEvents(line string, sampleErrors prometheus.CounterVec, s elements := strings.SplitN(line, ":", 2) if len(elements) < 2 || len(elements[0]) == 0 || !utf8.ValidString(line) { sampleErrors.WithLabelValues("malformed_line").Inc() - level.Debug(logger).Log("msg", "bad line", "line", line) + logger.Debug("bad line", "line", line) return events } @@ -223,7 +222,7 @@ func (p *Parser) LineToEvents(line string, sampleErrors prometheus.CounterVec, s // don't allow mixed tagging styles sampleErrors.WithLabelValues("mixed_tagging_styles").Inc() - level.Debug(logger).Log("msg", "bad line: multiple tagging styles", "line", line) + logger.Debug("bad line: multiple tagging styles", "line", line) return events } @@ -231,7 +230,7 @@ func (p *Parser) LineToEvents(line string, sampleErrors prometheus.CounterVec, s lineParts := strings.SplitN(elements[1], "|", 3) if len(lineParts) < 2 { sampleErrors.WithLabelValues("not_enough_parts_after_colon").Inc() - level.Debug(logger).Log("msg", "bad line: not enough '|'-delimited parts after first ':'", "line", line) + logger.Debug("bad line: not enough '|'-delimited parts after first ':'", "line", line) return events } if strings.Contains(lineParts[0], ":") { @@ -256,7 +255,7 @@ func (p *Parser) LineToEvents(line string, sampleErrors prometheus.CounterVec, s samples = aggLines } else { sampleErrors.WithLabelValues("invalid_extended_aggregate_type").Inc() - level.Debug(logger).Log("msg", "bad line: invalid extended aggregate type", "line", line) + logger.Debug("bad line: invalid extended aggregate type", "line", line) return events } } else if usingDogStatsDTags { @@ -272,7 +271,7 @@ samples: components := strings.Split(sample, "|") if len(components) < 2 || len(components) > 4 { sampleErrors.WithLabelValues("malformed_component").Inc() - level.Debug(logger).Log("msg", "bad component", "line", line) + logger.Debug("bad component", "line", line) continue } valueStr, statType := components[0], components[1] @@ -284,7 +283,7 @@ samples: value, err := strconv.ParseFloat(valueStr, 64) if err != nil { - level.Debug(logger).Log("msg", "bad value", "value", valueStr, "line", line) + logger.Debug("bad value", "value", valueStr, "line", line) sampleErrors.WithLabelValues("malformed_value").Inc() continue } @@ -293,7 +292,7 @@ samples: if len(components) >= 3 { for _, component := range components[2:] { if len(component) == 0 { - level.Debug(logger).Log("msg", "Empty component", "line", line) + logger.Debug("Empty component", "line", line) sampleErrors.WithLabelValues("malformed_component").Inc() continue samples } @@ -305,7 +304,7 @@ samples: samplingFactor, err := strconv.ParseFloat(component[1:], 64) if err != nil { - level.Debug(logger).Log("msg", "Invalid sampling factor", "component", component[1:], "line", line) + logger.Debug("Invalid sampling factor", "component", component[1:], "line", line) sampleErrors.WithLabelValues("invalid_sample_factor").Inc() } if samplingFactor == 0 { @@ -322,7 +321,7 @@ samples: case '#': p.ParseDogStatsDTags(component[1:], labels, tagErrors, logger) default: - level.Debug(logger).Log("msg", "Invalid sampling factor or tag section", "component", components[2], "line", line) + logger.Debug("Invalid sampling factor or tag section", "component", components[2], "line", line) sampleErrors.WithLabelValues("invalid_sample_factor").Inc() continue } @@ -336,7 +335,7 @@ samples: for i := 0; i < multiplyEvents; i++ { event, err := buildEvent(statType, metric, value, relative, labels) if err != nil { - level.Debug(logger).Log("msg", "Error building event", "line", line, "error", err) + logger.Debug("Error building event", "line", line, "error", err) sampleErrors.WithLabelValues("illegal_event").Inc() continue } diff --git a/pkg/line/line_test.go b/pkg/line/line_test.go index 305d790..a1a04c3 100644 --- a/pkg/line/line_test.go +++ b/pkg/line/line_test.go @@ -17,8 +17,8 @@ import ( "reflect" "testing" - "github.com/go-kit/log" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/common/promslog" "github.com/prometheus/statsd_exporter/pkg/event" ) @@ -49,7 +49,7 @@ var ( Help: "The number of errors parsing DogStatsD tags.", }, ) - nopLogger = log.NewNopLogger() + nopLogger = promslog.NewNopLogger() ) func TestLineToEvents(t *testing.T) { diff --git a/pkg/listener/listener.go b/pkg/listener/listener.go index 99e5792..ac27c14 100644 --- a/pkg/listener/listener.go +++ b/pkg/listener/listener.go @@ -16,26 +16,25 @@ package listener import ( "bufio" "io" + "log/slog" "net" "os" "strings" - "github.com/go-kit/log" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/statsd_exporter/pkg/event" - "github.com/prometheus/statsd_exporter/pkg/level" "github.com/prometheus/statsd_exporter/pkg/relay" ) type Parser interface { - LineToEvents(line string, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter, logger log.Logger) event.Events + LineToEvents(line string, sampleErrors prometheus.CounterVec, samplesReceived prometheus.Counter, tagErrors prometheus.Counter, tagsReceived prometheus.Counter, logger *slog.Logger) event.Events } type StatsDUDPListener struct { Conn *net.UDPConn EventHandler event.EventHandler - Logger log.Logger + Logger *slog.Logger LineParser Parser UDPPackets prometheus.Counter UDPPacketDrops prometheus.Counter @@ -64,7 +63,7 @@ func (l *StatsDUDPListener) Listen() { if strings.HasSuffix(err.Error(), "use of closed network connection") { return } - level.Error(l.Logger).Log("error", err) + l.Logger.Error("error reading from UDP connection", "err", err) return } @@ -94,7 +93,7 @@ func (l *StatsDUDPListener) ProcessUdpPacketQueue() { func (l *StatsDUDPListener) HandlePacket(packet []byte) { lines := strings.Split(string(packet), "\n") for _, line := range lines { - level.Debug(l.Logger).Log("msg", "Incoming line", "proto", "udp", "line", line) + l.Logger.Debug("Incoming line", "proto", "udp", "line", line) l.LinesReceived.Inc() if l.Relay != nil && len(line) > 0 { l.Relay.RelayLine(line) @@ -106,7 +105,7 @@ func (l *StatsDUDPListener) HandlePacket(packet []byte) { type StatsDTCPListener struct { Conn *net.TCPListener EventHandler event.EventHandler - Logger log.Logger + Logger *slog.Logger LineParser Parser LinesReceived prometheus.Counter EventsFlushed prometheus.Counter @@ -133,7 +132,7 @@ func (l *StatsDTCPListener) Listen() { if strings.HasSuffix(err.Error(), "use of closed network connection") { return } - level.Error(l.Logger).Log("msg", "AcceptTCP failed", "error", err) + l.Logger.Error("AcceptTCP failed", "error", err) os.Exit(1) } go l.HandleConn(c) @@ -151,14 +150,14 @@ func (l *StatsDTCPListener) HandleConn(c *net.TCPConn) { if err != nil { if err != io.EOF { l.TCPErrors.Inc() - level.Debug(l.Logger).Log("msg", "Read failed", "addr", c.RemoteAddr(), "error", err) + l.Logger.Debug("Read failed", "addr", c.RemoteAddr(), "error", err) } break } - level.Debug(l.Logger).Log("msg", "Incoming line", "proto", "tcp", "line", string(line)) + l.Logger.Debug("Incoming line", "proto", "tcp", "line", string(line)) if isPrefix { l.TCPLineTooLong.Inc() - level.Debug(l.Logger).Log("msg", "Read failed: line too long", "addr", c.RemoteAddr()) + l.Logger.Debug("Read failed: line too long", "addr", c.RemoteAddr()) break } l.LinesReceived.Inc() @@ -172,7 +171,7 @@ func (l *StatsDTCPListener) HandleConn(c *net.TCPConn) { type StatsDUnixgramListener struct { Conn *net.UnixConn EventHandler event.EventHandler - Logger log.Logger + Logger *slog.Logger LineParser Parser UnixgramPackets prometheus.Counter LinesReceived prometheus.Counter @@ -198,7 +197,7 @@ func (l *StatsDUnixgramListener) Listen() { if strings.HasSuffix(err.Error(), "use of closed network connection") { return } - level.Error(l.Logger).Log(err) + l.Logger.Error("error reading from unixgram connection", "err", err) os.Exit(1) } l.HandlePacket(buf[:n]) @@ -209,7 +208,7 @@ func (l *StatsDUnixgramListener) HandlePacket(packet []byte) { l.UnixgramPackets.Inc() lines := strings.Split(string(packet), "\n") for _, line := range lines { - level.Debug(l.Logger).Log("msg", "Incoming line", "proto", "unixgram", "line", line) + l.Logger.Debug("Incoming line", "proto", "unixgram", "line", line) l.LinesReceived.Inc() if l.Relay != nil && len(line) > 0 { l.Relay.RelayLine(line) diff --git a/pkg/mapper/fsm/fsm.go b/pkg/mapper/fsm/fsm.go index 85068f7..ae0a276 100644 --- a/pkg/mapper/fsm/fsm.go +++ b/pkg/mapper/fsm/fsm.go @@ -14,12 +14,9 @@ package fsm import ( + "log/slog" "regexp" "strings" - - "github.com/go-kit/log" - - "github.com/prometheus/statsd_exporter/pkg/level" ) type mappingState struct { @@ -234,7 +231,7 @@ func (f *FSM) GetMapping(statsdMetric string, statsdMetricType string) (*mapping // TestIfNeedBacktracking tests if backtrack is needed for given list of mappings // and whether ordering is disabled. -func TestIfNeedBacktracking(mappings []string, orderingDisabled bool, logger log.Logger) bool { +func TestIfNeedBacktracking(mappings []string, orderingDisabled bool, logger *slog.Logger) bool { backtrackingNeeded := false // A has * in rules, but there's other transisitions at the same state, // this makes A the cause of backtracking @@ -250,7 +247,7 @@ func TestIfNeedBacktracking(mappings []string, orderingDisabled bool, logger log metricRe = strings.Replace(metricRe, "*", "([^.]*)", -1) regex, err := regexp.Compile("^" + metricRe + "$") if err != nil { - level.Warn(logger).Log("msg", "Invalid match, cannot compile regex in mapping", "mapping", mapping, "err", err) + logger.Warn("Invalid match, cannot compile regex in mapping", "mapping", mapping, "err", err) } // put into array no matter there's error or not, we will skip later if regex is nil ruleREByLength[l] = append(ruleREByLength[l], regex) @@ -293,7 +290,7 @@ func TestIfNeedBacktracking(mappings []string, orderingDisabled bool, logger log if i2 != i1 && len(re1.FindStringSubmatchIndex(r2)) > 0 { // log if we care about ordering and the superset occurs before if !orderingDisabled && i1 < i2 { - level.Warn(logger).Log("msg", "match is a super set of match but in a lower order, the first will never be matched", "first_match", r1, "second_match", r2) + logger.Warn("match is a super set of match but in a lower order, the first will never be matched", "first_match", r1, "second_match", r2) } currentRuleNeedBacktrack = false } @@ -311,7 +308,7 @@ func TestIfNeedBacktracking(mappings []string, orderingDisabled bool, logger log } if currentRuleNeedBacktrack { - level.Warn(logger).Log("msg", "backtracking required because of match. Performance may be degraded", "match", r1) + logger.Warn("backtracking required because of match. Performance may be degraded", "match", r1) backtrackingNeeded = true } } diff --git a/pkg/mapper/mapper.go b/pkg/mapper/mapper.go index e559201..ced0d11 100644 --- a/pkg/mapper/mapper.go +++ b/pkg/mapper/mapper.go @@ -15,16 +15,16 @@ package mapper import ( "fmt" + "log/slog" "os" "regexp" "sync" "time" - "github.com/go-kit/log" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/common/promslog" "gopkg.in/yaml.v2" - "github.com/prometheus/statsd_exporter/pkg/level" "github.com/prometheus/statsd_exporter/pkg/mapper/fsm" ) @@ -53,7 +53,7 @@ type MetricMapper struct { MappingsCount prometheus.Gauge - Logger log.Logger + Logger *slog.Logger } type SummaryOptions struct { @@ -174,12 +174,12 @@ func (m *MetricMapper) InitFromYAMLString(fileContents string) error { if currentMapping.LegacyQuantiles != nil && (currentMapping.SummaryOptions == nil || currentMapping.SummaryOptions.Quantiles != nil) { - level.Warn(m.Logger).Log("msg", "using the top level quantiles is deprecated. Please use quantiles in the summary_options hierarchy") + m.Logger.Warn("using the top level quantiles is deprecated. Please use quantiles in the summary_options hierarchy") } if currentMapping.LegacyBuckets != nil && (currentMapping.HistogramOptions == nil || currentMapping.HistogramOptions.Buckets != nil) { - level.Warn(m.Logger).Log("msg", "using the top level buckets is deprecated. Please use buckets in the histogram_options hierarchy") + m.Logger.Warn("using the top level buckets is deprecated. Please use buckets in the histogram_options hierarchy") } if currentMapping.SummaryOptions != nil && @@ -242,7 +242,7 @@ func (m *MetricMapper) InitFromYAMLString(fileContents string) error { defer m.mutex.Unlock() if m.Logger == nil { - m.Logger = log.NewNopLogger() + m.Logger = promslog.NewNopLogger() } m.Defaults = n.Defaults diff --git a/pkg/mapper/mapper_benchmark_test.go b/pkg/mapper/mapper_benchmark_test.go index 0a04944..4596173 100644 --- a/pkg/mapper/mapper_benchmark_test.go +++ b/pkg/mapper/mapper_benchmark_test.go @@ -18,7 +18,7 @@ import ( "math/rand" "testing" - "github.com/go-kit/log" + "github.com/prometheus/common/promslog" "github.com/prometheus/statsd_exporter/pkg/mappercache/lru" "github.com/prometheus/statsd_exporter/pkg/mappercache/randomreplacement" @@ -245,7 +245,7 @@ mappings: } mapper := MetricMapper{ - Logger: log.NewNopLogger(), + Logger: promslog.NewNopLogger(), } err := mapper.InitFromYAMLString(config) if err != nil { diff --git a/pkg/relay/relay.go b/pkg/relay/relay.go index 08f109c..d2972fb 100644 --- a/pkg/relay/relay.go +++ b/pkg/relay/relay.go @@ -16,24 +16,22 @@ package relay import ( "bytes" "fmt" + "log/slog" "net" "strings" "time" "github.com/prometheus/statsd_exporter/pkg/clock" - "github.com/go-kit/log" - "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" - "github.com/prometheus/statsd_exporter/pkg/level" ) type Relay struct { addr *net.UDPAddr bufferChannel chan []byte conn *net.UDPConn - logger log.Logger + logger *slog.Logger packetLength uint packetsTotal prometheus.Counter @@ -67,7 +65,7 @@ var ( // NewRelay creates a statsd UDP relay. It can be used to send copies of statsd raw // lines to a separate service. -func NewRelay(l log.Logger, target string, packetLength uint) (*Relay, error) { +func NewRelay(l *slog.Logger, target string, packetLength uint) (*Relay, error) { addr, err := net.ResolveUDPAddr("udp", target) if err != nil { return nil, fmt.Errorf("unable to resolve target %s, err: %w", target, err) @@ -110,24 +108,24 @@ func (r *Relay) relayOutput() { case <-relayInterval.C: err = r.sendPacket(buffer.Bytes()) if err != nil { - level.Error(r.logger).Log("msg", "Error sending UDP packet", "error", err) + r.logger.Error("Error sending UDP packet", "error", err) return } // Clear out the buffer. buffer.Reset() case b := <-r.bufferChannel: if uint(len(b)+buffer.Len()) > r.packetLength { - level.Debug(r.logger).Log("msg", "Buffer full, sending packet", "length", buffer.Len()) + r.logger.Debug("Buffer full, sending packet", "length", buffer.Len()) err = r.sendPacket(buffer.Bytes()) if err != nil { - level.Error(r.logger).Log("msg", "Error sending UDP packet", "error", err) + r.logger.Error("Error sending UDP packet", "error", err) return } // Seed the new buffer with the new line. buffer.Reset() buffer.Write(b) } else { - level.Debug(r.logger).Log("msg", "Adding line to buffer", "line", string(b)) + r.logger.Debug("Adding line to buffer", "line", string(b)) buffer.Write(b) } } @@ -137,10 +135,10 @@ func (r *Relay) relayOutput() { // sendPacket sends a single relay line to the destination target. func (r *Relay) sendPacket(buf []byte) error { if len(buf) == 0 { - level.Debug(r.logger).Log("msg", "Empty buffer, nothing to send") + r.logger.Debug("Empty buffer, nothing to send") return nil } - level.Debug(r.logger).Log("msg", "Sending packet", "length", len(buf), "data", string(buf)) + r.logger.Debug("Sending packet", "length", len(buf), "data", string(buf)) _, err := r.conn.WriteToUDP(buf, r.addr) r.packetsTotal.Inc() return err @@ -150,15 +148,15 @@ func (r *Relay) sendPacket(buf []byte) error { func (r *Relay) RelayLine(l string) { lineLength := uint(len(l)) if lineLength == 0 { - level.Debug(r.logger).Log("msg", "Empty line, not relaying") + r.logger.Debug("Empty line, not relaying") return } if lineLength > r.packetLength-1 { - level.Warn(r.logger).Log("msg", "line too long, not relaying", "length", lineLength, "max", r.packetLength) + r.logger.Warn("line too long, not relaying", "length", lineLength, "max", r.packetLength) r.longLinesTotal.Inc() return } - level.Debug(r.logger).Log("msg", "Relaying line", "line", string(l)) + r.logger.Debug("Relaying line", "line", string(l)) if !strings.HasSuffix(l, "\n") { l = l + "\n" } diff --git a/pkg/relay/relay_test.go b/pkg/relay/relay_test.go index 7a2eb6b..ea0fca0 100644 --- a/pkg/relay/relay_test.go +++ b/pkg/relay/relay_test.go @@ -19,9 +19,9 @@ import ( "testing" "time" - "github.com/go-kit/log" "github.com/prometheus/client_golang/prometheus" dto "github.com/prometheus/client_model/go" + "github.com/prometheus/common/promslog" "github.com/prometheus/statsd_exporter/pkg/clock" "github.com/stvp/go-udp-testing" ) @@ -54,7 +54,7 @@ func TestRelay_RelayLine(t *testing.T) { } clock.ClockInstance.Instant = time.Unix(0, 0) - logger := log.NewNopLogger() + logger := promslog.NewNopLogger() r, err := NewRelay( logger, "localhost:1160",