raven

package module
v0.0.0-...-b9d1245 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 18, 2018 License: BSD-3-Clause Imports: 28 Imported by: 0

README

raven Build Status

raven is a Go client for the Sentry event/error logging system.

Installation

go get github.com/getsentry/raven-go

Documentation

Overview

Package raven implements a client for the Sentry error logging service.

Example
// ... i.e. raisedErr is incoming error
var raisedErr error
// sentry DSN generated by Sentry server
var sentryDSN string
// r is a request performed when error occured
var r *http.Request
client, err := New(sentryDSN)
if err != nil {
	log.Fatal(err)
}
trace := NewStacktrace(0, 2, nil)
packet := NewPacket(raisedErr.Error(), NewException(raisedErr, trace), NewHttp(r))
eventID, ch := client.Capture(packet, nil)
if err = <-ch; err != nil {
	log.Fatal(err)
}
message := fmt.Sprintf("Captured error with id %s: %q", eventID, raisedErr)
log.Println(message)
Output:

Index

Examples

Constants

View Source
const (
	DEBUG   = Severity("debug")
	INFO    = Severity("info")
	WARNING = Severity("warning")
	ERROR   = Severity("error")
	FATAL   = Severity("fatal")
)

http://docs.python.org/2/howto/logging.html#logging-levels

Variables

View Source
var (
	ErrPacketDropped         = errors.New("raven: packet dropped")
	ErrUnableToUnmarshalJSON = errors.New("raven: unable to unmarshal JSON")
	ErrMissingUser           = errors.New("raven: dsn missing public key and/or password")
	ErrMissingProjectID      = errors.New("raven: dsn missing project id")
	ErrInvalidSampleRate     = errors.New("raven: sample rate should be between 0 and 1")
)
View Source
var DefaultClient = newClient(nil)

Initialize a default *Client instance

View Source
var MaxQueueBuffer = 100

The maximum number of packets that will be buffered waiting to be delivered. Packets will be dropped if the buffer is full. Used by NewClient.

Functions

func Capture

func Capture(packet *Packet, captureTags map[string]string) (eventID string, ch chan error)

Capture asynchronously delivers a packet to the Sentry server with the default *Client. It is a no-op when client is nil. A channel is provided if it is important to check for a send's success.

func CaptureError

func CaptureError(err error, tags map[string]string, interfaces ...Interface) string

CaptureErrors formats and delivers an error to the Sentry server using the default *Client. Adds a stacktrace to the packet, excluding the call to this method.

func CaptureErrorAndWait

func CaptureErrorAndWait(err error, tags map[string]string, interfaces ...Interface) string

CaptureErrorAndWait is identical to CaptureError, except it blocks and assures that the event was sent

func CaptureMessage

func CaptureMessage(message string, tags map[string]string, interfaces ...Interface) string

CaptureMessage formats and delivers a string message to the Sentry server with the default *Client

func CaptureMessageAndWait

func CaptureMessageAndWait(message string, tags map[string]string, interfaces ...Interface) string

CaptureMessageAndWait is identical to CaptureMessage except it blocks and waits for the message to be sent.

func CapturePanic

func CapturePanic(f func(), tags map[string]string, interfaces ...Interface) (interface{}, string)

CapturePanic calls f and then recovers and reports a panic to the Sentry server if it occurs. If an error is captured, both the error and the reported Sentry error ID are returned.

func CapturePanicAndWait

func CapturePanicAndWait(f func(), tags map[string]string, interfaces ...Interface) (interface{}, string)

CapturePanicAndWait is identical to CaptureError, except it blocks and assures that the event was sent

func ClearContext

func ClearContext()

func Close

func Close()

func IncludePaths

func IncludePaths() []string

func ProjectID

func ProjectID() string

func RecoveryHandler

func RecoveryHandler(handler func(http.ResponseWriter, *http.Request)) func(http.ResponseWriter, *http.Request)

Recovery handler to wrap the stdlib net/http Mux. Example:

http.HandleFunc("/", raven.RecoveryHandler(func(w http.ResponseWriter, r *http.Request) {
	...
}))

func Release

func Release() string

func SetDSN

func SetDSN(dsn string) error

Sets the DSN for the default *Client instance

func SetDefaultLoggerName

func SetDefaultLoggerName(name string)

SetDefaultLoggerName sets the "defaultLoggerName" on the default *Client

func SetEnvironment

func SetEnvironment(environment string)

SetEnvironment sets the "environment" tag on the default *Client

func SetHttpContext

func SetHttpContext(h *Http)

