in module/apmsql/conn.go [96:126]
func (c *conn) finishSpan(ctx context.Context, span *apm.Span, result *driver.Result, resultError *error) {
if *resultError == driver.ErrSkip {
// TODO(axw) mark span as abandoned,
// so it's not sent and not counted
// in the span limit. Ideally remove
// from the slice so memory is kept
// in check.
return
}
switch *resultError {
case nil:
if !span.Dropped() && result != nil && *result != nil && *result != driver.ResultNoRows {
rowsAffected, err := (*result).RowsAffected()
if err == nil && rowsAffected >= 0 {
span.Context.SetDatabaseRowsAffected(rowsAffected)
}
}
case driver.ErrBadConn, context.Canceled:
// ErrBadConn is used by the connection pooling
// logic in database/sql, and so is expected and
// should not be reported.
//
// context.Canceled means the callers canceled
// the operation, so this is also expected.
default:
if e := apm.CaptureError(ctx, *resultError); e != nil {
e.Send()
}
}
span.End()
}