Skip to content

Commit ef76c15

Browse files
update span name based on latest semconv (#367)
1 parent f5d5675 commit ef76c15

File tree

58 files changed

+604
-148
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+604
-148
lines changed

Diff for: .github/workflows/plugins.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,4 @@ jobs:
3737
- name: Build
3838
run: make build
3939
- name: Test
40-
run: go test -timeout 50m -v github.com/alibaba/opentelemetry-go-auto-instrumentation/test -run ".*Plugins"
40+
run: go test -timeout 90m -v github.com/alibaba/opentelemetry-go-auto-instrumentation/test -run ".*Plugins"

Diff for: docs/experimental-feature.md

+6
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,9 @@
1111
| Environment Variable | Type | Default | Description |
1212
|------------------------------------------------------------|---------|---------|-------------------------------------------------------------|
1313
| `OTEL_INSTRUMENTATION_NACOS_EXPERIMENTAL_METRICS_ENABLE` | Boolean | `false` | Enable the capture of experimental nacos metrics attributes.|
14+
15+
## Settings for the DB instrumentation
16+
17+
| Environment Variable | Type | Default | Description |
18+
|------------------------------------------------------------|---------|---------|-------------------------------------------------------------|
19+
| `OTEL_INSTRUMENTATION_DB_EXPERIMENTAL_ENABLE` | Boolean | `false` | Enable the capture of experimental database span attributes.|

Diff for: docs/how-to-write-tests-for-plugins.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ represents for the `get` redis operation. You should use the `verifier` to verif
5050
import "github.com/alibaba/opentelemetry-go-auto-instrumentation/test/verifier"
5151

5252
verifier.WaitAndAssertTraces(func (stubs []tracetest.SpanStubs) {
53-
verifier.VerifyDbAttributes(stubs[0][0], "set", "", "redis", "", "localhost", "set a b ex 5 ", "set")
54-
verifier.VerifyDbAttributes(stubs[1][0], "get", "", "redis", "", "localhost", "get a ", "get")
53+
verifier.VerifyDbAttributes(stubs[0][0], "set", "", "redis", "", "localhost", "set a b ex 5 ", "set", "")
54+
verifier.VerifyDbAttributes(stubs[1][0], "get", "", "redis", "", "localhost", "get a ", "get", "")
5555
})
5656
```
5757

Diff for: example/demo/pkg/http.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ func InitDB() {
101101
}
102102

103103
// test insert
104-
if _, err := db.ExecContext(context.Background(), `INSERT INTO usersx (id, name, age) VALUE ( ?, ?, ?)`, "0", "foo", 10); err != nil {
104+
if _, err := db.ExecContext(context.Background(), `INSERT INTO usersx (id, name, age) VALUES ( ?, ?, ?)`, "0", "foo", 10); err != nil {
105105
fmt.Printf("exec insert error: %v", err)
106106
}
107107
}

Diff for: example/extension/sqlinject/sql_inject.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func main() {
2828
fmt.Printf("exec create error: %v", err)
2929
}
3030

31-
if _, err := db.ExecContext(context.Background(), `INSERT INTO usersx (id, name, age) VALUE ( ?, ?, ?)`, "0", "foo", 10); err != nil {
31+
if _, err := db.ExecContext(context.Background(), `INSERT INTO usersx (id, name, age) VALUES ( ?, ?, ?)`, "0", "foo", 10); err != nil {
3232
fmt.Printf("exec insert error: %v", err)
3333
}
3434

Diff for: go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ require (
119119
github.com/gorilla/css v1.0.0 // indirect
120120
github.com/hashicorp/errwrap v1.1.0 // indirect
121121
github.com/hashicorp/go-multierror v1.1.1 // indirect
122+
github.com/hashicorp/golang-lru/v2 v2.0.7
122123
github.com/henrylee2cn/ameda v1.4.10 // indirect
123124
github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect
124125
github.com/huandu/xstrings v1.3.3 // indirect
@@ -194,6 +195,7 @@ require (
194195
github.com/xdg-go/scram v1.1.2 // indirect
195196
github.com/xdg-go/stringprep v1.0.4 // indirect
196197
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
198+
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2
197199
github.com/yargevad/filepathx v1.0.0 // indirect
198200
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
199201
github.com/yusufpapurcu/wmi v1.2.4 // indirect

Diff for: go.sum

+4
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,8 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY
342342
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
343343
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
344344
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
345+
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
346+
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
345347
github.com/henrylee2cn/ameda v1.4.8/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=
346348
github.com/henrylee2cn/ameda v1.4.10 h1:JdvI2Ekq7tapdPsuhrc4CaFiqw6QXFvZIULWJgQyCAk=
347349
github.com/henrylee2cn/ameda v1.4.10/go.mod h1:liZulR8DgHxdK+MEwvZIylGnmcjzQ6N6f2PlWe7nEO4=
@@ -645,6 +647,8 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17
645647
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
646648
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
647649
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
650+
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2 h1:zzrxE1FKn5ryBNl9eKOeqQ58Y/Qpo3Q9QNxKHX5uzzQ=
651+
github.com/xwb1989/sqlparser v0.0.0-20180606152119-120387863bf2/go.mod h1:hzfGeIUDq/j97IG+FhNqkowIyEcD88LrW6fyU3K3WqY=
648652
github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY=
649653
github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI=
650654
github.com/yargevad/filepathx v1.0.0 h1:SYcT+N3tYGi+NvazubCNlvgIPbzAk7i7y2dwg3I5FYc=

Diff for: pkg/inst-api-semconv/instrumenter/db/db_client_extractor.go

+22-10
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,37 @@ package db
1717
import (
1818
"context"
1919
"fmt"
20+
"os"
21+
"strconv"
22+
2023
"github.com/alibaba/opentelemetry-go-auto-instrumentation/pkg/inst-api/instrumenter"
2124
"github.com/alibaba/opentelemetry-go-auto-instrumentation/pkg/inst-api/utils"
2225
"go.opentelemetry.io/otel/attribute"
2326
semconv "go.opentelemetry.io/otel/semconv/v1.30.0"
24-
"strconv"
2527
)
2628

2729
// TODO: remove server.address and put it into NetworkAttributesExtractor
2830

29-
type DbExperimentalAttributesEnabler interface {
30-
Enable() bool
31-
}
31+
const EnvDBExperimentalEnabled = "OTEL_INSTRUMENTATION_DB_EXPERIMENTAL_ENABLE"
3232

33-
type defaultDbExperimentalAttributesEnabler struct {
33+
type dbExperimentalEnabler struct {
34+
enabled bool
3435
}
3536

36-
func (d defaultDbExperimentalAttributesEnabler) Enable() bool {
37-
return false
37+
func (d dbExperimentalEnabler) Enable() bool {
38+
return d.enabled
3839
}
3940

40-
var experimentalAttributesEnabler = instrumenter.NewDefaultInstrumentEnabler()
41+
var experimentalAttributesEnabler instrumenter.InstrumentEnabler = &dbExperimentalEnabler{
42+
// SQL params parsing is not enabled by default.
43+
enabled: func() bool {
44+
val, err := strconv.ParseBool(os.Getenv(EnvDBExperimentalEnabled))
45+
if err != nil {
46+
return false
47+
}
48+
return val
49+
}(),
50+
}
4151

4252
type DbClientCommonAttrsExtractor[REQUEST any, RESPONSE any, GETTER DbClientCommonAttrsGetter[REQUEST]] struct {
4353
Getter GETTER
@@ -86,6 +96,9 @@ func (d *DbClientAttrsExtractor[REQUEST, RESPONSE, GETTER]) OnEnd(attrs []attrib
8696
}, attribute.KeyValue{
8797
Key: semconv.ServerAddressKey,
8898
Value: attribute.StringValue(d.Base.Getter.GetServerAddress(request)),
99+
}, attribute.KeyValue{
100+
Key: semconv.DBCollectionNameKey,
101+
Value: attribute.StringValue(d.Base.Getter.GetCollection(request)),
89102
})
90103
batchSize := d.Base.Getter.GetBatchSize(request)
91104
if batchSize > 0 {
@@ -95,13 +108,12 @@ func (d *DbClientAttrsExtractor[REQUEST, RESPONSE, GETTER]) OnEnd(attrs []attrib
95108
if dbNameSpace != "" {
96109
attrs = append(attrs, attribute.KeyValue{Key: semconv.DBNamespaceKey, Value: attribute.StringValue(dbNameSpace)})
97110
}
98-
// TODO: add db.collection.name after doing sanitizing
99111
if d.Base.AttributesFilter != nil {
100112
attrs = d.Base.AttributesFilter(attrs)
101113
}
102114
if experimentalAttributesEnabler.Enable() {
103115
params := d.Base.Getter.GetParameters(request)
104-
if params != nil && len(params) > 0 {
116+
if len(params) > 0 {
105117
for i, param := range params {
106118
attrs = append(attrs, attribute.String("db.query.parameter."+strconv.Itoa(i), fmt.Sprintf("%v", param)))
107119
}

Diff for: pkg/inst-api-semconv/instrumenter/db/db_client_extractor_test.go

+8-2
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,18 @@ package db
1616

1717
import (
1818
"context"
19+
"log"
20+
"testing"
21+
1922
"github.com/alibaba/opentelemetry-go-auto-instrumentation/pkg/inst-api/utils"
2023
"go.opentelemetry.io/otel/attribute"
2124
semconv "go.opentelemetry.io/otel/semconv/v1.30.0"
22-
"log"
23-
"testing"
2425
)
2526

2627
type testRequest struct {
2728
Name string
2829
Operation string
30+
Target string
2931
}
3032

3133
type testResponse struct {
@@ -66,6 +68,10 @@ func (m mongoAttrsGetter) GetParameters(request testRequest) []any {
6668
return nil
6769
}
6870

71+
func (m mongoAttrsGetter) GetCollection(request testRequest) string {
72+
return request.Target
73+
}
74+
6975
func TestGetSpanKey(t *testing.T) {
7076
dbExtractor := &DbClientAttrsExtractor[testRequest, any, mongoAttrsGetter]{}
7177
if dbExtractor.GetSpanKey() != utils.DB_CLIENT_KEY {

Diff for: pkg/inst-api-semconv/instrumenter/db/db_client_getter.go

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type DbClientAttrsGetter[REQUEST any] interface {
2525
DbClientCommonAttrsGetter[REQUEST]
2626
GetStatement(REQUEST) string
2727
GetOperation(REQUEST) string
28+
GetCollection(REQUEST) string
2829
GetParameters(REQUEST) []any
2930
}
3031

Diff for: pkg/inst-api-semconv/instrumenter/db/db_span_name_extractor.go

+17-4
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,23 @@ type DBSpanNameExtractor[REQUEST any] struct {
1818
Getter DbClientAttrsGetter[REQUEST]
1919
}
2020

21+
// ref: https://opentelemetry.io/docs/specs/semconv/database/database-spans/#name
2122
func (d *DBSpanNameExtractor[REQUEST]) Extract(request REQUEST) string {
2223
operation := d.Getter.GetOperation(request)
23-
if operation == "" {
24-
return "DB Query"
24+
target := d.Getter.GetCollection(request)
25+
system := d.Getter.GetSystem(request)
26+
27+
if operation != "" && target != "" {
28+
return operation + " " + target
2529
}
26-
return operation
27-
}
30+
31+
if operation != "" {
32+
return operation
33+
}
34+
// If neither {db.operation.name} nor {target} are available, span name SHOULD be {db.system}.
35+
if system != "" {
36+
return system
37+
}
38+
39+
return "DB"
40+
}

Diff for: pkg/inst-api-semconv/instrumenter/db/db_span_name_extractor_test.go

+11-5
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,23 @@ package db
1616

1717
import "testing"
1818

19-
func TestDbNameExtractor(t *testing.T) {
19+
func TestDbSpanNameExtractor(t *testing.T) {
2020
dbSpanNameExtractor := DBSpanNameExtractor[testRequest]{
2121
Getter: mongoAttrsGetter{},
2222
}
23-
if dbSpanNameExtractor.Extract(testRequest{}) != "DB Query" {
24-
t.Fatalf("Should have returned DB Query")
23+
if dbSpanNameExtractor.Extract(testRequest{}) != "DB" {
24+
t.Fatalf("Should have returned DB")
2525
}
26-
if dbSpanNameExtractor.Extract(testRequest{Name: "test", Operation: "test"}) != "test" {
27-
t.Fatalf("Should have returned test")
26+
if dbSpanNameExtractor.Extract(testRequest{Name: "test", Operation: "op"}) != "op" {
27+
t.Fatalf("Should have returned op")
2828
}
2929
if dbSpanNameExtractor.Extract(testRequest{Operation: "op_test"}) != "op_test" {
3030
t.Fatalf("Should have returned op_test")
3131
}
32+
if dbSpanNameExtractor.Extract(testRequest{Operation: "op", Target: "table"}) != "op table" {
33+
t.Fatalf("Should have returned `op table`")
34+
}
35+
if dbSpanNameExtractor.Extract(testRequest{Name: "test"}) != "test" {
36+
t.Fatalf("Shoule have returned test")
37+
}
3238
}

0 commit comments

Comments
 (0)