@@ -3,9 +3,11 @@ package nsqd
33import (
44 "fmt"
55 "math"
6+ "net"
67 "time"
78
89 "github.com/nsqio/nsq/internal/statsd"
10+ "github.com/nsqio/nsq/internal/writers"
911)
1012
1113type Uint64Slice []uint64
@@ -25,20 +27,25 @@ func (s Uint64Slice) Less(i, j int) bool {
2527func (n * NSQD ) statsdLoop () {
2628 var lastMemStats memStats
2729 var lastStats []TopicStats
28- ticker := time .NewTicker (n .getOpts ().StatsdInterval )
30+ interval := n .getOpts ().StatsdInterval
31+ ticker := time .NewTicker (interval )
2932 for {
3033 select {
3134 case <- n .exitChan :
3235 goto exit
3336 case <- ticker .C :
34- client := statsd .NewClient (n .getOpts ().StatsdAddress , n .getOpts ().StatsdPrefix )
35- err := client .CreateSocket ()
37+ addr := n .getOpts ().StatsdAddress
38+ prefix := n .getOpts ().StatsdPrefix
39+ conn , err := net .DialTimeout ("udp" , addr , time .Second )
3640 if err != nil {
37- n .logf (LOG_ERROR , "failed to create UDP socket to statsd(%s)" , client )
41+ n .logf (LOG_ERROR , "failed to create UDP socket to statsd(%s)" , addr )
3842 continue
3943 }
44+ sw := writers .NewSpreadWriter (conn , interval - time .Second )
45+ bw := writers .NewBoundaryBufferedWriter (sw , n .getOpts ().StatsdUDPPacketSize )
46+ client := statsd .NewClient (bw , prefix )
4047
41- n .logf (LOG_INFO , "STATSD: pushing stats to %s" , client )
48+ n .logf (LOG_INFO , "STATSD: pushing stats to %s" , addr )
4249
4350 stats := n .GetStats ("" , "" )
4451 for _ , topic := range stats {
@@ -128,7 +135,9 @@ func (n *NSQD) statsdLoop() {
128135 lastMemStats = ms
129136 }
130137
131- client .Close ()
138+ bw .Flush ()
139+ sw .Flush ()
140+ conn .Close ()
132141 }
133142 }
134143
0 commit comments