Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions statsd.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package statsd

import (
"bufio"
"errors"
"fmt"
"math/rand"
"net"
Expand Down Expand Up @@ -139,6 +140,10 @@ func (c *Client) Close() error {
}

func (c *Client) send(stat string, rate float64, format string, args ...interface{}) error {
if c.buf == nil {
return errors.New("client is no longer useable")
}

if rate < 1 {
if rand.Float64() < rate {
format = fmt.Sprintf("%s|@%g", format, rate)
Expand All @@ -147,13 +152,14 @@ func (c *Client) send(stat string, rate float64, format string, args ...interfac
}
}

format = fmt.Sprintf("%s:%s", stat, format)
format = fmt.Sprintf(fmt.Sprintf("%s:%s", stat, format), args...)

c.m.Lock()
defer c.m.Unlock()

// Flush data if we have reach the buffer limit
if c.buf.Available() < len(format) {
if c.buf.Available() < len(format) ||
(c.buf.Buffered() > 0 && c.buf.Available() < len(format)+1) {
if err := c.Flush(); err != nil {
return nil
}
Expand All @@ -164,6 +170,6 @@ func (c *Client) send(stat string, rate float64, format string, args ...interfac
format = fmt.Sprintf("\n%s", format)
}

_, err := fmt.Fprintf(c.buf, format, args...)
_, err := fmt.Fprint(c.buf, format)
return err
}
44 changes: 44 additions & 0 deletions statsd_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,3 +206,47 @@ func TestMultiPacketOverflow(t *testing.T) {
c.Flush()
assert(t, buf.String(), "unique:765|s")
}

func TestMultiPacketOverflowNewline(t *testing.T) {
buf := new(bytes.Buffer)
c := &Client{
buf: bufio.NewWriterSize(buf, 24),
}

//write to the buffer, sized at 12
err := c.Unique("unique", 765, 1)
if err != nil {
t.Fatal(err)
}
//make sure this write accounts for the newline
err = c.Unique("unique", 766, 1)
if err != nil {
t.Fatal(err)
}

assert(t, buf.String(), "unique:765|s")
buf.Reset()
c.Flush()
assert(t, buf.String(), "unique:766|s")
}

func TestMultiPacketExact(t *testing.T) {
buf := new(bytes.Buffer)
c := &Client{
buf: bufio.NewWriterSize(buf, 25),
}

//write to the buffer, sized at 12
err := c.Unique("unique", 765, 1)
if err != nil {
t.Fatal(err)
}
err = c.Unique("unique", 766, 1)
if err != nil {
t.Fatal(err)
}

assert(t, buf.String(), "")
c.Flush()
assert(t, buf.String(), "unique:765|s\nunique:766|s")
}