func()

in module/apmzerolog/writer.go [161:216]


func (l *logRecord) decode(r io.Reader) (result error) {
	m := make(map[string]interface{})
	d := json.NewDecoder(r)
	d.UseNumber()
	if err := d.Decode(&m); err != nil {
		return err
	}

	l.message, _ = m[zerolog.MessageFieldName].(string)
	if strval, ok := m[zerolog.TimestampFieldName].(string); ok {
		if t, err := time.Parse(zerolog.TimeFieldFormat, strval); err == nil {
			l.timestamp = t.UTC()
		}
	}
	if errmsg, ok := m[zerolog.ErrorFieldName].(string); ok {
		err := &jsonError{message: errmsg}
		if stack, ok := m[zerolog.ErrorStackFieldName].([]interface{}); ok {
			frames := make([]stacktrace.Frame, 0, len(stack))
			for i := range stack {
				in, ok := stack[i].(map[string]interface{})
				if !ok {
					continue
				}
				var frame stacktrace.Frame
				frame.File, _ = in[pkgerrors.StackSourceFileName].(string)
				frame.Function, _ = in[StackSourceFunctionName].(string)
				if strval, ok := in[StackSourceLineName].(string); ok {
					if line, err := strconv.Atoi(strval); err == nil {
						frame.Line = line
					}
				}
				frames = append(frames, frame)
			}
			err.stack = frames
		}
		l.err = err
	}

	if strval, ok := m[SpanIDFieldName].(string); ok {
		if err := decodeHex(l.spanID[:], strval); err != nil {
			return errors.Wrap(err, "invalid span.id")
		}
	}

	if strval, ok := m[TraceIDFieldName].(string); ok {
		if err := decodeHex(l.traceID[:], strval); err != nil {
			return errors.Wrap(err, "invalid trace.id")
		}
	}
	if strval, ok := m[TransactionIDFieldName].(string); ok {
		if err := decodeHex(l.transactionID[:], strval); err != nil {
			return errors.Wrap(err, "invalid transaction.id")
		}
	}
	return nil
}