Skip to content

Commit 7125bf6

Browse files
authored
Merge pull request #1513 from go-redis/feature/net-remote-addr
otel: add RemoteAddr
2 parents 9e4063a + 566840f commit 7125bf6

File tree

4 files changed

+26
-13
lines changed

4 files changed

+26
-13
lines changed

internal/pool/conn.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/go-redis/redis/v8/internal"
1111
"github.com/go-redis/redis/v8/internal/proto"
12+
"go.opentelemetry.io/otel/api/trace"
1213
)
1314

1415
var noDeadline = time.Time{}
@@ -58,11 +59,14 @@ func (cn *Conn) Write(b []byte) (int, error) {
5859
}
5960

6061
func (cn *Conn) RemoteAddr() net.Addr {
61-
return cn.netConn.RemoteAddr()
62+
if cn.netConn != nil {
63+
return cn.netConn.RemoteAddr()
64+
}
65+
return nil
6266
}
6367

6468
func (cn *Conn) WithReader(ctx context.Context, timeout time.Duration, fn func(rd *proto.Reader) error) error {
65-
return internal.WithSpan(ctx, "with_reader", func(ctx context.Context) error {
69+
return internal.WithSpan(ctx, "with_reader", func(ctx context.Context, span trace.Span) error {
6670
if err := cn.netConn.SetReadDeadline(cn.deadline(ctx, timeout)); err != nil {
6771
return internal.RecordError(ctx, err)
6872
}
@@ -76,7 +80,7 @@ func (cn *Conn) WithReader(ctx context.Context, timeout time.Duration, fn func(r
7680
func (cn *Conn) WithWriter(
7781
ctx context.Context, timeout time.Duration, fn func(wr *proto.Writer) error,
7882
) error {
79-
return internal.WithSpan(ctx, "with_writer", func(ctx context.Context) error {
83+
return internal.WithSpan(ctx, "with_writer", func(ctx context.Context, span trace.Span) error {
8084
if err := cn.netConn.SetWriteDeadline(cn.deadline(ctx, timeout)); err != nil {
8185
return internal.RecordError(ctx, err)
8286
}

internal/util.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
)
1212

1313
func Sleep(ctx context.Context, dur time.Duration) error {
14-
return WithSpan(ctx, "sleep", func(ctx context.Context) error {
14+
return WithSpan(ctx, "sleep", func(ctx context.Context, span trace.Span) error {
1515
t := time.NewTimer(dur)
1616
defer t.Stop()
1717

@@ -62,15 +62,15 @@ func Unwrap(err error) error {
6262

6363
//------------------------------------------------------------------------------
6464

65-
func WithSpan(ctx context.Context, name string, fn func(context.Context) error) error {
66-
if !trace.SpanFromContext(ctx).IsRecording() {
67-
return fn(ctx)
65+
func WithSpan(ctx context.Context, name string, fn func(context.Context, trace.Span) error) error {
66+
if span := trace.SpanFromContext(ctx); !span.IsRecording() {
67+
return fn(ctx, span)
6868
}
6969

7070
ctx, span := global.Tracer("github.com/go-redis/redis").Start(ctx, name)
7171
defer span.End()
7272

73-
return fn(ctx)
73+
return fn(ctx, span)
7474
}
7575

7676
func RecordError(ctx context.Context, err error) error {

options.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -293,9 +293,9 @@ func newConnPool(opt *Options) *pool.ConnPool {
293293
return pool.NewConnPool(&pool.Options{
294294
Dialer: func(ctx context.Context) (net.Conn, error) {
295295
var conn net.Conn
296-
err := internal.WithSpan(ctx, "dialer", func(ctx context.Context) error {
296+
err := internal.WithSpan(ctx, "dialer", func(ctx context.Context, span trace.Span) error {
297297
var err error
298-
trace.SpanFromContext(ctx).SetAttributes(
298+
span.SetAttributes(
299299
label.String("redis.network", opt.Network),
300300
label.String("redis.addr", opt.Addr),
301301
)

redis.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"github.com/go-redis/redis/v8/internal"
99
"github.com/go-redis/redis/v8/internal/pool"
1010
"github.com/go-redis/redis/v8/internal/proto"
11+
"go.opentelemetry.io/otel/api/trace"
12+
"go.opentelemetry.io/otel/label"
1113
)
1214

1315
// Nil reply returned by Redis when key does not exist.
@@ -223,7 +225,7 @@ func (c *baseClient) _getConn(ctx context.Context) (*pool.Conn, error) {
223225
return cn, nil
224226
}
225227

226-
err = internal.WithSpan(ctx, "init_conn", func(ctx context.Context) error {
228+
err = internal.WithSpan(ctx, "init_conn", func(ctx context.Context, span trace.Span) error {
227229
return c.initConn(ctx, cn)
228230
})
229231
if err != nil {
@@ -297,11 +299,18 @@ func (c *baseClient) releaseConn(ctx context.Context, cn *pool.Conn, err error)
297299
func (c *baseClient) withConn(
298300
ctx context.Context, fn func(context.Context, *pool.Conn) error,
299301
) error {
300-
return internal.WithSpan(ctx, "with_conn", func(ctx context.Context) error {
302+
return internal.WithSpan(ctx, "with_conn", func(ctx context.Context, span trace.Span) error {
301303
cn, err := c.getConn(ctx)
302304
if err != nil {
303305
return err
304306
}
307+
308+
if span.IsRecording() {
309+
if remoteAddr := cn.RemoteAddr(); remoteAddr != nil {
310+
span.SetAttributes(label.String("net.peer.ip", remoteAddr.String()))
311+
}
312+
}
313+
305314
defer func() {
306315
c.releaseConn(ctx, cn, err)
307316
}()
@@ -317,7 +326,7 @@ func (c *baseClient) process(ctx context.Context, cmd Cmder) error {
317326
attempt := attempt
318327

319328
var retry bool
320-
err := internal.WithSpan(ctx, "process", func(ctx context.Context) error {
329+
err := internal.WithSpan(ctx, "process", func(ctx context.Context, span trace.Span) error {
321330
if attempt > 0 {
322331
if err := internal.Sleep(ctx, c.retryBackoff(attempt)); err != nil {
323332
return err

0 commit comments

Comments
 (0)