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