joomcode / errorx

A comprehensive error handling library for Go
MIT License
1.12k stars 29 forks source link

Set get frames public #41

Open ldreux opened 1 year ago

ldreux commented 1 year ago

In our applications, we catch all errors in our webservices and our batches and create sentry issues with the errorx stacktrace.

errxFrames := errx.GetFrames()
framesLen := len(errxFrames)
sentryFrames := make([]sentry.Frame, framesLen)
for i, errxFrame := range errxFrames {
    sentryFrames[framesLen-i-1] = convertFrame(errxFrame)
}

func convertFrame(frame errorx.Frame) sentry.Frame {
    return sentry.Frame{
        Filename: frame.File(),
        Function: frame.Function(),
        Lineno:   frame.Line(),
    }
}
PeterIvanov commented 1 year ago

Maybe we adopt this exact use case? Instead of API focused on just exposing stack frames, make an api for conversion. This would highlight that you don't need to extract this information as-is, but if you need to feed it to some system with custom stack frames format, you can. Such conversion API can also be based on interface for errorx frame, not the actual representation, as an added bonus. What's your view on such idea?

reaganiwadha commented 8 months ago

For monitoring tools like github.com/getsentry/sentry-go, it's important to expose the callstack so the error can be traced.

https://github.com/getsentry/sentry-go/blob/824589bd5be49de6242d5f867a94c7df05510a4e/stacktrace.go#L74

This is how Sentry extracts stack trace from other error libraries. While I don't think errorx should necessarily adhere to the way Sentry parses stack trace, an exposed API to get the frames from the Error should be available for custom stack trace parsing.

reaganiwadha commented 8 months ago

Instead of API focused on just exposing stack frames, make an api for conversion. This would highlight that you don't need to extract this information as-is, but if you need to feed it to some system with custom stack frames format, you can.

Im not sure how a conversion API for call stack works, can you provide an example?

PeterIvanov commented 8 months ago

As far as I can recall, the idea was that we add an API like this:

func (e *Error) ExportStackFrames(originalFrames []FrameInterface) any

This way, we:

  1. Hint that extracting stack frames is not an intended high-level API for dealing with errors
  2. Hide behind the interface to avoid, say, marshalling issues
PeterIvanov commented 8 months ago

In this PR, the second point is already addressed, so I'm generally OK with that. Just asked for an opinion on an idea.