860b28c5b9
To simplify the vendoring story for the client, we have now removed the requirement for `logrus` and the forked `context` package (usually imported as `dcontext`). We inject the logger via the metrics tracker for the blob cache and via options on the token handler. We preserve logs on the proxy cache for that case. Clients expecting these log messages may need to be updated accordingly. Signed-off-by: Stephen J Day <stephen.day@docker.com>
67 lines
1.7 KiB
Go
67 lines
1.7 KiB
Go
package storage
|
|
|
|
import (
|
|
"context"
|
|
"expvar"
|
|
"sync/atomic"
|
|
|
|
dcontext "github.com/docker/distribution/context"
|
|
"github.com/docker/distribution/registry/storage/cache"
|
|
)
|
|
|
|
type blobStatCollector struct {
|
|
metrics cache.Metrics
|
|
}
|
|
|
|
func (bsc *blobStatCollector) Hit() {
|
|
atomic.AddUint64(&bsc.metrics.Requests, 1)
|
|
atomic.AddUint64(&bsc.metrics.Hits, 1)
|
|
}
|
|
|
|
func (bsc *blobStatCollector) Miss() {
|
|
atomic.AddUint64(&bsc.metrics.Requests, 1)
|
|
atomic.AddUint64(&bsc.metrics.Misses, 1)
|
|
}
|
|
|
|
func (bsc *blobStatCollector) Metrics() cache.Metrics {
|
|
return bsc.metrics
|
|
}
|
|
|
|
func (bsc *blobStatCollector) Logger(ctx context.Context) cache.Logger {
|
|
return dcontext.GetLogger(ctx)
|
|
}
|
|
|
|
// blobStatterCacheMetrics keeps track of cache metrics for blob descriptor
|
|
// cache requests. Note this is kept globally and made available via expvar.
|
|
// For more detailed metrics, its recommend to instrument a particular cache
|
|
// implementation.
|
|
var blobStatterCacheMetrics cache.MetricsTracker = &blobStatCollector{}
|
|
|
|
func init() {
|
|
registry := expvar.Get("registry")
|
|
if registry == nil {
|
|
registry = expvar.NewMap("registry")
|
|
}
|
|
|
|
cache := registry.(*expvar.Map).Get("cache")
|
|
if cache == nil {
|
|
cache = &expvar.Map{}
|
|
cache.(*expvar.Map).Init()
|
|
registry.(*expvar.Map).Set("cache", cache)
|
|
}
|
|
|
|
storage := cache.(*expvar.Map).Get("storage")
|
|
if storage == nil {
|
|
storage = &expvar.Map{}
|
|
storage.(*expvar.Map).Init()
|
|
cache.(*expvar.Map).Set("storage", storage)
|
|
}
|
|
|
|
storage.(*expvar.Map).Set("blobdescriptor", expvar.Func(func() interface{} {
|
|
// no need for synchronous access: the increments are atomic and
|
|
// during reading, we don't care if the data is up to date. The
|
|
// numbers will always *eventually* be reported correctly.
|
|
return blobStatterCacheMetrics
|
|
}))
|
|
}
|