diff --git a/client.go b/client.go index 3c57fbd..3830ed3 100644 --- a/client.go +++ b/client.go @@ -9,6 +9,10 @@ import ( "time" ) +// EnableDebugLogging is a global flag that enables debug logging for all clients. +// When enabled, all IronTelemetry clients will output debug information to stdout. +var EnableDebugLogging = false + // Client is the main IronTelemetry client type Client struct { mu sync.RWMutex @@ -41,7 +45,7 @@ func New(opts Options) (*Client, error) { } client.journeys = NewJourneyManager(client) - if opts.Debug { + if opts.Debug || EnableDebugLogging { fmt.Printf("[IronTelemetry] Initialized with DSN: %s\n", parsedDSN.APIBaseURL) } @@ -80,6 +84,38 @@ func (c *Client) CaptureMessageWithContext(ctx context.Context, message string, return c.sendEvent(ctx, event) } +// LogMessage logs a structured message with title, message, and optional data. +// Useful for structured logging that differentiates the log title from its details. +func (c *Client) LogMessage(level SeverityLevel, title string, message string, data map[string]any) SendResult { + return c.LogMessageWithContext(context.Background(), level, title, message, data) +} + +// LogMessageWithContext logs a structured message with context +func (c *Client) LogMessageWithContext(ctx context.Context, level SeverityLevel, title, message string, data map[string]any) SendResult { + var fullMessage string + if message != "" { + fullMessage = fmt.Sprintf("%s: %s", title, message) + } else { + fullMessage = title + } + + event := c.createEvent(level, fullMessage) + + c.mu.Lock() + event.Extra["logTitle"] = title + if data != nil { + event.Extra["logData"] = data + } + c.mu.Unlock() + + return c.sendEvent(ctx, event) +} + +// GetBreadcrumbs returns a copy of the current breadcrumbs list +func (c *Client) GetBreadcrumbs() []Breadcrumb { + return c.breadcrumbs.GetAll() +} + // AddBreadcrumb adds a breadcrumb func (c *Client) AddBreadcrumb(message string, category BreadcrumbCategory) { c.breadcrumbs.AddSimple(message, category) @@ -237,7 +273,7 @@ func (c *Client) createEvent(level SeverityLevel, message string) *TelemetryEven func (c *Client) sendEvent(ctx context.Context, event *TelemetryEvent) SendResult { // Check sample rate if c.opts.SampleRate < 1.0 && rand.Float64() > c.opts.SampleRate { - if c.opts.Debug { + if c.opts.Debug || EnableDebugLogging { fmt.Printf("[IronTelemetry] Event sampled out: %s\n", event.EventID) } return SendResult{Success: true, EventID: event.EventID} @@ -247,7 +283,7 @@ func (c *Client) sendEvent(ctx context.Context, event *TelemetryEvent) SendResul if c.opts.BeforeSend != nil { event = c.opts.BeforeSend(event) if event == nil { - if c.opts.Debug { + if c.opts.Debug || EnableDebugLogging { fmt.Println("[IronTelemetry] Event dropped by beforeSend hook") } return SendResult{Success: true}