Skip to content

Commit 177f71d

Browse files
authored
Merge pull request #11 from mozilla-services/ajvb/statsd
Add statsd timer collection for http, get reputation, and redis commands
2 parents 719e015 + 2f481ca commit 177f71d

File tree

15 files changed

+2246
-0
lines changed

15 files changed

+2246
-0
lines changed

http.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ func (v *ViolationRequest) Validate() error {
3232

3333
func mwHandler(h http.Handler) http.Handler {
3434
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
35+
s := time.Now()
36+
defer func() {
37+
sruntime.statsd.Timing("http.timing", time.Since(s))
38+
}()
3539
w.Header().Add("X-Frame-Options", "DENY")
3640
w.Header().Add("X-Content-Type-Options", "nosniff")
3741
w.Header().Add("Content-Security-Policy",
@@ -111,6 +115,10 @@ func httpGetAllReputation(w http.ResponseWriter, r *http.Request) {
111115
}
112116

113117
func httpGetReputation(w http.ResponseWriter, r *http.Request) {
118+
s := time.Now()
119+
defer func() {
120+
sruntime.statsd.Timing("http.get_reputation.timing", time.Since(s))
121+
}()
114122
ipstr := mux.Vars(r)["ip"]
115123
if net.ParseIP(ipstr) == nil {
116124
w.WriteHeader(http.StatusBadRequest)

iprepd.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ type serverRuntime struct {
1515
redis redisLink
1616
versionResponse []byte
1717
exceptionsLoaded chan bool
18+
statsd *statsdClient
1819
}
1920

2021
type serverCfg struct {
@@ -43,6 +44,9 @@ type serverCfg struct {
4344
AWS bool
4445
}
4546
VersionResponse string
47+
Statsd struct {
48+
Addr string
49+
}
4650
}
4751

4852
func (cfg *serverCfg) validate() error {
@@ -102,6 +106,10 @@ func StartDaemon(confpath string) {
102106
if err != nil {
103107
log.Fatalf(err.Error())
104108
}
109+
sruntime.statsd, err = newStatsdClient(sruntime.cfg)
110+
if err != nil {
111+
log.Fatalf(err.Error())
112+
}
105113
sruntime.redis, err = newRedisLink(sruntime.cfg)
106114
if err != nil {
107115
log.Fatalf(err.Error())

iprepd.yaml.sample

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,6 @@ exceptions:
7878
# request to the /__version__ endpoint. If the file isn't found a warning will be printed
7979
# in the log and the daemon will not return any data at this endpoint.
8080
versionresponse: ./version.json
81+
# statsd address for metrics. To disable metrics collection, simply delete the below section.
82+
statsd:
83+
addr: "127.0.0.1:8125"

iprepd_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ func TestMain(m *testing.M) {
5555
if renv != "" {
5656
tcfg.Redis.Addr = renv
5757
}
58+
sruntime.statsd, err = newStatsdClient(tcfg)
59+
if err != nil {
60+
fmt.Fprintf(os.Stderr, "%v\n", err)
61+
os.Exit(1)
62+
}
5863
sruntime.redis, err = newRedisLink(tcfg)
5964
if err != nil {
6065
fmt.Fprintf(os.Stderr, "%v\n", err)

redis.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package iprepd
22

33
import (
4+
"fmt"
45
"math/rand"
56
"runtime"
67
"time"
@@ -48,6 +49,15 @@ func (r *redisLink) set(k string, v interface{}, e time.Duration) *redis.StatusC
4849
return r.master.Set(k, v, e)
4950
}
5051

52+
func instrumentRedisCmd(old func(cmd redis.Cmder) error) func(cmd redis.Cmder) error {
53+
return func(cmd redis.Cmder) error {
54+
s := time.Now()
55+
err := old(cmd)
56+
sruntime.statsd.Timing(fmt.Sprintf("redis.%s.timing", cmd.Name()), time.Since(s))
57+
return err
58+
}
59+
}
60+
5161
func newRedisLink(cfg serverCfg) (ret redisLink, err error) {
5262
minIdleConns := cfg.Redis.MinIdleConn
5363
if cfg.Redis.MaxPoolSize != 0 && cfg.Redis.MaxPoolSize < 20 {
@@ -65,6 +75,7 @@ func newRedisLink(cfg serverCfg) (ret redisLink, err error) {
6575
PoolSize: cfg.Redis.MaxPoolSize,
6676
MinIdleConns: minIdleConns,
6777
})
78+
ret.master.WrapProcess(instrumentRedisCmd)
6879
_, err = ret.ping().Result()
6980
if err != nil {
7081
return
@@ -84,6 +95,7 @@ func newRedisLink(cfg serverCfg) (ret redisLink, err error) {
8495
PoolSize: cfg.Redis.MaxPoolSize,
8596
MinIdleConns: minIdleConns,
8697
})
98+
y.WrapProcess(instrumentRedisCmd)
8799
ret.readClients = append(ret.readClients, y)
88100
}
89101
// Also use the master for reads

statsd.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package iprepd
2+
3+
import (
4+
"time"
5+
6+
"github.com/DataDog/datadog-go/statsd"
7+
)
8+
9+
type statsdClient struct {
10+
client *statsd.Client
11+
}
12+
13+
func newStatsdClient(cfg serverCfg) (*statsdClient, error) {
14+
if cfg.Statsd.Addr == "" {
15+
return &statsdClient{client: nil}, nil
16+
}
17+
c, err := statsd.New(cfg.Statsd.Addr)
18+
if err != nil {
19+
return nil, err
20+
}
21+
c.Namespace = "iprepd_server."
22+
23+
return &statsdClient{client: c}, nil
24+
}
25+
26+
func (sc statsdClient) Timing(name string, value time.Duration) error {
27+
if sc.client == nil {
28+
return nil
29+
}
30+
return sc.client.Timing(name, value, []string{}, 1)
31+
}

vendor/github.com/DataDog/datadog-go/CHANGELOG.md

Lines changed: 94 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/DataDog/datadog-go/LICENSE.txt

Lines changed: 19 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/DataDog/datadog-go/README.md

Lines changed: 33 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/DataDog/datadog-go/statsd/README.md

Lines changed: 64 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)