fix: add sentry in ui, http and projection handlers (#1977)

* fix: add sentry in ui, http and projection handlers

* fix test
This commit is contained in:
Livio Amstutz 2021-07-06 13:36:35 +02:00 committed by GitHub
parent 9277928ef7
commit 0e472a347f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
78 changed files with 339 additions and 11 deletions

View File

@ -40,6 +40,10 @@ const (
customTextTable = "adminapi.custom_texts" customTextTable = "adminapi.custom_texts"
) )
func (m *CustomText) Subscription() *v1.Subscription {
return m.subscription
}
func (m *CustomText) ViewModel() string { func (m *CustomText) ViewModel() string {
return customTextTable return customTextTable
} }

View File

@ -47,6 +47,10 @@ func (p *Features) subscribe() {
}() }()
} }
func (p *Features) Subscription() *v1.Subscription {
return p.subscription
}
func (p *Features) ViewModel() string { func (p *Features) ViewModel() string {
return featuresTable return featuresTable
} }

View File

@ -49,7 +49,6 @@ func (m *IAMMember) subscribe() {
go func() { go func() {
for event := range m.subscription.Events { for event := range m.subscription.Events {
query.ReduceEvent(m, event) query.ReduceEvent(m, event)
} }
}() }()
@ -67,6 +66,10 @@ func (m *IAMMember) ViewModel() string {
return iamMemberTable return iamMemberTable
} }
func (m *IAMMember) Subscription() *v1.Subscription {
return m.subscription
}
func (m *IAMMember) AggregateTypes() []es_models.AggregateType { func (m *IAMMember) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.IAMAggregate, usr_es_model.UserAggregate} return []es_models.AggregateType{model.IAMAggregate, usr_es_model.UserAggregate}
} }

View File

@ -39,6 +39,10 @@ func (i *IDPConfig) subscribe() {
}() }()
} }
func (i *IDPConfig) Subscription() *v1.Subscription {
return i.subscription
}
func (i *IDPConfig) ViewModel() string { func (i *IDPConfig) ViewModel() string {
return idpConfigTable return idpConfigTable
} }

View File

@ -54,6 +54,10 @@ func (i *IDPProvider) subscribe() {
}() }()
} }
func (i *IDPProvider) Subscription() *v1.Subscription {
return i.subscription
}
func (i *IDPProvider) ViewModel() string { func (i *IDPProvider) ViewModel() string {
return idpProviderTable return idpProviderTable
} }

View File

@ -44,6 +44,10 @@ func (p *LabelPolicy) ViewModel() string {
return labelPolicyTable return labelPolicyTable
} }
func (p *LabelPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (p *LabelPolicy) AggregateTypes() []es_models.AggregateType { func (p *LabelPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.IAMAggregate} return []es_models.AggregateType{model.IAMAggregate}
} }

View File

