func()

in module/apmotel/span.go [217:331]


func (s *span) setSpanAttributes() {
	var (
		dbContext  apm.DatabaseSpanContext
		httpURL    string
		httpMethod string
		httpHost   string

		netPeerPort string
		netPeerName string

		haveDBContext   bool
		haveHTTPContext bool
		haveHTTPHostTag bool

		serviceTargetName string
		serviceTargetType string
	)

	agentAttrs := make(map[string]interface{})
	for _, v := range s.attributes {
		agentAttrs[string(v.Key)] = v.Value.AsInterface()

		switch v.Key {
		case "component":
			s.span.Subtype = v.Value.Emit()

		case "db.system":
			s.span.Type = "db"
			s.span.Subtype = v.Value.Emit()
			dbContext.Type = v.Value.Emit()
			serviceTargetType = v.Value.Emit()
			haveDBContext = true
		case "db.instance":
			dbContext.Instance = v.Value.Emit()
			haveDBContext = true
		case "db.statement":
			dbContext.Statement = v.Value.Emit()
			haveDBContext = true
		case "db.user":
			dbContext.User = v.Value.Emit()
			haveDBContext = true
		case "db.name":
			serviceTargetName = v.Value.Emit()

		case "messaging.system":
			s.span.Type = "messaging"
			s.span.Subtype = v.Value.Emit()
			serviceTargetType = v.Value.Emit()
		case "messaging.destination":
			serviceTargetName = v.Value.Emit()

		case "rpc.system":
			s.span.Type = "external"
			s.span.Subtype = v.Value.Emit()
			serviceTargetType = v.Value.Emit()
		case "rpc.service":
			serviceTargetName = v.Value.Emit()
		case "net.peer.port":
			netPeerPort = v.Value.Emit()
		case "net.peer.name":
			netPeerName = v.Value.Emit()

		case "http.url":
			s.span.Type = "external"
			s.span.Subtype = "http"
			serviceTargetName = v.Value.Emit()
			haveHTTPContext = true
			httpURL = v.Value.Emit()
		case "http.scheme":
			s.span.Type = "external"
			s.span.Subtype = "http"
		case "http.method":
			haveHTTPContext = true
			httpMethod = v.Value.Emit()
		case "http.host":
			haveHTTPContext = true
			haveHTTPHostTag = true
			httpHost = v.Value.Emit()
		}
	}

	if netPeerPort != "" && netPeerName != "" {
		serviceTargetName = fmt.Sprintf("%s:%s", netPeerName, netPeerPort)
	}

	switch {
	case haveHTTPContext:
		url, err := url.Parse(httpURL)
		if err == nil {
			// handles the case where the url.Host hasn't been set.
			// Tries obtaining the host value from the "http.host" tag.
			// If not found, or if the url.Host has a value, it won't
			// mutate the existing host.
			if url.Host == "" && haveHTTPHostTag {
				url.Host = httpHost
			}
			s.span.Context.SetHTTPRequest(&http.Request{
				Method: httpMethod,
				URL:    url,
			})
		}
	case haveDBContext:
		s.span.Context.SetDatabase(dbContext)
	}

	if serviceTargetType != "" || serviceTargetName != "" {
		s.span.Context.SetServiceTarget(apm.ServiceTargetSpanContext{
			Type: serviceTargetType,
			Name: serviceTargetName,
		})
	}

	s.span.Context.SetOTelAttributes(agentAttrs)
	s.span.Context.SetOTelSpanKind(s.spanKind.String())
}