Skip to content

Commit f6b942c

Browse files
authored
chore!: adopt log/slog, drop go-kit/log (#4089)
* chore!: adopt log/slog, drop go-kit/log The bulk of this change set 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 This commit includes several changes: - bump exporter-tookit to v0.13.1 for log/slog support - updates golangci-lint deprecated configs - enables sloglint linter - removes old go-kit/log linter configs - introduce some `if logger == nil { $newLogger }` additions to prevent nil references - converts cluster membership config to use a stdlib compatible slog adapter, rather than creating a custom io.Writer for use as the membership `logOutput` config Signed-off-by: TJ Hoplock <[email protected]> * chore: address PR feedback Signed-off-by: TJ Hoplock <[email protected]> --------- Signed-off-by: TJ Hoplock <[email protected]>
1 parent 82e804f commit f6b942c

Some content is hidden

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

73 files changed

+612
-646
lines changed

.golangci.yml

+5-8
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
run:
2-
skip-files:
3-
# Skip autogenerated files.
4-
- ^.*\.(pb|y)\.go$
5-
timeout: 5m
6-
71
output:
82
sort-results: true
93

@@ -17,6 +11,7 @@ linters:
1711
- misspell
1812
- revive
1913
- testifylint
14+
- sloglint
2015

2116
issues:
2217
max-issues-per-linter: 0
@@ -25,6 +20,10 @@ issues:
2520
- path: _test.go
2621
linters:
2722
- errcheck
23+
exclude-files:
24+
# Skip autogenerated files.
25+
- ^.*\.(pb|y)\.go$
26+
timeout: 5m
2827

2928
linters-settings:
3029
depguard:
@@ -48,8 +47,6 @@ linters-settings:
4847
- (net/http.ResponseWriter).Write
4948
# No need to check for errors on server's shutdown.
5049
- (*net/http.Server).Shutdown
51-
# Never check for logger errors.
52-
- (github.com/go-kit/log.Logger).Log
5350
# Never check for rollback errors as Rollback() is called when a previous error was detected.
5451
- (github.com/prometheus/prometheus/storage.Appender).Rollback
5552
godot:

api/api.go

+6-5
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@ package api
1616
import (
1717
"errors"
1818
"fmt"
19+
"log/slog"
1920
"net/http"
2021
"runtime"
2122
"time"
2223

23-
"github.com/go-kit/log"
2424
"github.com/prometheus/client_golang/prometheus"
2525
"github.com/prometheus/common/model"
26+
"github.com/prometheus/common/promslog"
2627
"github.com/prometheus/common/route"
2728

2829
apiv2 "github.com/prometheus/alertmanager/api/v2"
@@ -70,7 +71,7 @@ type Options struct {
7071
// the concurrency limit.
7172
Concurrency int
7273
// Logger is used for logging, if nil, no logging will happen.
73-
Logger log.Logger
74+
Logger *slog.Logger
7475
// Registry is used to register Prometheus metrics. If nil, no metrics
7576
// registration will happen.
7677
Registry prometheus.Registerer
@@ -107,7 +108,7 @@ func New(opts Options) (*API, error) {
107108
}
108109
l := opts.Logger
109110
if l == nil {
110-
l = log.NewNopLogger()
111+
l = promslog.NewNopLogger()
111112
}
112113
concurrency := opts.Concurrency
113114
if concurrency < 1 {
@@ -124,7 +125,7 @@ func New(opts Options) (*API, error) {
124125
opts.GroupMutedFunc,
125126
opts.Silences,
126127
opts.Peer,
127-
log.With(l, "version", "v2"),
128+
l.With("version", "v2"),
128129
opts.Registry,
129130
)
130131
if err != nil {
@@ -153,7 +154,7 @@ func New(opts Options) (*API, error) {
153154
}
154155

155156
return &API{
156-
deprecationRouter: NewV1DeprecationRouter(log.With(l, "version", "v1")),
157+
deprecationRouter: NewV1DeprecationRouter(l.With("version", "v1")),
157158
v2: v2,
158159
requestsInFlight: requestsInFlight,
159160
concurrencyLimitExceeded: concurrencyLimitExceeded,

api/v1_deprecation_router.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,19 @@ package api
1313

1414
import (
1515
"encoding/json"
16+
"log/slog"
1617
"net/http"
1718

18-
"github.com/go-kit/log"
19-
"github.com/go-kit/log/level"
2019
"github.com/prometheus/common/route"
2120
)
2221

2322
// V1DeprecationRouter is the router to signal v1 users that the API v1 is now removed.
2423
type V1DeprecationRouter struct {
25-
logger log.Logger
24+
logger *slog.Logger
2625
}
2726

2827
// NewV1DeprecationRouter returns a new V1DeprecationRouter.
29-
func NewV1DeprecationRouter(l log.Logger) *V1DeprecationRouter {
28+
func NewV1DeprecationRouter(l *slog.Logger) *V1DeprecationRouter {
3029
return &V1DeprecationRouter{
3130
logger: l,
3231
}
@@ -47,7 +46,7 @@ func (dr *V1DeprecationRouter) Register(r *route.Router) {
4746
}
4847

4948
func (dr *V1DeprecationRouter) deprecationHandler(w http.ResponseWriter, req *http.Request) {
50-
level.Warn(dr.logger).Log("msg", "v1 API received a request on a removed endpoint", "path", req.URL.Path, "method", req.Method)
49+
dr.logger.Warn("v1 API received a request on a removed endpoint", "path", req.URL.Path, "method", req.Method)
5150

5251
resp := struct {
5352
Status string `json:"status"`
@@ -61,6 +60,6 @@ func (dr *V1DeprecationRouter) deprecationHandler(w http.ResponseWriter, req *ht
6160
w.WriteHeader(410)
6261

6362
if err := json.NewEncoder(w).Encode(resp); err != nil {
64-
level.Error(dr.logger).Log("msg", "failed to write response", "err", err)
63+
dr.logger.Error("failed to write response", "err", err)
6564
}
6665
}

api/v2/api.go

+23-24
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,13 @@ package v2
1616
import (
1717
"errors"
1818
"fmt"
19+
"log/slog"
1920
"net/http"
2021
"regexp"
2122
"sort"
2223
"sync"
2324
"time"
2425

25-
"github.com/go-kit/log"
26-
"github.com/go-kit/log/level"
2726
"github.com/go-openapi/analysis"
2827
"github.com/go-openapi/loads"
2928
"github.com/go-openapi/runtime/middleware"
@@ -71,7 +70,7 @@ type API struct {
7170
route *dispatch.Route
7271
setAlertStatus setAlertStatusFn
7372

74-
logger log.Logger
73+
logger *slog.Logger
7574
m *metrics.Alerts
7675

7776
Handler http.Handler
@@ -92,7 +91,7 @@ func NewAPI(
9291
gmf groupMutedFunc,
9392
silences *silence.Silences,
9493
peer cluster.ClusterPeer,
95-
l log.Logger,
94+
l *slog.Logger,
9695
r prometheus.Registerer,
9796
) (*API, error) {
9897
api := API{
@@ -154,8 +153,8 @@ func setResponseHeaders(h http.Handler) http.Handler {
154153
})
155154
}
156155

157-
func (api *API) requestLogger(req *http.Request) log.Logger {
158-
return log.With(api.logger, "path", req.URL.Path, "method", req.Method)
156+
func (api *API) requestLogger(req *http.Request) *slog.Logger {
157+
return api.logger.With("path", req.URL.Path, "method", req.Method)
159158
}
160159

161160
// Update sets the API struct members that may change between reloads of alertmanager.
@@ -249,14 +248,14 @@ func (api *API) getAlertsHandler(params alert_ops.GetAlertsParams) middleware.Re
249248

250249
matchers, err := parseFilter(params.Filter)
251250
if err != nil {
252-
level.Debug(logger).Log("msg", "Failed to parse matchers", "err", err)
251+
logger.Debug("Failed to parse matchers", "err", err)
253252
return alertgroup_ops.NewGetAlertGroupsBadRequest().WithPayload(err.Error())
254253
}
255254

256255
if params.Receiver != nil {
257256
receiverFilter, err = regexp.Compile("^(?:" + *params.Receiver + ")$")
258257
if err != nil {
259-
level.Debug(logger).Log("msg", "Failed to compile receiver regex", "err", err)
258+
logger.Debug("Failed to compile receiver regex", "err", err)
260259
return alert_ops.
261260
NewGetAlertsBadRequest().
262261
WithPayload(
@@ -301,7 +300,7 @@ func (api *API) getAlertsHandler(params alert_ops.GetAlertsParams) middleware.Re
301300
api.mtx.RUnlock()
302301

303302
if err != nil {
304-
level.Error(logger).Log("msg", "Failed to get alerts", "err", err)
303+
logger.Error("Failed to get alerts", "err", err)
305304
return alert_ops.NewGetAlertsInternalServerError().WithPayload(err.Error())
306305
}
307306
sort.Slice(res, func(i, j int) bool {
@@ -361,12 +360,12 @@ func (api *API) postAlertsHandler(params alert_ops.PostAlertsParams) middleware.
361360
validAlerts = append(validAlerts, a)
362361
}
363362
if err := api.alerts.Put(validAlerts...); err != nil {
364-
level.Error(logger).Log("msg", "Failed to create alerts", "err", err)
363+
logger.Error("Failed to create alerts", "err", err)
365364
return alert_ops.NewPostAlertsInternalServerError().WithPayload(err.Error())
366365
}
367366

368367
if validationErrs.Len() > 0 {
369-
level.Error(logger).Log("msg", "Failed to validate alerts", "err", validationErrs.Error())
368+
logger.Error("Failed to validate alerts", "err", validationErrs.Error())
370369
return alert_ops.NewPostAlertsBadRequest().WithPayload(validationErrs.Error())
371370
}
372371

@@ -378,15 +377,15 @@ func (api *API) getAlertGroupsHandler(params alertgroup_ops.GetAlertGroupsParams
378377

379378
matchers, err := parseFilter(params.Filter)
380379
if err != nil {
381-
level.Debug(logger).Log("msg", "Failed to parse matchers", "err", err)
380+
logger.Debug("Failed to parse matchers", "err", err)
382381
return alertgroup_ops.NewGetAlertGroupsBadRequest().WithPayload(err.Error())
383382
}
384383

385384
var receiverFilter *regexp.Regexp
386385
if params.Receiver != nil {
387386
receiverFilter, err = regexp.Compile("^(?:" + *params.Receiver + ")$")
388387
if err != nil {
389-
level.Error(logger).Log("msg", "Failed to compile receiver regex", "err", err)
388+
logger.Error("Failed to compile receiver regex", "err", err)
390389
return alertgroup_ops.
391390
NewGetAlertGroupsBadRequest().
392391
WithPayload(
@@ -518,13 +517,13 @@ func (api *API) getSilencesHandler(params silence_ops.GetSilencesParams) middlew
518517

519518
matchers, err := parseFilter(params.Filter)
520519
if err != nil {
521-
level.Debug(logger).Log("msg", "Failed to parse matchers", "err", err)
520+
logger.Debug("Failed to parse matchers", "err", err)
522521
return silence_ops.NewGetSilencesBadRequest().WithPayload(err.Error())
523522
}
524523

525524
psils, _, err := api.silences.Query()
526525
if err != nil {
527-
level.Error(logger).Log("msg", "Failed to get silences", "err", err)
526+
logger.Error("Failed to get silences", "err", err)
528527
return silence_ops.NewGetSilencesInternalServerError().WithPayload(err.Error())
529528
}
530529

@@ -535,7 +534,7 @@ func (api *API) getSilencesHandler(params silence_ops.GetSilencesParams) middlew
535534
}
536535
silence, err := GettableSilenceFromProto(ps)
537536
if err != nil {
538-
level.Error(logger).Log("msg", "Failed to unmarshal silence from proto", "err", err)
537+
logger.Error("Failed to unmarshal silence from proto", "err", err)
539538
return silence_ops.NewGetSilencesInternalServerError().WithPayload(err.Error())
540539
}
541540
sils = append(sils, &silence)
@@ -614,18 +613,18 @@ func (api *API) getSilenceHandler(params silence_ops.GetSilenceParams) middlewar
614613

615614
sils, _, err := api.silences.Query(silence.QIDs(params.SilenceID.String()))
616615
if err != nil {
617-
level.Error(logger).Log("msg", "Failed to get silence by id", "err", err, "id", params.SilenceID.String())
616+
logger.Error("Failed to get silence by id", "err", err, "id", params.SilenceID.String())
618617
return silence_ops.NewGetSilenceInternalServerError().WithPayload(err.Error())
619618
}
620619

621620
if len(sils) == 0 {
622-
level.Error(logger).Log("msg", "Failed to find silence", "err", err, "id", params.SilenceID.String())
621+
logger.Error("Failed to find silence", "err", err, "id", params.SilenceID.String())
623622
return silence_ops.NewGetSilenceNotFound()
624623
}
625624

626625
sil, err := GettableSilenceFromProto(sils[0])
627626
if err != nil {
628-
level.Error(logger).Log("msg", "Failed to convert unmarshal from proto", "err", err)
627+
logger.Error("Failed to convert unmarshal from proto", "err", err)
629628
return silence_ops.NewGetSilenceInternalServerError().WithPayload(err.Error())
630629
}
631630

@@ -637,7 +636,7 @@ func (api *API) deleteSilenceHandler(params silence_ops.DeleteSilenceParams) mid
637636

638637
sid := params.SilenceID.String()
639638
if err := api.silences.Expire(sid); err != nil {
640-
level.Error(logger).Log("msg", "Failed to expire silence", "err", err)
639+
logger.Error("Failed to expire silence", "err", err)
641640
if errors.Is(err, silence.ErrNotFound) {
642641
return silence_ops.NewDeleteSilenceNotFound()
643642
}
@@ -651,26 +650,26 @@ func (api *API) postSilencesHandler(params silence_ops.PostSilencesParams) middl
651650

652651
sil, err := PostableSilenceToProto(params.Silence)
653652
if err != nil {
654-
level.Error(logger).Log("msg", "Failed to marshal silence to proto", "err", err)
653+
logger.Error("Failed to marshal silence to proto", "err", err)
655654
return silence_ops.NewPostSilencesBadRequest().WithPayload(
656655
fmt.Sprintf("failed to convert API silence to internal silence: %v", err.Error()),
657656
)
658657
}
659658

660659
if sil.StartsAt.After(sil.EndsAt) || sil.StartsAt.Equal(sil.EndsAt) {
661660
msg := "Failed to create silence: start time must be before end time"
662-
level.Error(logger).Log("msg", msg, "starts_at", sil.StartsAt, "ends_at", sil.EndsAt)
661+
logger.Error(msg, "starts_at", sil.StartsAt, "ends_at", sil.EndsAt)
663662
return silence_ops.NewPostSilencesBadRequest().WithPayload(msg)
664663
}
665664

666665
if sil.EndsAt.Before(time.Now()) {
667666
msg := "Failed to create silence: end time can't be in the past"
668-
level.Error(logger).Log("msg", msg, "ends_at", sil.EndsAt)
667+
logger.Error(msg, "ends_at", sil.EndsAt)
669668
return silence_ops.NewPostSilencesBadRequest().WithPayload(msg)
670669
}
671670

672671
if err = api.silences.Set(sil); err != nil {
673-
level.Error(logger).Log("msg", "Failed to create silence", "err", err)
672+
logger.Error("Failed to create silence", "err", err)
674673
if errors.Is(err, silence.ErrNotFound) {
675674
return silence_ops.NewPostSilencesNotFound().WithPayload(err.Error())
676675
}

api/v2/api_test.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import (
2828
"github.com/go-openapi/runtime/middleware"
2929
"github.com/go-openapi/strfmt"
3030
"github.com/prometheus/common/model"
31+
"github.com/prometheus/common/promslog"
3132
"github.com/stretchr/testify/require"
3233

3334
open_api_models "github.com/prometheus/alertmanager/api/v2/models"
@@ -39,8 +40,6 @@ import (
3940
"github.com/prometheus/alertmanager/silence"
4041
"github.com/prometheus/alertmanager/silence/silencepb"
4142
"github.com/prometheus/alertmanager/types"
42-
43-
"github.com/go-kit/log"
4443
)
4544

4645
// If api.peers == nil, Alertmanager cluster feature is disabled. Make sure to
@@ -192,7 +191,7 @@ func TestDeleteSilenceHandler(t *testing.T) {
192191
api := API{
193192
uptime: time.Now(),
194193
silences: silences,
195-
logger: log.NewNopLogger(),
194+
logger: promslog.NewNopLogger(),
196195
}
197196

198197
r, err := http.NewRequest("DELETE", "/api/v2/silence/${tc.sid}", nil)
@@ -274,7 +273,7 @@ func TestPostSilencesHandler(t *testing.T) {
274273
api := API{
275274
uptime: time.Now(),
276275
silences: silences,
277-
logger: log.NewNopLogger(),
276+
logger: promslog.NewNopLogger(),
278277
}
279278

280279
sil := createSilence(t, tc.sid, "silenceCreator", tc.start, tc.end)
@@ -293,7 +292,7 @@ func TestPostSilencesHandlerMissingIdCreatesSilence(t *testing.T) {
293292
api := API{
294293
uptime: time.Now(),
295294
silences: silences,
296-
logger: log.NewNopLogger(),
295+
logger: promslog.NewNopLogger(),
297296
}
298297

299298
// Create a new silence. It should be assigned a random UUID.
@@ -557,7 +556,7 @@ receivers:
557556
cfg, _ := config.Load(in)
558557
api := API{
559558
uptime: time.Now(),
560-
logger: log.NewNopLogger(),
559+
logger: promslog.NewNopLogger(),
561560
alertmanagerConfig: cfg,
562561
}
563562

0 commit comments

Comments
 (0)