Skip to content

Commit

Permalink
feat: replace go-kit logger by slog
Browse files Browse the repository at this point in the history
  • Loading branch information
tboerger authored and renovate[bot] committed Sep 14, 2024
1 parent 0ea6a3d commit c9b5eab
Show file tree
Hide file tree
Showing 15 changed files with 135 additions and 216 deletions.
7 changes: 7 additions & 0 deletions changelog/unreleased/logging-library.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Change: Switch to official logging library

Since there have been a structured logger part of the Go standard library we
thought it's time to replace the library with that. Be aware that log messages
should change a little bit.

https://github.com/promhippie/hcloud_exporter/issues/258
9 changes: 3 additions & 6 deletions pkg/action/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ package action

import (
"fmt"
"log/slog"

"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/collectors"
"github.com/promhippie/hcloud_exporter/pkg/version"
Expand Down Expand Up @@ -49,11 +48,9 @@ func init() {
}

type promLogger struct {
logger log.Logger
logger *slog.Logger
}

func (pl promLogger) Println(v ...interface{}) {
level.Error(pl.logger).Log(
"msg", fmt.Sprintln(v...),
)
pl.logger.Error(fmt.Sprintln(v...))
}
56 changes: 17 additions & 39 deletions pkg/action/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,13 @@ package action
import (
"context"
"io"
"log/slog"
"net/http"
"os"
"os/signal"
"time"

"github.com/go-chi/chi/v5"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/hetznercloud/hcloud-go/v2/hcloud"
"github.com/oklog/run"
"github.com/prometheus/client_golang/prometheus/promhttp"
Expand All @@ -22,9 +21,8 @@ import (
)

// Server handles the server sub-command.
func Server(cfg *config.Config, logger log.Logger) error {
level.Info(logger).Log(
"msg", "Launching HetznerCloud Exporter",
func Server(cfg *config.Config, logger *slog.Logger) error {
logger.Info("Launching HetznerCloud Exporter",
"version", version.String,
"revision", version.Revision,
"date", version.Date,
Expand All @@ -34,8 +32,7 @@ func Server(cfg *config.Config, logger log.Logger) error {
token, err := config.Value(cfg.Target.Token)

if err != nil {
level.Error(logger).Log(
"msg", "Failed to load token from file",
logger.Error("Failed to load token from file",
"err", err,
)

Expand Down Expand Up @@ -63,9 +60,8 @@ func Server(cfg *config.Config, logger log.Logger) error {
}

gr.Add(func() error {
level.Info(logger).Log(
"msg", "Starting metrics server",
"addr", cfg.Server.Addr,
logger.Info("Starting metrics server",
"address", cfg.Server.Addr,
)

return web.ListenAndServe(
Expand All @@ -82,16 +78,14 @@ func Server(cfg *config.Config, logger log.Logger) error {
defer cancel()

if err := server.Shutdown(ctx); err != nil {
level.Error(logger).Log(
"msg", "Failed to shutdown metrics gracefully",
logger.Error("Failed to shutdown metrics gracefully",
"err", err,
)

return
}

level.Info(logger).Log(
"msg", "Metrics shutdown gracefully",
logger.Info("Metrics shutdown gracefully",
"reason", reason,
)
})
Expand All @@ -114,7 +108,7 @@ func Server(cfg *config.Config, logger log.Logger) error {
return gr.Run()
}

func handler(cfg *config.Config, logger log.Logger, client *hcloud.Client) *chi.Mux {
func handler(cfg *config.Config, logger *slog.Logger, client *hcloud.Client) *chi.Mux {
mux := chi.NewRouter()
mux.Use(middleware.Recoverer(logger))
mux.Use(middleware.RealIP)
Expand All @@ -126,9 +120,7 @@ func handler(cfg *config.Config, logger log.Logger, client *hcloud.Client) *chi.
}

if cfg.Collector.FloatingIPs {
level.Debug(logger).Log(
"msg", "Floating IP collector registered",
)
logger.Debug("Floating IP collector registered")

registry.MustRegister(exporter.NewFloatingIPCollector(
logger,
Expand All @@ -140,9 +132,7 @@ func handler(cfg *config.Config, logger log.Logger, client *hcloud.Client) *chi.
}

if cfg.Collector.Images {
level.Debug(logger).Log(
"msg", "Image collector registered",
)
logger.Debug("Image collector registered")

registry.MustRegister(exporter.NewImageCollector(
logger,
Expand All @@ -154,9 +144,7 @@ func handler(cfg *config.Config, logger log.Logger, client *hcloud.Client) *chi.
}

if cfg.Collector.Pricing {
level.Debug(logger).Log(
"msg", "Pricing collector registered",
)
logger.Debug("Pricing collector registered")

registry.MustRegister(exporter.NewPricingCollector(
logger,
Expand All @@ -168,9 +156,7 @@ func handler(cfg *config.Config, logger log.Logger, client *hcloud.Client) *chi.
}

if cfg.Collector.Servers {
level.Debug(logger).Log(
"msg", "Server collector registered",
)
logger.Debug("Server collector registered")

registry.MustRegister(exporter.NewServerCollector(
logger,
Expand All @@ -182,9 +168,7 @@ func handler(cfg *config.Config, logger log.Logger, client *hcloud.Client) *chi.
}

if cfg.Collector.ServerMetrics {
level.Debug(logger).Log(
"msg", "Server metrics collector registered",
)
logger.Debug("Server metrics collector registered")

registry.MustRegister(exporter.NewServerMetricsCollector(
logger,
Expand All @@ -196,9 +180,7 @@ func handler(cfg *config.Config, logger log.Logger, client *hcloud.Client) *chi.
}

if cfg.Collector.LoadBalancers {
level.Debug(logger).Log(
"msg", "Load balancer collector registered",
)
logger.Debug("Load balancer collector registered")

registry.MustRegister(exporter.NewLoadBalancerCollector(
logger,
Expand All @@ -210,9 +192,7 @@ func handler(cfg *config.Config, logger log.Logger, client *hcloud.Client) *chi.
}

if cfg.Collector.SSHKeys {
level.Debug(logger).Log(
"msg", "SSH key collector registered",
)
logger.Debug("SSH key collector registered")

registry.MustRegister(exporter.NewSSHKeyCollector(
logger,
Expand All @@ -224,9 +204,7 @@ func handler(cfg *config.Config, logger log.Logger, client *hcloud.Client) *chi.
}

if cfg.Collector.Volumes {
level.Debug(logger).Log(
"msg", "Volumes collector registered",
)
logger.Debug("Volumes collector registered")

registry.MustRegister(exporter.NewVolumeCollector(
logger,
Expand Down
6 changes: 1 addition & 5 deletions pkg/command/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"os"
"time"

"github.com/go-kit/log/level"
"github.com/promhippie/hcloud_exporter/pkg/action"
"github.com/promhippie/hcloud_exporter/pkg/config"
"github.com/promhippie/hcloud_exporter/pkg/version"
Expand Down Expand Up @@ -34,10 +33,7 @@ func Run() error {
logger := setupLogger(cfg)

if cfg.Target.Token == "" {
level.Error(logger).Log(
"msg", "Missing required hcloud.token",
)

logger.Error("Missing required hcloud.token")
return fmt.Errorf("missing required hcloud.token")
}

Expand Down
11 changes: 6 additions & 5 deletions pkg/command/health.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"fmt"
"net/http"

"github.com/go-kit/log/level"
"github.com/promhippie/hcloud_exporter/pkg/config"
"github.com/urfave/cli/v2"
)
Expand All @@ -26,8 +25,7 @@ func Health(cfg *config.Config) *cli.Command {
)

if err != nil {
level.Error(logger).Log(
"msg", "Failed to request health check",
logger.Error("Failed to request health check",
"err", err,
)

Expand All @@ -37,15 +35,18 @@ func Health(cfg *config.Config) *cli.Command {
defer resp.Body.Close()

if resp.StatusCode != 200 {
level.Error(logger).Log(
"msg", "Health check seems to be in bad state",
logger.Error("Health check seems to be in bad state",
"err", err,
"code", resp.StatusCode,
)

return err
}

logger.Debug("Health check seems to be fine",
"code", resp.StatusCode,
)

return nil
},
}
Expand Down
40 changes: 19 additions & 21 deletions pkg/command/setup.go
Original file line number Diff line number Diff line change
@@ -1,42 +1,40 @@
package command

import (
"log/slog"
"os"
"strings"

"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/promhippie/hcloud_exporter/pkg/config"
)

func setupLogger(cfg *config.Config) log.Logger {
var logger log.Logger

func setupLogger(cfg *config.Config) *slog.Logger {
if cfg.Logs.Pretty {
logger = log.NewSyncLogger(
log.NewLogfmtLogger(os.Stdout),
)
} else {
logger = log.NewSyncLogger(
log.NewJSONLogger(os.Stdout),
return slog.New(
slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: loggerLevel(cfg),
}),
)
}

return slog.New(
slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: loggerLevel(cfg),
}),
)
}

func loggerLevel(cfg *config.Config) slog.Leveler {
switch strings.ToLower(cfg.Logs.Level) {
case "error":
logger = level.NewFilter(logger, level.AllowError())
return slog.LevelError
case "warn":
logger = level.NewFilter(logger, level.AllowWarn())
return slog.LevelWarn
case "info":
logger = level.NewFilter(logger, level.AllowInfo())
return slog.LevelInfo
case "debug":
logger = level.NewFilter(logger, level.AllowDebug())
default:
logger = level.NewFilter(logger, level.AllowInfo())
return slog.LevelDebug
}

return log.With(
logger,
"ts", log.DefaultTimestampUTC,
)
return slog.LevelInfo
}
18 changes: 7 additions & 11 deletions pkg/exporter/floating_ip.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@ package exporter

import (
"context"
"log/slog"
"strconv"
"time"

"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/hetznercloud/hcloud-go/v2/hcloud"
"github.com/prometheus/client_golang/prometheus"
"github.com/promhippie/hcloud_exporter/pkg/config"
Expand All @@ -15,7 +14,7 @@ import (
// FloatingIPCollector collects metrics about the floating IPs.
type FloatingIPCollector struct {
client *hcloud.Client
logger log.Logger
logger *slog.Logger
failures *prometheus.CounterVec
duration *prometheus.HistogramVec
config config.Target
Expand All @@ -24,15 +23,15 @@ type FloatingIPCollector struct {
}

// NewFloatingIPCollector returns a new FloatingIPCollector.
func NewFloatingIPCollector(logger log.Logger, client *hcloud.Client, failures *prometheus.CounterVec, duration *prometheus.HistogramVec, cfg config.Target) *FloatingIPCollector {
func NewFloatingIPCollector(logger *slog.Logger, client *hcloud.Client, failures *prometheus.CounterVec, duration *prometheus.HistogramVec, cfg config.Target) *FloatingIPCollector {
if failures != nil {
failures.WithLabelValues("floating_ip").Add(0)
}

labels := []string{"id", "server", "location", "type", "ip"}
return &FloatingIPCollector{
client: client,
logger: log.With(logger, "collector", "floating-ip"),
logger: logger.With("collector", "floating-ip"),
failures: failures,
duration: duration,
config: cfg,
Expand Down Expand Up @@ -67,17 +66,15 @@ func (c *FloatingIPCollector) Collect(ch chan<- prometheus.Metric) {
ips, err := c.client.FloatingIP.All(ctx)

if err != nil {
level.Error(c.logger).Log(
"msg", "Failed to fetch floating IPs",
c.logger.Error("Failed to fetch floating IPs",
"err", err,
)

c.failures.WithLabelValues("floating_ip").Inc()
return
}

level.Debug(c.logger).Log(
"msg", "Fetched floating IPs",
c.logger.Debug("Fetched floating IPs",
"count", len(ips),
)

Expand Down Expand Up @@ -108,8 +105,7 @@ func (c *FloatingIPCollector) Collect(ch chan<- prometheus.Metric) {
)
}

level.Debug(c.logger).Log(
"msg", "Processed floating IP collector",
c.logger.Debug("Processed floating IP collector",
"duration", time.Since(now),
)

Expand Down
Loading

0 comments on commit c9b5eab

Please sign in to comment.