Documentation ¶
Index ¶
- Variables
- func Abort(err error)
- func AbortIf(err error)
- func Auto(config Config) func()
- func Capture(err error)
- func CaptureSilent(err error)
- func Catch(fn func() error) (err error)
- func Crash(err error)
- func CrashIf(err error)
- func Debug(config DebugConfig) func()
- func Drain(name string, reader io.Reader)
- func Drop(err error, n int) error
- func Eval(key, value string) string
- func F(format string, args ...interface{}) error
- func FilterSentryIntegrations(drop ...string) func(i []sentry.Integration) []sentry.Integration
- func Get(key, fallback string) string
- func GetGlobalTracer() trace.Tracer
- func GetSpan(ctx context.Context) trace.Span
- func HookReporting(transport sentry.Transport) func()
- func HookTracing(exporter exportTrace.SpanExporter, serviceName string, async bool) func()
- func Intercept() func()
- func IsSafe(err error) bool
- func Load(v Var) string
- func NumberCleaner(fullNumber bool) func([]string) []string
- func Panic(err error)
- func PanicIf(err error)
- func Recover(fn func(error))
- func Reporter(tags SM) func(error)
- func ResetGlobalTracer()
- func Resume(fn func(error))
- func RootHandler(cleaners ...func([]string) []string) func(http.Handler) http.Handler
- func Run(ctx context.Context, fn func(ctx *Context) error) error
- func SF(format string, args ...interface{}) error
- func SW(err error) error
- func Sink(name string) io.WriteCloser
- func SortNodes(nodes []*VNode)
- func StartSpan(ctx context.Context, name string) (context.Context, trace.Span)
- func Test(fn func(tester *Tester))
- func Testing() bool
- func Tunnel(limit int64, verify func(*http.Request, string, *url.URL) bool, ...) http.Handler
- func VerifyDSN(list ...string) func(*http.Request, string, *url.URL) bool
- func W(err error) error
- func WF(err error, format string, args ...interface{}) error
- func WS(err error, skip int) error
- func WalkTrace(node *VNode, fn func(node *VNode) bool) bool
- type BaseErr
- type Caller
- type Config
- type Context
- type DebugConfig
- type Debugger
- type Err
- type M
- type SM
- type SafeErr
- type SentryTransport
- type Span
- func (s Span) Attach(event string, attributes M)
- func (s Span) Context() context.Context
- func (s Span) End()
- func (s Span) Log(format string, args ...interface{})
- func (s Span) Native() trace.Span
- func (s Span) Record(err error)
- func (s Span) Rename(name string)
- func (s Span) Tag(key string, value interface{})
- type SpanExporter
- type Tester
- func (t *Tester) ReducedReports(includeFrames bool) []VReport
- func (t *Tester) ReducedSpans(resolution time.Duration) []VSpan
- func (t *Tester) Reset()
- func (t *Tester) SentryTransport() sentry.Transport
- func (t *Tester) SinkFactory() func(name string) io.WriteCloser
- func (t *Tester) SpanExporter() trace.SpanExporter
- type Tracer
- func (t *Tracer) Attach(event string, attributes M)
- func (t *Tracer) End()
- func (t *Tracer) Log(format string, args ...interface{})
- func (t *Tracer) Pop()
- func (t *Tracer) Push(name string)
- func (t *Tracer) Record(err error)
- func (t *Tracer) Rename(name string)
- func (t *Tracer) Root() Span
- func (t *Tracer) SmartPush()
- func (t *Tracer) Tag(key string, value interface{})
- func (t *Tracer) Tail() Span
- type VEvent
- type VException
- type VFrame
- type VNode
- type VReport
- type VSink
- type VSpan
- type Var
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var Devel = os.Getenv("DEVEL") == "true" || Testing()
Devel is true when the program runs in development or testing mode.
var SinkFactory = func(name string) io.WriteCloser { reader, writer := io.Pipe() go Drain(name, reader) return writer }
SinkFactory is the factory used by Sink() to create sinks.
var Stdout io.Writer = os.Stdout
Stdout is the original stdout.
Functions ¶
func AbortIf ¶ added in v0.1.1
func AbortIf(err error)
AbortIf will only abort with the supplied error if present.
func Auto ¶ added in v0.3.0
func Auto(config Config) func()
Auto will automatically install logging, reporting and tracing components. The returned function should be deferred to catch panics and ensure flushing.
func Capture ¶
func Capture(err error)
Capture will capture the error.
Example ¶
// install teardown := Debug(DebugConfig{ NoReportContext: true, NoReportLineNumbers: true, }) defer teardown() // capture error Capture(F("some error")) // report error Reporter(SM{"foo": "bar"})(F("another error")) // flush time.Sleep(10 * time.Millisecond)
Output: ===== REPORT ===== ERROR > some error (*xo.Err) | ExampleCapture (github.com/256dpi/xo): github.com/256dpi/xo/examples_test.go | main (main): _testmain.go ERROR • foo: bar > another error (*xo.Err) | ExampleCapture (github.com/256dpi/xo): github.com/256dpi/xo/examples_test.go | main (main): _testmain.go
func CaptureSilent ¶ added in v0.3.2
func CaptureSilent(err error)
CaptureSilent will capture the error without printing it.
func Catch ¶ added in v0.2.3
Catch will call fn and recover any panic and return an error.
Note: If the built-in panic function has been called with nil, a call to Recover will discard that panic and continue execution.
func CrashIf ¶ added in v0.4.3
func CrashIf(err error)
CrashIf will only panic with a formatted error if an error is present.
func Debug ¶
func Debug(config DebugConfig) func()
Debug will install logging, reporting and tracing components for debugging purposes. The returned function may be called to teardown all installed components.
func Drop ¶ added in v0.3.4
Drop will drop the specified amount of frames from the error if possible.
func Eval ¶ added in v0.3.6
Eval will evaluate a rule found in value. If a value is formatted as "@file:foo" the contents of foo is loaded and returned. If a value is formatted as "@config:foo" the config foo is loaded and the value at the name key returned.
func F ¶
F will format an error. This function can be used instead of errors.New() and fmt.Errorf().
func FilterSentryIntegrations ¶
func FilterSentryIntegrations(drop ...string) func(i []sentry.Integration) []sentry.Integration
FilterSentryIntegrations will return a sentry integrations filter that will drop the named integrations.
func Get ¶ added in v0.2.4
Get will get the specified environment variable and fallback to the specified value if it is missing or empty. The retrieved value is evaluated using Eval.
func GetGlobalTracer ¶ added in v0.3.5
GetGlobalTracer will return the global xo tracer. It will cache the tracer to increase performance between calls.
func GetSpan ¶
GetSpan will return the first native span found in the provided context. It will return nil if no span has been found.
func HookReporting ¶ added in v0.2.6
func HookReporting(transport sentry.Transport) func()
HookReporting will set up error reporting using sentry. The returned function may be called to revert the previously configured client.
func HookTracing ¶ added in v0.2.6
func HookTracing(exporter exportTrace.SpanExporter, serviceName string, async bool) func()
HookTracing will hook tracing using the provided span exporter. The returned function may be called to revert the previously configured provider.
func Intercept ¶
func Intercept() func()
Intercept will replace os.Stdout with a logging sink named "STDOUT". It will also redirect the output of the log package to a logging sink named "LOG". The returned function can be called to restore the original state.
func IsSafe ¶
IsSafe can be used to check if an error has been wrapped using SW. It will also detect further wrapped safe errors.
func Load ¶ added in v0.2.5
Load will return the value of the provided environment variable. The loaded value is evaluated using Eval.
func NumberCleaner ¶
NumberCleaner will return a function that replaces number-like URL segments with a "#". If fullNumber is true it will only replace if the whole segment is a number instead of just the first character.
Note: BSON ObjectIDs start with a number until 2055.
func PanicIf ¶ added in v0.3.4
func PanicIf(err error)
PanicIf will only panic if the supplied error is present.
func Recover ¶ added in v0.2.1
func Recover(fn func(error))
Recover will recover any panic and call fn if an error has been recovered.
Note: If the built-in panic function has been called with nil, a call to Recover will discard that panic and continue execution.
func ResetGlobalTracer ¶ added in v0.3.5
func ResetGlobalTracer()
ResetGlobalTracer will reset the global tracer cache.
func Resume ¶ added in v0.1.1
func Resume(fn func(error))
Resume will recover an earlier call to Abort or AbortIf and call fn if an error has been recovered. It will not recover direct calls to the built-in panic function.
Note: If the built-in panic function has been called with nil, a call to Resume will discard that panic and continue execution.
func RootHandler ¶
RootHandler is the middleware used to create the root trace span for incoming HTTP requests.
func Run ¶
Run will run the provided function and automatically handle tracing, error handling and panic recovering.
Example ¶
// get context ctx := context.Background() // divide positive res, err := Div(ctx, 10, 2) fmt.Printf("div: %d, %v\n", res, err) // divide negative res, err = Div(ctx, 10, -2) fmt.Printf("div: %d, %v\n", res, err) // divide zero res, err = Div(ctx, 10, 0) fmt.Printf("div: %d, %v\n", res, err)
Output: div: 5, <nil> div: 0, xo.Div: negative division div: 0, xo.Div: PANIC: runtime error: integer divide by zero
func SW ¶
SW wraps an error and marks it as safe. Wrapped errors are safe to be presented to the client if appropriate.
func Sink ¶
func Sink(name string) io.WriteCloser
Sink will return a new named logging sink.
Example ¶
// intercept reset := Intercept() defer reset() // builtin fmt fmt.Println("foo", "bar") fmt.Printf("%d %d\n", 7, 42) time.Sleep(10 * time.Millisecond) // builtin logger log.SetFlags(0) log.Println("foo", "bar") log.Printf("%d %d", 7, 42) time.Sleep(10 * time.Millisecond) // custom logger sink := Sink("FOO") logger := log.New(sink, "", 0) logger.Println("foo", "bar") logger.Printf("%d %d", 7, 42) time.Sleep(10 * time.Millisecond)
Output: ===== STDOUT ===== foo bar 7 42 ===== LOG ===== foo bar 7 42 ===== FOO ===== foo bar 7 42
func StartSpan ¶
StartSpan will start a native span using the globally configured tracer. It will continue any span found in the provided context or start a new span with the specified name if absent.
func Test ¶
func Test(fn func(tester *Tester))
Test will temporarily intercept and collect logging, tracing and reporting data for testing purposes. Standard logging is not intercepted to prevent messing with test output.
func Testing ¶ added in v0.3.0
func Testing() bool
Testing will return true if the program is likely being tested.
func Tunnel ¶ added in v0.3.8
func Tunnel(limit int64, verify func(*http.Request, string, *url.URL) bool, reporter func(error)) http.Handler
Tunnel returns a handler that forwards received Sentry envelopes to the endpoint specified by the DSN received in the envelopes. The optional verify callback may set to verify received DSNs. This handler can be used together with the sentry tunnel feature to relay browser errors via a custom endpoint.
func VerifyDSN ¶ added in v0.3.8
VerifyDSN will require the submitted DNS to match one of the provided DSNs.
func W ¶
W will wrap an error. The error is not wrapped if the parent error already captured the caller.
func WF ¶
WF will wrap and error with a formatted message. This function can be used instead of wrapping with fmt.Errorf().
Types ¶
type BaseErr ¶ added in v0.1.1
type BaseErr struct {
// contains filtered or unexported fields
}
BaseErr represents the base of an error chain. It cannot directly be used as an error value. Instead, the caller uses Wrap() to get a new wrapped error or Self() to get the identity error.
type Caller ¶
Caller describes a caller.
func (*Caller) Analyze ¶ added in v0.3.4
func (c *Caller) Analyze()
Analyze will fill Short, Full, File and Line from the first stack frame.
func (*Caller) Drop ¶ added in v0.3.4
Drop will drop the specified amount of frames from the caller.
func (Caller) Format ¶
Format will format the caller.
%s short name %q "short name" %v full name %+v stack trace
func (Caller) Includes ¶
Includes returns whether the receiver fully includes the provided caller. Ignore can be set to ignore n bottom frames. Two adjacent callers will have the same stack except for the last frame which represents the call site.
type Config ¶
type Config struct { // The Sentry DSN. SentryDSN string // The OTLP endpoint URL. OTLPEndpointURL string // The trace service name. TraceServiceName string // ReportOutput for writing errors. // // Default: os.Stderr. ReportOutput io.Writer // The debug config. DebugConfig DebugConfig }
Config is used to configure xo.
type Context ¶
Context is used by Run to track execution.
type DebugConfig ¶ added in v0.2.4
type DebugConfig struct { // Whether to omit interception. // // Default: false. NoIntercept bool // The output for traces. // // Default: Sink("TRACE"). TraceOutput io.Writer // The trace resolution. // // Default: 1ns. TraceResolution time.Duration // The trace width. // // Default: 80. TraceWidth int // Whether to include trace attributes. TraceAttributes bool // The output for reports. // // Default: Sink("REPORT"). ReportOutput io.Writer // Whether to omit report context data. NoReportContext bool // Whether to omit file paths from report stack traces. NoReportPaths bool // Whether to omit line numbers from report stack traces. NoReportLineNumbers bool }
DebugConfig is used to configure xo for debugging.
func (*DebugConfig) Ensure ¶ added in v0.2.4
func (c *DebugConfig) Ensure()
Ensure will ensure defaults.
type Debugger ¶
type Debugger struct {
// contains filtered or unexported fields
}
Debugger is a virtual logging, tracing and reporting provider for debugging purposes.
func NewDebugger ¶
func NewDebugger(config DebugConfig) *Debugger
NewDebugger will create and return a new debugger.
func (*Debugger) Report ¶ added in v0.3.0
func (d *Debugger) Report(event *sentry.Event)
Report will report the specified event.
func (*Debugger) SentryTransport ¶
func (d *Debugger) SentryTransport() sentry.Transport
SentryTransport will return a sentry transport that print received events.
func (*Debugger) SpanExporter ¶ added in v0.2.4
func (d *Debugger) SpanExporter() trace.SpanExporter
SpanExporter will return a span exporter that prints received spans.
type Err ¶
Err is the error returned by F(), W(), WS() and WF().
func (*Err) Format ¶
Format will format the error.
%s message %q "message" %v caller: message %+v err message caller
func (*Err) StackTrace ¶
StackTrace will return the stack trace (for sentry compatibility).
type SentryTransport ¶
type SentryTransport func(*sentry.Event)
SentryTransport is a functional sentry transport.
func (SentryTransport) Configure ¶
func (t SentryTransport) Configure(sentry.ClientOptions)
Configure implements the sentry.Transport interface.
func (SentryTransport) Flush ¶
func (t SentryTransport) Flush(time.Duration) bool
Flush implements the sentry.Transport interface.
func (SentryTransport) SendEvent ¶
func (t SentryTransport) SendEvent(event *sentry.Event)
SendEvent implements the sentry.Transport interface.
type Span ¶
type Span struct {
// contains filtered or unexported fields
}
Span is the underlying span used for tracing.
func NewSpan ¶ added in v0.2.0
NewSpan will create and return a new span from the provided context and native span. The context should already carry the native span.
func SmartTrace ¶ added in v0.2.0
SmartTrace calls Trace with the callers short name.
func Trace ¶
Trace is used to trace a function call. It will start a new span based on the history in the provided context. It will return a new span and context that contains the created spans native span.
Example ¶
// install teardown := Debug(DebugConfig{ TraceResolution: 100 * time.Millisecond, }) defer teardown() // get context ctx := context.Background() // trace one func() { ctx, span := Trace(ctx, "One") defer span.End() time.Sleep(100 * time.Millisecond) // trace two func() { ctx, span := Trace(ctx, "Two") span.Log("hello world") defer span.End() time.Sleep(100 * time.Millisecond) // trace three func() { _, span := Trace(ctx, "Three") span.Tag("foo", "bar") defer span.End() time.Sleep(100 * time.Millisecond) }() }() // trace four func() { ctx, span := Trace(ctx, "Four") span.Record(F("fatal")) defer span.End() // trace five func() { _, span := Trace(ctx, "Five") span.Tag("baz", 42) defer span.End() time.Sleep(100 * time.Millisecond) }() time.Sleep(100 * time.Millisecond) }() }() // flush time.Sleep(10 * time.Millisecond)
Output: ===== TRACE ===== > One ├──────────────────────────────────────────────────────────────────────────────┤ 500ms | Two ├──────────────────────────────┤ 200ms | :log • 100ms | Three ├──────────────┤ 100ms | Four ├──────────────────────────────┤ 200ms | :exception • 300ms | Five ├──────────────┤ 100ms
type SpanExporter ¶ added in v0.2.4
type SpanExporter func(trace.ReadOnlySpan) error
SpanExporter is a functional span exporter.
func (SpanExporter) ExportSpans ¶ added in v0.2.4
func (s SpanExporter) ExportSpans(_ context.Context, spans []trace.ReadOnlySpan) error
ExportSpans implements the trace.SpanExporter interface.
type Tester ¶
type Tester struct { // The collected spans. Spans []VSpan // The collected reports. Reports []VReport // The collected sinks. Sinks map[string]*VSink }
Tester is a virtual logging, tracing and reporting provider for testing purposes.
func (*Tester) ReducedReports ¶
ReducedReports will return a copy of the report list with reduced information. This representation can be used in tests for easy direct comparison.
func (*Tester) ReducedSpans ¶
ReducedSpans will return a copy of the span list with reduced information. This representation can be used in tests for easy direct comparison.
func (*Tester) SentryTransport ¶
func (t *Tester) SentryTransport() sentry.Transport
SentryTransport will return a sentry transport that collects events.
func (*Tester) SinkFactory ¶
func (t *Tester) SinkFactory() func(name string) io.WriteCloser
SinkFactory will return a sink factory that returns buffer sinks.
func (*Tester) SpanExporter ¶ added in v0.2.4
func (t *Tester) SpanExporter() trace.SpanExporter
SpanExporter will return a span exporter that collects spans.
type Tracer ¶ added in v0.2.0
type Tracer struct {
// contains filtered or unexported fields
}
Tracer manages a span stack that can be used with fat contexts. Rather than branching of the context for every function call, a span is pushed onto the tracers stack to trace execution.
Code that uses Trace or native opentelemetry APIs will automatically discover the stack and branch of its tail if no previous branch has been detected.
func CreateTracer ¶ added in v0.2.0
CreateTracer returns a new tracer that will use the span found in the provided context to start a new one with the provided name. The returned context is the provided context wrapped with the new native span and tracer.
func GetTracer ¶ added in v0.2.0
GetTracer will return the tracer from the context or nil if absent.
func NewTracer ¶ added in v0.2.0
NewTracer returns a new tracer that will use the native span found in the context as its root. The returned context is the provided context wrapped with the tracer.
func (*Tracer) End ¶ added in v0.2.0
func (t *Tracer) End()
End will end all stacked spans and the root span.
func (*Tracer) Pop ¶ added in v0.2.0
func (t *Tracer) Pop()
Pop ends and removes the last pushed span. This call is usually deferred right after a push.
func (*Tracer) SmartPush ¶ added in v0.2.0
func (t *Tracer) SmartPush()
SmartPush will call Push() with callers short name.
type VException ¶
VException is a virtual report exception.
type VNode ¶
VNode is a virtual trace node.
func BuildTraces ¶
BuildTraces will assemble traces from a list of spans.
type VReport ¶
type VReport struct { ID string Level string Time time.Time Context M Tags M Exceptions []VException }
VReport is a virtual report.
func ConvertReport ¶
func ConvertReport(event *sentry.Event) VReport
ConvertReport will convert a raw event to virtual report.
type VSink ¶ added in v0.3.6
type VSink struct {
String string
}
VSink provides a virtual string buffer.
type VSpan ¶
type VSpan struct { ID string Trace string Parent string Name string Start time.Time End time.Time Duration time.Duration Attributes M Events []VEvent }
VSpan is a virtual span.
func ConvertSpan ¶
func ConvertSpan(data trace.ReadOnlySpan) VSpan
ConvertSpan will convert a raw span to a virtual span.