@ -2,7 +2,9 @@ package handler
import ( import (
"context" "context"
"github.com/caos/logging" "github.com/caos/logging"
"github.com/caos/zitadel/internal/domain" "github.com/caos/zitadel/internal/domain"
caos_errs "github.com/caos/zitadel/internal/errors" caos_errs "github.com/caos/zitadel/internal/errors"
"github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1"
@ -12,7 +14,7 @@ import (
"github.com/caos/zitadel/internal/iam/repository/eventsourcing" "github.com/caos/zitadel/internal/iam/repository/eventsourcing"
iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model"
iam_model "github.com/caos/zitadel/internal/iam/repository/view/model" iam_model "github.com/caos/zitadel/internal/iam/repository/view/model"
model "github.com/caos/zitadel/internal/org/repository/eventsourcing/model" "github.com/caos/zitadel/internal/org/repository/eventsourcing/model"
) )
const ( const (
@ -47,6 +49,10 @@ func (p *LoginPolicy) ViewModel() string {
return loginPolicyTable return loginPolicyTable
} }
func (p *LoginPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (p *LoginPolicy) AggregateTypes() []es_models.AggregateType { func (p *LoginPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{iam_es_model.IAMAggregate, model.OrgAggregate} return []es_models.AggregateType{iam_es_model.IAMAggregate, model.OrgAggregate}
} }

View File

@ -44,12 +44,16 @@ func (m *MailTemplate) ViewModel() string {
return mailTemplateTable return mailTemplateTable
} }
func (_ *MailTemplate) AggregateTypes() []es_models.AggregateType { func (m *MailTemplate) Subscription() *v1.Subscription {
return m.subscription
}
func (m *MailTemplate) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{iam_es_model.IAMAggregate} return []es_models.AggregateType{iam_es_model.IAMAggregate}
} }
func (p *MailTemplate) CurrentSequence() (uint64, error) { func (m *MailTemplate) CurrentSequence() (uint64, error) {
sequence, err := p.view.GetLatestMailTemplateSequence() sequence, err := m.view.GetLatestMailTemplateSequence()
if err != nil { if err != nil {
return 0, err return 0, err
} }
@ -99,6 +103,6 @@ func (m *MailTemplate) OnError(event *es_models.Event, err error) error {
return spooler.HandleError(event, err, m.view.GetLatestMailTemplateFailedEvent, m.view.ProcessedMailTemplateFailedEvent, m.view.ProcessedMailTemplateSequence, m.errorCountUntilSkip) return spooler.HandleError(event, err, m.view.GetLatestMailTemplateFailedEvent, m.view.ProcessedMailTemplateFailedEvent, m.view.ProcessedMailTemplateSequence, m.errorCountUntilSkip)
} }
func (o *MailTemplate) OnSuccess() error { func (m *MailTemplate) OnSuccess() error {
return spooler.HandleSuccess(o.view.UpdateMailTemplateSpoolerRunTimestamp) return spooler.HandleSuccess(m.view.UpdateMailTemplateSpoolerRunTimestamp)
} }

View File

@ -2,6 +2,7 @@ package handler
import ( import (
"github.com/caos/logging" "github.com/caos/logging"
caos_errs "github.com/caos/zitadel/internal/errors" caos_errs "github.com/caos/zitadel/internal/errors"
"github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1"
@ -45,6 +46,10 @@ func (m *MessageText) ViewModel() string {
return mailTextTable return mailTextTable
} }
func (m *MessageText) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *MessageText) AggregateTypes() []es_models.AggregateType { func (_ *MessageText) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{iam_es_model.IAMAggregate} return []es_models.AggregateType{iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (o *Org) ViewModel() string {
return orgTable return orgTable
} }
func (o *Org) Subscription() *v1.Subscription {
return o.subscription
}
func (o *Org) AggregateTypes() []es_models.AggregateType { func (o *Org) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate} return []es_models.AggregateType{model.OrgAggregate}
} }

View File

@ -2,6 +2,7 @@ package handler
import ( import (
"github.com/caos/logging" "github.com/caos/logging"
"github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1"
es_models "github.com/caos/zitadel/internal/eventstore/v1/models" es_models "github.com/caos/zitadel/internal/eventstore/v1/models"
"github.com/caos/zitadel/internal/eventstore/v1/query" "github.com/caos/zitadel/internal/eventstore/v1/query"
@ -43,6 +44,10 @@ func (p *OrgIAMPolicy) ViewModel() string {
return orgIAMPolicyTable return orgIAMPolicyTable
} }
func (p *OrgIAMPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (p *OrgIAMPolicy) AggregateTypes() []es_models.AggregateType { func (p *OrgIAMPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -2,6 +2,7 @@ package handler
import ( import (
"github.com/caos/logging" "github.com/caos/logging"
"github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1"
iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model"
@ -44,6 +45,10 @@ func (p *PasswordAgePolicy) ViewModel() string {
return passwordAgePolicyTable return passwordAgePolicyTable
} }
func (p *PasswordAgePolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (p *PasswordAgePolicy) AggregateTypes() []es_models.AggregateType { func (p *PasswordAgePolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -2,6 +2,7 @@ package handler
import ( import (
"github.com/caos/logging" "github.com/caos/logging"
"github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1"
iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model" iam_es_model "github.com/caos/zitadel/internal/iam/repository/eventsourcing/model"
@ -44,6 +45,10 @@ func (p *PasswordComplexityPolicy) ViewModel() string {
return passwordComplexityPolicyTable return passwordComplexityPolicyTable
} }
func (m *PasswordComplexityPolicy) Subscription() *v1.Subscription {
return m.subscription
}
func (p *PasswordComplexityPolicy) AggregateTypes() []es_models.AggregateType { func (p *PasswordComplexityPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (p *PasswordLockoutPolicy) ViewModel() string {
return passwordLockoutPolicyTable return passwordLockoutPolicyTable
} }
func (m *PasswordLockoutPolicy) Subscription() *v1.Subscription {
return m.subscription
}
func (p *PasswordLockoutPolicy) AggregateTypes() []es_models.AggregateType { func (p *PasswordLockoutPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (p *PrivacyPolicy) ViewModel() string {
return privacyPolicyTable return privacyPolicyTable
} }
func (p *PrivacyPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (p *PrivacyPolicy) AggregateTypes() []es_models.AggregateType { func (p *PrivacyPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -63,6 +63,10 @@ func (m *Styling) ViewModel() string {
return stylingTable return stylingTable
} }
func (m *Styling) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *Styling) AggregateTypes() []es_models.AggregateType { func (_ *Styling) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -60,6 +60,10 @@ func (u *User) ViewModel() string {
return userTable return userTable
} }
func (u *User) Subscription() *v1.Subscription {
return u.subscription
}
func (u *User) AggregateTypes() []es_models.AggregateType { func (u *User) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate}
} }

View File

@ -59,6 +59,10 @@ func (i *ExternalIDP) ViewModel() string {
return externalIDPTable return externalIDPTable
} }
func (i *ExternalIDP) Subscription() *v1.Subscription {
return i.subscription
}
func (i *ExternalIDP) AggregateTypes() []es_models.AggregateType { func (i *ExternalIDP) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.UserAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{model.UserAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate}
} }

View File

@ -8,6 +8,7 @@ import (
"github.com/caos/zitadel/internal/telemetry/metrics" "github.com/caos/zitadel/internal/telemetry/metrics"
"github.com/caos/zitadel/internal/telemetry/metrics/otel" "github.com/caos/zitadel/internal/telemetry/metrics/otel"
view_model "github.com/caos/zitadel/internal/view/model" view_model "github.com/caos/zitadel/internal/view/model"
sentryhttp "github.com/getsentry/sentry-go/http"
"go.opentelemetry.io/otel/api/metric" "go.opentelemetry.io/otel/api/metric"
"net/http" "net/http"
@ -78,7 +79,8 @@ func (a *API) RegisterServer(ctx context.Context, server server.Server) {
} }
func (a *API) RegisterHandler(prefix string, handler http.Handler) { func (a *API) RegisterHandler(prefix string, handler http.Handler) {
a.gatewayHandler.RegisterHandler(prefix, handler) sentryHandler := sentryhttp.New(sentryhttp.Options{})
a.gatewayHandler.RegisterHandler(prefix, sentryHandler.Handle(handler))
} }
func (a *API) Start(ctx context.Context) { func (a *API) Start(ctx context.Context) {

View File

@ -49,6 +49,10 @@ func (a *Application) ViewModel() string {
return applicationTable return applicationTable
} }
func (a *Application) Subscription() *v1.Subscription {
return a.subscription
}
func (_ *Application) AggregateTypes() []models.AggregateType { func (_ *Application) AggregateTypes() []models.AggregateType {
return []models.AggregateType{es_model.ProjectAggregate} return []models.AggregateType{es_model.ProjectAggregate}
} }

View File

@ -46,6 +46,10 @@ func (k *AuthNKeys) ViewModel() string {
return authnKeysTable return authnKeysTable
} }
func (k *AuthNKeys) Subscription() *v1.Subscription {
return k.subscription
}
func (_ *AuthNKeys) AggregateTypes() []es_models.AggregateType { func (_ *AuthNKeys) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{user_model.UserAggregate, proj_model.ProjectAggregate} return []es_models.AggregateType{user_model.UserAggregate, proj_model.ProjectAggregate}
} }

View File

@ -44,6 +44,10 @@ func (m *CustomText) ViewModel() string {
return customTextTable return customTextTable
} }
func (m *CustomText) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *CustomText) AggregateTypes() []es_models.AggregateType { func (_ *CustomText) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -51,6 +51,10 @@ func (p *Features) ViewModel() string {
return featuresTable return featuresTable
} }
func (p *Features) Subscription() *v1.Subscription {
return p.subscription
}
func (p *Features) AggregateTypes() []es_models.AggregateType { func (p *Features) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate}
} }

View File

@ -44,6 +44,10 @@ func (i *IDPConfig) ViewModel() string {
return idpConfigTable return idpConfigTable
} }
func (i *IDPConfig) Subscription() *v1.Subscription {
return i.subscription
}
func (_ *IDPConfig) AggregateTypes() []es_models.AggregateType { func (_ *IDPConfig) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -59,6 +59,10 @@ func (i *IDPProvider) ViewModel() string {
return idpProviderTable return idpProviderTable
} }
func (i *IDPProvider) Subscription() *v1.Subscription {
return i.subscription
}
func (_ *IDPProvider) AggregateTypes() []es_models.AggregateType { func (_ *IDPProvider) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.IAMAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{model.IAMAggregate, org_es_model.OrgAggregate}
} }

View File

@ -49,6 +49,10 @@ func (k *Key) ViewModel() string {
return keyTable return keyTable
} }
func (k *Key) Subscription() *v1.Subscription {
return k.subscription
}
func (_ *Key) AggregateTypes() []models.AggregateType { func (_ *Key) AggregateTypes() []models.AggregateType {
return []models.AggregateType{es_model.KeyPairAggregate} return []models.AggregateType{es_model.KeyPairAggregate}
} }

View File

@ -46,6 +46,10 @@ func (m *LabelPolicy) ViewModel() string {
return labelPolicyTable return labelPolicyTable
} }
func (p *LabelPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *LabelPolicy) AggregateTypes() []models.AggregateType { func (_ *LabelPolicy) AggregateTypes() []models.AggregateType {
return []models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -48,6 +48,10 @@ func (p *LoginPolicy) ViewModel() string {
return loginPolicyTable return loginPolicyTable
} }
func (p *LoginPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *LoginPolicy) AggregateTypes() []es_models.AggregateType { func (_ *LoginPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (o *Org) ViewModel() string {
return orgTable return orgTable
} }
func (o *Org) Subscription() *v1.Subscription {
return o.subscription
}
func (_ *Org) AggregateTypes() []es_models.AggregateType { func (_ *Org) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate} return []es_models.AggregateType{model.OrgAggregate}
} }

