Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
ca8e8f2
Add support for semconv 1.39.0 and 1.38.0 in the `set_semconv_span_na…
cyrille-leclerc Feb 5, 2026
df7b291
Fix typo
cyrille-leclerc Feb 5, 2026
8043d6f
Add issue number to the changelog
cyrille-leclerc Feb 5, 2026
97fd16f
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Feb 6, 2026
2efbc7a
Remove trailing space char
cyrille-leclerc Feb 6, 2026
cf822ee
Apply suggestions from code review
cyrille-leclerc Feb 10, 2026
db2091f
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Feb 10, 2026
b67eee2
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Feb 11, 2026
295c580
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Feb 11, 2026
2854ec8
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Feb 12, 2026
7913c34
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Feb 12, 2026
f3a1365
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Feb 16, 2026
7d07cc9
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Feb 23, 2026
969d69b
[processor/transformprocessor] evolve set_semconv_span_name RPC span …
cyrille-leclerc Feb 28, 2026
1dd8ad5
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Feb 28, 2026
44f33b1
Update docs
cyrille-leclerc Feb 28, 2026
22811ab
tidy
cyrille-leclerc Feb 28, 2026
bf78b8e
tidy
cyrille-leclerc Feb 28, 2026
7d14589
format
cyrille-leclerc Feb 28, 2026
9ed9e57
Try remove unrelated declaration added by go tidy
cyrille-leclerc Mar 1, 2026
6f1bb2f
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Mar 1, 2026
14f570a
"make gotidy" adds this declaration
cyrille-leclerc Mar 1, 2026
8295dbb
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Mar 9, 2026
950ac46
Merge remote-tracking branch 'origin/main' into transform-processor_s…
cyrille-leclerc Mar 16, 2026
3643bd9
Merge remote-tracking branch 'origin/main' into transform-processor_s…
cyrille-leclerc Mar 16, 2026
8eaf8f6
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Mar 16, 2026
051363e
Merge remote-tracking branch 'origin/main' into transform-processor_s…
cyrille-leclerc Mar 17, 2026
20331fc
Simplify code
cyrille-leclerc Mar 19, 2026
07c91ed
Simplify code
cyrille-leclerc Mar 19, 2026
deaa8cc
Simplify code
cyrille-leclerc Mar 19, 2026
08c8b8b
Simplify code
cyrille-leclerc Mar 19, 2026
b5da54a
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Mar 30, 2026
df0129d
Apply suggestion from @edmocosta
cyrille-leclerc Mar 30, 2026
a077b1b
Apply suggestions from code review
cyrille-leclerc Mar 30, 2026
024d031
Remove unneeded code
cyrille-leclerc Mar 31, 2026
40aafb9
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Mar 31, 2026
aaf67db
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Apr 1, 2026
d9baf59
[processor/transformprocessor] Refactor set_semconv_span_name to shar…
cyrille-leclerc Apr 1, 2026
f1bf0ec
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Apr 1, 2026
3a8dd68
Update .chloggen/transformprocessor-set_semconv_span_name-v1.40.0.yaml
edmocosta Apr 1, 2026
1ee71bf
Merge branch 'main' into transform-processor_setsemconvspanname_1.39
cyrille-leclerc Apr 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions .chloggen/transformprocessor-set_semconv_span_name-v1.40.0.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Use this changelog template to create an entry for release notes.

# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: enhancement

# The name of the component, or a single word describing the area of concern, (e.g. receiver/filelog)
component: processor/transform

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Add support for semantic conventions 1.38.0, 1.39.0, and 1.40.0 in the `set_semconv_span_name` function.

# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists.
issues: [45911]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext: >
The `set_semconv_span_name` function now recognizes semantic conventions 1.38.0, 1.39.0, and 1.40.0, allowing span
names to be determined using the latest rules. Support for the `rpc.system.name` attribute (introduced in 1.39.0)
has been added so span names can reflect the new RPC system conventions. Backward compatibility is preserved: the
`rpc.system` attribute remains supported.

# If your change doesn't affect end users or the exported elements of any package,
# you should instead start your pull request title with [chore] or use the "Skip Changelog" label.
# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [user]
1 change: 1 addition & 0 deletions internal/datadog/e2e/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ require (
github.com/DataDog/zstd v1.5.7 // indirect
github.com/DataDog/zstd_0 v0.0.0-20210310093942-586c1286621f // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.31.0 // indirect
github.com/Masterminds/semver/v3 v3.4.0 // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/Showmax/go-fqdn v1.0.0 // indirect
github.com/alecthomas/participle/v2 v2.1.4 // indirect
Expand Down
31 changes: 16 additions & 15 deletions processor/transformprocessor/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -671,7 +671,7 @@ The primary use case of the `set_semconv_span_name()` function is to address hig

Parameters:

* `semconvVersion` is the version of the Semantic Conventions used to generate the `span.name`, older semconv attributes are supported. `1.37.0` is currently the only supported version.
* `semconvVersion` is the version of the Semantic Conventions used to generate the `span.name`, older semconv attributes are supported. Versions `1.37.0` to `1.40.0` are supported.
* `originalSpanNameAttribute` is the optional name of the attribute used to copy the original `span.name` if different from the name derived from semantic conventions.

Sanitization examples:
Expand All @@ -686,7 +686,7 @@ Sanitization examples:
http.route: /api/v1/users/{id}
url.path: /api/v1/users/123
```
* Span name after applying `set_semconv_span_name("1.37.0")`: `GET /api/v1/users/{id}`
* Span name after applying `set_semconv_span_name("1.40.0")`: `GET /api/v1/users/{id}`
* No loss of information on `span.name` occurs because the recommended attribute `http.route` is present.
* Span with high-cardinality name lacking recommended semantic convention attribute `http.route`
* Incoming span:
Expand All @@ -697,7 +697,7 @@ Sanitization examples:
http.request.method: GET
url.path: /api/v1/users/123
```
* Span name after applying `set_semconv_span_name("1.37.0")`: `GET`
* Span name after applying `set_semconv_span_name("1.40.0")`: `GET`
* Loss of information on `span.name` occurs because the recommended attribute `http.route` is missing.
Note that this loss of information is mitigated if the instrumentation produced attributes that contain the URL path like `url.path` or `url.full`.
* Compliant span name is unchanged
Expand All @@ -710,25 +710,26 @@ Sanitization examples:
http.route: /api/v1/users/{id}
url.path: /api/v1/users/123
```
* Span name after applying `set_semconv_span_name("1.37.0")`: `GET /api/v1/users/{id}`
* Span name after applying `set_semconv_span_name("1.40.0")`: `GET /api/v1/users/{id}`


