diff --git a/pkg/eventbus/handlers.go b/pkg/eventbus/handlers.go index e6eaac1f8..6c7365b6b 100644 --- a/pkg/eventbus/handlers.go +++ b/pkg/eventbus/handlers.go @@ -2,6 +2,10 @@ package eventbus import ( "context" + elpb "github.com/slntopp/nocloud-proto/events_logging" + "github.com/slntopp/nocloud/pkg/nocloud" + "go.uber.org/zap" + "time" "github.com/arangodb/go-driver" pb "github.com/slntopp/nocloud-proto/events" @@ -9,7 +13,7 @@ import ( "google.golang.org/protobuf/types/known/structpb" ) -type EventHandler func(context.Context, *pb.Event, driver.Database) (*pb.Event, error) +type EventHandler func(context.Context, *zap.Logger, *pb.Event, driver.Database) (*pb.Event, error) var handlers = map[string]EventHandler{ "instance_suspended": GetInstAccountHandler, @@ -22,6 +26,7 @@ var handlers = map[string]EventHandler{ "instance_renew": GetInstAccountHandler, "pending_notification": GetInstAccountHandler, "instance_credentials": GetInstAccountHandler, + "logging": EventLoggingHandler, } var getInstanceAccount = ` @@ -88,7 +93,7 @@ type EventInfo struct { Price float64 `json:"price,omitempty"` } -func GetInstAccountHandler(ctx context.Context, event *pb.Event, db driver.Database) (*pb.Event, error) { +func GetInstAccountHandler(ctx context.Context, _ *zap.Logger, event *pb.Event, db driver.Database) (*pb.Event, error) { if event.GetData() == nil { event.Data = make(map[string]*structpb.Value) } @@ -144,3 +149,33 @@ func GetInstAccountHandler(ctx context.Context, event *pb.Event, db driver.Datab return event, nil } + +func EventLoggingHandler(_ context.Context, log *zap.Logger, event *pb.Event, _ driver.Database) (*pb.Event, error) { + data := event.GetData() + scope := data["scope"].GetStringValue() + action := data["action"].GetStringValue() + diff := data["diff"].GetStringValue() + if scope == "" || action == "" { + log.Warn("Invalid event for logging. Scope or action missing. skip logging", zap.Any("event", event)) + return event, nil + } + + logEvent := &elpb.Event{ + Scope: scope, + Action: action, + Rc: 0, + Requestor: schema.ROOT_ACCOUNT_KEY, + Ts: time.Now().Unix(), + Snapshot: &elpb.Snapshot{ + Diff: diff, + }, + Priority: event.Priority, + Entity: event.Type, + Uuid: event.Uuid, + } + + nocloud.Log(log, logEvent) + log.Debug("Logged event", zap.Any("event", logEvent)) + + return event, nil +} diff --git a/pkg/eventbus/server.go b/pkg/eventbus/server.go index 4f16bd596..9e2f6abf6 100644 --- a/pkg/eventbus/server.go +++ b/pkg/eventbus/server.go @@ -156,7 +156,7 @@ init: continue } - updEvent, err := handler(ctx, &event, s.db) + updEvent, err := handler(ctx, log, &event, s.db) if err != nil { log.Error("Fail to call handler", zap.Any("handler type", event.Key), zap.String("err", err.Error())) if err = msg.Ack(false); err != nil {