package eventhandler import ( "context" "runtime/debug" "go.opentelemetry.io/otel/trace" "github.com/openmeterio/openmeter/openmeter/notification" "github.com/openmeterio/openmeter/pkg/framework/tracex" ) func (h *Handler) Dispatch(ctx context.Context, event *notification.Event) error { spanLink := trace.LinkFromContext(ctx) fn := func(ctx context.Context) error { return h.reconcileEvent(ctx, event) } go func() { defer func() { if err := recover(); err != nil { h.logger.Error("notification event handler panicked", "error", err, "code.stacktrace", string(debug.Stack())) } }() ctx, cancel := context.WithTimeout(context.Background(), notification.DefaultDispatchTimeout) defer cancel() tracerOpts := []trace.SpanStartOption{ trace.WithNewRoot(), trace.WithLinks(spanLink), } err := tracex.StartWithNoValue(ctx, h.tracer, "event_handler.dispatch", tracerOpts...).Wrap(fn) if err != nil { h.logger.WarnContext(ctx, "failed to dispatch event", "eventID", event.ID, "error", err) } }() return nil }