Skip to content

Commit 6d2f7a6

Browse files
feat: add option to exclude server address attribute (#47)
* feat: add option to exclude server address attribute * chore: formating tracing_test.go
1 parent d1842db commit 6d2f7a6

File tree

3 files changed

+63
-19
lines changed

3 files changed

+63
-19
lines changed

tracing/option.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,10 @@ func WithRecordStackTrace() Option {
5656
p.recordStackTraceInSpan = true
5757
}
5858
}
59+
60+
// WithoutServerAddress excludes db.server_address attribute.
61+
func WithoutServerAddress() Option {
62+
return func(p *otelPlugin) {
63+
p.excludeServerAddress = true
64+
}
65+
}

tracing/tracing.go

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ type otelPlugin struct {
3636
attrs []attribute.KeyValue
3737
excludeQueryVars bool
3838
excludeMetrics bool
39+
excludeServerAddress bool
3940
recordStackTraceInSpan bool
4041
queryFormatter func(query string) string
4142
}
@@ -112,26 +113,28 @@ func (p *otelPlugin) before(spanName string) gormHookFunc {
112113
ctx, span := p.tracer.Start(tx.Statement.Context, spanName, trace.WithSpanKind(trace.SpanKindClient))
113114
tx.Statement.Context = ctx
114115

115-
// `server.address` is required in the latest semconv
116-
var serverAddrAttr attribute.KeyValue
117-
switch dialector := tx.Config.Dialector.(type) {
118-
case *mysql.Dialector:
119-
if dialector.Config.DSNConfig != nil && dialector.Config.DSNConfig.Addr != "" {
120-
serverAddrAttr = semconv.ServerAddressKey.String(dialector.Config.DSNConfig.Addr)
121-
span.SetAttributes(serverAddrAttr)
122-
}
123-
case *clickhouse.Dialector:
124-
if dialector.Config.DSN != "" {
125-
serverAddrAttr = semconv.ServerAddressKey.String(dialector.Config.DSN)
126-
span.SetAttributes(serverAddrAttr)
127-
}
128-
case *postgres.Dialector:
129-
if dialector.Config.DSN != "" {
130-
serverAddrAttr = semconv.ServerAddressKey.String(dialector.Config.DSN)
131-
span.SetAttributes(serverAddrAttr)
132-
}
133-
default:
116+
if !p.excludeServerAddress {
117+
// `server.address` is required in the latest semconv
118+
var serverAddrAttr attribute.KeyValue
119+
switch dialector := tx.Config.Dialector.(type) {
120+
case *mysql.Dialector:
121+
if dialector.Config.DSNConfig != nil && dialector.Config.DSNConfig.Addr != "" {
122+
serverAddrAttr = semconv.ServerAddressKey.String(dialector.Config.DSNConfig.Addr)
123+
span.SetAttributes(serverAddrAttr)
124+
}
125+
case *clickhouse.Dialector:
126+
if dialector.Config.DSN != "" {
127+
serverAddrAttr = semconv.ServerAddressKey.String(dialector.Config.DSN)
128+
span.SetAttributes(serverAddrAttr)
129+
}
130+
case *postgres.Dialector:
131+
if dialector.Config.DSN != "" {
132+
serverAddrAttr = semconv.ServerAddressKey.String(dialector.Config.DSN)
133+
span.SetAttributes(serverAddrAttr)
134+
}
135+
default:
134136

137+
}
135138
}
136139
}
137140
}

tracing/tracing_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"go.opentelemetry.io/otel/sdk/trace/tracetest"
1313
semconv "go.opentelemetry.io/otel/semconv/v1.30.0"
1414
"go.opentelemetry.io/otel/trace"
15+
"gorm.io/driver/postgres"
1516
"gorm.io/driver/sqlite"
1617
"gorm.io/gorm"
1718
)
@@ -112,6 +113,39 @@ func TestOtel(t *testing.T) {
112113
require.Equal(t, "select", operation.AsString())
113114
},
114115
},
116+
{
117+
do: func(ctx context.Context, db *gorm.DB) {
118+
var num int
119+
db.Config.Dialector = &postgres.Dialector{
120+
Config: &postgres.Config{
121+
DSN: "test.dsn",
122+
},
123+
}
124+
err := db.WithContext(ctx).Raw("SELECT 42").Scan(&num).Error
125+
require.NoError(t, err)
126+
},
127+
require: func(t *testing.T, spans []sdktrace.ReadOnlySpan) {
128+
m := attrMap(spans[0].Attributes())
129+
require.Equal(t, "test.dsn", m[semconv.ServerAddressKey].AsString())
130+
},
131+
},
132+
{
133+
do: func(ctx context.Context, db *gorm.DB) {
134+
var num int
135+
db.Config.Dialector = &postgres.Dialector{
136+
Config: &postgres.Config{
137+
DSN: "test.dsn",
138+
},
139+
}
140+
err := db.WithContext(ctx).Raw("SELECT 42").Scan(&num).Error
141+
require.NoError(t, err)
142+
},
143+
opts: []Option{WithoutServerAddress()},
144+
require: func(t *testing.T, spans []sdktrace.ReadOnlySpan) {
145+
m := attrMap(spans[0].Attributes())
146+
require.Equal(t, "", m[semconv.ServerAddressKey].AsString())
147+
},
148+
},
115149
}
116150

117151
for i, test := range tests {

0 commit comments

Comments
 (0)