diff --git a/span.go b/span.go index 198f0de..44853bc 100644 --- a/span.go +++ b/span.go @@ -116,6 +116,77 @@ func (s *Span) CaptureMessage(message string) *Span { return s } +type ( + SeverityLevel string + BreadcrumbType string +) + +const ( + SeverityDebug SeverityLevel = "debug" + SeverityInfo SeverityLevel = "info" + SeverityWarning SeverityLevel = "warning" + SeverityError SeverityLevel = "error" + SeverityFatal SeverityLevel = "fatal" + + BreadcrumbTypeDefault BreadcrumbType = "default" + // BreadcrumbCatagoryConsole is rendered as a BreadcrumbTypeDebug + BreadcrumbCatagoryConsole string = "console" + + BreadcrumbTypeDebug BreadcrumbType = "debug" + + BreadcrumbTypeError BreadcrumbType = "error" + BreadcrumbCatagoryError string = "error" + + // BreadcrumbTypeNavigration requires the `from` and `to` attributes + BreadcrumbTypeNavigration BreadcrumbType = "navigation" + BreadcrumbCatagoryNavigration string = "navigation" + + // BreadcrumbTypeHTTP requires the `url`, `method` and `status_code` attributes + BreadcrumbTypeHTTP BreadcrumbType = "http" + BreadcrumbCatagoryHTTP string = "http" + + BreadcrumbTypeInfo BreadcrumbType = "info" + + BreadcrumbTypeQuery BreadcrumbType = "query" + + BreadcrumbTypeTransaction BreadcrumbType = "transaction" + BreadcrumbCategorySentryTransaction string = "sentry.transaction" + + // BreadcrumbTypeUI is also applicable for all `ui.*` categories + BreadcrumbTypeUI BreadcrumbType = "ui" + + BreadcrumbTypeUser BreadcrumbType = "user" + BreadcrumbCategoryClick string = "click" +) + +func (s *Span) CaptureBreadcrumb(level SeverityLevel, type_ BreadcrumbType, category string, message string, data map[string]any) *Span { + now := time.Now() + + if hub := sentry.GetHubFromContext(s.Context()); hub != nil { + hub.AddBreadcrumb(&sentry.Breadcrumb{ + Level: sentry.Level(level), + Type: string(type_), + Category: category, + Message: message, + Data: data, + Timestamp: now, + }, nil) + } + + attrs := []attribute.KeyValue{ + attribute.String("category", category), + attribute.String("type", string(type_)), + attribute.String("level", string(level)), + } + for k, v := range data { + attrs = append(attrs, attribute.String(k, fmt.Sprintf("%v", v))) + } + + s.otel.AddEvent(message, trace.WithAttributes(attrs...), trace.WithTimestamp(now)) + + return s +} + func (s *Span) SetName(name string) *Span { s.otel.SetName(name) s.sentry.Name = name