Skip to content

Commit c810fde

Browse files
committed
chore: Improve logging for cache entry retrieval errors
1 parent a180136 commit c810fde

2 files changed

Lines changed: 50 additions & 8 deletions

File tree

internal/responsecache.go

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package internal
1717
import (
1818
"encoding/json"
1919
"fmt"
20+
"log/slog"
2021
"net/http"
2122

2223
"github.com/bartventer/httpcache/store/driver"
@@ -46,22 +47,53 @@ func NewResponseCache(cache Cache) *responseCache {
4647

4748
var _ ResponseCache = (*responseCache)(nil)
4849

50+
type CacheError struct {
51+
Op string
52+
Message string
53+
Err error
54+
}
55+
56+
func (c *CacheError) Error() string { return fmt.Sprintf("%s: %s: %v", c.Op, c.Message, c.Err) }
57+
func (c *CacheError) Unwrap() error { return c.Err }
58+
59+
func (c *CacheError) LogValue() slog.Value {
60+
return slog.GroupValue(
61+
slog.String("op", c.Op),
62+
slog.String("message", c.Message),
63+
slog.Any("error", c.Err),
64+
)
65+
}
66+
67+
func newCacheError(err error, op, message string) *CacheError {
68+
return &CacheError{Op: op, Message: message, Err: err}
69+
}
70+
71+
var _ slog.LogValuer = (*CacheError)(nil)
72+
4973
func (r *responseCache) Get(responseKey string, req *http.Request) (*Response, error) {
5074
data, err := r.cache.Get(responseKey)
5175
if err != nil {
5276
return nil, err
5377
}
5478
entry, err := ParseResponse(data, req)
5579
if err != nil {
56-
return nil, fmt.Errorf("failed to unmarshal cached entry: %w", err)
80+
return nil, newCacheError(
81+
err,
82+
"Get",
83+
fmt.Sprintf("failed to unmarshal cached entry for key %q", responseKey),
84+
)
5785
}
5886
return entry, nil
5987
}
6088

6189
func (r *responseCache) Set(responseKey string, entry *Response) error {
6290
data, err := entry.MarshalBinary()
6391
if err != nil {
64-
return fmt.Errorf("failed to marshal entry: %w", err)
92+
return newCacheError(
93+
err,
94+
"Set",
95+
fmt.Sprintf("failed to marshal entry for key %q", responseKey),
96+
)
6597
}
6698
return r.cache.Set(responseKey, data)
6799
}
@@ -77,15 +109,23 @@ func (r *responseCache) GetRefs(urlKey string) (ResponseRefs, error) {
77109
}
78110
var refs ResponseRefs
79111
if unmarshalErr := json.Unmarshal(data, &refs); unmarshalErr != nil {
80-
return nil, fmt.Errorf("failed to unmarshal cached entries: %w", unmarshalErr)
112+
return nil, newCacheError(
113+
unmarshalErr,
114+
"GetRefs",
115+
fmt.Sprintf("failed to unmarshal cached refs for key %q", urlKey),
116+
)
81117
}
82118
return refs, nil
83119
}
84120

85121
func (r *responseCache) SetRefs(urlKey string, refs ResponseRefs) error {
86122
data, err := json.Marshal(refs)
87123
if err != nil {
88-
return fmt.Errorf("failed to marshal headers: %w", err)
124+
return newCacheError(
125+
err,
126+
"SetRefs",
127+
fmt.Sprintf("failed to marshal refs for key %q", urlKey),
128+
)
89129
}
90130
return r.cache.Set(urlKey, data)
91131
}

roundtripper.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ import (
5454
"iter"
5555
"log/slog"
5656
"net/http"
57+
"strings"
5758
"time"
5859

5960
"github.com/bartventer/httpcache/internal"
@@ -224,13 +225,14 @@ func (r *transport) RoundTrip(req *http.Request) (*http.Response, error) {
224225
entry, err := r.cache.Get(refs[refIndex].ResponseID, req)
225226
if err != nil || entry == nil {
226227
r.logger.Warn(
227-
"Cache reference found but entry missing or unreadable; possible cache corruption or concurrent eviction. Falling back to cache miss.",
228+
"Cache entry missing or unreadable. Possible corruption or eviction.",
228229
slog.String("url", req.URL.String()),
229230
slog.String("method", req.Method),
230-
slog.String("cacheKey", urlKey),
231-
slog.Int("refIndex", refIndex),
231+
slog.String("drivers", strings.Join(store.Drivers(), ", ")),
232+
slog.String("cache_key", urlKey),
233+
slog.Int("ref_index", refIndex),
232234
slog.String("vary", refs[refIndex].Vary),
233-
slog.String("responseID", refs[refIndex].ResponseID),
235+
slog.String("response_id", refs[refIndex].ResponseID),
234236
slog.Any("error", err),
235237
)
236238
return r.handleCacheMiss(req, urlKey, refs, refIndex)

0 commit comments

Comments
 (0)