View File

@ -44,6 +44,10 @@ func (p *OrgIAMPolicy) ViewModel() string {
return orgIAMPolicyTable return orgIAMPolicyTable
} }
func (p *OrgIAMPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *OrgIAMPolicy) AggregateTypes() []es_models.AggregateType { func (_ *OrgIAMPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{org_es_model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{org_es_model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (p *PasswordComplexityPolicy) ViewModel() string {
return passwordComplexityPolicyTable return passwordComplexityPolicyTable
} }
func (p *PasswordComplexityPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *PasswordComplexityPolicy) AggregateTypes() []es_models.AggregateType { func (_ *PasswordComplexityPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{org_es_model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{org_es_model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (p *PrivacyPolicy) ViewModel() string {
return privacyPolicyTable return privacyPolicyTable
} }
func (p *PrivacyPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (p *PrivacyPolicy) AggregateTypes() []es_models.AggregateType { func (p *PrivacyPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -46,6 +46,10 @@ func (p *ProjectRole) ViewModel() string {
return projectRoleTable return projectRoleTable
} }
func (p *ProjectRole) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *ProjectRole) AggregateTypes() []es_models.AggregateType { func (_ *ProjectRole) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.ProjectAggregate} return []es_models.AggregateType{model.ProjectAggregate}
} }

View File

@ -51,6 +51,10 @@ func (t *RefreshToken) ViewModel() string {
return refreshTokenTable return refreshTokenTable
} }
func (t *RefreshToken) Subscription() *v1.Subscription {
return t.subscription
}
func (t *RefreshToken) AggregateTypes() []es_models.AggregateType { func (t *RefreshToken) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{user_es_model.UserAggregate, project_es_model.ProjectAggregate} return []es_models.AggregateType{user_es_model.UserAggregate, project_es_model.ProjectAggregate}
} }

View File

@ -53,6 +53,10 @@ func (t *Token) ViewModel() string {
return tokenTable return tokenTable
} }
func (t *Token) Subscription() *v1.Subscription {
return t.subscription
}
func (_ *Token) AggregateTypes() []es_models.AggregateType { func (_ *Token) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{user_es_model.UserAggregate, project_es_model.ProjectAggregate} return []es_models.AggregateType{user_es_model.UserAggregate, project_es_model.ProjectAggregate}
} }

View File

@ -57,6 +57,9 @@ func (u *User) ViewModel() string {
return userTable return userTable
} }
func (u *User) Subscription() *v1.Subscription {
return u.subscription
}
func (_ *User) AggregateTypes() []es_models.AggregateType { func (_ *User) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate}
} }

