Skip to content

Commit 402d74e

Browse files
authored
Merge pull request #163 from Shopify/statsd-timer-tags
Support adding tags on timer finishers
2 parents c2719df + 0394015 commit 402d74e

File tree

4 files changed

+74
-15
lines changed

4 files changed

+74
-15
lines changed

go.mod

+1-3
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,12 @@ require (
1515
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d
1616
github.com/pkg/errors v0.9.1
1717
github.com/sirupsen/logrus v1.8.1
18-
github.com/stretchr/objx v0.3.0 // indirect
19-
github.com/stretchr/testify v1.7.0
18+
github.com/stretchr/testify v1.8.1
2019
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d
2120
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
2221
golang.org/x/sys v0.0.0-20210817190340-bfb29a6856f2 // indirect
2322
golang.org/x/text v0.3.7 // indirect
2423
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
2524
gopkg.in/tomb.v2 v2.0.0-20161208151619-d5d1b5820637
2625
gopkg.in/yaml.v2 v2.4.0 // indirect
27-
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
2826
)

go.sum

+9-6
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,15 @@ github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic
4747
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
4848
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
4949
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
50-
github.com/stretchr/objx v0.3.0 h1:NGXK3lHquSN08v5vWalVI/L8XU9hdzE/G6xsrze47As=
51-
github.com/stretchr/objx v0.3.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
50+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
51+
github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c=
52+
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
5253
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
5354
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
54-
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
55-
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
55+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
56+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
57+
github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
58+
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
5659
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d h1:LO7XpTYMwTqxjLcGWPijK3vRXg1aWdlNOVOHRq45d7c=
5760
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
5861
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
@@ -78,5 +81,5 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
7881
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
7982
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
8083
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
81-
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
82-
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
84+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
85+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

statsd/timer.go

+14-6
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ func (t *Timer) Time(ctx context.Context, fn func() error, ts ...Tags) error {
3434
}
3535

3636
type Finisher interface {
37-
Finish()
38-
SuccessFinish(err *error)
37+
Finish(ts ...Tags)
38+
SuccessFinish(err *error, ts ...Tags)
39+
SetTags(ts ...Tags)
3940
}
4041

4142
type timerFinisher struct {
@@ -45,18 +46,25 @@ type timerFinisher struct {
4546
ctx context.Context
4647
}
4748

48-
func (t *timerFinisher) Finish() {
49-
t.timer.Duration(t.ctx, time.Since(t.startTime), t.tags...)
49+
func (t *timerFinisher) Finish(ts ...Tags) {
50+
tags := append([]Tags{}, t.tags...)
51+
tags = append(tags, ts...)
52+
t.timer.Duration(t.ctx, time.Since(t.startTime), tags...)
5053
}
5154

52-
func (t *timerFinisher) SuccessFinish(errp *error) {
53-
tags := append([]Tags{}, t.tags...) // Copy the slice
55+
func (t *timerFinisher) SuccessFinish(errp *error, ts ...Tags) {
56+
tags := append([]Tags{}, t.tags...)
57+
tags = append(tags, ts...)
5458
if errp != nil {
5559
tags = append(tags, Tags{"success": *errp == nil})
5660
}
5761
t.timer.Duration(t.ctx, time.Since(t.startTime), tags...)
5862
}
5963

64+
func (t *timerFinisher) SetTags(ts ...Tags) {
65+
t.tags = append(t.tags, ts...)
66+
}
67+
6068
// StartTimer provides a way to collect a duration metric for a function call
6169
// in one line.
6270
//

statsd/timer_test.go

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package statsd
2+
3+
import (
4+
"context"
5+
"io"
6+
"testing"
7+
8+
"github.com/stretchr/testify/mock"
9+
10+
"github.com/Shopify/goose/statsd/mocks"
11+
)
12+
13+
func TestTimer_StartTimer(t *testing.T) {
14+
defer func() { SetBackend(NewNullBackend()) }()
15+
16+
ctx := WithTags(context.Background(), Tags{"context": "ok"})
17+
18+
statsd := new(mocks.Backend)
19+
SetBackend(statsd)
20+
metric := &Timer{Name: "metric"}
21+
22+
t.Run("Finish", func(t *testing.T) {
23+
statsd.On("Distribution", ctx, "metric", mock.Anything, []string{"context:ok", "finish:ok", "starttimer:ok"}, 1.0).Return(nil).Once()
24+
25+
start := metric.StartTimer(ctx, Tags{"starttimer": "ok"})
26+
start.Finish(Tags{"finish": "ok"})
27+
28+
statsd.AssertExpectations(t)
29+
})
30+
31+
t.Run("SuccessFinish", func(t *testing.T) {
32+
statsd.On("Distribution", ctx, "metric", mock.Anything, []string{"context:ok", "starttimer:ok", "success:false", "successfinish:ok"}, 1.0).Return(nil).Once()
33+
34+
err := io.EOF
35+
start := metric.StartTimer(ctx, Tags{"starttimer": "ok"})
36+
start.SuccessFinish(&err, Tags{"successfinish": "ok"})
37+
38+
statsd.AssertExpectations(t)
39+
})
40+
41+
t.Run("SetTags", func(t *testing.T) {
42+
statsd.On("Distribution", ctx, "metric", mock.Anything, []string{"context:ok", "settags:ok", "starttimer:ok"}, 1.0).Return(nil).Once()
43+
44+
start := metric.StartTimer(ctx, Tags{"starttimer": "ok"})
45+
start.SetTags(Tags{"settags": "ok"})
46+
start.Finish()
47+
48+
statsd.AssertExpectations(t)
49+
})
50+
}

0 commit comments

Comments
 (0)