mirror of
https://github.com/zitadel/zitadel.git
synced 2025-08-11 21:17:32 +00:00
feat: add quotas (#4779)
adds possibilities to cap authenticated requests and execution seconds of actions on a defined intervall
This commit is contained in:
@@ -1,30 +1,83 @@
|
||||
package actions
|
||||
|
||||
import (
|
||||
"github.com/zitadel/logging"
|
||||
"context"
|
||||
"time"
|
||||
|
||||
"github.com/dop251/goja"
|
||||
"github.com/dop251/goja_nodejs/console"
|
||||
"github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/zitadel/zitadel/internal/api/authz"
|
||||
"github.com/zitadel/zitadel/internal/logstore"
|
||||
"github.com/zitadel/zitadel/internal/logstore/emitters/execution"
|
||||
)
|
||||
|
||||
var ServerLog *logrus
|
||||
var (
|
||||
logstoreService *logstore.Service
|
||||
_ console.Printer = (*logger)(nil)
|
||||
)
|
||||
|
||||
type logrus struct{}
|
||||
|
||||
func (*logrus) Log(s string) {
|
||||
logging.WithFields("message", s).Info("log from action")
|
||||
}
|
||||
func (*logrus) Warn(s string) {
|
||||
logging.WithFields("message", s).Info("warn from action")
|
||||
}
|
||||
func (*logrus) Error(s string) {
|
||||
logging.WithFields("message", s).Info("error from action")
|
||||
func SetLogstoreService(svc *logstore.Service) {
|
||||
logstoreService = svc
|
||||
}
|
||||
|
||||
func WithLogger(logger console.Printer) Option {
|
||||
type logger struct {
|
||||
ctx context.Context
|
||||
started time.Time
|
||||
instanceID string
|
||||
}
|
||||
|
||||
// newLogger returns a *logger instance that should only be used for a single action run.
|
||||
// The first log call sets the started field for subsequent log calls
|
||||
func newLogger(ctx context.Context, instanceID string) *logger {
|
||||
return &logger{
|
||||
ctx: ctx,
|
||||
started: time.Time{},
|
||||
instanceID: instanceID,
|
||||
}
|
||||
}
|
||||
|
||||
func (l *logger) Log(msg string) {
|
||||
l.log(msg, logrus.InfoLevel, false)
|
||||
}
|
||||
|
||||
func (l *logger) Warn(msg string) {
|
||||
l.log(msg, logrus.WarnLevel, false)
|
||||
}
|
||||
|
||||
func (l *logger) Error(msg string) {
|
||||
l.log(msg, logrus.ErrorLevel, false)
|
||||
}
|
||||
|
||||
func (l *logger) log(msg string, level logrus.Level, last bool) {
|
||||
ts := time.Now()
|
||||
if l.started.IsZero() {
|
||||
l.started = ts
|
||||
}
|
||||
|
||||
record := &execution.Record{
|
||||
LogDate: ts,
|
||||
InstanceID: l.instanceID,
|
||||
Message: msg,
|
||||
LogLevel: level,
|
||||
}
|
||||
|
||||
if last {
|
||||
record.Took = ts.Sub(l.started)
|
||||
}
|
||||
|
||||
logstoreService.Handle(l.ctx, record)
|
||||
}
|
||||
|
||||
func withLogger(ctx context.Context) Option {
|
||||
instance := authz.GetInstance(ctx)
|
||||
instanceID := instance.InstanceID()
|
||||
return func(c *runConfig) {
|
||||
c.logger = newLogger(ctx, instanceID)
|
||||
c.instanceID = instanceID
|
||||
c.modules["zitadel/log"] = func(runtime *goja.Runtime, module *goja.Object) {
|
||||
console.RequireWithPrinter(logger)(runtime, module)
|
||||
console.RequireWithPrinter(c.logger)(runtime, module)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user