func SetIgnoreErrors

func SetIgnoreErrors(errs ...string) error

func SetIncludePaths

func SetIncludePaths(p []string)

func SetRelease

func SetRelease(release string)

SetRelease sets the "release" tag on the default *Client

func SetSampleRate

func SetSampleRate(rate float32) error

SetSampleRate sets the "sample rate" on the degault *Client

func SetTagsContext

func SetTagsContext(t map[string]string)

func SetUserContext

func SetUserContext(u *User)

func URL

func URL() string

func Wait

func Wait()

Wait blocks and waits for all events to finish being sent to Sentry server

func WrapWithExtra

func WrapWithExtra(err error, extraInfo map[string]interface{}) error

Adds extra data to an error before reporting to Sentry

Types

type Client

type Client struct {
	Tags map[string]string

	Transport Transport

	// DropHandler is called when a packet is dropped because the buffer is full.
	DropHandler func(*Packet)
	// contains filtered or unexported fields
}

Client encapsulates a connection to a Sentry server. It must be initialized by calling NewClient. Modification of fields concurrently with Send or after calling Report for the first time is not thread-safe.

func New

func New(dsn string) (*Client, error)

New constructs a new Sentry client instance

func NewClient deprecated

func NewClient(dsn string, tags map[string]string) (*Client, error)

NewClient constructs a Sentry client and spawns a background goroutine to handle packets sent by Client.Report.

Deprecated: use New and NewWithTags instead

func NewWithTags

func NewWithTags(dsn string, tags map[string]string) (*Client, error)

NewWithTags constructs a new Sentry client instance with default tags.

func (*Client) Capture

func (client *Client) Capture(packet *Packet, captureTags map[string]string) (eventID string, ch chan error)

Capture asynchronously delivers a packet to the Sentry server. It is a no-op when client is nil. A channel is provided if it is important to check for a send's success.

func (*Client) CaptureError

func (client *Client) CaptureError(err error, tags map[string]string, interfaces ...Interface) string

CaptureErrors formats and delivers an error to the Sentry server. Adds a stacktrace to the packet, excluding the call to this method.

func (*Client) CaptureErrorAndWait

func (client *Client) CaptureErrorAndWait(err error, tags map[string]string, interfaces ...Interface) string

CaptureErrorAndWait is identical to CaptureError, except it blocks and assures that the event was sent

func (*Client) CaptureMessage

func (client *Client) CaptureMessage(message string, tags map[string]string, interfaces ...Interface) string

CaptureMessage formats and delivers a string message to the Sentry server.

func (*Client) CaptureMessageAndWait

func (client *Client) CaptureMessageAndWait(message string, tags map[string]string, interfaces ...Interface) string

CaptureMessageAndWait is identical to CaptureMessage except it blocks and waits for the message to be sent.

func (*Client) CapturePanic

func (client *Client) CapturePanic(f func(), tags map[string]string, interfaces ...Interface) (err interface{}, errorID string)

CapturePanic calls f and then recovers and reports a panic to the Sentry server if it occurs. If an error is captured, both the error and the reported Sentry error ID are returned.

func (*Client) CapturePanicAndWait

func (client *Client) CapturePanicAndWait(f func(), tags map[string]string, interfaces ...Interface) (err interface{}, errorID string)

CapturePanicAndWait is identical to CaptureError, except it blocks and assures that the event was sent

func (*Client) ClearContext

func (c *Client) ClearContext()

func (*Client) Close

func (client *Client) Close()

func (*Client) IncludePaths

func (client *Client) IncludePaths() []string

func (*Client) ProjectID

func (client *Client) ProjectID() string

func (*Client) Release

func (client *Client) Release() string

func (*Client) SetDSN

func (client *Client) SetDSN(dsn string) error

SetDSN updates a client with a new DSN. It safe to call after and concurrently with calls to Report and Send.

func (*Client) SetDefaultLoggerName

func (client *Client) SetDefaultLoggerName(name string)

SetDefaultLoggerName sets the default logger name.

func (*Client) SetEnvironment

func (client *Client) SetEnvironment(environment string)

SetEnvironment sets the "environment" tag.

func (*Client) SetHttpContext

func (c *Client) SetHttpContext(h *Http)

func (*Client) SetIgnoreErrors

func (c *Client) SetIgnoreErrors(errs []string) error

func (*Client) SetIncludePaths

func (client *Client) SetIncludePaths(p []string)

func (*Client) SetRelease

func (client *Client) SetRelease(release string)

SetRelease sets the "release" tag.

func (*Client) SetSampleRate

