func()

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)
	}
}