Skip to content

Commit 4dbb6ad

Browse files
authored
feat!: switch from Zap to log/slog (#1115)
* feat!: switch from Zap to log/slog * add context to the API * clean using a custom handler * fix * lint/fix
1 parent 3d8c0bc commit 4dbb6ad

Some content is hidden

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

42 files changed

+714
-947
lines changed

authorization.go

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ package mercure
33
import (
44
"errors"
55
"fmt"
6+
"log/slog"
67
"net/http"
78
"net/url"
89
"slices"
910
"strings"
1011

1112
"github.com/golang-jwt/jwt/v5"
12-
"go.uber.org/zap"
1313
)
1414

1515
// claims contains Mercure's JWT claims.
@@ -194,7 +194,5 @@ func canDispatch(s *TopicSelectorStore, topics, topicSelectors []string) bool {
194194
func (h *Hub) httpAuthorizationError(w http.ResponseWriter, r *http.Request, err error) {
195195
http.Error(w, http.StatusText(http.StatusUnauthorized), http.StatusUnauthorized)
196196

197-
if c := h.logger.Check(zap.DebugLevel, "Topic selectors not matched, not provided or authorization error"); c != nil {
198-
c.Write(zap.String("remote_addr", r.RemoteAddr), zap.Error(err))
199-
}
197+
h.logger.DebugContext(r.Context(), "Topic selectors not matched, not provided or authorization error", slog.Any("error", err))
200198
}

bolt.go

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@ package mercure
22

33
import (
44
"bytes"
5+
"context"
56
"encoding/binary"
67
"encoding/json"
78
"fmt"
9+
"log/slog"
810
"math/rand"
911
"sync"
1012
"time"
1113

1214
bolt "go.etcd.io/bbolt"
13-
"go.uber.org/zap"
1415
)
1516

1617
const BoltDefaultCleanupFrequency = 0.3
@@ -22,7 +23,7 @@ type BoltTransport struct {
2223
sync.RWMutex
2324

2425
subscribers *SubscriberList
25-
logger Logger
26+
logger *slog.Logger
2627
db *bolt.DB
2728
bucketName string
2829
size uint64
@@ -36,7 +37,7 @@ type BoltTransport struct {
3637
// NewBoltTransport creates a new BoltTransport.
3738
func NewBoltTransport(
3839
subscriberList *SubscriberList,
39-
logger Logger,
40+
logger *slog.Logger,
4041
path string,
4142
bucketName string,
4243
size uint64,
@@ -95,7 +96,7 @@ func getDBLastEventID(db *bolt.DB, bucketName string) (string, error) {
9596
}
9697

9798
// Dispatch dispatches an update to all subscribers and persists it in Bolt DB.
98-
func (t *BoltTransport) Dispatch(update *Update) error {
99+
func (t *BoltTransport) Dispatch(ctx context.Context, update *Update) error {
99100
select {
100101
case <-t.closed:
101102
return ErrClosedTransport
@@ -118,14 +119,14 @@ func (t *BoltTransport) Dispatch(update *Update) error {
118119
}
119120

120121
for _, s := range t.subscribers.MatchAny(update) {
121-
s.Dispatch(update, false)
122+
s.Dispatch(ctx, update, false)
122123
}
123124

124125
return nil
125126
}
126127

127128
// AddSubscriber adds a new subscriber to the transport.
128-
func (t *BoltTransport) AddSubscriber(s *LocalSubscriber) error {
129+
func (t *BoltTransport) AddSubscriber(ctx context.Context, s *LocalSubscriber) error {
129130
select {
130131
case <-t.closed:
131132
return ErrClosedTransport
@@ -138,18 +139,18 @@ func (t *BoltTransport) AddSubscriber(s *LocalSubscriber) error {
138139
t.Unlock()
139140

140141
if s.RequestLastEventID != "" {
141-
if err := t.dispatchHistory(s, toSeq); err != nil {
142+
if err := t.dispatchHistory(ctx, s, toSeq); err != nil {
142143
return err
143144
}
144145
}
145146

146-
s.Ready()
147+
s.Ready(ctx)
147148

148149
return nil
149150
}
150151

151152
// RemoveSubscriber removes a new subscriber from the transport.
152-
func (t *BoltTransport) RemoveSubscriber(s *LocalSubscriber) error {
153+
func (t *BoltTransport) RemoveSubscriber(_ context.Context, s *LocalSubscriber) error {
153154
select {
154155
case <-t.closed:
155156
return ErrClosedTransport
@@ -165,15 +166,15 @@ func (t *BoltTransport) RemoveSubscriber(s *LocalSubscriber) error {
165166
}
166167

167168
// GetSubscribers get the list of active subscribers.
168-
func (t *BoltTransport) GetSubscribers() (string, []*Subscriber, error) {
169+
func (t *BoltTransport) GetSubscribers(_ context.Context) (string, []*Subscriber, error) {
169170
t.RLock()
170171
defer t.RUnlock()
171172

172173
return t.lastEventID, getSubscribers(t.subscribers), nil
173174
}
174175

175176
// Close closes the Transport.
176-
func (t *BoltTransport) Close() (err error) {
177+
func (t *BoltTransport) Close(_ context.Context) (err error) {
177178
t.closedOnce.Do(func() {
178179
close(t.closed)
179180

@@ -196,7 +197,7 @@ func (t *BoltTransport) Close() (err error) {
196197
}
197198

198199
//nolint:gocognit
199-
func (t *BoltTransport) dispatchHistory(s *LocalSubscriber, toSeq uint64) error {
200+
func (t *BoltTransport) dispatchHistory(ctx context.Context, s *LocalSubscriber, toSeq uint64) error {
200201
err := t.db.View(func(tx *bolt.Tx) error {
201202
b := tx.Bucket([]byte(t.bucketName))
202203
if b == nil {
@@ -223,14 +224,13 @@ func (t *BoltTransport) dispatchHistory(s *LocalSubscriber, toSeq uint64) error
223224
if err := json.Unmarshal(v, &update); err != nil {
224225
s.HistoryDispatched(responseLastEventID)
225226

226-
if c := t.logger.Check(zap.ErrorLevel, "Unable to unmarshal update coming from the Bolt DB"); c != nil {
227-
c.Write(zap.Error(err))
228-
}
227+
err := fmt.Errorf("unable to unmarshal update: %w", err)
228+
t.logger.ErrorContext(ctx, "Unable to unmarshal update coming from the Bolt DB", slog.Any("update", update), slog.Any("error", err))
229229

230-
return fmt.Errorf("unable to unmarshal update: %w", err)
230+
return err
231231
}
232232

233-
if (s.Match(update) && !s.Dispatch(update, true)) || (toSeq > 0 && binary.BigEndian.Uint64(k[:8]) >= toSeq) {
233+
if (s.Match(update) && !s.Dispatch(ctx, update, true)) || (toSeq > 0 && binary.BigEndian.Uint64(k[:8]) >= toSeq) {
234234
s.HistoryDispatched(responseLastEventID)
235235

236236
return nil
@@ -240,9 +240,7 @@ func (t *BoltTransport) dispatchHistory(s *LocalSubscriber, toSeq uint64) error
240240
s.HistoryDispatched(responseLastEventID)
241241

242242
if !afterFromID {
243-
if c := t.logger.Check(zap.InfoLevel, "Can't find requested LastEventID"); c != nil {
244-
c.Write(zap.String("LastEventID", s.RequestLastEventID))
245-
}
243+
t.logger.InfoContext(ctx, "Can't find requested LastEventID")
246244
}
247245

248246
return nil

bolt_deprecated_test.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,34 +9,33 @@ import (
99

1010
"github.com/stretchr/testify/assert"
1111
"github.com/stretchr/testify/require"
12-
"go.uber.org/zap"
1312
)
1413

1514
func TestNewBoltTransport(t *testing.T) {
1615
t.Parallel()
1716

1817
u, _ := url.Parse("bolt://test-" + t.Name() + ".db?bucket_name=demo")
19-
transport, err := DeprecatedNewBoltTransport(u, zap.NewNop())
18+
transport, err := DeprecatedNewBoltTransport(u, nil)
2019
require.NoError(t, err)
2120
require.NotNil(t, transport)
22-
require.NoError(t, transport.Close())
21+
require.NoError(t, transport.Close(t.Context()))
2322
require.NoError(t, os.Remove("test-"+t.Name()+".db"))
2423

2524
u, _ = url.Parse("bolt://")
26-
_, err = DeprecatedNewBoltTransport(u, zap.NewNop())
25+
_, err = DeprecatedNewBoltTransport(u, nil)
2726
require.EqualError(t, err, `"bolt:": invalid transport: missing path`)
2827

2928
u, _ = url.Parse("bolt:///test.db")
30-
_, err = DeprecatedNewBoltTransport(u, zap.NewNop())
29+
_, err = DeprecatedNewBoltTransport(u, nil)
3130

3231
// The exact error message depends on the OS
3332
assert.Contains(t, err.Error(), "open /test.db:")
3433

3534
u, _ = url.Parse("bolt://test.db?cleanup_frequency=invalid")
36-
_, err = DeprecatedNewBoltTransport(u, zap.NewNop())
35+
_, err = DeprecatedNewBoltTransport(u, nil)
3736
require.EqualError(t, err, `"bolt://test.db?cleanup_frequency=invalid": invalid "cleanup_frequency" parameter "invalid": invalid transport: strconv.ParseFloat: parsing "invalid": invalid syntax`)
3837

3938
u, _ = url.Parse("bolt://test.db?size=invalid")
40-
_, err = DeprecatedNewBoltTransport(u, zap.NewNop())
39+
_, err = DeprecatedNewBoltTransport(u, nil)
4140
require.EqualError(t, err, `"bolt://test.db?size=invalid": invalid "size" parameter "invalid": invalid transport: strconv.ParseUint: parsing "invalid": invalid syntax`)
4241
}

0 commit comments

Comments
 (0)