mirror of
https://github.com/zitadel/zitadel.git
synced 2025-12-06 11:02:20 +00:00
# Which Problems Are Solved
Comparing the v3 and v4 deployments we noticed an increase in memory
usage. A first analysis revealed that it might be related to the
(multiple) initialization of the `i18n.Translator`, partially related
# How the Problems Are Solved
Initialize the tranlator once (apart from the translator interceptor,
which uses context / request specific information) and pass it to all
necessary middleware.
# Additional Changes
Removed unnecessary error return parameter from the translator
initialization.
# Additional Context
- noticed internally
- backport to v4.x
(cherry picked from commit a0c3ccecf7)
38 lines
1015 B
Go
38 lines
1015 B
Go
package connect_middleware
|
|
|
|
import (
|
|
"context"
|
|
|
|
"connectrpc.com/connect"
|
|
|
|
"github.com/zitadel/zitadel/internal/api/authz"
|
|
"github.com/zitadel/zitadel/internal/i18n"
|
|
_ "github.com/zitadel/zitadel/internal/statik"
|
|
"github.com/zitadel/zitadel/internal/telemetry/tracing"
|
|
)
|
|
|
|
func TranslationHandler() connect.UnaryInterceptorFunc {
|
|
|
|
return func(handler connect.UnaryFunc) connect.UnaryFunc {
|
|
return func(ctx context.Context, req connect.AnyRequest) (connect.AnyResponse, error) {
|
|
resp, err := handler(ctx, req)
|
|
ctx, span := tracing.NewSpan(ctx)
|
|
defer func() { span.EndWithError(err) }()
|
|
|
|
if err != nil {
|
|
translator := getTranslator(ctx)
|
|
return resp, translateError(ctx, err, translator)
|
|
}
|
|
if loc, ok := resp.Any().(localizers); ok {
|
|
translator := getTranslator(ctx)
|
|
translateFields(ctx, loc, translator)
|
|
}
|
|
return resp, nil
|
|
}
|
|
}
|
|
}
|
|
|
|
func getTranslator(ctx context.Context) *i18n.Translator {
|
|
return i18n.NewZitadelTranslator(authz.GetInstance(ctx).DefaultLanguage())
|
|
}
|