func (client *Client) SetSampleRate(rate float32) error

SetSampleRate sets how much sampling we want on client side

func (*Client) SetTagsContext

func (c *Client) SetTagsContext(t map[string]string)

func (*Client) SetUserContext

func (c *Client) SetUserContext(u *User)

func (*Client) URL

func (client *Client) URL() string

func (*Client) Wait

func (client *Client) Wait()

Wait blocks and waits for all events to finish being sent to Sentry server

type Culpriter

type Culpriter interface {
	Culprit() string
}

type ErrWithExtra

type ErrWithExtra interface {
	Error() string
	Cause() error
	ExtraInfo() Extra
}

type Exception

type Exception struct {
	// Required
	Value string `json:"value"`

	// Optional
	Type       string      `json:"type,omitempty"`
	Module     string      `json:"module,omitempty"`
	Stacktrace *Stacktrace `json:"stacktrace,omitempty"`
}

https://docs.getsentry.com/hosted/clientdev/interfaces/#failure-interfaces

func NewException

func NewException(err error, stacktrace *Stacktrace) *Exception

func (*Exception) Class

func (e *Exception) Class() string

func (*Exception) Culprit

func (e *Exception) Culprit() string

type Exceptions

type Exceptions struct {
	// Required
	Values []*Exception `json:"values"`
}

Exceptions allows for chained errors https://docs.sentry.io/clientdev/interfaces/exception/

func (Exceptions) Class

func (es Exceptions) Class() string

type Extra

type Extra map[string]interface{}

type HTTPTransport

type HTTPTransport struct {
	*http.Client
}

HTTPTransport is the default transport, delivering packets to Sentry via the HTTP API.

func (*HTTPTransport) Send

func (t *HTTPTransport) Send(url, authHeader string, packet *Packet) error

type Http

type Http struct {
	// Required
	URL    string `json:"url"`
	Method string `json:"method"`
	Query  string `json:"query_string,omitempty"`

	// Optional
	Cookies string            `json:"cookies,omitempty"`
	Headers map[string]string `json:"headers,omitempty"`
	Env     map[string]string `json:"env,omitempty"`

	// Must be either a string or map[string]string
	Data interface{} `json:"data,omitempty"`
}

https://docs.getsentry.com/hosted/clientdev/interfaces/#context-interfaces

func NewHttp

func NewHttp(req *http.Request) *Http

func (*Http) Class

func (h *Http) Class() string

type Interface

type Interface interface {
	// The Sentry class name. Example: sentry.interfaces.Stacktrace
	Class() string
}

An Interface is a Sentry interface that will be serialized as JSON. It must implement json.Marshaler or use json struct tags.

type Message

type Message struct {
	// Required
	Message string `json:"message"`

	// Optional
	Params []interface{} `json:"params,omitempty"`
}

https://docs.getsentry.com/hosted/clientdev/interfaces/#message-interface

func (*Message) Class

func (m *Message) Class() string

type Packet

type Packet struct {
	// Required
	Message string `json:"message"`

	// Required, set automatically by Client.Send/Report via Packet.Init if blank
	EventID   string    `json:"event_id"`
	Project   string    `json:"project"`
	Timestamp Timestamp `json:"timestamp"`
	Level     Severity  `json:"level"`
	Logger    string    `json:"logger"`

	// Optional
	Platform    string            `json:"platform,omitempty"`
	Culprit     string            `json:"culprit,omitempty"`
	ServerName  string            `json:"server_name,omitempty"`
	Release     string            `json:"release,omitempty"`
	Environment string            `json:"environment,omitempty"`
	Tags        Tags              `json:"tags,omitempty"`
	Modules     map[string]string `json:"modules,omitempty"`
	Fingerprint []string          `json:"fingerprint,omitempty"`
	Extra       Extra             `json:"extra,omitempty"`

	Interfaces []Interface `json:"-"`
}

https://docs.getsentry.com/hosted/clientdev/#building-the-json-packet

func NewPacket

func NewPacket(message string, interfaces ...Interface) *Packet

NewPacket constructs a packet with the specified message and interfaces.

func NewPacketWithExtra

func NewPacketWithExtra(message string, extra Extra, interfaces ...Interface) *Packet

NewPacketWithExtra constructs a packet with the specified message, extra information, and interfaces.

func (*Packet) AddTags

func (packet *Packet) AddTags(tags map[string]string)

func (*Packet) Init

func (packet *Packet) Init(project string) error

Init initializes required fields in a packet. It is typically called by Client.Send/Report automatically.

