Skip to content

Commit cf672ff

Browse files
committed
more logs
1 parent bcc3e1c commit cf672ff

File tree

4 files changed

+21
-30
lines changed

4 files changed

+21
-30
lines changed

analytics_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package flagsmith
33
import (
44
"context"
55
"io"
6+
"log/slog"
67
"net/http"
78
"net/http/httptest"
89
"sync"
@@ -42,7 +43,7 @@ func TestAnalytics(t *testing.T) {
4243
client.SetHeader("X-Environment-Key", EnvironmentAPIKey)
4344

4445
// Now let's create the processor
45-
processor := NewAnalyticsProcessor(context.Background(), client, server.URL+"/api/v1/", &analyticsTimer, defaultLogger())
46+
processor := NewAnalyticsProcessor(context.Background(), client, server.URL+"/api/v1/", &analyticsTimer, slog.Default())
4647

4748
// and, track some features
4849
processor.TrackFeature("feature_1")

client.go

+1-3
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,7 @@ func NewClient(apiKey string, options ...Option) (*Client, error) {
6060
client: resty.New(),
6161
}
6262

63-
if c.log == nil {
64-
c.log = defaultLogger()
65-
}
63+
c.log = slog.Default()
6664
c.client = resty.
6765
New().
6866
OnBeforeRequest(newRestyLogRequestMiddleware(c.log)).

logger.go

+2-21
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,18 @@ func (s restySlogLogger) Debugf(format string, v ...interface{}) {
2929
s.logger.Debug(msg)
3030
}
3131

32-
func defaultLogger() *slog.Logger {
33-
return slog.Default().WithGroup("flagsmith")
34-
}
35-
3632
func newRestyLogRequestMiddleware(logger *slog.Logger) resty.RequestMiddleware {
3733
return func(c *resty.Client, req *resty.Request) error {
3834
// Create a child logger with request metadata
3935
reqLogger := logger.With(
4036
"method", req.Method,
4137
"url", req.URL,
4238
)
39+
reqLogger.Debug("request")
40+
4341
// Store the logger in this request's context, and use it in the response
4442
req.SetContext(context.WithValue(req.Context(), "logger", reqLogger))
4543

46-
reqLogger.Debug("request",
47-
slog.String("method", req.Method),
48-
slog.String("url", req.URL),
49-
)
50-
5144
// Time the current request
5245
req.SetContext(context.WithValue(req.Context(), "startTime", time.Now()))
5346

@@ -64,23 +57,11 @@ func newRestyLogResponseMiddleware(logger *slog.Logger) resty.ResponseMiddleware
6457
if reqLogger == nil {
6558
reqLogger = logger
6659
}
67-
attrs := []slog.Attr{
68-
slog.Int("status", resp.StatusCode()),
69-
slog.Duration("duration", time.Since(startTime)),
70-
slog.Int64("content_length", resp.Size()),
71-
}
7260
reqLogger.Debug("response",
7361
slog.Int("status", resp.StatusCode()),
7462
slog.Duration("duration", time.Since(startTime)),
7563
slog.Int64("content_length", resp.Size()),
7664
)
77-
msg := "received error response"
78-
level := slog.LevelDebug
79-
if resp.IsError() {
80-
level = slog.LevelError
81-
}
82-
logger.LogAttrs(context.Background(), level, msg, attrs...)
83-
8465
return nil
8566
}
8667
}

realtime.go

+16-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"errors"
88
"log/slog"
99
"net/http"
10+
"net/url"
1011
"strings"
1112
"time"
1213
)
@@ -16,17 +17,25 @@ func (c *Client) startRealtimeUpdates(ctx context.Context) {
1617
if err != nil {
1718
panic("Failed to fetch the environment while configuring real-time updates")
1819
}
20+
1921
env := c.environment.GetEnvironment()
20-
stream_url := c.config.realtimeBaseUrl + "sse/environments/" + env.APIKey + "/stream"
2122
envUpdatedAt := env.UpdatedAt
23+
log := c.log.With("environment", env.APIKey, "current_updated_at", &envUpdatedAt)
24+
25+
streamPath, err := url.JoinPath(c.config.realtimeBaseUrl, "sse/environments", env.APIKey, "stream")
26+
if err != nil {
27+
log.Error("failed to build stream URL", "error", err)
28+
panic(err)
29+
}
30+
2231
for {
2332
select {
2433
case <-ctx.Done():
2534
return
2635
default:
27-
resp, err := http.Get(stream_url)
36+
resp, err := http.Get(streamPath)
2837
if err != nil {
29-
c.log.Error("failed to connect to realtime service", "error", err)
38+
log.Error("failed to connect to realtime service", "error", err)
3039
continue
3140
}
3241
defer resp.Body.Close()
@@ -37,11 +46,12 @@ func (c *Client) startRealtimeUpdates(ctx context.Context) {
3746
if strings.HasPrefix(line, "data: ") {
3847
parsedTime, err := parseUpdatedAtFromSSE(line)
3948
if err != nil {
40-
c.log.Error("failed to parse realtime update event", "error", err, "raw_event", line)
49+
log.Error("failed to parse realtime update event", "error", err, "raw_event", line)
4150
continue
4251
}
4352
if parsedTime.After(envUpdatedAt) {
44-
c.log.Info("received update event",
53+
log.WithGroup("event").Info("received update event",
54+
slog.Duration("update_delay", parsedTime.Sub(envUpdatedAt)),
4555
slog.Time("updated_at", parsedTime),
4656
slog.String("environment", env.APIKey),
4757
)
@@ -59,6 +69,7 @@ func (c *Client) startRealtimeUpdates(ctx context.Context) {
5969
}
6070
}
6171
}
72+
6273
func parseUpdatedAtFromSSE(line string) (time.Time, error) {
6374
var eventData struct {
6475
UpdatedAt float64 `json:"updated_at"`

0 commit comments

Comments
 (0)