You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.3 KiB
60 lines
1.3 KiB
package mw
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
|
|
"gitoa.ru/go-4devs/cache"
|
|
)
|
|
|
|
// Metrics interface for middleware.
|
|
type Metrics interface {
|
|
Hit(label string)
|
|
Miss(label string)
|
|
Expired(label string)
|
|
Err(label string, operation string)
|
|
Observe(label string, operation string, start time.Time)
|
|
}
|
|
|
|
// LabelName sets static name.
|
|
func LabelName(name string) func(ctx context.Context, item *cache.Item) string {
|
|
return func(_ context.Context, _ *cache.Item) string {
|
|
return name
|
|
}
|
|
}
|
|
|
|
// LabelPreficKey gets lebale by item prefix.
|
|
func LabelPreficKey(ctx context.Context, item *cache.Item) string {
|
|
return item.Key.Prefix
|
|
}
|
|
|
|
// WithMetrics cache middleware metrics.
|
|
func WithMetrics(m Metrics, labelCallback func(ctx context.Context, item *cache.Item) string) cache.Configure {
|
|
return cache.WithMiddleware(
|
|
func(ctx context.Context, op string, item *cache.Item, next cache.Provider) error {
|
|
label := labelCallback(ctx, item)
|
|
start := time.Now()
|
|
err := next(ctx, op, item)
|
|
m.Observe(label, op, start)
|
|
if err != nil {
|
|
switch {
|
|
case errors.Is(err, cache.ErrCacheMiss):
|
|
m.Miss(label)
|
|
case errors.Is(err, cache.ErrCacheExpired):
|
|
m.Expired(label)
|
|
default:
|
|
m.Err(label, op)
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
if op == cache.OperationGet {
|
|
m.Hit(label)
|
|
}
|
|
|
|
return nil
|
|
},
|
|
)
|
|
}
|
|
|