diff --git a/proxy/grpcproxy/cache/store.go b/proxy/grpcproxy/cache/store.go index a4bf90aa2..11d8864dd 100644 --- a/proxy/grpcproxy/cache/store.go +++ b/proxy/grpcproxy/cache/store.go @@ -34,6 +34,7 @@ type Cache interface { Get(req *pb.RangeRequest) (*pb.RangeResponse, error) Compact(revision int64) Invalidate(key []byte, endkey []byte) + Size() int } // keyFunc returns the key of an request, which is used to look up in the cache for it's caching response. @@ -154,3 +155,7 @@ func (c *cache) Compact(revision int64) { c.compactedRev = revision } } + +func (c *cache) Size() int { + return c.lru.Len() +} diff --git a/proxy/grpcproxy/kv.go b/proxy/grpcproxy/kv.go index b769272eb..bfb16c4ed 100644 --- a/proxy/grpcproxy/kv.go +++ b/proxy/grpcproxy/kv.go @@ -39,11 +39,14 @@ func (p *kvProxy) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRespo resp, err := p.cache.Get(r) switch err { case nil: + cacheHits.Inc() return resp, nil case cache.ErrCompacted: + cacheHits.Inc() return nil, err } } + cachedMisses.Inc() resp, err := p.kv.Do(ctx, RangeRequestToOp(r)) if err != nil { @@ -55,18 +58,23 @@ func (p *kvProxy) Range(ctx context.Context, r *pb.RangeRequest) (*pb.RangeRespo req.Serializable = true gresp := (*pb.RangeResponse)(resp.Get()) p.cache.Add(&req, gresp) + cacheKeys.Set(float64(p.cache.Size())) return gresp, nil } func (p *kvProxy) Put(ctx context.Context, r *pb.PutRequest) (*pb.PutResponse, error) { p.cache.Invalidate(r.Key, nil) + cacheKeys.Set(float64(p.cache.Size())) + resp, err := p.kv.Do(ctx, PutRequestToOp(r)) return (*pb.PutResponse)(resp.Put()), err } func (p *kvProxy) DeleteRange(ctx context.Context, r *pb.DeleteRangeRequest) (*pb.DeleteRangeResponse, error) { p.cache.Invalidate(r.Key, r.RangeEnd) + cacheKeys.Set(float64(p.cache.Size())) + resp, err := p.kv.Do(ctx, DelRequestToOp(r)) return (*pb.DeleteRangeResponse)(resp.Del()), err } @@ -120,6 +128,9 @@ func (p *kvProxy) Txn(ctx context.Context, r *pb.TxnRequest) (*pb.TxnResponse, e } else { p.txnToCache(r.Failure, resp.Responses) } + + cacheKeys.Set(float64(p.cache.Size())) + return (*pb.TxnResponse)(resp), nil } @@ -134,6 +145,8 @@ func (p *kvProxy) Compact(ctx context.Context, r *pb.CompactionRequest) (*pb.Com p.cache.Compact(r.Revision) } + cacheKeys.Set(float64(p.cache.Size())) + return (*pb.CompactionResponse)(resp), err } diff --git a/proxy/grpcproxy/metrics.go b/proxy/grpcproxy/metrics.go index 395a5e64f..864fa1609 100644 --- a/proxy/grpcproxy/metrics.go +++ b/proxy/grpcproxy/metrics.go @@ -29,9 +29,30 @@ var ( Name: "events_coalescing_total", Help: "Total number of events coalescing", }) + cacheKeys = prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "etcd", + Subsystem: "grpc_proxy", + Name: "cache_keys_total", + Help: "Total number of keys/ranges cached", + }) + cacheHits = prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "etcd", + Subsystem: "grpc_proxy", + Name: "cache_hits_total", + Help: "Total number of cache hits", + }) + cachedMisses = prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "etcd", + Subsystem: "grpc_proxy", + Name: "cache_misses_total", + Help: "Total number of cache misses", + }) ) func init() { prometheus.MustRegister(watchersCoalescing) prometheus.MustRegister(eventsCoalescing) + prometheus.MustRegister(cacheKeys) + prometheus.MustRegister(cacheHits) + prometheus.MustRegister(cachedMisses) }