From fdc9530e3142d5d50f6901a65d570eba052ba10e Mon Sep 17 00:00:00 2001 From: Rahul Agrawal Date: Wed, 28 Feb 2018 18:35:42 +0530 Subject: [PATCH 1/2] Stats API Built --- memcache/memcache.go | 42 +++++++++++++++++++++++++++++++++++++++ memcache/memcache_test.go | 8 ++++++++ 2 files changed, 50 insertions(+) diff --git a/memcache/memcache.go b/memcache/memcache.go index b98a7653..d0640310 100644 --- a/memcache/memcache.go +++ b/memcache/memcache.go @@ -324,6 +324,46 @@ func (c *Client) Get(key string) (item *Item, err error) { return } + +// Get Stats as an array of String +func (c *Client) Stats() ([]string, error) { + addr, err := c.selector.PickServer("tmp") + if err != nil { + return nil,err + } + return c.getStatsFromAddr(addr) +} + +func (c *Client) getStatsFromAddr(addr net.Addr) ([]string,error) { + cn, err := c.getConn(addr) + if err != nil { + return nil,err + } + defer cn.condRelease(&err) + + if _, err := fmt.Fprintf(cn.rw, "stats\r\n"); err != nil { + return nil,err + } + if err := cn.rw.Flush(); err != nil { + return nil,err + } + return parseStatsResponse(cn.rw.Reader) +} + +func parseStatsResponse(r *bufio.Reader) ([]string,error) { + stats := []string{} + for { + line, err := r.ReadSlice('\n') + if err != nil { + return stats,err + } + if bytes.Equal(line, resultEnd) { + return stats,nil + } + stats = append(stats,string(line)) + } +} + // Touch updates the expiry for the given key. The seconds parameter is either // a Unix timestamp or, if seconds is less than 1 month, the number of seconds // into the future at which time the item will expire. ErrCacheMiss is returned if the @@ -334,6 +374,8 @@ func (c *Client) Touch(key string, seconds int32) (err error) { }) } + + func (c *Client) withKeyAddr(key string, fn func(net.Addr) error) (err error) { if !legalKey(key) { return ErrMalformedKey diff --git a/memcache/memcache_test.go b/memcache/memcache_test.go index 4b52a911..7a2dee98 100644 --- a/memcache/memcache_test.go +++ b/memcache/memcache_test.go @@ -79,6 +79,14 @@ func mustSetF(t *testing.T, c *Client) func(*Item) { } } +func TestStats(t *testing.T) { + client := New(testServer) + _, err := client.Stats() + if err != nil { + t.Errorf("error fetching stats %v", err) + } +} + func testWithClient(t *testing.T, c *Client) { checkErr := func(err error, format string, args ...interface{}) { if err != nil { From bae748bc4a72d02cdf7de5bbd656c135ac654ad3 Mon Sep 17 00:00:00 2001 From: Rahul Agrawal Date: Thu, 1 Mar 2018 17:29:45 +0530 Subject: [PATCH 2/2] stats items and status slabs created --- memcache/memcache.go | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/memcache/memcache.go b/memcache/memcache.go index d0640310..61b23a89 100644 --- a/memcache/memcache.go +++ b/memcache/memcache.go @@ -331,17 +331,33 @@ func (c *Client) Stats() ([]string, error) { if err != nil { return nil,err } - return c.getStatsFromAddr(addr) + return c.getStatsFromAddr(addr,"stats\r\n") } -func (c *Client) getStatsFromAddr(addr net.Addr) ([]string,error) { +func (c *Client) ItemStats() ([]string, error) { + addr, err := c.selector.PickServer("tmp") + if err != nil { + return nil,err + } + return c.getStatsFromAddr(addr,"stats items\r\n") +} + +func (c *Client) SlabsStats() ([]string, error) { + addr, err := c.selector.PickServer("tmp") + if err != nil { + return nil,err + } + return c.getStatsFromAddr(addr,"stats slabs\r\n") +} + +func (c *Client) getStatsFromAddr(addr net.Addr,command string) ([]string,error) { cn, err := c.getConn(addr) if err != nil { return nil,err } defer cn.condRelease(&err) - if _, err := fmt.Fprintf(cn.rw, "stats\r\n"); err != nil { + if _, err := fmt.Fprintf(cn.rw, command); err != nil { return nil,err } if err := cn.rw.Flush(); err != nil {