Skip to content

Commit cfe2ddc

Browse files
authored
Set genai type and subtype for spans that have the gen_ai.system attribute (#127)
* Set genai for span type and genai system value for subtype for spans that have the gen_ai.system attribute
1 parent 6e98dda commit cfe2ddc

File tree

2 files changed

+124
-92
lines changed

2 files changed

+124
-92
lines changed

enrichments/trace/internal/elastic/span.go

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ import (
3333
"github.com/elastic/opentelemetry-lib/enrichments/trace/config"
3434
"go.opentelemetry.io/collector/pdata/pcommon"
3535
"go.opentelemetry.io/collector/pdata/ptrace"
36-
semconv "go.opentelemetry.io/collector/semconv/v1.25.0"
36+
semconv25 "go.opentelemetry.io/collector/semconv/v1.25.0"
37+
semconv27 "go.opentelemetry.io/collector/semconv/v1.27.0"
3738
tracepb "go.opentelemetry.io/proto/otlp/trace/v1"
3839
"google.golang.org/grpc/codes"
3940
)
@@ -68,6 +69,7 @@ type spanEnrichmentContext struct {
6869
dbSystem string
6970
messagingSystem string
7071
messagingDestinationName string
72+
genAiSystem string
7173

7274
serverPort int64
7375
urlPort int64
@@ -82,6 +84,7 @@ type spanEnrichmentContext struct {
8284
isHTTP bool
8385
isDB bool
8486
messagingDestinationTemp bool
87+
isGenAi bool
8588
}
8689

8790
func (s *spanEnrichmentContext) Enrich(span ptrace.Span, cfg config.Config) {
@@ -91,86 +94,89 @@ func (s *spanEnrichmentContext) Enrich(span ptrace.Span, cfg config.Config) {
9194
// Extract information from span attributes.
9295
span.Attributes().Range(func(k string, v pcommon.Value) bool {
9396
switch k {
94-
case semconv.AttributePeerService:
97+
case semconv25.AttributePeerService:
9598
s.peerService = v.Str()
96-
case semconv.AttributeServerAddress:
99+
case semconv25.AttributeServerAddress:
97100
s.serverAddress = v.Str()
98-
case semconv.AttributeServerPort:
101+
case semconv25.AttributeServerPort:
99102
s.serverPort = v.Int()
100-
case semconv.AttributeNetPeerName:
103+
case semconv25.AttributeNetPeerName:
101104
if s.serverAddress == "" {
102105
// net.peer.name is deprecated, so has lower priority
103106
// only set when not already set with server.address
104107
// and allowed to be overridden by server.address.
105108
s.serverAddress = v.Str()
106109
}
107-
case semconv.AttributeNetPeerPort:
110+
case semconv25.AttributeNetPeerPort:
108111
if s.serverPort == 0 {
109112
// net.peer.port is deprecated, so has lower priority
110113
// only set when not already set with server.port and
111114
// allowed to be overridden by server.port.
112115
s.serverPort = v.Int()
113116
}
114-
case semconv.AttributeMessagingDestinationName:
117+
case semconv25.AttributeMessagingDestinationName:
115118
s.isMessaging = true
116119
s.messagingDestinationName = v.Str()
117-
case semconv.AttributeMessagingOperation:
120+
case semconv25.AttributeMessagingOperation:
118121
s.isMessaging = true
119-
case semconv.AttributeMessagingSystem:
122+
case semconv25.AttributeMessagingSystem:
120123
s.isMessaging = true
121124
s.messagingSystem = v.Str()
122-
case semconv.AttributeMessagingDestinationTemporary:
125+
case semconv25.AttributeMessagingDestinationTemporary:
123126
s.isMessaging = true
124127
s.messagingDestinationTemp = true
125-
case semconv.AttributeHTTPStatusCode,
126-
semconv.AttributeHTTPResponseStatusCode:
128+
case semconv25.AttributeHTTPStatusCode,
129+
semconv25.AttributeHTTPResponseStatusCode:
127130
s.isHTTP = true
128131
s.httpStatusCode = v.Int()
129-
case semconv.AttributeHTTPMethod,
130-
semconv.AttributeHTTPRequestMethod,
131-
semconv.AttributeHTTPTarget,
132-
semconv.AttributeHTTPScheme,
133-
semconv.AttributeHTTPFlavor,
134-
semconv.AttributeNetHostName:
132+
case semconv25.AttributeHTTPMethod,
133+
semconv25.AttributeHTTPRequestMethod,
134+
semconv25.AttributeHTTPTarget,
135+
semconv25.AttributeHTTPScheme,
136+
semconv25.AttributeHTTPFlavor,
137+
semconv25.AttributeNetHostName:
135138
s.isHTTP = true
136-
case semconv.AttributeURLFull,
137-
semconv.AttributeHTTPURL:
139+
case semconv25.AttributeURLFull,
140+
semconv25.AttributeHTTPURL:
138141
s.isHTTP = true
139142
// ignoring error as if parse fails then we don't want the url anyway
140143
s.urlFull, _ = url.Parse(v.Str())
141-
case semconv.AttributeURLScheme:
144+
case semconv25.AttributeURLScheme:
142145
s.isHTTP = true
143146
s.urlScheme = v.Str()
144-
case semconv.AttributeURLDomain:
147+
case semconv25.AttributeURLDomain:
145148
s.isHTTP = true
146149
s.urlDomain = v.Str()
147-
case semconv.AttributeURLPort:
150+
case semconv25.AttributeURLPort:
148151
s.isHTTP = true
149152
s.urlPort = v.Int()
150-
case semconv.AttributeURLPath:
153+
case semconv25.AttributeURLPath:
151154
s.isHTTP = true
152155
s.urlPath = v.Str()
153-
case semconv.AttributeURLQuery:
156+
case semconv25.AttributeURLQuery:
154157
s.isHTTP = true
155158
s.urlQuery = v.Str()
156-
case semconv.AttributeRPCGRPCStatusCode:
159+
case semconv25.AttributeRPCGRPCStatusCode:
157160
s.isRPC = true
158161
s.grpcStatus = codes.Code(v.Int()).String()
159-
case semconv.AttributeRPCSystem:
162+
case semconv25.AttributeRPCSystem:
160163
s.isRPC = true
161164
s.rpcSystem = v.Str()
162-
case semconv.AttributeRPCService:
165+
case semconv25.AttributeRPCService:
163166
s.isRPC = true
164167
s.rpcService = v.Str()
165-
case semconv.AttributeDBStatement,
166-
semconv.AttributeDBUser:
168+
case semconv25.AttributeDBStatement,
169+
semconv25.AttributeDBUser:
167170
s.isDB = true
168-
case semconv.AttributeDBName:
171+
case semconv25.AttributeDBName:
169172
s.isDB = true
170173
s.dbName = v.Str()
171-
case semconv.AttributeDBSystem:
174+
case semconv25.AttributeDBSystem:
172175
s.isDB = true
173176
s.dbSystem = v.Str()
177+
case semconv27.AttributeGenAiSystem:
178+
s.isGenAi = true
179+
s.genAiSystem = v.Str()
174180
}
175181
return true
176182
})
@@ -361,6 +367,9 @@ func (s *spanEnrichmentContext) setSpanTypeSubtype(span ptrace.Span) {
361367
case s.isHTTP:
362368
spanType = "external"
363369
spanSubtype = "http"
370+
case s.isGenAi:
371+
spanType = "genai"
372+
spanSubtype = s.genAiSystem
364373
default:
365374
switch span.Kind() {
366375
case ptrace.SpanKindInternal:
@@ -504,11 +513,11 @@ func (s *spanEventEnrichmentContext) enrich(
504513
if s.exception {
505514
se.Attributes().Range(func(k string, v pcommon.Value) bool {
506515
switch k {
507-
case semconv.AttributeExceptionEscaped:
516+
case semconv25.AttributeExceptionEscaped:
508517
s.exceptionEscaped = v.Bool()
509-
case semconv.AttributeExceptionType:
518+
case semconv25.AttributeExceptionType:
510519
s.exceptionType = v.Str()
511-
case semconv.AttributeExceptionMessage:
520+
case semconv25.AttributeExceptionMessage:
512521
s.exceptionMessage = v.Str()
513522
}
514523
return true

0 commit comments

Comments
 (0)