func (*Packet) JSON

func (packet *Packet) JSON() ([]byte, error)

type Query

type Query struct {
	// Required
	Query string `json:"query"`

	// Optional
	Engine string `json:"engine,omitempty"`
}

https://docs.getsentry.com/hosted/clientdev/interfaces/#context-interfaces

func (*Query) Class

func (q *Query) Class() string

type Severity

type Severity string

type Stacktrace

type Stacktrace struct {
	// Required
	Frames []*StacktraceFrame `json:"frames"`
}

https://docs.getsentry.com/hosted/clientdev/interfaces/#failure-interfaces

func GetOrNewStacktrace

func GetOrNewStacktrace(err error, skip int, context int, appPackagePrefixes []string) *Stacktrace

Try to get stacktrace from err as an interface of github.com/pkg/errors, or else NewStacktrace()

func NewStacktrace

func NewStacktrace(skip int, context int, appPackagePrefixes []string) *Stacktrace

Intialize and populate a new stacktrace, skipping skip frames.

context is the number of surrounding lines that should be included for context. Setting context to 3 would try to get seven lines. Setting context to -1 returns one line with no surrounding context, and 0 returns no context.

appPackagePrefixes is a list of prefixes used to check whether a package should be considered "in app".

func (*Stacktrace) Class

func (s *Stacktrace) Class() string

func (*Stacktrace) Culprit

func (s *Stacktrace) Culprit() string

type StacktraceFrame

type StacktraceFrame struct {
	// At least one required
	Filename string `json:"filename,omitempty"`
	Function string `json:"function,omitempty"`
	Module   string `json:"module,omitempty"`

	// Optional
	Lineno       int      `json:"lineno,omitempty"`
	Colno        int      `json:"colno,omitempty"`
	AbsolutePath string   `json:"abs_path,omitempty"`
	ContextLine  string   `json:"context_line,omitempty"`
	PreContext   []string `json:"pre_context,omitempty"`
	PostContext  []string `json:"post_context,omitempty"`
	InApp        bool     `json:"in_app"`
}

func NewStacktraceFrame

func NewStacktraceFrame(pc uintptr, file string, line, context int, appPackagePrefixes []string) *StacktraceFrame

Build a single frame using data returned from runtime.Caller.

context is the number of surrounding lines that should be included for context. Setting context to 3 would try to get seven lines. Setting context to -1 returns one line with no surrounding context, and 0 returns no context.

appPackagePrefixes is a list of prefixes used to check whether a package should be considered "in app".

type Tag

type Tag struct {
	Key   string
	Value string
}

func (*Tag) MarshalJSON

func (tag *Tag) MarshalJSON() ([]byte, error)

func (*Tag) UnmarshalJSON

func (t *Tag) UnmarshalJSON(data []byte) error

type Tags

type Tags []Tag

func (*Tags) UnmarshalJSON

func (t *Tags) UnmarshalJSON(data []byte) error

type Template

type Template struct {
	// Required
	Filename    string `json:"filename"`
	Lineno      int    `json:"lineno"`
	ContextLine string `json:"context_line"`

	// Optional
	PreContext   []string `json:"pre_context,omitempty"`
	PostContext  []string `json:"post_context,omitempty"`
	AbsolutePath string   `json:"abs_path,omitempty"`
}

https://docs.getsentry.com/hosted/clientdev/interfaces/#template-interface

func (*Template) Class

func (t *Template) Class() string

type Timestamp

type Timestamp time.Time

func (Timestamp) Format

func (timestamp Timestamp) Format(format string) string

func (Timestamp) MarshalJSON

func (t Timestamp) MarshalJSON() ([]byte, error)

func (*Timestamp) UnmarshalJSON

func (timestamp *Timestamp) UnmarshalJSON(data []byte) error

type Transport

type Transport interface {
	Send(url, authHeader string, packet *Packet) error
}

type User

type User struct {
	// All fields are optional
	ID       string `json:"id,omitempty"`
	Username string `json:"username,omitempty"`
	Email    string `json:"email,omitempty"`
	IP       string `json:"ip_address,omitempty"`
}

https://docs.getsentry.com/hosted/clientdev/interfaces/#context-interfaces

func (*User) Class

func (h *User) Class() string

type Writer

type Writer struct {
	Client *Client
	Level  Severity
	Logger string // Logger name reported to Sentry
}

func (*Writer) Write

func (w *Writer) Write(p []byte) (int, error)

Write formats the byte slice p into a string, and sends a message to Sentry at the severity level indicated by the Writer w.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL