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
}