Skip to content
Snippets Groups Projects
Commit d9d9948c52fa authored by Christophe de Vienne's avatar Christophe de Vienne
Browse files

sentry: add a 'tag-names' setting

Any field that has a name present in tag-names will be set as a Tag on the sentry event
parent 49ce5682db45
No related branches found
No related tags found
No related merge requests found
Pipeline #28108 passed
......@@ -2,6 +2,7 @@
import (
"bytes"
"fmt"
"io"
"github.com/getsentry/sentry-go"
......@@ -11,6 +12,7 @@
// SentryOptions ...
type SentryOptions struct {
SentryDSN func(string) `long:"dsn" env:"DSN" ini-name:"dsn" description:"Sentry DSN"`
TagNames []string `long:"tag-names" env:"TAG_NAMES" ini-name:"tag-names" description:"log properties that should be set as tags on the sentry event"`
}
// NewSentryOptions ...
......@@ -29,7 +31,7 @@
loggingOptions.AddLogWrapper(
func(next io.Writer) io.Writer {
return SentryLogger{hub, next}
return SentryLogger{hub, next, &sentryOptions}
})
//OnShutdown(func() {
//hub.Flush(time.Second)
......@@ -40,8 +42,9 @@
// SentryLogger ...
type SentryLogger struct {
hub *sentry.Hub
next io.Writer
hub *sentry.Hub
next io.Writer
options *SentryOptions
}
var (
......@@ -50,7 +53,7 @@
levelsFirstLetter = []byte(`wefp`)
)
func buildEventIfLevelGtWarn(p []byte) *sentry.Event {
func buildEventIfLevelGtWarn(tagNames []string, p []byte) *sentry.Event {
if i := bytes.Index(p, levelMarker); i != -1 {
first := p[i+levelMarkerLen]
if bytes.IndexByte(levelsFirstLetter, first) != -1 {
......@@ -54,9 +57,9 @@
if i := bytes.Index(p, levelMarker); i != -1 {
first := p[i+levelMarkerLen]
if bytes.IndexByte(levelsFirstLetter, first) != -1 {
return buildEvent(p)
return buildEvent(tagNames, p)
}
}
return nil
}
......@@ -58,9 +61,9 @@
}
}
return nil
}
func buildEvent(p []byte) *sentry.Event {
func buildEvent(tagNames []string, p []byte) *sentry.Event {
iter := jsoniter.ConfigFastest.BorrowIterator(p)
defer jsoniter.ConfigFastest.ReturnIterator(iter)
......@@ -105,6 +108,22 @@
iter.ReadVal(&e)
event.Exception = []sentry.Exception{e}
default:
for _, tag := range tagNames {
if tag == field {
rawvalue := iter.Read()
var value string
if s, ok := rawvalue.(string); ok {
value = s
} else {
value = fmt.Sprint(rawvalue)
}
if len(value) > 200 {
value = value[:200]
}
event.Tags[tag] = value
return true
}
}
event.Extra[field] = iter.Read()
}
return true
......@@ -122,7 +141,7 @@
// Write ...
func (l SentryLogger) Write(p []byte) (n int, err error) {
if event := buildEventIfLevelGtWarn(p); event != nil {
if event := buildEventIfLevelGtWarn(l.options.TagNames, p); event != nil {
l.hub.CaptureEvent(event)
}
return l.next.Write(p)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment