Skip to content

v0.4.0

Latest

Choose a tag to compare

@prashantv prashantv released this 22 Jul 05:03
· 5 commits to main since this release
44156d0

This release supports compile-time rewriting of source files via toolexec.
Build your package or binary with go build -toolexec errtrace and all packages
that import errtrace will be automatically instrumented with errtrace.

Added

  • Add UnwrapFrame function to extract a single frame from an error.
    You can use this to implement your own trace formatting logic.

  • Support extracting trace frames from custom errors.
    Any error value that implements TracePC() uintptr will now
    contribute to the trace.

  • Add GetCaller function for error helpers to annotate wrapped errors with
    their caller information instead of the helper. Example:

    //go:noinline
    func Wrapf(err error, msg string, args ...any) {
      caller := errtrace.GetCaller()
      err := ...
      return caller.Wrap(err)
    }
  • Implement slog.LogValuer so errors logged with log/slog log the full trace.

  • cmd/errtrace:
    Add -no-wrapn option to disable wrapping with generic WrapN functions.
    This is only useful for toolexec mode due to tooling limitations.

  • cmd/errtrace:
    Experimental support for instrumenting code with errtrace automatically
    as part of the Go build process.
    Try this out with go build -toolexec=errtrace pkg/to/build.
    Automatic instrumentation only rewrites packages that import errtrace.
    The flag -required-packages can be used to specify which packages
    are expected to import errtrace if they require rewrites.
    Example: go build -toolexec="errtrace -required-packages pkg/..." pkg/to/build

Changed

  • Update go directive in go.mod to 1.21, and drop compatibility with Go 1.20 and earlier.
  • Errors wrapped with errtrace are now compatible with log/slog-based loggers,
    and will report the full error trace when logged.

Fixed

  • cmd/errtrace: Don't exit with a non-zero status when -h is used.
  • cmd/errtrace: Don't panic on imbalanced assignments inside defer blocks.