Skip to content

Commit 984a639

Browse files
authored
Merge pull request #1225 from go-redis/fix/watch-instrumentation
Add missing Tx instrumentation
2 parents 6c240ff + c0fcf85 commit 984a639

File tree

5 files changed

+72
-12
lines changed

5 files changed

+72
-12
lines changed

example_instrumentation_test.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,25 @@ func ExamplePipeline_instrumentation() {
5656
// Output: pipeline starting processing: [ping: ping: ]
5757
// pipeline finished processing: [ping: PONG ping: PONG]
5858
}
59+
60+
func ExampleWatch_instrumentation() {
61+
rdb := redis.NewClient(&redis.Options{
62+
Addr: ":6379",
63+
})
64+
rdb.AddHook(redisHook{})
65+
66+
rdb.Watch(func(tx *redis.Tx) error {
67+
tx.Ping()
68+
tx.Ping()
69+
return nil
70+
}, "foo")
71+
// Output:
72+
// starting processing: <watch foo: >
73+
// finished processing: <watch foo: OK>
74+
// starting processing: <ping: >
75+
// finished processing: <ping: PONG>
76+
// starting processing: <ping: >
77+
// finished processing: <ping: PONG>
78+
// starting processing: <unwatch: >
79+
// finished processing: <unwatch: OK>
80+
}

go.mod

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
module github.com/go-redis/redis/v7
22

33
require (
4-
github.com/onsi/ginkgo v1.8.0
5-
github.com/onsi/gomega v1.5.0
4+
github.com/golang/protobuf v1.3.2 // indirect
5+
github.com/kr/pretty v0.1.0 // indirect
6+
github.com/onsi/ginkgo v1.10.1
7+
github.com/onsi/gomega v1.7.0
8+
golang.org/x/net v0.0.0-20190923162816-aa69164e4478 // indirect
9+
golang.org/x/sys v0.0.0-20191010194322-b09406accb47 // indirect
10+
golang.org/x/text v0.3.2 // indirect
11+
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
12+
gopkg.in/yaml.v2 v2.2.4 // indirect
613
)
714

815
go 1.11

go.sum

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,46 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV
22
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
33
github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM=
44
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
5+
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
6+
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
57
github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
68
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
9+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
10+
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
11+
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
12+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
13+
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
714
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
8-
github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w=
9-
github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
10-
github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo=
11-
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
15+
github.com/onsi/ginkgo v1.10.1 h1:q/mM8GF/n0shIN8SaAZ0V+jnLPzen6WIVZdiwrRlMlo=
16+
github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
17+
github.com/onsi/gomega v1.7.0 h1:XPnZz8VVBHjVsy1vzJmRwIcSwiUO+JFfrv/xGiigmME=
18+
github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
19+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
1220
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd h1:nTDtHvHSdCn1m6ITfMRqtOd/9+7a3s8RBNOZ3eYZzJA=
1321
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
22+
golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g=
23+
golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
1424
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
1525
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
1626
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e h1:o3PsSEY8E4eXWkXrIP9YJALUkVZqzHJT5DOasTyn8Vs=
1727
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
28+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
29+
golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY=
30+
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1831
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
1932
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
33+
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
34+
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
35+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
2036
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
2137
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
38+
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
39+
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
2240
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
2341
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
2442
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
2543
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
2644
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
2745
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
46+
gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
47+
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=

redis.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,16 @@ type hooks struct {
3232
hooks []Hook
3333
}
3434

35-
func (hs hooks) Lock() {
35+
func (hs *hooks) Lock() {
3636
hs.hooks = hs.hooks[:len(hs.hooks):len(hs.hooks)]
3737
}
3838

39+
func (hs hooks) Clone() hooks {
40+
clone := hs
41+
clone.Lock()
42+
return clone
43+
}
44+
3945
func (hs *hooks) AddHook(hook Hook) {
4046
hs.hooks = append(hs.hooks, hook)
4147
}

tx.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type Tx struct {
1818
baseClient
1919
cmdable
2020
statefulCmdable
21+
hooks
2122
ctx context.Context
2223
}
2324

@@ -27,7 +28,8 @@ func (c *Client) newTx(ctx context.Context) *Tx {
2728
opt: c.opt,
2829
connPool: pool.NewStickyConnPool(c.connPool.(*pool.ConnPool), true),
2930
},
30-
ctx: ctx,
31+
hooks: c.hooks.Clone(),
32+
ctx: ctx,
3133
}
3234
tx.init()
3335
return &tx
@@ -47,8 +49,9 @@ func (c *Tx) WithContext(ctx context.Context) *Tx {
4749
panic("nil context")
4850
}
4951
clone := *c
50-
clone.ctx = ctx
5152
clone.init()
53+
clone.hooks.Lock()
54+
clone.ctx = ctx
5255
return &clone
5356
}
5457

@@ -57,7 +60,7 @@ func (c *Tx) Process(cmd Cmder) error {
5760
}
5861

5962
func (c *Tx) ProcessContext(ctx context.Context, cmd Cmder) error {
60-
return c.baseClient.process(ctx, cmd)
63+
return c.hooks.process(ctx, cmd, c.baseClient.process)
6164
}
6265

6366
// Watch prepares a transaction and marks the keys to be watched
@@ -116,8 +119,10 @@ func (c *Tx) Unwatch(keys ...string) *StatusCmd {
116119
// Pipeline creates a new pipeline. It is more convenient to use Pipelined.
117120
func (c *Tx) Pipeline() Pipeliner {
118121
pipe := Pipeline{
119-
ctx: c.ctx,
120-
exec: c.processTxPipeline,
122+
ctx: c.ctx,
123+
exec: func(ctx context.Context, cmds []Cmder) error {
124+
return c.hooks.processPipeline(ctx, cmds, c.baseClient.processTxPipeline)
125+
},
121126
}
122127
pipe.init()
123128
return &pipe

0 commit comments

Comments
 (0)