View File

@ -59,6 +59,10 @@ func (i *ExternalIDP) ViewModel() string {
return externalIDPTable return externalIDPTable
} }
func (i *ExternalIDP) Subscription() *v1.Subscription {
return i.subscription
}
func (_ *ExternalIDP) AggregateTypes() []es_models.AggregateType { func (_ *ExternalIDP) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.UserAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{model.UserAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate}
} }

View File

@ -71,6 +71,10 @@ func (u *UserGrant) ViewModel() string {
return userGrantTable return userGrantTable
} }
func (u *UserGrant) Subscription() *v1.Subscription {
return u.subscription
}
func (_ *UserGrant) AggregateTypes() []es_models.AggregateType { func (_ *UserGrant) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{grant_es_model.UserGrantAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate, usr_es_model.UserAggregate, proj_es_model.ProjectAggregate} return []es_models.AggregateType{grant_es_model.UserGrantAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate, usr_es_model.UserAggregate, proj_es_model.ProjectAggregate}
} }

View File

@ -57,6 +57,10 @@ func (m *UserMembership) ViewModel() string {
return userMembershipTable return userMembershipTable
} }
func (m *UserMembership) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *UserMembership) AggregateTypes() []es_models.AggregateType { func (_ *UserMembership) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate, model.UserAggregate} return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate, model.UserAggregate}
} }

