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