func()

in module/apmotel/span.go [335:412]


func (s *span) setTransactionAttributes() {
	var (
		isHTTP      bool
		isRPC       bool
		isMessaging bool

		httpMethod     string
		httpStatusCode = -1
		httpURL        string
	)

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

		switch v.Key {
		case "component":
			s.tx.Type = v.Value.Emit()

		case "http.method":
			httpMethod = v.Value.Emit()
		case "http.status_code":
			if code := v.Value.AsInt64(); code > 0 {
				httpStatusCode = int(code)
			}
		case "http.url":
			httpURL = v.Value.Emit()
			isHTTP = true
		case "http.scheme":
			isHTTP = true

		case "rpc.system":
			isRPC = true

		case "messaging.system":
			isMessaging = true

		case "result":
			s.tx.Result = v.Value.Emit()

		case "user.id":
			s.tx.Context.SetUserID(v.Value.Emit())
		case "user.email":
			s.tx.Context.SetUserEmail(v.Value.Emit())
		case "user.username":
			s.tx.Context.SetUsername(v.Value.Emit())
		}
	}

	if s.tx.Type == "" {
		if s.spanKind == trace.SpanKindServer && (isHTTP || isRPC) {
			s.tx.Type = "request"
		} else if s.spanKind == trace.SpanKindConsumer && isMessaging {
			s.tx.Type = "messaging"
		} else {
			s.tx.Type = "unknown"
		}
	}

	if s.tx.Result == "" && httpStatusCode != -1 {
		s.tx.Result = apmhttp.StatusCodeResult(httpStatusCode)
		s.tx.Context.SetHTTPStatusCode(httpStatusCode)
	}

	if isHTTP {
		if uri, err := url.ParseRequestURI(httpURL); err == nil {
			var req http.Request
			req.ProtoMajor = 1 // Assume HTTP/1.1
			req.ProtoMinor = 1
			req.Method = httpMethod
			req.URL = uri
			s.tx.Context.SetHTTPRequest(&req)
		}
	}

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