Backward compatibility: `set_semconv_span_name` will map the following attributes to their equivalents per the v1.37.0 semantic conventions:
Backward compatibility: `set_semconv_span_name` will map the following attributes to their equivalents per the v1.39.0 semantic conventions:

| v1.37.0 Attribute | Older attribute |
|-----------------------|------------------------|
| `http.request.method` | `http.method` |
| `rpc.method` | `rpc.grpc.method` |
| `rpc.service` | `rpc.grpc.service` |
| `db.system.name` | `db.system` |
| `db.operation.name` | `db.operation` |
| `db.collection.name` | `db.name` |
| v1.40.0 Attribute | Older attribute |
|-----------------------|--------------------|
| `http.request.method` | `http.method` |
| `rpc.method` | `rpc.grpc.method` |
| `rpc.service` | `rpc.grpc.service` |
| `rpc.system.name` | `rpc.system` |
| `db.system.name` | `db.system` |
| `db.operation.name` | `db.operation` |
| `db.collection.name` | `db.name` |

Examples:

- `set_semconv_span_name("1.37.0")`
- `set_semconv_span_name("1.40.0")`

- `set_semconv_span_name("1.37.0", "original_span_name")`
- `set_semconv_span_name("1.40.0", "original_span_name")`

## Examples

Expand Down
1 change: 1 addition & 0 deletions processor/transformprocessor/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ require (
)

