Skip to content

Commit d1842db

Browse files
support semconv v1.30 (#44)
1 parent 14ddd27 commit d1842db

File tree

9 files changed

+221
-54
lines changed

9 files changed

+221
-54
lines changed

.github/workflows/tests.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ jobs:
1313
with:
1414
go-version: '1.22'
1515

16+
- name: Tidy modules
17+
run: go mod tidy
18+
1619
- uses: actions/cache@v3
1720
with:
1821
path: ~/go/pkg/mod

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@
22
metrics/test.db
33
logging/logrus/test.db
44
.DS_Store
5+
6+
.vscode/
7+

go.mod

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,45 @@ go 1.22
44

55
require (
66
github.com/sirupsen/logrus v1.9.3
7-
github.com/stretchr/testify v1.9.0
7+
github.com/stretchr/testify v1.10.0
88
go.opentelemetry.io/contrib/instrumentation/runtime v0.44.0
99
go.opentelemetry.io/contrib/propagators/b3 v1.19.0
1010
go.opentelemetry.io/contrib/propagators/jaeger v1.19.0
1111
go.opentelemetry.io/contrib/propagators/opencensus v0.44.0
1212
go.opentelemetry.io/contrib/propagators/ot v1.19.0
13-
go.opentelemetry.io/otel v1.32.0
13+
go.opentelemetry.io/otel v1.35.0
1414
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v0.42.0
1515
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0
1616
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0
1717
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.32.0
18-
go.opentelemetry.io/otel/metric v1.32.0
18+
go.opentelemetry.io/otel/metric v1.35.0
1919
go.opentelemetry.io/otel/sdk v1.32.0
2020
go.opentelemetry.io/otel/sdk/metric v1.32.0
21-
go.opentelemetry.io/otel/trace v1.32.0
21+
go.opentelemetry.io/otel/trace v1.35.0
2222
gorm.io/driver/sqlite v1.5.0
23-
gorm.io/gorm v1.25.1
23+
gorm.io/gorm v1.25.10
24+
)
25+
26+
require (
27+
github.com/ClickHouse/ch-go v0.61.5 // indirect
28+
github.com/ClickHouse/clickhouse-go/v2 v2.23.2 // indirect
29+
github.com/andybalholm/brotli v1.1.0 // indirect
30+
github.com/go-faster/city v1.0.1 // indirect
31+
github.com/go-faster/errors v0.7.1 // indirect
32+
github.com/go-sql-driver/mysql v1.7.0 // indirect
33+
github.com/hashicorp/go-version v1.6.0 // indirect
34+
github.com/jackc/pgpassfile v1.0.0 // indirect
35+
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect
36+
github.com/jackc/pgx/v5 v5.5.5 // indirect
37+
github.com/jackc/puddle/v2 v2.2.1 // indirect
38+
github.com/klauspost/compress v1.17.8 // indirect
39+
github.com/paulmach/orb v0.11.1 // indirect
40+
github.com/pierrec/lz4/v4 v4.1.21 // indirect
41+
github.com/pkg/errors v0.9.1 // indirect
42+
github.com/segmentio/asm v1.2.0 // indirect
43+
github.com/shopspring/decimal v1.4.0 // indirect
44+
golang.org/x/crypto v0.21.0 // indirect
45+
golang.org/x/sync v0.6.0 // indirect
2446
)
2547

2648
require (
@@ -37,16 +59,20 @@ require (
3759
github.com/mattn/go-sqlite3 v1.14.15 // indirect
3860
github.com/pmezard/go-difflib v1.0.0 // indirect
3961
go.opencensus.io v0.24.0 // indirect
62+
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
4063
go.opentelemetry.io/otel/bridge/opencensus v0.41.0 // indirect
4164
go.opentelemetry.io/otel/exporters/otlp/otlpmetric v0.42.0 // indirect
4265
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
4366
go.uber.org/multierr v1.11.0 // indirect
44-
golang.org/x/net v0.17.0 // indirect
67+
golang.org/x/net v0.22.0 // indirect
4568
golang.org/x/sys v0.28.0 // indirect
46-
golang.org/x/text v0.13.0 // indirect
69+
golang.org/x/text v0.14.0 // indirect
4770
google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect
4871
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
4972
google.golang.org/grpc v1.59.0 // indirect
50-
google.golang.org/protobuf v1.31.0 // indirect
73+
google.golang.org/protobuf v1.33.0 // indirect
5174
gopkg.in/yaml.v3 v3.0.1 // indirect
75+
gorm.io/driver/clickhouse v0.6.1
76+
gorm.io/driver/mysql v1.5.7
77+
gorm.io/driver/postgres v1.5.11
5278
)

go.sum

Lines changed: 114 additions & 14 deletions
Large diffs are not rendered by default.

provider/options.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"go.opentelemetry.io/otel/propagation"
1010
"go.opentelemetry.io/otel/sdk/resource"
1111
sdktrace "go.opentelemetry.io/otel/sdk/trace"
12-
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
12+
semconv "go.opentelemetry.io/otel/semconv/v1.30.0"
1313
)
1414

1515
// Option opts for opentelemetry tracer provider
@@ -70,21 +70,21 @@ func defaultConfig() *config {
7070
// WithServiceName configures `service.name` resource attribute
7171
func WithServiceName(serviceName string) Option {
7272
return option(func(cfg *config) {
73-
cfg.resourceAttributes = append(cfg.resourceAttributes, semconv.ServiceNameKey.String(serviceName))
73+
cfg.resourceAttributes = append(cfg.resourceAttributes, semconv.ServiceName(serviceName))
7474
})
7575
}
7676

77-
// WithDeploymentEnvironment configures `deployment.environment` resource attribute
77+
// WithDeploymentEnvironment configures `deployment.environment.name` resource attribute
7878
func WithDeploymentEnvironment(env string) Option {
7979
return option(func(cfg *config) {
80-
cfg.resourceAttributes = append(cfg.resourceAttributes, semconv.DeploymentEnvironmentKey.String(env))
80+
cfg.resourceAttributes = append(cfg.resourceAttributes, semconv.DeploymentEnvironmentName(env))
8181
})
8282
}
8383

8484
// WithServiceNamespace configures `service.namespace` resource attribute
8585
func WithServiceNamespace(namespace string) Option {
8686
return option(func(cfg *config) {
87-
cfg.resourceAttributes = append(cfg.resourceAttributes, semconv.ServiceNamespaceKey.String(namespace))
87+
cfg.resourceAttributes = append(cfg.resourceAttributes, semconv.ServiceNamespace(namespace))
8888
})
8989
}
9090

provider/provider.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313
"go.opentelemetry.io/otel/sdk/resource"
1414

1515
sdktrace "go.opentelemetry.io/otel/sdk/trace"
16-
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
16+
semconv "go.opentelemetry.io/otel/semconv/v1.30.0"
1717
)
1818

1919
type OtelProvider interface {

tracing/option.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package tracing
22

33
import (
44
"go.opentelemetry.io/otel/attribute"
5-
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
5+
semconv "go.opentelemetry.io/otel/semconv/v1.30.0"
66
"go.opentelemetry.io/otel/trace"
77
)
88

@@ -23,9 +23,9 @@ func WithAttributes(attrs ...attribute.KeyValue) Option {
2323
}
2424

2525
// WithDBName configures a db.name attribute.
26-
func WithDBName(name string) Option {
26+
func WithDBSystem(name string) Option {
2727
return func(p *otelPlugin) {
28-
p.attrs = append(p.attrs, semconv.DBNameKey.String(name))
28+
p.attrs = append(p.attrs, semconv.DBSystemNameKey.String(name))
2929
}
3030
}
3131

tracing/tracing.go

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@ import (
1111
"go.opentelemetry.io/otel"
1212
"go.opentelemetry.io/otel/attribute"
1313
"go.opentelemetry.io/otel/codes"
14-
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
14+
semconv "go.opentelemetry.io/otel/semconv/v1.30.0"
1515
"go.opentelemetry.io/otel/trace"
16+
"gorm.io/driver/clickhouse"
17+
"gorm.io/driver/mysql"
18+
"gorm.io/driver/postgres"
1619
"gorm.io/gorm"
1720

1821
"gorm.io/plugin/opentelemetry/metrics"
@@ -106,7 +109,30 @@ func (p otelPlugin) Initialize(db *gorm.DB) (err error) {
106109

107110
func (p *otelPlugin) before(spanName string) gormHookFunc {
108111
return func(tx *gorm.DB) {
109-
tx.Statement.Context, _ = p.tracer.Start(tx.Statement.Context, spanName, trace.WithSpanKind(trace.SpanKindClient))
112+
ctx, span := p.tracer.Start(tx.Statement.Context, spanName, trace.WithSpanKind(trace.SpanKindClient))
113+
tx.Statement.Context = ctx
114+
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:
134+
135+
}
110136
}
111137
}
112138

@@ -135,10 +161,19 @@ func (p *otelPlugin) after() gormHookFunc {
135161
}
136162

137163
formatQuery := p.formatQuery(query)
138-
attrs = append(attrs, semconv.DBStatementKey.String(formatQuery))
139-
attrs = append(attrs, semconv.DBOperationKey.String(dbOperation(formatQuery)))
164+
attrs = append(attrs, semconv.DBQueryText(formatQuery))
165+
operation := dbOperation(formatQuery)
166+
attrs = append(attrs, semconv.DBOperationName(operation))
140167
if tx.Statement.Table != "" {
141-
attrs = append(attrs, semconv.DBSQLTableKey.String(tx.Statement.Table))
168+
attrs = append(attrs, semconv.DBCollectionName(tx.Statement.Table))
169+
// add attr `db.query.summary`
170+
dbQuerySummary := operation + " " + tx.Statement.Table
171+
attrs = append(attrs, semconv.DBQuerySummary(dbQuerySummary))
172+
173+
// according to semconv, we should update the span name here if `db.query.summary`is available
174+
// Use `db.query.summary` as span name directly here instead of keeping the original span name like `gorm.Query`,
175+
// as we cannot access the original span name here.
176+
span.SetName(dbQuerySummary)
142177
}
143178
if tx.Statement.RowsAffected != -1 {
144179
attrs = append(attrs, dbRowsAffected.Int64(tx.Statement.RowsAffected))
@@ -169,19 +204,19 @@ func (p *otelPlugin) formatQuery(query string) string {
169204
func dbSystem(tx *gorm.DB) attribute.KeyValue {
170205
switch tx.Dialector.Name() {
171206
case "mysql":
172-
return semconv.DBSystemMySQL
207+
return semconv.DBSystemNameMySQL
173208
case "mssql":
174-
return semconv.DBSystemMSSQL
209+
return semconv.DBSystemNameMicrosoftSQLServer
175210
case "postgres", "postgresql":
176-
return semconv.DBSystemPostgreSQL
211+
return semconv.DBSystemNamePostgreSQL
177212
case "sqlite":
178-
return semconv.DBSystemSqlite
213+
return semconv.DBSystemNameSqlite
179214
case "sqlserver":
180-
return semconv.DBSystemKey.String("sqlserver")
215+
return semconv.DBSystemNameMicrosoftSQLServer
181216
case "clickhouse":
182-
return semconv.DBSystemKey.String("clickhouse")
217+
return semconv.DBSystemNameClickhouse
183218
case "spanner":
184-
return semconv.DBSystemKey.String("spanner")
219+
return semconv.DBSystemNameGCPSpanner
185220
default:
186221
return attribute.KeyValue{}
187222
}

tracing/tracing_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"go.opentelemetry.io/otel/codes"
1111
sdktrace "go.opentelemetry.io/otel/sdk/trace"
1212
"go.opentelemetry.io/otel/sdk/trace/tracetest"
13-
semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
13+
semconv "go.opentelemetry.io/otel/semconv/v1.30.0"
1414
"go.opentelemetry.io/otel/trace"
1515
"gorm.io/driver/sqlite"
1616
"gorm.io/gorm"
@@ -37,15 +37,15 @@ func TestOtel(t *testing.T) {
3737

3838
m := attrMap(spans[0].Attributes())
3939

40-
sys, ok := m[semconv.DBSystemKey]
40+
sys, ok := m[semconv.DBSystemNameKey]
4141
require.True(t, ok)
4242
require.Equal(t, "sqlite", sys.AsString())
4343

44-
stmt, ok := m[semconv.DBStatementKey]
44+
stmt, ok := m[semconv.DBQueryTextKey]
4545
require.True(t, ok)
4646
require.Equal(t, "SELECT 42", stmt.AsString())
4747

48-
operation, ok := m[semconv.DBOperationKey]
48+
operation, ok := m[semconv.DBOperationNameKey]
4949
require.True(t, ok)
5050
require.Equal(t, "select", operation.AsString())
5151
},
@@ -66,15 +66,15 @@ func TestOtel(t *testing.T) {
6666

6767
m := attrMap(span.Attributes())
6868

69-
sys, ok := m[semconv.DBSystemKey]
69+
sys, ok := m[semconv.DBSystemNameKey]
7070
require.True(t, ok)
7171
require.Equal(t, "sqlite", sys.AsString())
7272

73-
stmt, ok := m[semconv.DBStatementKey]
73+
stmt, ok := m[semconv.DBQueryTextKey]
7474
require.True(t, ok)
7575
require.Equal(t, "SELECT foo_bar", stmt.AsString())
7676

77-
operation, ok := m[semconv.DBOperationKey]
77+
operation, ok := m[semconv.DBOperationNameKey]
7878
require.True(t, ok)
7979
require.Equal(t, "select", operation.AsString())
8080
},
@@ -94,20 +94,20 @@ func TestOtel(t *testing.T) {
9494
fmt.Printf("span=%#v\n", s)
9595
}
9696
require.Equal(t, 2, len(spans))
97-
require.Equal(t, "gorm.Row", spans[1].Name())
97+
require.Equal(t, "select foo", spans[1].Name())
9898
require.Equal(t, trace.SpanKindClient, spans[1].SpanKind())
9999

100100
m := attrMap(spans[1].Attributes())
101101

102-
sys, ok := m[semconv.DBSystemKey]
102+
sys, ok := m[semconv.DBSystemNameKey]
103103
require.True(t, ok)
104104
require.Equal(t, "sqlite", sys.AsString())
105105

106-
stmt, ok := m[semconv.DBStatementKey]
106+
stmt, ok := m[semconv.DBQueryTextKey]
107107
require.True(t, ok)
108108
require.Equal(t, "SELECT id FROM `foo` WHERE id = ?", stmt.AsString())
109109

110-
operation, ok := m[semconv.DBOperationKey]
110+
operation, ok := m[semconv.DBOperationNameKey]
111111
require.True(t, ok)
112112
require.Equal(t, "select", operation.AsString())
113113
},

0 commit comments

Comments
 (0)