Bumps the go-deps group with 12 updates in the / directory: | Package | From | To | | --- | --- | --- | | [cloud.google.com/go/storage](https://github.com/googleapis/google-cloud-go) | `1.41.0` | `1.42.0` | | [github.com/Azure/azure-sdk-for-go/sdk/azidentity](https://github.com/Azure/azure-sdk-for-go) | `1.5.2` | `1.6.0` | | [github.com/Azure/go-autorest/autorest/azure/auth](https://github.com/Azure/go-autorest) | `0.5.12` | `0.5.13` | | [github.com/BurntSushi/toml](https://github.com/BurntSushi/toml) | `1.3.2` | `1.4.0` | | [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) | `1.53.6` | `1.54.2` | | [github.com/getsentry/sentry-go](https://github.com/getsentry/sentry-go) | `0.27.0` | `0.28.1` | | [github.com/gophercloud/gophercloud](https://github.com/gophercloud/gophercloud) | `1.11.0` | `1.12.0` | | [github.com/hashicorp/go-retryablehttp](https://github.com/hashicorp/go-retryablehttp) | `0.7.6` | `0.7.7` | | [github.com/openshift-online/ocm-sdk-go](https://github.com/openshift-online/ocm-sdk-go) | `0.1.420` | `0.1.425` | | [github.com/osbuild/images](https://github.com/osbuild/images) | `0.65.0` | `0.66.0` | | [github.com/spf13/cobra](https://github.com/spf13/cobra) | `1.8.0` | `1.8.1` | | [github.com/vmware/govmomi](https://github.com/vmware/govmomi) | `0.37.2` | `0.37.3` | Updates `cloud.google.com/go/storage` from 1.41.0 to 1.42.0 - [Release notes](https://github.com/googleapis/google-cloud-go/releases) - [Changelog](https://github.com/googleapis/google-cloud-go/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-cloud-go/compare/spanner/v1.41.0...spanner/v1.42.0) Updates `github.com/Azure/azure-sdk-for-go/sdk/azidentity` from 1.5.2 to 1.6.0 - [Release notes](https://github.com/Azure/azure-sdk-for-go/releases) - [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/documentation/release.md) - [Commits](https://github.com/Azure/azure-sdk-for-go/compare/sdk/internal/v1.5.2...sdk/azcore/v1.6.0) Updates `github.com/Azure/go-autorest/autorest/azure/auth` from 0.5.12 to 0.5.13 - [Release notes](https://github.com/Azure/go-autorest/releases) - [Changelog](https://github.com/Azure/go-autorest/blob/main/CHANGELOG.md) - [Commits](https://github.com/Azure/go-autorest/compare/autorest/azure/auth/v0.5.12...autorest/azure/auth/v0.5.13) Updates `github.com/BurntSushi/toml` from 1.3.2 to 1.4.0 - [Release notes](https://github.com/BurntSushi/toml/releases) - [Commits](https://github.com/BurntSushi/toml/compare/v1.3.2...v1.4.0) Updates `github.com/aws/aws-sdk-go` from 1.53.6 to 1.54.2 - [Release notes](https://github.com/aws/aws-sdk-go/releases) - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.53.6...v1.54.2) Updates `github.com/getsentry/sentry-go` from 0.27.0 to 0.28.1 - [Release notes](https://github.com/getsentry/sentry-go/releases) - [Changelog](https://github.com/getsentry/sentry-go/blob/master/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-go/compare/v0.27.0...v0.28.1) Updates `github.com/gophercloud/gophercloud` from 1.11.0 to 1.12.0 - [Release notes](https://github.com/gophercloud/gophercloud/releases) - [Changelog](https://github.com/gophercloud/gophercloud/blob/master/CHANGELOG.md) - [Commits](https://github.com/gophercloud/gophercloud/compare/v1.11.0...v1.12.0) Updates `github.com/hashicorp/go-retryablehttp` from 0.7.6 to 0.7.7 - [Changelog](https://github.com/hashicorp/go-retryablehttp/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/go-retryablehttp/compare/v0.7.6...v0.7.7) Updates `github.com/openshift-online/ocm-sdk-go` from 0.1.420 to 0.1.425 - [Release notes](https://github.com/openshift-online/ocm-sdk-go/releases) - [Changelog](https://github.com/openshift-online/ocm-sdk-go/blob/main/CHANGES.md) - [Commits](https://github.com/openshift-online/ocm-sdk-go/compare/v0.1.420...v0.1.425) Updates `github.com/osbuild/images` from 0.65.0 to 0.66.0 - [Release notes](https://github.com/osbuild/images/releases) - [Commits](https://github.com/osbuild/images/compare/v0.65.0...v0.66.0) Updates `github.com/spf13/cobra` from 1.8.0 to 1.8.1 - [Release notes](https://github.com/spf13/cobra/releases) - [Commits](https://github.com/spf13/cobra/compare/v1.8.0...v1.8.1) Updates `github.com/vmware/govmomi` from 0.37.2 to 0.37.3 - [Release notes](https://github.com/vmware/govmomi/releases) - [Changelog](https://github.com/vmware/govmomi/blob/main/CHANGELOG.md) - [Commits](https://github.com/vmware/govmomi/compare/v0.37.2...v0.37.3) Updates `golang.org/x/oauth2` from 0.20.0 to 0.21.0 - [Commits](https://github.com/golang/oauth2/compare/v0.20.0...v0.21.0) Updates `golang.org/x/sys` from 0.20.0 to 0.21.0 - [Commits](https://github.com/golang/sys/compare/v0.20.0...v0.21.0) Updates `google.golang.org/api` from 0.181.0 to 0.183.0 - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.181.0...v0.183.0) --- updated-dependencies: - dependency-name: cloud.google.com/go/storage dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/Azure/azure-sdk-for-go/sdk/azidentity dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/Azure/go-autorest/autorest/azure/auth dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-deps - dependency-name: github.com/BurntSushi/toml dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/aws/aws-sdk-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/getsentry/sentry-go dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/gophercloud/gophercloud dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/hashicorp/go-retryablehttp dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-deps - dependency-name: github.com/openshift-online/ocm-sdk-go dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-deps - dependency-name: github.com/osbuild/images dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-deps - dependency-name: github.com/vmware/govmomi dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-deps - dependency-name: golang.org/x/oauth2 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: golang.org/x/sys dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-deps ... Signed-off-by: dependabot[bot] <support@github.com>
195 lines
5.4 KiB
Go
195 lines
5.4 KiB
Go
// Package sentrylogrus provides a simple Logrus hook for Sentry.
|
|
package sentrylogrus
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
sentry "github.com/getsentry/sentry-go"
|
|
)
|
|
|
|
// The identifier of the Logrus SDK.
|
|
const sdkIdentifier = "sentry.go.logrus"
|
|
|
|
// These default log field keys are used to pass specific metadata in a way that
|
|
// Sentry understands. If they are found in the log fields, and the value is of
|
|
// the expected datatype, it will be converted from a generic field, into Sentry
|
|
// metadata.
|
|
//
|
|
// These keys may be overridden by calling SetKey on the hook object.
|
|
const (
|
|
// FieldRequest holds an *http.Request.
|
|
FieldRequest = "request"
|
|
// FieldUser holds a User or *User value.
|
|
FieldUser = "user"
|
|
// FieldTransaction holds a transaction ID as a string.
|
|
FieldTransaction = "transaction"
|
|
// FieldFingerprint holds a string slice ([]string), used to dictate the
|
|
// grouping of this event.
|
|
FieldFingerprint = "fingerprint"
|
|
|
|
// These fields are simply omitted, as they are duplicated by the Sentry SDK.
|
|
FieldGoVersion = "go_version"
|
|
FieldMaxProcs = "go_maxprocs"
|
|
)
|
|
|
|
// Hook is the logrus hook for Sentry.
|
|
//
|
|
// It is not safe to configure the hook while logging is happening. Please
|
|
// perform all configuration before using it.
|
|
type Hook struct {
|
|
hub *sentry.Hub
|
|
fallback FallbackFunc
|
|
keys map[string]string
|
|
levels []logrus.Level
|
|
}
|
|
|
|
var _ logrus.Hook = &Hook{}
|
|
|
|
// New initializes a new Logrus hook which sends logs to a new Sentry client
|
|
// configured according to opts.
|
|
func New(levels []logrus.Level, opts sentry.ClientOptions) (*Hook, error) {
|
|
client, err := sentry.NewClient(opts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
client.SetSDKIdentifier(sdkIdentifier)
|
|
|
|
return NewFromClient(levels, client), nil
|
|
}
|
|
|
|
// NewFromClient initializes a new Logrus hook which sends logs to the provided
|
|
// sentry client.
|
|
func NewFromClient(levels []logrus.Level, client *sentry.Client) *Hook {
|
|
h := &Hook{
|
|
levels: levels,
|
|
hub: sentry.NewHub(client, sentry.NewScope()),
|
|
keys: make(map[string]string),
|
|
}
|
|
return h
|
|
}
|
|
|
|
// AddTags adds tags to the hook's scope.
|
|
func (h *Hook) AddTags(tags map[string]string) {
|
|
h.hub.Scope().SetTags(tags)
|
|
}
|
|
|
|
// A FallbackFunc can be used to attempt to handle any errors in logging, before
|
|
// resorting to Logrus's standard error reporting.
|
|
type FallbackFunc func(*logrus.Entry) error
|
|
|
|
// SetFallback sets a fallback function, which will be called in case logging to
|
|
// sentry fails. In case of a logging failure in the Fire() method, the
|
|
// fallback function is called with the original logrus entry. If the
|
|
// fallback function returns nil, the error is considered handled. If it returns
|
|
// an error, that error is passed along to logrus as the return value from the
|
|
// Fire() call. If no fallback function is defined, a default error message is
|
|
// returned to Logrus in case of failure to send to Sentry.
|
|
func (h *Hook) SetFallback(fb FallbackFunc) {
|
|
h.fallback = fb
|
|
}
|
|
|
|
// SetKey sets an alternate field key. Use this if the default values conflict
|
|
// with other loggers, for instance. You may pass "" for new, to unset an
|
|
// existing alternate.
|
|
func (h *Hook) SetKey(oldKey, newKey string) {
|
|
if oldKey == "" {
|
|
return
|
|
}
|
|
if newKey == "" {
|
|
delete(h.keys, oldKey)
|
|
return
|
|
}
|
|
delete(h.keys, newKey)
|
|
h.keys[oldKey] = newKey
|
|
}
|
|
|
|
func (h *Hook) key(key string) string {
|
|
if val := h.keys[key]; val != "" {
|
|
return val
|
|
}
|
|
return key
|
|
}
|
|
|
|
// Levels returns the list of logging levels that will be sent to
|
|
// Sentry.
|
|
func (h *Hook) Levels() []logrus.Level {
|
|
return h.levels
|
|
}
|
|
|
|
// Fire sends entry to Sentry.
|
|
func (h *Hook) Fire(entry *logrus.Entry) error {
|
|
event := h.entryToEvent(entry)
|
|
if id := h.hub.CaptureEvent(event); id == nil {
|
|
if h.fallback != nil {
|
|
return h.fallback(entry)
|
|
}
|
|
return errors.New("failed to send to sentry")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
var levelMap = map[logrus.Level]sentry.Level{
|
|
logrus.TraceLevel: sentry.LevelDebug,
|
|
logrus.DebugLevel: sentry.LevelDebug,
|
|
logrus.InfoLevel: sentry.LevelInfo,
|
|
logrus.WarnLevel: sentry.LevelWarning,
|
|
logrus.ErrorLevel: sentry.LevelError,
|
|
logrus.FatalLevel: sentry.LevelFatal,
|
|
logrus.PanicLevel: sentry.LevelFatal,
|
|
}
|
|
|
|
func (h *Hook) entryToEvent(l *logrus.Entry) *sentry.Event {
|
|
data := make(logrus.Fields, len(l.Data))
|
|
for k, v := range l.Data {
|
|
data[k] = v
|
|
}
|
|
s := &sentry.Event{
|
|
Level: levelMap[l.Level],
|
|
Extra: data,
|
|
Message: l.Message,
|
|
Timestamp: l.Time,
|
|
}
|
|
key := h.key(FieldRequest)
|
|
if req, ok := s.Extra[key].(*http.Request); ok {
|
|
delete(s.Extra, key)
|
|
s.Request = sentry.NewRequest(req)
|
|
}
|
|
if err, ok := s.Extra[logrus.ErrorKey].(error); ok {
|
|
delete(s.Extra, logrus.ErrorKey)
|
|
s.SetException(err, -1)
|
|
}
|
|
key = h.key(FieldUser)
|
|
if user, ok := s.Extra[key].(sentry.User); ok {
|
|
delete(s.Extra, key)
|
|
s.User = user
|
|
}
|
|
if user, ok := s.Extra[key].(*sentry.User); ok {
|
|
delete(s.Extra, key)
|
|
s.User = *user
|
|
}
|
|
key = h.key(FieldTransaction)
|
|
if txn, ok := s.Extra[key].(string); ok {
|
|
delete(s.Extra, key)
|
|
s.Transaction = txn
|
|
}
|
|
key = h.key(FieldFingerprint)
|
|
if fp, ok := s.Extra[key].([]string); ok {
|
|
delete(s.Extra, key)
|
|
s.Fingerprint = fp
|
|
}
|
|
delete(s.Extra, FieldGoVersion)
|
|
delete(s.Extra, FieldMaxProcs)
|
|
return s
|
|
}
|
|
|
|
// Flush waits until the underlying Sentry transport sends any buffered events,
|
|
// blocking for at most the given timeout. It returns false if the timeout was
|
|
// reached, in which case some events may not have been sent.
|
|
func (h *Hook) Flush(timeout time.Duration) bool {
|
|
return h.hub.Client().Flush(timeout)
|
|
}
|