diff --git a/internal/authz/repository/eventsourcing/eventstore/token_verifier.go b/internal/authz/repository/eventsourcing/eventstore/token_verifier.go index 848f20a28..7260310fa 100644 --- a/internal/authz/repository/eventsourcing/eventstore/token_verifier.go +++ b/internal/authz/repository/eventsourcing/eventstore/token_verifier.go @@ -29,7 +29,9 @@ type TokenVerifierRepo struct { Query *query.Queries } -func (repo *TokenVerifierRepo) tokenByID(ctx context.Context, tokenID, userID string) (*usr_model.TokenView, error) { +func (repo *TokenVerifierRepo) tokenByID(ctx context.Context, tokenID, userID string) (_ *usr_model.TokenView, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() token, viewErr := repo.View.TokenByID(tokenID, authz.GetInstance(ctx).InstanceID()) if viewErr != nil && !caos_errs.IsNotFound(viewErr) { return nil, viewErr @@ -78,7 +80,9 @@ func (repo *TokenVerifierRepo) VerifyAccessToken(ctx context.Context, tokenStrin if len(splittedToken) != 2 { return "", "", "", "", "", caos_errs.ThrowUnauthenticated(nil, "APP-GDg3a", "invalid token") } + _, tokenSpan := tracing.NewNamedSpan(ctx, "token") token, err := repo.tokenByID(ctx, splittedToken[0], splittedToken[1]) + tokenSpan.EndWithError(err) if err != nil { return "", "", "", "", "", caos_errs.ThrowUnauthenticated(err, "APP-BxUSiL", "invalid token") } @@ -120,7 +124,9 @@ func (repo *TokenVerifierRepo) VerifierClientID(ctx context.Context, appName str return clientID, app.ProjectID, nil } -func (r *TokenVerifierRepo) getUserEvents(ctx context.Context, userID, instanceID string, sequence uint64) ([]*models.Event, error) { +func (r *TokenVerifierRepo) getUserEvents(ctx context.Context, userID, instanceID string, sequence uint64) (_ []*models.Event, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() query, err := usr_view.UserByIDQuery(userID, instanceID, sequence) if err != nil { return nil, err diff --git a/internal/authz/repository/eventsourcing/eventstore/user_membership.go b/internal/authz/repository/eventsourcing/eventstore/user_membership.go index abe0be3c6..e34e37018 100644 --- a/internal/authz/repository/eventsourcing/eventstore/user_membership.go +++ b/internal/authz/repository/eventsourcing/eventstore/user_membership.go @@ -6,6 +6,7 @@ import ( "github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/authz/repository/eventsourcing/view" "github.com/zitadel/zitadel/internal/domain" + "github.com/zitadel/zitadel/internal/telemetry/tracing" user_model "github.com/zitadel/zitadel/internal/user/model" user_view_model "github.com/zitadel/zitadel/internal/user/repository/view/model" ) @@ -18,7 +19,9 @@ func (repo *UserMembershipRepo) Health() error { return repo.View.Health() } -func (repo *UserMembershipRepo) SearchMyMemberships(ctx context.Context) ([]*authz.Membership, error) { +func (repo *UserMembershipRepo) SearchMyMemberships(ctx context.Context) (_ []*authz.Membership, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() memberships, err := repo.searchUserMemberships(ctx) if err != nil { return nil, err @@ -26,9 +29,12 @@ func (repo *UserMembershipRepo) SearchMyMemberships(ctx context.Context) ([]*aut return userMembershipsToMemberships(memberships), nil } -func (repo *UserMembershipRepo) searchUserMemberships(ctx context.Context) ([]*user_view_model.UserMembershipView, error) { +func (repo *UserMembershipRepo) searchUserMemberships(ctx context.Context) (_ []*user_view_model.UserMembershipView, err error) { + ctx, span := tracing.NewSpan(ctx) + defer func() { span.EndWithError(err) }() ctxData := authz.GetCtxData(ctx) instance := authz.GetInstance(ctx) + ctx, orgSpan := tracing.NewSpan(ctx) orgMemberships, orgCount, err := repo.View.SearchUserMemberships(&user_model.UserMembershipSearchRequest{ Queries: []*user_model.UserMembershipSearchQuery{ { @@ -48,9 +54,11 @@ func (repo *UserMembershipRepo) searchUserMemberships(ctx context.Context) ([]*u }, }, }) + orgSpan.EndWithError(err) if err != nil { return nil, err } + ctx, iamSpan := tracing.NewSpan(ctx) iamMemberships, iamCount, err := repo.View.SearchUserMemberships(&user_model.UserMembershipSearchRequest{ Queries: []*user_model.UserMembershipSearchQuery{ { @@ -70,6 +78,7 @@ func (repo *UserMembershipRepo) searchUserMemberships(ctx context.Context) ([]*u }, }, }) + iamSpan.EndWithError(err) if err != nil { return nil, err } diff --git a/internal/telemetry/tracing/google/google_tracer.go b/internal/telemetry/tracing/google/google_tracer.go index fde1525fa..4787a9fd0 100644 --- a/internal/telemetry/tracing/google/google_tracer.go +++ b/internal/telemetry/tracing/google/google_tracer.go @@ -1,12 +1,9 @@ package google import ( - "strconv" - texporter "github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace" sdk_trace "go.opentelemetry.io/otel/sdk/trace" - "github.com/zitadel/zitadel/internal/errors" "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/telemetry/tracing/otel" ) @@ -19,14 +16,10 @@ type Config struct { func NewTracer(rawConfig map[string]interface{}) (err error) { c := new(Config) c.ProjectID, _ = rawConfig["projectid"].(string) - fraction, ok := rawConfig["fraction"].(string) - if ok { - c.Fraction, err = strconv.ParseFloat(fraction, 32) - if err != nil { - return errors.ThrowInternal(err, "GOOGLE-Dsag3", "could not map fraction") - } + c.Fraction, err = otel.FractionFromConfig(rawConfig["fraction"]) + if err != nil { + return err } - return c.NewTracer() } diff --git a/internal/telemetry/tracing/log/config.go b/internal/telemetry/tracing/log/config.go index 13b3b1e77..e6a8c13f0 100644 --- a/internal/telemetry/tracing/log/config.go +++ b/internal/telemetry/tracing/log/config.go @@ -1,12 +1,9 @@ package log import ( - "strconv" - stdout "go.opentelemetry.io/otel/exporters/stdout/stdouttrace" sdk_trace "go.opentelemetry.io/otel/sdk/trace" - "github.com/zitadel/zitadel/internal/errors" "github.com/zitadel/zitadel/internal/telemetry/tracing" "github.com/zitadel/zitadel/internal/telemetry/tracing/otel" ) @@ -17,14 +14,10 @@ type Config struct { func NewTracer(rawConfig map[string]interface{}) (err error) { c := new(Config) - fraction, ok := rawConfig["fraction"].(string) - if ok { - c.Fraction, err = strconv.ParseFloat(fraction, 32) - if err != nil { - return errors.ThrowInternal(err, "LOG-Dsag3", "could not map fraction") - } + c.Fraction, err = otel.FractionFromConfig(rawConfig["fraction"]) + if err != nil { + return err } - return c.NewTracer() } diff --git a/internal/telemetry/tracing/otel/config.go b/internal/telemetry/tracing/otel/config.go index b03c8df02..81995a941 100644 --- a/internal/telemetry/tracing/otel/config.go +++ b/internal/telemetry/tracing/otel/config.go @@ -19,17 +19,33 @@ type Config struct { func NewTracerFromConfig(rawConfig map[string]interface{}) (err error) { c := new(Config) c.Endpoint, _ = rawConfig["endpoint"].(string) - fraction, ok := rawConfig["fraction"].(string) - if ok { - c.Fraction, err = strconv.ParseFloat(fraction, 32) - if err != nil { - return errors.ThrowInternal(err, "OTEL-Dd2s", "could not map fraction") - } + c.Fraction, err = FractionFromConfig(rawConfig["fraction"]) + if err != nil { + return err } - return c.NewTracer() } +func FractionFromConfig(i interface{}) (float64, error) { + if i == nil { + return 0, nil + } + switch fraction := i.(type) { + case float64: + return fraction, nil + case int: + return float64(fraction), nil + case string: + f, err := strconv.ParseFloat(fraction, 64) + if err != nil { + return 0, errors.ThrowInternal(err, "OTEL-SAfe1", "could not map fraction") + } + return f, nil + default: + return 0, errors.ThrowInternal(nil, "OTEL-Dd2s", "could not map fraction, unknown type") + } +} + func (c *Config) NewTracer() error { sampler := sdk_trace.ParentBased(sdk_trace.TraceIDRatioBased(c.Fraction)) exporter, err := otlpgrpc.New(context.Background(), otlpgrpc.WithEndpoint(c.Endpoint), otlpgrpc.WithInsecure())