func()

in modelwriter.go [174:259]


func (w *modelWriter) buildModelError(out *model.Error, e *ErrorData) {
	out.ID = model.TraceID(e.ID)
	out.TraceID = model.TraceID(e.TraceID)
	out.ParentID = model.SpanID(e.ParentID)
	out.TransactionID = model.SpanID(e.TransactionID)
	out.Timestamp = model.Time(e.Timestamp.UTC())
	out.Context = e.Context.build()
	out.Culprit = e.Culprit

	if !e.TransactionID.isZero() {
		out.Transaction.Sampled = &e.transactionSampled
		if e.transactionSampled {
			out.Transaction.Type = e.transactionType
			out.Transaction.Name = e.transactionName
		}
	}

	// Create model stacktrace frames, and set the context.
	w.modelStacktrace = w.modelStacktrace[:0]
	var appendModelErrorStacktraceFrames func(exception *exceptionData)
	appendModelErrorStacktraceFrames = func(exception *exceptionData) {
		if len(exception.stacktrace) != 0 {
			w.modelStacktrace = appendModelStacktraceFrames(w.modelStacktrace, exception.stacktrace)
		}
		for _, cause := range exception.cause {
			appendModelErrorStacktraceFrames(&cause)
		}
	}
	appendModelErrorStacktraceFrames(&e.exception)
	if len(e.logStacktrace) != 0 {
		w.modelStacktrace = appendModelStacktraceFrames(w.modelStacktrace, e.logStacktrace)
	}

	var modelStacktraceOffset int
	if e.exception.message != "" {
		var buildException func(exception *exceptionData) model.Exception
		culprit := e.Culprit
		buildException = func(exception *exceptionData) model.Exception {
			out := model.Exception{
				Message: exception.message,
				Code: model.ExceptionCode{
					String: exception.Code.String,
					Number: exception.Code.Number,
				},
				Type:    exception.Type.Name,
				Module:  exception.Type.PackagePath,
				Handled: e.Handled,
			}
			if n := len(exception.stacktrace); n != 0 {
				out.Stacktrace = w.modelStacktrace[modelStacktraceOffset : modelStacktraceOffset+n]
				modelStacktraceOffset += n
			}
			if len(exception.attrs) != 0 {
				out.Attributes = exception.attrs
			}
			if n := len(exception.cause); n > 0 {
				out.Cause = make([]model.Exception, n)
				for i := range exception.cause {
					out.Cause[i] = buildException(&exception.cause[i])
				}
			}
			if culprit == "" {
				culprit = stacktraceCulprit(out.Stacktrace)
			}
			return out
		}
		out.Exception = buildException(&e.exception)
		out.Culprit = culprit
	}
	if e.log.Message != "" {
		out.Log = model.Log{
			Message:      e.log.Message,
			Level:        e.log.Level,
			LoggerName:   e.log.LoggerName,
			ParamMessage: e.log.MessageFormat,
		}
		if n := len(e.logStacktrace); n != 0 {
			out.Log.Stacktrace = w.modelStacktrace[modelStacktraceOffset : modelStacktraceOffset+n]
			modelStacktraceOffset += n
			if out.Culprit == "" {
				out.Culprit = stacktraceCulprit(out.Log.Stacktrace)
			}
		}
	}
	out.Culprit = truncateString(out.Culprit)
}