View File

@ -47,6 +47,10 @@ func (u *UserSession) ViewModel() string {
return userSessionTable return userSessionTable
} }
func (u *UserSession) Subscription() *v1.Subscription {
return u.subscription
}
func (_ *UserSession) AggregateTypes() []models.AggregateType { func (_ *UserSession) AggregateTypes() []models.AggregateType {
return []models.AggregateType{es_model.UserAggregate} return []models.AggregateType{es_model.UserAggregate}
} }

View File

@ -44,6 +44,10 @@ func (a *Application) ViewModel() string {
return applicationTable return applicationTable
} }
func (p *Application) Subscription() *v1.Subscription {
return p.subscription
}
func (a *Application) AggregateTypes() []models.AggregateType { func (a *Application) AggregateTypes() []models.AggregateType {
return []models.AggregateType{es_model.ProjectAggregate} return []models.AggregateType{es_model.ProjectAggregate}
} }

View File

@ -51,6 +51,10 @@ func (p *Features) ViewModel() string {
return featuresTable return featuresTable
} }
func (p *Features) Subscription() *v1.Subscription {
return p.subscription
}
func (p *Features) AggregateTypes() []es_models.AggregateType { func (p *Features) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate}
} }

View File

@ -44,6 +44,10 @@ func (o *Org) ViewModel() string {
return orgTable return orgTable
} }
func (o *Org) Subscription() *v1.Subscription {
return o.subscription
}
func (_ *Org) AggregateTypes() []es_models.AggregateType { func (_ *Org) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate} return []es_models.AggregateType{model.OrgAggregate}
} }

View File

@ -60,6 +60,10 @@ func (u *UserGrant) ViewModel() string {
return userGrantTable return userGrantTable
} }
func (u *UserGrant) Subscription() *v1.Subscription {
return u.subscription
}
func (_ *UserGrant) AggregateTypes() []es_models.AggregateType { func (_ *UserGrant) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate} return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate}
} }

View File

@ -57,6 +57,10 @@ func (m *UserMembership) ViewModel() string {
return userMembershipTable return userMembershipTable
} }
func (m *UserMembership) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *UserMembership) AggregateTypes() []es_models.AggregateType { func (_ *UserMembership) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate, model.UserAggregate} return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate, model.UserAggregate}
} }

View File

