in enrichments/trace/internal/elastic/span.go [104:219]
func (s *spanEnrichmentContext) Enrich(
span ptrace.Span,
cfg config.Config,
userAgentParser *uaparser.Parser,
) {
// Extract top level span information.
s.spanStatusCode = span.Status().Code()
// Extract information from span attributes.
span.Attributes().Range(func(k string, v pcommon.Value) bool {
switch k {
case semconv25.AttributePeerService:
s.peerService = v.Str()
case semconv25.AttributeServerAddress:
s.serverAddress = v.Str()
case semconv25.AttributeServerPort:
s.serverPort = v.Int()
case semconv25.AttributeNetPeerName:
if s.serverAddress == "" {
// net.peer.name is deprecated, so has lower priority
// only set when not already set with server.address
// and allowed to be overridden by server.address.
s.serverAddress = v.Str()
}
case semconv25.AttributeNetPeerPort:
if s.serverPort == 0 {
// net.peer.port is deprecated, so has lower priority
// only set when not already set with server.port and
// allowed to be overridden by server.port.
s.serverPort = v.Int()
}
case semconv25.AttributeMessagingDestinationName:
s.isMessaging = true
s.messagingDestinationName = v.Str()
case semconv25.AttributeMessagingOperation:
s.isMessaging = true
case semconv25.AttributeMessagingSystem:
s.isMessaging = true
s.messagingSystem = v.Str()
case semconv25.AttributeMessagingDestinationTemporary:
s.isMessaging = true
s.messagingDestinationTemp = true
case semconv25.AttributeHTTPStatusCode,
semconv25.AttributeHTTPResponseStatusCode:
s.isHTTP = true
s.httpStatusCode = v.Int()
case semconv25.AttributeHTTPMethod,
semconv25.AttributeHTTPRequestMethod,
semconv25.AttributeHTTPTarget,
semconv25.AttributeHTTPScheme,
semconv25.AttributeHTTPFlavor,
semconv25.AttributeNetHostName:
s.isHTTP = true
case semconv25.AttributeURLFull,
semconv25.AttributeHTTPURL:
s.isHTTP = true
// ignoring error as if parse fails then we don't want the url anyway
s.urlFull, _ = url.Parse(v.Str())
case semconv25.AttributeURLScheme:
s.isHTTP = true
s.urlScheme = v.Str()
case semconv25.AttributeURLDomain:
s.isHTTP = true
s.urlDomain = v.Str()
case semconv25.AttributeURLPort:
s.isHTTP = true
s.urlPort = v.Int()
case semconv25.AttributeURLPath:
s.isHTTP = true
s.urlPath = v.Str()
case semconv25.AttributeURLQuery:
s.isHTTP = true
s.urlQuery = v.Str()
case semconv25.AttributeRPCGRPCStatusCode:
s.isRPC = true
s.grpcStatus = codes.Code(v.Int()).String()
case semconv25.AttributeRPCSystem:
s.isRPC = true
s.rpcSystem = v.Str()
case semconv25.AttributeRPCService:
s.isRPC = true
s.rpcService = v.Str()
case semconv25.AttributeDBStatement,
semconv25.AttributeDBUser:
s.isDB = true
case semconv25.AttributeDBName:
s.isDB = true
s.dbName = v.Str()
case semconv25.AttributeDBSystem:
s.isDB = true
s.dbSystem = v.Str()
case semconv27.AttributeGenAiSystem:
s.isGenAi = true
s.genAiSystem = v.Str()
case semconv27.AttributeUserAgentOriginal:
s.userAgentOriginal = v.Str()
case semconv27.AttributeUserAgentName:
s.userAgentName = v.Str()
case semconv27.AttributeUserAgentVersion:
s.userAgentVersion = v.Str()
case "type":
s.typeValue = v.Str()
}
return true
})
s.normalizeAttributes(userAgentParser)
s.isTransaction = isElasticTransaction(span)
s.enrich(span, cfg)
spanEvents := span.Events()
for i := 0; i < spanEvents.Len(); i++ {
var c spanEventEnrichmentContext
c.enrich(s, spanEvents.At(i), cfg.SpanEvent)
}
}