require (
github.com/Masterminds/semver/v3 v3.4.0
Comment thread
edmocosta marked this conversation as resolved.
go.opentelemetry.io/collector/component/componenttest v0.149.0
go.opentelemetry.io/collector/confmap/xconfmap v0.149.0
go.opentelemetry.io/collector/consumer/consumertest v0.149.0
Expand Down
2 changes: 2 additions & 0 deletions processor/transformprocessor/go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,20 @@ import (
"errors"
"fmt"

"github.com/Masterminds/semver/v3"
"go.opentelemetry.io/collector/pdata/pcommon"
"go.opentelemetry.io/collector/pdata/ptrace"
"go.opentelemetry.io/otel/attribute"
conventions "go.opentelemetry.io/otel/semconv/v1.38.0"
conventions "go.opentelemetry.io/otel/semconv/v1.40.0"

"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl"
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl/contexts/ottlspan"
)

// Currently only v1.37.0 is supported
const supportedSemconvVersion = "1.37.0"
var (
minKnownSemConvVersion = semver.MustParse("1.37.0")
maxKnownSemConvVersion = semver.MustParse("1.40.0")
)

type setSemconvSpanNameArguments struct {
SemconvVersion string
Expand All @@ -30,19 +33,10 @@ func NewSetSemconvSpanNameFactoryLegacy() ottl.Factory[ottlspan.TransformContext
}

func createSetSemconvSpanNameFunctionLegacy(_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[ottlspan.TransformContext], error) {
args, ok := oArgs.(*setSemconvSpanNameArguments)

if !ok {
return nil, errors.New("NewSetSemconvSpanNameFactory args must be of type *setSemconvSpanNameArguments")
}
if args.SemconvVersion != supportedSemconvVersion {
return nil, fmt.Errorf("unsupported semconv version: %s, supported version: %s", args.SemconvVersion, supportedSemconvVersion)
args, err := parseSemconvSpanNameArguments(oArgs)
if err != nil {
return nil, err
}

if !args.OriginalSpanNameAttribute.IsEmpty() && args.OriginalSpanNameAttribute.Get() == "" {
return nil, errors.New("originalSpanNameAttribute cannot be an empty string")
}

return func(_ context.Context, tCtx ottlspan.TransformContext) (any, error) {
setSemconvSpanName(args.OriginalSpanNameAttribute, tCtx.GetSpan())
return nil, nil
Expand All @@ -54,23 +48,32 @@ func NewSetSemconvSpanNameFactory() ottl.Factory[*ottlspan.TransformContext] {
}

func createSetSemconvSpanNameFunction(_ ottl.FunctionContext, oArgs ottl.Arguments) (ottl.ExprFunc[*ottlspan.TransformContext], error) {
args, ok := oArgs.(*setSemconvSpanNameArguments)
args, err := parseSemconvSpanNameArguments(oArgs)
if err != nil {
return nil, err
}
return func(_ context.Context, tCtx *ottlspan.TransformContext) (any, error) {
setSemconvSpanName(args.OriginalSpanNameAttribute, tCtx.GetSpan())
return nil, nil
}, nil
}

func parseSemconvSpanNameArguments(oArgs ottl.Arguments) (*setSemconvSpanNameArguments, error) {
args, ok := oArgs.(*setSemconvSpanNameArguments)
if !ok {
return nil, errors.New("NewSetSemconvSpanNameFactory args must be of type *setSemconvSpanNameArguments")
}
if args.SemconvVersion != supportedSemconvVersion {
return nil, fmt.Errorf("unsupported semconv version: %s, supported version: %s", args.SemconvVersion, supportedSemconvVersion)
semconvVersion, err := semver.NewVersion(args.SemconvVersion)
if err != nil {
return nil, fmt.Errorf("failed to parse semconv version %q: %w", args.SemconvVersion, err)
}
if semconvVersion.LessThan(minKnownSemConvVersion) || semconvVersion.GreaterThan(maxKnownSemConvVersion) {
return nil, fmt.Errorf("unsupported semconv version %q: must be between %s and %s", args.SemconvVersion, minKnownSemConvVersion, maxKnownSemConvVersion)
}

if !args.OriginalSpanNameAttribute.IsEmpty() && args.OriginalSpanNameAttribute.Get() == "" {
return nil, errors.New("originalSpanNameAttribute cannot be an empty string")
}

return func(_ context.Context, tCtx *ottlspan.TransformContext) (any, error) {
setSemconvSpanName(args.OriginalSpanNameAttribute, tCtx.GetSpan())
return nil, nil
}, nil
return args, nil
}

func setSemconvSpanName(originalSpanNameAttribute ottl.Optional[string], span ptrace.Span) {
Expand Down Expand Up @@ -142,9 +145,9 @@ func httpSpanName(span ptrace.Span, subject attribute.Key) string {

// https://opentelemetry.io/docs/specs/semconv/rpc/rpc-spans/
func rpcSpanName(span ptrace.Span) string {
if system, ok := span.Attributes().Get(string(conventions.RPCSystemKey)); ok {
if system, ok := attributeValue(span, conventions.RPCSystemNameKey, "rpc.system"); ok {
method, okMethod := attributeValue(span, conventions.RPCMethodKey, "rpc.grpc.method")
service, okService := attributeValue(span, conventions.RPCServiceKey, "rpc.grpc.service")
service, okService := attributeValue(span, "rpc.service", "rpc.grpc.service")

if okMethod && okService {
return service.AsString() + "/" + method.AsString()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,25 @@ func Test_createSetSemconvSpanNameFunction_parameterChecks(t *testing.T) {
wantError bool
}{
{
name: "valid semconv version and original span name attribute",
name: "valid semconv version 1.40.0 and original span name attribute",
semconvVersion: "1.40.0",
originalSpanNameAttribute: ottl.NewTestingOptional("original_span_name"),
wantError: false,
},
{
name: "valid semconv version 1.39.0 and original span name attribute",
semconvVersion: "1.39.0",
originalSpanNameAttribute: ottl.NewTestingOptional("original_span_name"),
wantError: false,
},
{
name: "valid semconv version 1.38.0 and original span name attribute",
semconvVersion: "1.38.0",
originalSpanNameAttribute: ottl.NewTestingOptional("original_span_name"),
wantError: false,
},
{
name: "valid semconv version 1.37.0 and original span name attribute",
semconvVersion: "1.37.0",
originalSpanNameAttribute: ottl.NewTestingOptional("original_span_name"),
wantError: false,
Expand All @@ -42,8 +60,8 @@ func Test_createSetSemconvSpanNameFunction_parameterChecks(t *testing.T) {
wantError: true,
},
{
name: "invalid semconv version and valid original span name attribute",
semconvVersion: "1.38.0",
name: "unsupported semconv version and valid original span name attribute",
semconvVersion: "1.36.0",
originalSpanNameAttribute: ottl.NewTestingOptional("original_span_name"),
wantError: true,
},
Expand Down Expand Up @@ -282,7 +300,6 @@ VALUES (@p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15, @p16);
},
want: "oteldemo.AdService/GetAds",
},

// MESSAGING - KAFKA
{
name: "Messaging OTel Demo - accounting - ",
Expand Down Expand Up @@ -481,7 +498,7 @@ VALUES (@p7, @p8, @p9, @p10, @p11, @p12, @p13, @p14, @p15, @p16);
tt.addAttributes(span.Attributes())

setSemconvNameFunction, err := createSetSemconvSpanNameFunction(ottl.FunctionContext{}, &setSemconvSpanNameArguments{
SemconvVersion: supportedSemconvVersion,
SemconvVersion: maxKnownSemConvVersion.String(),
OriginalSpanNameAttribute: ottl.NewTestingOptional("original_span_name"),
})

Expand Down Expand Up @@ -680,6 +697,38 @@ func Test_rpcSpanName(t *testing.T) {
},
want: "grpc",
},
{
name: "'rpc.system.name' and 'rpc.method', no 'rpc.service' - semconv 1.39+",
spanName: "a span name",
instrumentationLibrary: "hand crafted",
kind: ptrace.SpanKindServer,
addAttributes: func(attrs pcommon.Map) {
attrs.PutStr("rpc.system.name", "grpc")
attrs.PutStr("rpc.method", "oteldemo.AdService/a_method")
},
want: "oteldemo.AdService/a_method",
},
// Version-based priority: when both rpc.system.name and rpc.system are present
{
name: "semconv 1.40.0: both 'rpc.system.name' and 'rpc.system' present - prioritizes 'rpc.system.name'",
spanName: "a span name",
kind: ptrace.SpanKindServer,
addAttributes: func(attrs pcommon.Map) {
attrs.PutStr("rpc.system.name", "grpc")
attrs.PutStr("rpc.system", "other_rpc")
},
want: "grpc",
},
{
name: "semconv 1.39.0: both 'rpc.system.name' and 'rpc.system' present - prioritizes 'rpc.system.name'",
spanName: "a span name",
kind: ptrace.SpanKindServer,
addAttributes: func(attrs pcommon.Map) {
attrs.PutStr("rpc.system.name", "grpc")
attrs.PutStr("rpc.system", "other_rpc")
},
want: "grpc",
},
}

for _, tt := range tests {
Expand Down
Loading