@ -2,9 +2,12 @@ package query
import ( import (
"context" "context"
"github.com/caos/zitadel/internal/eventstore/v1"
"time" "time"
"github.com/getsentry/sentry-go"
"github.com/caos/zitadel/internal/eventstore/v1"
"github.com/caos/logging" "github.com/caos/logging"
"github.com/caos/zitadel/internal/eventstore/v1/models" "github.com/caos/zitadel/internal/eventstore/v1/models"
@ -27,9 +30,19 @@ type Handler interface {
AggregateTypes() []models.AggregateType AggregateTypes() []models.AggregateType
CurrentSequence() (uint64, error) CurrentSequence() (uint64, error)
Eventstore() v1.Eventstore Eventstore() v1.Eventstore
Subscription() *v1.Subscription
} }
func ReduceEvent(handler Handler, event *models.Event) { func ReduceEvent(handler Handler, event *models.Event) {
defer func() {
err := recover()
if err != nil {
sentry.CurrentHub().Recover(err)
handler.Subscription().Unsubscribe()
}
}()
currentSequence, err := handler.CurrentSequence() currentSequence, err := handler.CurrentSequence()
if err != nil { if err != nil {
logging.Log("HANDL-BmpkC").WithError(err).Warn("unable to get current sequence") logging.Log("HANDL-BmpkC").WithError(err).Warn("unable to get current sequence")

View File

@ -2,6 +2,9 @@ package spooler
import ( import (
"context" "context"
"github.com/getsentry/sentry-go"
"github.com/caos/zitadel/internal/eventstore/v1" "github.com/caos/zitadel/internal/eventstore/v1"
"strconv" "strconv"
"sync" "sync"
@ -64,7 +67,14 @@ func requeueTask(task *spooledHandler, queue chan<- *spooledHandler) {
func (s *spooledHandler) load(workerID string) { func (s *spooledHandler) load(workerID string) {
errs := make(chan error) errs := make(chan error)
defer close(errs) defer func() {
close(errs)
err := recover()
if err != nil {
sentry.CurrentHub().Recover(err)
}
}()
ctx, cancel := context.WithCancel(context.Background()) ctx, cancel := context.WithCancel(context.Background())
go s.awaitError(cancel, errs, workerID) go s.awaitError(cancel, errs, workerID)
hasLocked := s.lock(ctx, errs, workerID) hasLocked := s.lock(ctx, errs, workerID)

View File

@ -42,6 +42,10 @@ func (h *testHandler) ViewModel() string {
return h.viewModel return h.viewModel
} }
func (h *testHandler) Subscription() *v1.Subscription {
return nil
}
func (h *testHandler) EventQuery() (*models.SearchQuery, error) { func (h *testHandler) EventQuery() (*models.SearchQuery, error) {
if h.queryError != nil { if h.queryError != nil {
return nil, h.queryError return nil, h.queryError

View File

@ -51,6 +51,10 @@ func (a *Application) ViewModel() string {
return applicationTable return applicationTable
} }
func (a *Application) Subscription() *v1.Subscription {
return a.subscription
}
func (_ *Application) AggregateTypes() []models.AggregateType { func (_ *Application) AggregateTypes() []models.AggregateType {
return []models.AggregateType{es_model.ProjectAggregate} return []models.AggregateType{es_model.ProjectAggregate}
} }

View File

@ -46,6 +46,10 @@ func (k *AuthNKeys) ViewModel() string {
return authnKeysTable return authnKeysTable
} }
func (k *AuthNKeys) Subscription() *v1.Subscription {
return k.subscription
}
func (_ *AuthNKeys) AggregateTypes() []es_models.AggregateType { func (_ *AuthNKeys) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{user_model.UserAggregate, proj_model.ProjectAggregate} return []es_models.AggregateType{user_model.UserAggregate, proj_model.ProjectAggregate}
} }

View File

@ -44,6 +44,10 @@ func (m *CustomText) ViewModel() string {
return customTextTable return customTextTable
} }
func (m *CustomText) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *CustomText) AggregateTypes() []es_models.AggregateType { func (_ *CustomText) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -51,6 +51,10 @@ func (p *Features) ViewModel() string {
return featuresTable return featuresTable
} }
func (p *Features) Subscription() *v1.Subscription {
return p.subscription
}
func (p *Features) AggregateTypes() []es_models.AggregateType { func (p *Features) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate}
} }

View File

@ -45,6 +45,10 @@ func (m *IDPConfig) ViewModel() string {
return idpConfigTable return idpConfigTable
} }
func (m *IDPConfig) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *IDPConfig) AggregateTypes() []es_models.AggregateType { func (_ *IDPConfig) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -57,6 +57,10 @@ func (m *IDPProvider) ViewModel() string {
return idpProviderTable return idpProviderTable
} }
func (p *IDPProvider) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *IDPProvider) AggregateTypes() []es_models.AggregateType { func (_ *IDPProvider) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.IAMAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{model.IAMAggregate, org_es_model.OrgAggregate}
} }

View File

@ -50,6 +50,10 @@ func (m *LabelPolicy) ViewModel() string {
return labelPolicyTable return labelPolicyTable
} }
func (p *LabelPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *LabelPolicy) AggregateTypes() []es_models.AggregateType { func (_ *LabelPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -47,6 +47,10 @@ func (m *LoginPolicy) ViewModel() string {
return loginPolicyTable return loginPolicyTable
} }
func (p *LoginPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *LoginPolicy) AggregateTypes() []es_models.AggregateType { func (_ *LoginPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (m *MailTemplate) ViewModel() string {
return mailTemplateTable return mailTemplateTable
} }
func (m *MailTemplate) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *MailTemplate) AggregateTypes() []es_models.AggregateType { func (_ *MailTemplate) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (m *MessageText) ViewModel() string {
return messageTextTable return messageTextTable
} }
func (m *MessageText) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *MessageText) AggregateTypes() []es_models.AggregateType { func (_ *MessageText) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (o *Org) ViewModel() string {
return orgTable return orgTable
} }
func (o *Org) Subscription() *v1.Subscription {
return o.subscription
}
func (_ *Org) AggregateTypes() []es_models.AggregateType { func (_ *Org) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate} return []es_models.AggregateType{model.OrgAggregate}
} }

View File

@ -42,6 +42,10 @@ func (d *OrgDomain) ViewModel() string {
return orgDomainTable return orgDomainTable
} }
func (d *OrgDomain) Subscription() *v1.Subscription {
return d.subscription
}
func (_ *OrgDomain) AggregateTypes() []es_models.AggregateType { func (_ *OrgDomain) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate} return []es_models.AggregateType{model.OrgAggregate}
} }

View File

@ -43,6 +43,10 @@ func (m *OrgIAMPolicy) ViewModel() string {
return orgIAMPolicyTable return orgIAMPolicyTable
} }
func (m *OrgIAMPolicy) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *OrgIAMPolicy) AggregateTypes() []es_models.AggregateType { func (_ *OrgIAMPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -58,6 +58,10 @@ func (m *OrgMember) ViewModel() string {
return orgMemberTable return orgMemberTable
} }
func (m *OrgMember) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *OrgMember) AggregateTypes() []es_models.AggregateType { func (_ *OrgMember) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, usr_es_model.UserAggregate} return []es_models.AggregateType{model.OrgAggregate, usr_es_model.UserAggregate}
} }

View File

@ -43,6 +43,10 @@ func (m *PasswordAgePolicy) ViewModel() string {
return passwordAgePolicyTable return passwordAgePolicyTable
} }
func (p *PasswordAgePolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *PasswordAgePolicy) AggregateTypes() []es_models.AggregateType { func (_ *PasswordAgePolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -43,6 +43,10 @@ func (p *PasswordComplexityPolicy) ViewModel() string {
return passwordComplexityPolicyTable return passwordComplexityPolicyTable
} }
func (p *PasswordComplexityPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *PasswordComplexityPolicy) AggregateTypes() []es_models.AggregateType { func (_ *PasswordComplexityPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (p *PasswordLockoutPolicy) ViewModel() string {
return passwordLockoutPolicyTable return passwordLockoutPolicyTable
} }
func (p *PasswordLockoutPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *PasswordLockoutPolicy) AggregateTypes() []es_models.AggregateType { func (_ *PasswordLockoutPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (p *PrivacyPolicy) ViewModel() string {
return privacyPolicyTable return privacyPolicyTable
} }
func (p *PrivacyPolicy) Subscription() *v1.Subscription {
return p.subscription
}
func (p *PrivacyPolicy) AggregateTypes() []es_models.AggregateType { func (p *PrivacyPolicy) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate} return []es_models.AggregateType{model.OrgAggregate, iam_es_model.IAMAggregate}
} }

View File

@ -44,6 +44,10 @@ func (p *Project) ViewModel() string {
return projectTable return projectTable
} }
func (p *Project) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *Project) AggregateTypes() []models.AggregateType { func (_ *Project) AggregateTypes() []models.AggregateType {
return []models.AggregateType{es_model.ProjectAggregate} return []models.AggregateType{es_model.ProjectAggregate}
} }

View File

@ -54,6 +54,10 @@ func (p *ProjectGrant) ViewModel() string {
return grantedProjectTable return grantedProjectTable
} }
func (p *ProjectGrant) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *ProjectGrant) AggregateTypes() []models.AggregateType { func (_ *ProjectGrant) AggregateTypes() []models.AggregateType {
return []models.AggregateType{es_model.ProjectAggregate} return []models.AggregateType{es_model.ProjectAggregate}
} }

View File

@ -61,6 +61,10 @@ func (p *ProjectGrantMember) ViewModel() string {
return projectGrantMemberTable return projectGrantMemberTable
} }
func (p *ProjectGrantMember) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *ProjectGrantMember) AggregateTypes() []es_models.AggregateType { func (_ *ProjectGrantMember) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{proj_es_model.ProjectAggregate, usr_es_model.UserAggregate} return []es_models.AggregateType{proj_es_model.ProjectAggregate, usr_es_model.UserAggregate}
} }

View File

@ -61,6 +61,10 @@ func (p *ProjectMember) ViewModel() string {
return projectMemberTable return projectMemberTable
} }
func (p *ProjectMember) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *ProjectMember) AggregateTypes() []es_models.AggregateType { func (_ *ProjectMember) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{proj_es_model.ProjectAggregate, usr_es_model.UserAggregate} return []es_models.AggregateType{proj_es_model.ProjectAggregate, usr_es_model.UserAggregate}
} }

View File

@ -46,6 +46,10 @@ func (p *ProjectRole) ViewModel() string {
return projectRoleTable return projectRoleTable
} }
func (p *ProjectRole) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *ProjectRole) AggregateTypes() []models.AggregateType { func (_ *ProjectRole) AggregateTypes() []models.AggregateType {
return []models.AggregateType{es_model.ProjectAggregate} return []models.AggregateType{es_model.ProjectAggregate}
} }

View File

@ -57,6 +57,10 @@ func (u *User) ViewModel() string {
return userTable return userTable
} }
func (u *User) Subscription() *v1.Subscription {
return u.subscription
}
func (_ *User) AggregateTypes() []es_models.AggregateType { func (_ *User) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate}
} }

View File

@ -61,6 +61,10 @@ func (i *ExternalIDP) ViewModel() string {
return externalIDPTable return externalIDPTable
} }
func (i *ExternalIDP) Subscription() *v1.Subscription {
return i.subscription
}
func (_ *ExternalIDP) AggregateTypes() []es_models.AggregateType { func (_ *ExternalIDP) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{model.UserAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{model.UserAggregate, iam_es_model.IAMAggregate, org_es_model.OrgAggregate}
} }

View File

@ -58,6 +58,10 @@ func (u *UserGrant) ViewModel() string {
return userGrantTable return userGrantTable
} }
func (u *UserGrant) Subscription() *v1.Subscription {
return u.subscription
}
func (_ *UserGrant) AggregateTypes() []es_models.AggregateType { func (_ *UserGrant) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{grant_es_model.UserGrantAggregate, usr_es_model.UserAggregate, proj_es_model.ProjectAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{grant_es_model.UserGrantAggregate, usr_es_model.UserAggregate, proj_es_model.ProjectAggregate, org_es_model.OrgAggregate}
} }

View File

@ -56,6 +56,10 @@ func (m *UserMembership) ViewModel() string {
return userMembershipTable return userMembershipTable
} }
func (m *UserMembership) Subscription() *v1.Subscription {
return m.subscription
}
func (_ *UserMembership) AggregateTypes() []es_models.AggregateType { func (_ *UserMembership) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate, model.UserAggregate} return []es_models.AggregateType{iam_es_model.IAMAggregate, org_es_model.OrgAggregate, proj_es_model.ProjectAggregate, model.UserAggregate}
} }

View File

@ -92,6 +92,10 @@ func (n *Notification) ViewModel() string {
return notificationTable return notificationTable
} }
func (n *Notification) Subscription() *v1.Subscription {
return n.subscription
}
func (_ *Notification) AggregateTypes() []models.AggregateType { func (_ *Notification) AggregateTypes() []models.AggregateType {
return []models.AggregateType{es_model.UserAggregate} return []models.AggregateType{es_model.UserAggregate}
} }

View File

@ -60,6 +60,10 @@ func (p *NotifyUser) ViewModel() string {
return userTable return userTable
} }
func (p *NotifyUser) Subscription() *v1.Subscription {
return p.subscription
}
func (_ *NotifyUser) AggregateTypes() []es_models.AggregateType { func (_ *NotifyUser) AggregateTypes() []es_models.AggregateType {
return []es_models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate} return []es_models.AggregateType{es_model.UserAggregate, org_es_model.OrgAggregate}
} }

View File

@ -4,6 +4,8 @@ import (
"context" "context"
"net/http" "net/http"
sentryhttp "github.com/getsentry/sentry-go/http"
http_util "github.com/caos/zitadel/internal/api/http" http_util "github.com/caos/zitadel/internal/api/http"
"github.com/caos/zitadel/internal/ui/console" "github.com/caos/zitadel/internal/ui/console"
"github.com/caos/zitadel/internal/ui/login" "github.com/caos/zitadel/internal/ui/login"
@ -32,7 +34,8 @@ func Create(config Config) *UI {
} }
func (u *UI) RegisterHandler(prefix string, handler http.Handler) { func (u *UI) RegisterHandler(prefix string, handler http.Handler) {
http_util.RegisterHandler(u.mux, prefix, handler) sentryHandler := sentryhttp.New(sentryhttp.Options{})
http_util.RegisterHandler(u.mux, prefix, sentryHandler.Handle(handler))
} }
func (u *UI) Start(ctx context.Context) { func (u *UI) Start(ctx context.Context) {