From be6f9a86cdcc72d3a78ff4b8b6ff01d5f1c51698 Mon Sep 17 00:00:00 2001 From: jonaustin09 Date: Fri, 10 May 2024 16:47:52 -0400 Subject: [PATCH] feat: Integrated metric manager into the gateway --- cmd/versitygw/main.go | 22 +- metrics/metrics.go | 51 ++- metrics/statsd.go | 6 +- s3api/admin-server.go | 4 +- s3api/controllers/base.go | 492 +++++++++++++++++++--------- s3api/controllers/base_test.go | 2 +- s3api/middlewares/authentication.go | 33 +- s3api/middlewares/chunk.go | 7 +- s3api/middlewares/presign-auth.go | 11 +- s3api/middlewares/url-decoder.go | 5 +- s3api/router.go | 5 +- s3api/router_test.go | 2 +- s3api/server.go | 23 +- s3api/server_test.go | 2 +- 14 files changed, 451 insertions(+), 214 deletions(-) diff --git a/cmd/versitygw/main.go b/cmd/versitygw/main.go index 49634b2..2d9adeb 100644 --- a/cmd/versitygw/main.go +++ b/cmd/versitygw/main.go @@ -27,6 +27,7 @@ import ( "github.com/urfave/cli/v2" "github.com/versity/versitygw/auth" "github.com/versity/versitygw/backend" + "github.com/versity/versitygw/metrics" "github.com/versity/versitygw/s3api" "github.com/versity/versitygw/s3api/middlewares" "github.com/versity/versitygw/s3event" @@ -62,6 +63,7 @@ var ( iamCacheDisable bool iamCacheTTL int iamCachePrune int + statsdServers string ) var ( @@ -398,6 +400,13 @@ func initFlags() []cli.Flag { EnvVars: []string{"VGW_READ_ONLY"}, Destination: &readonly, }, + &cli.StringFlag{ + Name: "metrics-statsd-servers", + Usage: "StatsD server urls comma separated. e.g. 'statsd.example1.com:8125, statsd.example2.com:8125'", + EnvVars: []string{"VGW_METRICS_STATSD_SERVERS"}, + Aliases: []string{"mss"}, + Destination: &statsdServers, + }, } } @@ -508,6 +517,13 @@ func runGateway(ctx context.Context, be backend.Backend) error { return fmt.Errorf("setup logger: %w", err) } + metricsManager, err := metrics.NewManager(ctx, metrics.Config{ + StatsdServers: statsdServers, + }) + if err != nil { + return fmt.Errorf("init metrics manager: %w", err) + } + evSender, err := s3event.InitEventSender(&s3event.EventConfig{ KafkaURL: kafkaURL, KafkaTopic: kafkaTopic, @@ -524,7 +540,7 @@ func runGateway(ctx context.Context, be backend.Backend) error { srv, err := s3api.New(app, be, middlewares.RootUserConfig{ Access: rootUserAccess, Secret: rootUserSecret, - }, port, region, iam, logger, evSender, opts...) + }, port, region, iam, logger, evSender, metricsManager, opts...) if err != nil { return fmt.Errorf("init gateway: %v", err) } @@ -587,5 +603,9 @@ Loop: } } + if metricsManager != nil { + metricsManager.Close() + } + return saveErr } diff --git a/metrics/metrics.go b/metrics/metrics.go index c63c307..891f63b 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "os" + "strings" "sync" ) @@ -46,11 +47,14 @@ type Manager struct { } type Config struct { - StatsdServers []string + StatsdServers string } // NewManager initializes metrics plugins and returns a new metrics manager func NewManager(ctx context.Context, conf Config) (*Manager, error) { + if len(conf.StatsdServers) == 0 { + return nil, nil + } hostname, err := os.Hostname() if err != nil { return nil, fmt.Errorf("failed to get hostname: %w", err) @@ -65,7 +69,9 @@ func NewManager(ctx context.Context, conf Config) (*Manager, error) { ctx: ctx, } - for _, server := range conf.StatsdServers { + statsdServers := strings.Split(conf.StatsdServers, ",") + + for _, server := range statsdServers { statsd, err := NewStatsd(server, hostname) if err != nil { return nil, err @@ -81,13 +87,42 @@ func NewManager(ctx context.Context, conf Config) (*Manager, error) { return mgr, nil } +func (m *Manager) Send(err error, action string, objSize int64, objCount int64) { + // In case of Authentication failures, url parsing ... + if action == "" { + action = "s3:UnDetected" + } + if err != nil { + m.Increment(action, "failed_count") + } + m.Increment(action, "success_count") + + switch action { + case "s3:PutObject": + m.Add(action, "bytes_written", objSize) + m.Increment(action, "object_created_count") + case "s3:CompleteMultipartUpload": + m.Increment(action, "object_created_count") + case "s3:UploadPart": + m.Add(action, "bytes_written", objSize) + case "s3:GetObject": + m.Add(action, "bytes_read", objSize) + case "s3:DeleteObject": + m.Increment(action, "object_removed_count") + case "s3:DeleteObjects": + m.Add(action, "object_removed_count", objCount) + } + //TODO: Handle UploadPartCopy case + //TODO: Handle CopyObject case +} + // Increment increments the key by one func (m *Manager) Increment(module, key string, tags ...Tag) { m.Add(module, key, 1, tags...) } // Add adds value to key -func (m *Manager) Add(module, key string, value int, tags ...Tag) { +func (m *Manager) Add(module, key string, value int64, tags ...Tag) { if m.ctx.Err() != nil { return } @@ -107,7 +142,7 @@ func (m *Manager) Add(module, key string, value int, tags ...Tag) { } // Gauge sets key to value -func (m *Manager) Gauge(module, key string, value int, tags ...Tag) { +func (m *Manager) Gauge(module, key string, value int64, tags ...Tag) { if m.ctx.Err() != nil { return } @@ -126,7 +161,7 @@ func (m *Manager) Gauge(module, key string, value int, tags ...Tag) { } } -// Close closes metrics channels, waits for data to cmplete, closes all plugins +// Close closes metrics channels, waits for data to complete, closes all plugins func (m *Manager) Close() { // drain the datapoint channels close(m.addDataChan) @@ -141,8 +176,8 @@ func (m *Manager) Close() { // publisher is the interface for interacting with the metrics plugins type publisher interface { - Add(module, key string, value int, tags ...Tag) - Gauge(module, key string, value int, tags ...Tag) + Add(module, key string, value int64, tags ...Tag) + Gauge(module, key string, value int64, tags ...Tag) Close() } @@ -167,6 +202,6 @@ func (m *Manager) gaugeForwarder(gaugeChan <-chan datapoint) { type datapoint struct { module string key string - value int + value int64 tags []Tag } diff --git a/metrics/statsd.go b/metrics/statsd.go index 6e12a3e..ee701c2 100644 --- a/metrics/statsd.go +++ b/metrics/statsd.go @@ -45,16 +45,16 @@ func (s *Statsd) Close() { } // Add adds value to key -func (s *Statsd) Add(module, key string, value int, tags ...Tag) { +func (s *Statsd) Add(module, key string, value int64, tags ...Tag) { stags := make([]statsd.Tag, len(tags)) for i, t := range tags { stags[i] = statsd.StringTag(t.Key, t.Value) } - s.c.Incr(fmt.Sprintf("%v.%v", module, key), int64(value), stags...) + s.c.Incr(fmt.Sprintf("%v.%v", module, key), value, stags...) } // Gauge sets key to value -func (s *Statsd) Gauge(module, key string, value int, tags ...Tag) { +func (s *Statsd) Gauge(module, key string, value int64, tags ...Tag) { stags := make([]statsd.Tag, len(tags)) for i, t := range tags { stags[i] = statsd.StringTag(t.Key, t.Value) diff --git a/s3api/admin-server.go b/s3api/admin-server.go index 7015697..1b45bd2 100644 --- a/s3api/admin-server.go +++ b/s3api/admin-server.go @@ -46,10 +46,10 @@ func NewAdminServer(app *fiber.App, be backend.Backend, root middlewares.RootUse // Logging middlewares app.Use(logger.New()) - app.Use(middlewares.DecodeURL(nil)) + app.Use(middlewares.DecodeURL(nil, nil)) // Authentication middlewares - app.Use(middlewares.VerifyV4Signature(root, iam, nil, region, false)) + app.Use(middlewares.VerifyV4Signature(root, iam, nil, nil, region, false)) app.Use(middlewares.VerifyMD5Body(nil)) server.router.Init(app, be, iam) diff --git a/s3api/controllers/base.go b/s3api/controllers/base.go index de4b597..d549b60 100644 --- a/s3api/controllers/base.go +++ b/s3api/controllers/base.go @@ -31,6 +31,7 @@ import ( "github.com/gofiber/fiber/v2" "github.com/versity/versitygw/auth" "github.com/versity/versitygw/backend" + "github.com/versity/versitygw/metrics" "github.com/versity/versitygw/s3api/utils" "github.com/versity/versitygw/s3err" "github.com/versity/versitygw/s3event" @@ -43,6 +44,7 @@ type S3ApiController struct { iam auth.IAMService logger s3log.AuditLogger evSender s3event.S3EventSender + mm *metrics.Manager debug bool readonly bool } @@ -51,7 +53,7 @@ const ( iso8601Format = "20060102T150405Z" ) -func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs s3event.S3EventSender, debug bool, readonly bool) S3ApiController { +func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs s3event.S3EventSender, mm *metrics.Manager, debug bool, readonly bool) S3ApiController { return S3ApiController{ be: be, iam: iam, @@ -59,6 +61,7 @@ func New(be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs evSender: evs, debug: debug, readonly: readonly, + mm: mm, } } @@ -67,8 +70,9 @@ func (c S3ApiController) ListBuckets(ctx *fiber.Ctx) error { res, err := c.be.ListBuckets(ctx.Context(), acct.Access, acct.Role == "admin") return SendXMLResponse(ctx, res, err, &MetaOpts{ - Logger: c.logger, - Action: "ListBucket", + Logger: c.logger, + MetricsMng: c.mm, + Action: "s3:ListAllMyBuckets", }) } @@ -103,7 +107,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectTagging", + MetricsMng: c.mm, + Action: "s3:GetObjectTagging", BucketOwner: parsedAcl.Owner, }) } @@ -113,7 +118,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectTagging", + MetricsMng: c.mm, + Action: "s3:GetObjectTagging", BucketOwner: parsedAcl.Owner, }) } @@ -129,7 +135,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res, nil, &MetaOpts{ Logger: c.logger, - Action: "GetObjectTagging", + MetricsMng: c.mm, + Action: "s3:GetObjectTagging", BucketOwner: parsedAcl.Owner, }) } @@ -149,7 +156,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectRetention", + MetricsMng: c.mm, + Action: "s3:GetObjectRetention", BucketOwner: parsedAcl.Owner, }) } @@ -159,7 +167,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, data, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectRetention", + MetricsMng: c.mm, + Action: "s3:GetObjectRetention", BucketOwner: parsedAcl.Owner, }) } @@ -168,7 +177,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, retention, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectRetention", + MetricsMng: c.mm, + Action: "s3:GetObjectRetention", BucketOwner: parsedAcl.Owner, }) } @@ -188,7 +198,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectLegalHold", + MetricsMng: c.mm, + Action: "s3:GetObjectLegalHold", BucketOwner: parsedAcl.Owner, }) } @@ -197,7 +208,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, auth.ParseObjectLegalHoldOutput(data), err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectLegalHold", + MetricsMng: c.mm, + Action: "s3:GetObjectLegalHold", BucketOwner: parsedAcl.Owner, }) } @@ -208,7 +220,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidMaxParts), &MetaOpts{ Logger: c.logger, - Action: "ListParts", + MetricsMng: c.mm, + Action: "s3:ListParts", BucketOwner: parsedAcl.Owner, }) } @@ -223,7 +236,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidPartNumberMarker), &MetaOpts{ Logger: c.logger, - Action: "ListParts", + MetricsMng: c.mm, + Action: "s3:ListParts", BucketOwner: parsedAcl.Owner, }) } @@ -243,7 +257,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "ListParts", + MetricsMng: c.mm, + Action: "s3:ListParts", BucketOwner: parsedAcl.Owner, }) } @@ -262,7 +277,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res, err, &MetaOpts{ Logger: c.logger, - Action: "ListParts", + MetricsMng: c.mm, + Action: "s3:ListParts", BucketOwner: parsedAcl.Owner, }) } @@ -282,7 +298,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectAcl", + MetricsMng: c.mm, + Action: "s3:GetObjectAcl", BucketOwner: parsedAcl.Owner, }) } @@ -293,7 +310,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectAcl", + MetricsMng: c.mm, + Action: "s3:GetObjectAcl", BucketOwner: parsedAcl.Owner, }) } @@ -313,7 +331,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectAttributes", + MetricsMng: c.mm, + Action: "s3:GetObjectAttributes", BucketOwner: parsedAcl.Owner, }) } @@ -324,7 +343,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectAttributes", + MetricsMng: c.mm, + Action: "s3:GetObjectAttributes", BucketOwner: parsedAcl.Owner, }) } @@ -342,14 +362,16 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectAttributes", + MetricsMng: c.mm, + Action: "s3:GetObjectAttributes", BucketOwner: parsedAcl.Owner, }) } return SendXMLResponse(ctx, utils.FilterObjectAttributes(attrs, res), err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectAttributes", + MetricsMng: c.mm, + Action: "s3:GetObjectAttributes", BucketOwner: parsedAcl.Owner, }) } @@ -368,7 +390,8 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "GetObject", + MetricsMng: c.mm, + Action: "s3:GetObject", BucketOwner: parsedAcl.Owner, }) } @@ -384,7 +407,17 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "GetObject", + MetricsMng: c.mm, + Action: "s3:GetObject", + BucketOwner: parsedAcl.Owner, + }) + } + if res == nil { + return SendResponse(ctx, fmt.Errorf("get object nil response"), + &MetaOpts{ + Logger: c.logger, + MetricsMng: c.mm, + Action: "s3:GetObject", BucketOwner: parsedAcl.Owner, }) } @@ -446,10 +479,12 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { return SendResponse(ctx, nil, &MetaOpts{ - Logger: c.logger, - Action: "GetObject", - BucketOwner: parsedAcl.Owner, - Status: status, + Logger: c.logger, + MetricsMng: c.mm, + Action: "s3:GetObject", + ContentLength: getint64(res.ContentLength), + BucketOwner: parsedAcl.Owner, + Status: status, }) } @@ -497,7 +532,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetBucketTagging", + MetricsMng: c.mm, + Action: "s3:GetBucketTagging", BucketOwner: parsedAcl.Owner, }) } @@ -507,7 +543,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetBucketTagging", + MetricsMng: c.mm, + Action: "s3:GetBucketTagging", BucketOwner: parsedAcl.Owner, }) } @@ -523,7 +560,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, resp, nil, &MetaOpts{ Logger: c.logger, - Action: "GetBucketTagging", + MetricsMng: c.mm, + Action: "s3:GetBucketTagging", BucketOwner: parsedAcl.Owner, }) } @@ -542,7 +580,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetBucketVersioning", + MetricsMng: c.mm, + Action: "s3:GetBucketVersioning", BucketOwner: parsedAcl.Owner, }) } @@ -551,7 +590,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetBucketVersioning", + MetricsMng: c.mm, + Action: "s3:GetBucketVersioning", BucketOwner: parsedAcl.Owner, }) } @@ -560,7 +600,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, data, err, &MetaOpts{ Logger: c.logger, - Action: "GetBucketVersioning", + MetricsMng: c.mm, + Action: "s3:GetBucketVersioning", BucketOwner: parsedAcl.Owner, }) } @@ -579,7 +620,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetBucketPolicy", + MetricsMng: c.mm, + Action: "s3:GetBucketPolicy", BucketOwner: parsedAcl.Owner, }) } @@ -588,7 +630,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, data, err, &MetaOpts{ Logger: c.logger, - Action: "GetBucketPolicy", + MetricsMng: c.mm, + Action: "s3:GetBucketPolicy", BucketOwner: parsedAcl.Owner, }) } @@ -607,7 +650,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "ListObjectVersions", + MetricsMng: c.mm, + Action: "s3:ListObjectVersions", BucketOwner: parsedAcl.Owner, }) } @@ -621,7 +665,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "ListObjectVersions", + MetricsMng: c.mm, + Action: "s3:ListObjectVersions", BucketOwner: parsedAcl.Owner, }) } @@ -638,7 +683,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, data, err, &MetaOpts{ Logger: c.logger, - Action: "ListObjectVersions", + MetricsMng: c.mm, + Action: "s3:ListObjectVersions", BucketOwner: parsedAcl.Owner, }) } @@ -657,7 +703,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectLockConfiguration", + MetricsMng: c.mm, + Action: "s3:GetObjectLockConfiguration", BucketOwner: parsedAcl.Owner, }) } @@ -667,7 +714,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectLockConfiguration", + MetricsMng: c.mm, + Action: "s3:GetObjectLockConfiguration", BucketOwner: parsedAcl.Owner, }) } @@ -676,7 +724,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, resp, err, &MetaOpts{ Logger: c.logger, - Action: "GetObjectLockConfiguration", + MetricsMng: c.mm, + Action: "s3:GetObjectLockConfiguration", BucketOwner: parsedAcl.Owner, }) } @@ -695,7 +744,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "GetBucketAcl", + MetricsMng: c.mm, + Action: "s3:GetBucketAcl", BucketOwner: parsedAcl.Owner, }) } @@ -705,7 +755,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { if err != nil { return SendResponse(ctx, err, &MetaOpts{ - Logger: c.logger, + Logger: c.logger, + MetricsMng: c.mm, }) } @@ -713,7 +764,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res, err, &MetaOpts{ Logger: c.logger, - Action: "GetBucketAcl", + MetricsMng: c.mm, + Action: "s3:GetBucketAcl", BucketOwner: parsedAcl.Owner, }) } @@ -732,7 +784,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "ListMultipartUploads", + MetricsMng: c.mm, + Action: "s3:ListMultipartUploads", BucketOwner: parsedAcl.Owner, }) } @@ -744,7 +797,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { } return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "ListMultipartUploads", + MetricsMng: c.mm, + Action: "s3:ListMultipartUploads", BucketOwner: parsedAcl.Owner, }) } @@ -760,7 +814,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res, err, &MetaOpts{ Logger: c.logger, - Action: "ListMultipartUploads", + MetricsMng: c.mm, + Action: "s3:ListMultipartUploads", BucketOwner: parsedAcl.Owner, }) } @@ -779,7 +834,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "ListObjectsV2", + MetricsMng: c.mm, + Action: "s3:ListObjectsV2", BucketOwner: parsedAcl.Owner, }) } @@ -792,7 +848,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "ListObjectsV2", + MetricsMng: c.mm, + Action: "s3:ListObjectsV2", BucketOwner: parsedAcl.Owner, }) } @@ -808,7 +865,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res, err, &MetaOpts{ Logger: c.logger, - Action: "ListObjectsV2", + MetricsMng: c.mm, + Action: "s3:ListObjectsV2", BucketOwner: parsedAcl.Owner, }) } @@ -826,7 +884,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "ListObjects", + MetricsMng: c.mm, + Action: "s3:ListObjects", BucketOwner: parsedAcl.Owner, }) } @@ -840,7 +899,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "ListObjects", + MetricsMng: c.mm, + Action: "s3:ListObjects", BucketOwner: parsedAcl.Owner, }) } @@ -859,7 +919,8 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { }{ListObjectsOutput: res}, err, &MetaOpts{ Logger: c.logger, - Action: "ListObjects", + MetricsMng: c.mm, + Action: "s3:ListObjects", BucketOwner: parsedAcl.Owner, }) } @@ -889,7 +950,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutBucketTagging", + MetricsMng: c.mm, + Action: "s3:PutBucketTagging", BucketOwner: parsedAcl.Owner, }) } @@ -901,7 +963,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidTag), &MetaOpts{ Logger: c.logger, - Action: "PutBucketTagging", + MetricsMng: c.mm, + Action: "s3:PutBucketTagging", BucketOwner: parsedAcl.Owner, }) } @@ -921,7 +984,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutBucketTagging", + MetricsMng: c.mm, + Action: "s3:PutBucketTagging", BucketOwner: parsedAcl.Owner, }) } @@ -930,7 +994,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutBucketTagging", + MetricsMng: c.mm, + Action: "s3:PutBucketTagging", BucketOwner: parsedAcl.Owner, }) } @@ -950,7 +1015,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutBucketVersioning", + MetricsMng: c.mm, + Action: "s3:PutBucketVersioning", BucketOwner: parsedAcl.Owner, }) } @@ -965,7 +1031,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutBucketVersioning", + MetricsMng: c.mm, + Action: "s3:PutBucketVersioning", BucketOwner: parsedAcl.Owner, }) } @@ -980,7 +1047,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutBucketVersioning", + MetricsMng: c.mm, + Action: "s3:PutBucketVersioning", BucketOwner: parsedAcl.Owner, }) } @@ -1000,7 +1068,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObjectLockConfiguration", + MetricsMng: c.mm, + Action: "s3:PutObjectLockConfiguration", BucketOwner: parsedAcl.Owner, }) } @@ -1010,7 +1079,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObjectLockConfiguration", + MetricsMng: c.mm, + Action: "s3:PutObjectLockConfiguration", BucketOwner: parsedAcl.Owner, }) } @@ -1019,7 +1089,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObjectLockConfiguration", + MetricsMng: c.mm, + Action: "s3:PutObjectLockConfiguration", BucketOwner: parsedAcl.Owner, }) } @@ -1039,7 +1110,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutBucketPolicy", + MetricsMng: c.mm, + Action: "s3:PutBucketPolicy", BucketOwner: parsedAcl.Owner, }) } @@ -1049,7 +1121,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutBucketPolicy", + MetricsMng: c.mm, + Action: "s3:PutBucketPolicy", BucketOwner: parsedAcl.Owner, }, ) @@ -1059,7 +1132,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutBucketPolicy", + MetricsMng: c.mm, + Action: "s3:PutBucketPolicy", BucketOwner: parsedAcl.Owner, }) } @@ -1085,7 +1159,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutBucketAcl", + MetricsMng: c.mm, + Action: "s3:PutBucketAcl", BucketOwner: parsedAcl.Owner, }) } @@ -1098,7 +1173,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutBucketAcl", + MetricsMng: c.mm, + Action: "s3:PutBucketAcl", BucketOwner: parsedAcl.Owner, }) } @@ -1113,7 +1189,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutBucketAcl", + MetricsMng: c.mm, + Action: "s3:PutBucketAcl", BucketOwner: parsedAcl.Owner, }) } @@ -1136,7 +1213,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutBucketAcl", + MetricsMng: c.mm, + Action: "s3:PutBucketAcl", BucketOwner: parsedAcl.Owner, }) } @@ -1149,7 +1227,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutBucketAcl", + MetricsMng: c.mm, + Action: "s3:PutBucketAcl", BucketOwner: parsedAcl.Owner, }) } @@ -1182,7 +1261,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutBucketAcl", + MetricsMng: c.mm, + Action: "s3:PutBucketAcl", BucketOwner: parsedAcl.Owner, }) } @@ -1191,7 +1271,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutBucketAcl", + MetricsMng: c.mm, + Action: "s3:PutBucketAcl", BucketOwner: parsedAcl.Owner, }) } @@ -1199,8 +1280,9 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { if ok := utils.IsValidBucketName(bucket); !ok { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidBucketName), &MetaOpts{ - Logger: c.logger, - Action: "CreateBucket", + Logger: c.logger, + MetricsMng: c.mm, + Action: "s3:CreateBucket", }) } @@ -1211,7 +1293,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutBucketAcl", + MetricsMng: c.mm, + Action: "s3:PutBucketAcl", BucketOwner: acct.Access, }) } @@ -1235,7 +1318,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "CreateBucket", + MetricsMng: c.mm, + Action: "s3:CreateBucket", BucketOwner: acct.Access, }) } @@ -1252,7 +1336,8 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "CreateBucket", + MetricsMng: c.mm, + Action: "s3:CreateBucket", BucketOwner: acct.Access, }) } @@ -1311,7 +1396,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutObjectTagging", + MetricsMng: c.mm, + Action: "s3:PutObjectTagging", BucketOwner: parsedAcl.Owner, }) } @@ -1327,7 +1413,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidTag), &MetaOpts{ Logger: c.logger, - Action: "PutObjectTagging", + MetricsMng: c.mm, + Action: "s3:PutObjectTagging", BucketOwner: parsedAcl.Owner, }) } @@ -1348,7 +1435,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObjectTagging", + MetricsMng: c.mm, + Action: "s3:PutObjectTagging", BucketOwner: parsedAcl.Owner, }) } @@ -1357,8 +1445,9 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, + MetricsMng: c.mm, EvSender: c.evSender, - Action: "PutObjectTagging", + Action: "s3:PutObjectTagging", BucketOwner: parsedAcl.Owner, EventName: s3event.EventObjectTaggingPut, }) @@ -1378,7 +1467,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObjectRetention", + MetricsMng: c.mm, + Action: "s3:PutObjectRetention", BucketOwner: parsedAcl.Owner, }) } @@ -1400,7 +1490,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { if err != nil { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObjectRetention", + MetricsMng: c.mm, + Action: "s3:PutObjectRetention", BucketOwner: parsedAcl.Owner, }) } @@ -1408,7 +1499,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { err = c.be.PutObjectRetention(ctx.Context(), bucket, keyStart, versionId, bypass, retention) return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObjectRetention", + MetricsMng: c.mm, + Action: "s3:PutObjectRetention", BucketOwner: parsedAcl.Owner, }) } @@ -1419,7 +1511,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutObjectLegalHold", + MetricsMng: c.mm, + Action: "s3:PutObjectLegalHold", BucketOwner: parsedAcl.Owner, }) } @@ -1428,7 +1521,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrMalformedXML), &MetaOpts{ Logger: c.logger, - Action: "PutObjectLegalHold", + MetricsMng: c.mm, + Action: "s3:PutObjectLegalHold", BucketOwner: parsedAcl.Owner, }) } @@ -1446,7 +1540,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObjectLegalHold", + MetricsMng: c.mm, + Action: "s3:PutObjectLegalHold", BucketOwner: parsedAcl.Owner, }) } @@ -1454,7 +1549,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { err := c.be.PutObjectLegalHold(ctx.Context(), bucket, keyStart, versionId, legalHold.Status == types.ObjectLockLegalHoldStatusOn) return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObjectLegalHold", + MetricsMng: c.mm, + Action: "s3:PutObjectLegalHold", BucketOwner: parsedAcl.Owner, }) } @@ -1471,7 +1567,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidPartNumber), &MetaOpts{ Logger: c.logger, - Action: "UploadPartCopy", + MetricsMng: c.mm, + Action: "s3:UploadPartCopy", BucketOwner: parsedAcl.Owner, }) } @@ -1490,7 +1587,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "UploadPartCopy", + MetricsMng: c.mm, + Action: "s3:UploadPartCopy", BucketOwner: parsedAcl.Owner, }) } @@ -1508,7 +1606,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, resp, err, &MetaOpts{ Logger: c.logger, - Action: "UploadPartCopy", + MetricsMng: c.mm, + Action: "s3:UploadPartCopy", BucketOwner: parsedAcl.Owner, }) } @@ -1523,7 +1622,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidPart), &MetaOpts{ Logger: c.logger, - Action: "UploadPart", + MetricsMng: c.mm, + Action: "s3:UploadPart", BucketOwner: parsedAcl.Owner, }) } @@ -1543,7 +1643,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "UploadPart", + MetricsMng: c.mm, + Action: "s3:UploadPart", BucketOwner: parsedAcl.Owner, }) } @@ -1557,7 +1658,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "UploadPart", + MetricsMng: c.mm, + Action: "s3:UploadPart", BucketOwner: parsedAcl.Owner, }) } @@ -1583,9 +1685,11 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { ctx.Response().Header.Set("Etag", etag) return SendResponse(ctx, err, &MetaOpts{ - Logger: c.logger, - Action: "UploadPart", - BucketOwner: parsedAcl.Owner, + Logger: c.logger, + MetricsMng: c.mm, + ContentLength: contentLength, + Action: "s3:UploadPart", + BucketOwner: parsedAcl.Owner, }) } @@ -1602,7 +1706,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutObjectAcl", + MetricsMng: c.mm, + Action: "s3:PutObjectAcl", BucketOwner: parsedAcl.Owner, }) } @@ -1618,7 +1723,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutObjectAcl", + MetricsMng: c.mm, + Action: "s3:PutObjectAcl", BucketOwner: parsedAcl.Owner, }) } @@ -1642,7 +1748,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutObjectAcl", + MetricsMng: c.mm, + Action: "s3:PutObjectAcl", BucketOwner: parsedAcl.Owner, }) } @@ -1655,7 +1762,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutObjectAcl", + MetricsMng: c.mm, + Action: "s3:PutObjectAcl", BucketOwner: parsedAcl.Owner, }) } @@ -1689,8 +1797,9 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, + MetricsMng: c.mm, EvSender: c.evSender, - Action: "PutObjectAcl", + Action: "s3:PutObjectAcl", BucketOwner: parsedAcl.Owner, EventName: s3event.EventObjectAclPut, }) @@ -1711,7 +1820,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "CopyObject", + MetricsMng: c.mm, + Action: "s3:CopyObject", BucketOwner: parsedAcl.Owner, }) } @@ -1729,7 +1839,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidCopySource), &MetaOpts{ Logger: c.logger, - Action: "CopyObject", + MetricsMng: c.mm, + Action: "s3:CopyObject", BucketOwner: parsedAcl.Owner, }) } @@ -1746,7 +1857,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrInvalidCopySource), &MetaOpts{ Logger: c.logger, - Action: "CopyObject", + MetricsMng: c.mm, + Action: "s3:CopyObject", BucketOwner: parsedAcl.Owner, }) } @@ -1771,8 +1883,9 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res.CopyObjectResult, err, &MetaOpts{ Logger: c.logger, + MetricsMng: c.mm, EvSender: c.evSender, - Action: "CopyObject", + Action: "s3:CopyObject", BucketOwner: parsedAcl.Owner, ObjectETag: res.CopyObjectResult.ETag, VersionId: res.VersionId, @@ -1782,7 +1895,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res, err, &MetaOpts{ Logger: c.logger, - Action: "CopyObject", + MetricsMng: c.mm, + Action: "s3:CopyObject", BucketOwner: parsedAcl.Owner, }) } @@ -1805,7 +1919,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObject", + MetricsMng: c.mm, + Action: "s3:PutObject", BucketOwner: parsedAcl.Owner, }) } @@ -1815,7 +1930,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObject", + MetricsMng: c.mm, + Action: "s3:PutObject", BucketOwner: parsedAcl.Owner, }) } @@ -1829,7 +1945,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "PutObject", + MetricsMng: c.mm, + Action: "s3:PutObject", BucketOwner: parsedAcl.Owner, }) } @@ -1839,7 +1956,8 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "PutObject", + MetricsMng: c.mm, + Action: "s3:PutObject", BucketOwner: parsedAcl.Owner, }) } @@ -1868,13 +1986,15 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { ctx.Response().Header.Set("ETag", etag) return SendResponse(ctx, err, &MetaOpts{ - Logger: c.logger, - EvSender: c.evSender, - Action: "PutObject", - BucketOwner: parsedAcl.Owner, - ObjectETag: &etag, - ObjectSize: contentLength, - EventName: s3event.EventObjectCreatedPut, + Logger: c.logger, + MetricsMng: c.mm, + ContentLength: contentLength, + EvSender: c.evSender, + Action: "s3:PutObject", + BucketOwner: parsedAcl.Owner, + ObjectETag: &etag, + ObjectSize: contentLength, + EventName: s3event.EventObjectCreatedPut, }) } @@ -1899,7 +2019,8 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteBucketTagging", + MetricsMng: c.mm, + Action: "s3:DeleteBucketTagging", BucketOwner: parsedAcl.Owner, }) } @@ -1908,7 +2029,8 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteBucketTagging", + MetricsMng: c.mm, + Action: "s3:DeleteBucketTagging", BucketOwner: parsedAcl.Owner, Status: http.StatusNoContent, }) @@ -1929,7 +2051,8 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteBucketPolicy", + MetricsMng: c.mm, + Action: "s3:DeleteBucketPolicy", BucketOwner: parsedAcl.Owner, }) } @@ -1938,7 +2061,8 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteBucketPolicy", + MetricsMng: c.mm, + Action: "s3:DeleteBucketPolicy", BucketOwner: parsedAcl.Owner, Status: http.StatusNoContent, }) @@ -1958,7 +2082,8 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteBucket", + MetricsMng: c.mm, + Action: "s3:DeleteBucket", BucketOwner: parsedAcl.Owner, }) } @@ -1970,7 +2095,8 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteBucket", + MetricsMng: c.mm, + Action: "s3:DeleteBucket", BucketOwner: parsedAcl.Owner, Status: http.StatusNoContent, }) @@ -1992,7 +2118,8 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), &MetaOpts{ Logger: c.logger, - Action: "DeleteObjects", + MetricsMng: c.mm, + Action: "s3:DeleteObjects", BucketOwner: parsedAcl.Owner, }) } @@ -2011,7 +2138,8 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteObjects", + MetricsMng: c.mm, + Action: "s3:DeleteObjects", BucketOwner: parsedAcl.Owner, }) } @@ -2021,7 +2149,8 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteObjects", + MetricsMng: c.mm, + Action: "s3:DeleteObjects", BucketOwner: parsedAcl.Owner, }) } @@ -2036,7 +2165,9 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteObjects", + MetricsMng: c.mm, + Action: "s3:DeleteObjects", + ObjectCount: int64(len(dObj.Objects)), BucketOwner: parsedAcl.Owner, EvSender: c.evSender, EventName: s3event.EventObjectRemovedDeleteObjects, @@ -2074,7 +2205,8 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteObjectTagging", + MetricsMng: c.mm, + Action: "s3:DeleteObjectTagging", BucketOwner: parsedAcl.Owner, }) } @@ -2084,8 +2216,9 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { &MetaOpts{ Status: http.StatusNoContent, Logger: c.logger, + MetricsMng: c.mm, EvSender: c.evSender, - Action: "DeleteObjectTagging", + Action: "s3:DeleteObjectTagging", BucketOwner: parsedAcl.Owner, EventName: s3event.EventObjectTaggingDelete, }) @@ -2110,7 +2243,8 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "AbortMultipartUpload", + MetricsMng: c.mm, + Action: "s3:AbortMultipartUpload", BucketOwner: parsedAcl.Owner, }) } @@ -2126,7 +2260,8 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "AbortMultipartUpload", + MetricsMng: c.mm, + Action: "s3:AbortMultipartUpload", BucketOwner: parsedAcl.Owner, Status: http.StatusNoContent, }) @@ -2147,7 +2282,8 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteObject", + MetricsMng: c.mm, + Action: "s3:DeleteObject", BucketOwner: parsedAcl.Owner, }) } @@ -2157,7 +2293,8 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "DeleteObject", + MetricsMng: c.mm, + Action: "s3:DeleteObject", BucketOwner: parsedAcl.Owner, }) } @@ -2171,8 +2308,9 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, + MetricsMng: c.mm, EvSender: c.evSender, - Action: "DeleteObject", + Action: "s3:DeleteObject", BucketOwner: parsedAcl.Owner, EventName: s3event.EventObjectRemovedDelete, Status: http.StatusNoContent, @@ -2200,7 +2338,8 @@ func (c S3ApiController) HeadBucket(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "HeadBucket", + MetricsMng: c.mm, + Action: "s3:HeadBucket", BucketOwner: parsedAcl.Owner, }) } @@ -2223,7 +2362,8 @@ func (c S3ApiController) HeadBucket(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "HeadBucket", + MetricsMng: c.mm, + Action: "s3:HeadBucket", BucketOwner: parsedAcl.Owner, }) } @@ -2253,7 +2393,8 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { return SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidPartNumber), &MetaOpts{ Logger: c.logger, - Action: "HeadObject", + MetricsMng: c.mm, + Action: "s3:HeadObject", BucketOwner: parsedAcl.Owner, }) } @@ -2276,7 +2417,8 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "HeadObject", + MetricsMng: c.mm, + Action: "s3:HeadObject", BucketOwner: parsedAcl.Owner, }) } @@ -2291,7 +2433,8 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "HeadObject", + MetricsMng: c.mm, + Action: "s3:HeadObject", BucketOwner: parsedAcl.Owner, }) } @@ -2299,7 +2442,8 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { return SendResponse(ctx, fmt.Errorf("head object nil response"), &MetaOpts{ Logger: c.logger, - Action: "HeadObject", + MetricsMng: c.mm, + Action: "s3:HeadObject", BucketOwner: parsedAcl.Owner, }) } @@ -2372,7 +2516,8 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { return SendResponse(ctx, nil, &MetaOpts{ Logger: c.logger, - Action: "HeadObject", + MetricsMng: c.mm, + Action: "s3:HeadObject", BucketOwner: parsedAcl.Owner, }) } @@ -2407,7 +2552,8 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "RestoreObject", + MetricsMng: c.mm, + Action: "s3:RestoreObject", BucketOwner: parsedAcl.Owner, }) } @@ -2427,7 +2573,8 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, - Action: "RestoreObject", + MetricsMng: c.mm, + Action: "s3:RestoreObject", BucketOwner: parsedAcl.Owner, }) } @@ -2439,8 +2586,9 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, + MetricsMng: c.mm, EvSender: c.evSender, - Action: "RestoreObject", + Action: "s3:RestoreObject", BucketOwner: parsedAcl.Owner, EventName: s3event.EventObjectRestoreCompleted, }) @@ -2458,7 +2606,8 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrMalformedXML), &MetaOpts{ Logger: c.logger, - Action: "SelectObjectContent", + MetricsMng: c.mm, + Action: "s3:SelectObjectContent", BucketOwner: parsedAcl.Owner, }) } @@ -2478,7 +2627,8 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "SelectObjectContent", + MetricsMng: c.mm, + Action: "s3:SelectObjectContent", BucketOwner: parsedAcl.Owner, }) } @@ -2514,7 +2664,8 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { s3err.GetAPIError(s3err.ErrMalformedXML), &MetaOpts{ Logger: c.logger, - Action: "CompleteMultipartUpload", + MetricsMng: c.mm, + Action: "s3:CompleteMultipartUpload", BucketOwner: parsedAcl.Owner, }) } @@ -2534,7 +2685,8 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "CompleteMultipartUpload", + MetricsMng: c.mm, + Action: "s3:CompleteMultipartUpload", BucketOwner: parsedAcl.Owner, }) } @@ -2552,8 +2704,9 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res, err, &MetaOpts{ Logger: c.logger, + MetricsMng: c.mm, EvSender: c.evSender, - Action: "CompleteMultipartUpload", + Action: "s3:CompleteMultipartUpload", BucketOwner: parsedAcl.Owner, ObjectETag: res.ETag, EventName: s3event.EventCompleteMultipartUpload, @@ -2563,7 +2716,8 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res, err, &MetaOpts{ Logger: c.logger, - Action: "CompleteMultipartUpload", + MetricsMng: c.mm, + Action: "s3:CompleteMultipartUpload", BucketOwner: parsedAcl.Owner, }) } @@ -2583,7 +2737,8 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, - Action: "CreateMultipartUpload", + MetricsMng: c.mm, + Action: "s3:CreateMultipartUpload", BucketOwner: parsedAcl.Owner, }) } @@ -2593,6 +2748,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, + MetricsMng: c.mm, Action: "CreateMultipartUpload", BucketOwner: parsedAcl.Owner, }) @@ -2614,21 +2770,25 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, res, err, &MetaOpts{ Logger: c.logger, - Action: "CreateMultipartUpload", + MetricsMng: c.mm, + Action: "s3:CreateMultipartUpload", BucketOwner: parsedAcl.Owner, }) } type MetaOpts struct { - Logger s3log.AuditLogger - EvSender s3event.S3EventSender - Action string - BucketOwner string - ObjectSize int64 - EventName s3event.EventType - ObjectETag *string - VersionId *string - Status int + Logger s3log.AuditLogger + EvSender s3event.S3EventSender + MetricsMng *metrics.Manager + ContentLength int64 + Action string + BucketOwner string + ObjectSize int64 + ObjectCount int64 + EventName s3event.EventType + ObjectETag *string + VersionId *string + Status int } func SendResponse(ctx *fiber.Ctx, err error, l *MetaOpts) error { @@ -2639,6 +2799,9 @@ func SendResponse(ctx *fiber.Ctx, err error, l *MetaOpts) error { ObjectSize: l.ObjectSize, }) } + if l.MetricsMng != nil { + l.MetricsMng.Send(err, l.Action, l.ContentLength, l.ObjectCount) + } if err != nil { var apierr s3err.APIError if errors.As(err, &apierr) { @@ -2681,6 +2844,9 @@ const ( ) func SendXMLResponse(ctx *fiber.Ctx, resp any, err error, l *MetaOpts) error { + if l.MetricsMng != nil { + l.MetricsMng.Send(err, l.Action, l.ContentLength, l.ObjectCount) + } if err != nil { if l.Logger != nil { l.Logger.Log(ctx, err, nil, s3log.LogMeta{ diff --git a/s3api/controllers/base_test.go b/s3api/controllers/base_test.go index 019a9d2..cca0f9b 100644 --- a/s3api/controllers/base_test.go +++ b/s3api/controllers/base_test.go @@ -77,7 +77,7 @@ func TestNew(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got := New(tt.args.be, tt.args.iam, nil, nil, false, false) + got := New(tt.args.be, tt.args.iam, nil, nil, nil, false, false) if !reflect.DeepEqual(got, tt.want) { t.Errorf("New() = %v, want %v", got, tt.want) } diff --git a/s3api/middlewares/authentication.go b/s3api/middlewares/authentication.go index 16f7e1a..90ce219 100644 --- a/s3api/middlewares/authentication.go +++ b/s3api/middlewares/authentication.go @@ -25,6 +25,7 @@ import ( "github.com/gofiber/fiber/v2" "github.com/versity/versitygw/auth" + "github.com/versity/versitygw/metrics" "github.com/versity/versitygw/s3api/controllers" "github.com/versity/versitygw/s3api/utils" "github.com/versity/versitygw/s3err" @@ -40,7 +41,7 @@ type RootUserConfig struct { Secret string } -func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.AuditLogger, region string, debug bool) fiber.Handler { +func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.AuditLogger, mm *metrics.Manager, region string, debug bool) fiber.Handler { acct := accounts{root: root, iam: iam} return func(ctx *fiber.Ctx) error { @@ -54,16 +55,16 @@ func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.Au ctx.Locals("startTime", time.Now()) authorization := ctx.Get("Authorization") if authorization == "" { - return sendResponse(ctx, s3err.GetAPIError(s3err.ErrAuthHeaderEmpty), logger) + return sendResponse(ctx, s3err.GetAPIError(s3err.ErrAuthHeaderEmpty), logger, mm) } authData, err := utils.ParseAuthorization(authorization) if err != nil { - return sendResponse(ctx, err, logger) + return sendResponse(ctx, err, logger, mm) } if authData.Algorithm != "AWS4-HMAC-SHA256" { - return sendResponse(ctx, s3err.GetAPIError(s3err.ErrSignatureVersionNotSupported), logger) + return sendResponse(ctx, s3err.GetAPIError(s3err.ErrSignatureVersionNotSupported), logger, mm) } if authData.Region != region { @@ -71,40 +72,40 @@ func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.Au Code: "SignatureDoesNotMatch", Description: fmt.Sprintf("Credential should be scoped to a valid Region, not %v", authData.Region), HTTPStatusCode: http.StatusForbidden, - }, logger) + }, logger, mm) } ctx.Locals("isRoot", authData.Access == root.Access) account, err := acct.getAccount(authData.Access) if err == auth.ErrNoSuchUser { - return sendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidAccessKeyID), logger) + return sendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidAccessKeyID), logger, mm) } if err != nil { - return sendResponse(ctx, err, logger) + return sendResponse(ctx, err, logger, mm) } ctx.Locals("account", account) // Check X-Amz-Date header date := ctx.Get("X-Amz-Date") if date == "" { - return sendResponse(ctx, s3err.GetAPIError(s3err.ErrMissingDateHeader), logger) + return sendResponse(ctx, s3err.GetAPIError(s3err.ErrMissingDateHeader), logger, mm) } // Parse the date and check the date validity tdate, err := time.Parse(iso8601Format, date) if err != nil { - return sendResponse(ctx, s3err.GetAPIError(s3err.ErrMalformedDate), logger) + return sendResponse(ctx, s3err.GetAPIError(s3err.ErrMalformedDate), logger, mm) } if date[:8] != authData.Date { - return sendResponse(ctx, s3err.GetAPIError(s3err.ErrSignatureDateDoesNotMatch), logger) + return sendResponse(ctx, s3err.GetAPIError(s3err.ErrSignatureDateDoesNotMatch), logger, mm) } // Validate the dates difference err = utils.ValidateDate(tdate) if err != nil { - return sendResponse(ctx, err, logger) + return sendResponse(ctx, err, logger, mm) } if utils.IsBigDataAction(ctx) { @@ -125,7 +126,7 @@ func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.Au // Compare the calculated hash with the hash provided if hashPayload != hexPayload { - return sendResponse(ctx, s3err.GetAPIError(s3err.ErrContentSHA256Mismatch), logger) + return sendResponse(ctx, s3err.GetAPIError(s3err.ErrContentSHA256Mismatch), logger, mm) } } @@ -134,13 +135,13 @@ func VerifyV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.Au if contentLengthStr != "" { contentLength, err = strconv.ParseInt(contentLengthStr, 10, 64) if err != nil { - return sendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), logger) + return sendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidRequest), logger, mm) } } err = utils.CheckValidSignature(ctx, authData, account.Secret, hashPayload, tdate, contentLength, debug) if err != nil { - return sendResponse(ctx, err, logger) + return sendResponse(ctx, err, logger, mm) } return ctx.Next() @@ -164,6 +165,6 @@ func (a accounts) getAccount(access string) (auth.Account, error) { return a.iam.GetUserAccount(access) } -func sendResponse(ctx *fiber.Ctx, err error, logger s3log.AuditLogger) error { - return controllers.SendResponse(ctx, err, &controllers.MetaOpts{Logger: logger}) +func sendResponse(ctx *fiber.Ctx, err error, logger s3log.AuditLogger, mm *metrics.Manager) error { + return controllers.SendResponse(ctx, err, &controllers.MetaOpts{Logger: logger, MetricsMng: mm}) } diff --git a/s3api/middlewares/chunk.go b/s3api/middlewares/chunk.go index 0592faa..24b3e5f 100644 --- a/s3api/middlewares/chunk.go +++ b/s3api/middlewares/chunk.go @@ -20,13 +20,14 @@ import ( "github.com/gofiber/fiber/v2" "github.com/versity/versitygw/auth" + "github.com/versity/versitygw/metrics" "github.com/versity/versitygw/s3api/utils" "github.com/versity/versitygw/s3log" ) // ProcessChunkedBody initializes the chunked upload stream if the // request appears to be a chunked upload -func ProcessChunkedBody(root RootUserConfig, iam auth.IAMService, logger s3log.AuditLogger, region string) fiber.Handler { +func ProcessChunkedBody(root RootUserConfig, iam auth.IAMService, logger s3log.AuditLogger, mm *metrics.Manager, region string) fiber.Handler { return func(ctx *fiber.Ctx) error { decodedLength := ctx.Get("X-Amz-Decoded-Content-Length") if decodedLength == "" { @@ -36,7 +37,7 @@ func ProcessChunkedBody(root RootUserConfig, iam auth.IAMService, logger s3log.A authData, err := utils.ParseAuthorization(ctx.Get("Authorization")) if err != nil { - return sendResponse(ctx, err, logger) + return sendResponse(ctx, err, logger, mm) } acct := ctx.Locals("account").(auth.Account) @@ -51,7 +52,7 @@ func ProcessChunkedBody(root RootUserConfig, iam auth.IAMService, logger s3log.A return cr }) if err != nil { - return sendResponse(ctx, err, logger) + return sendResponse(ctx, err, logger, mm) } return ctx.Next() } diff --git a/s3api/middlewares/presign-auth.go b/s3api/middlewares/presign-auth.go index bed9dda..18f6942 100644 --- a/s3api/middlewares/presign-auth.go +++ b/s3api/middlewares/presign-auth.go @@ -20,12 +20,13 @@ import ( "github.com/gofiber/fiber/v2" "github.com/versity/versitygw/auth" + "github.com/versity/versitygw/metrics" "github.com/versity/versitygw/s3api/utils" "github.com/versity/versitygw/s3err" "github.com/versity/versitygw/s3log" ) -func VerifyPresignedV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.AuditLogger, region string, debug bool) fiber.Handler { +func VerifyPresignedV4Signature(root RootUserConfig, iam auth.IAMService, logger s3log.AuditLogger, mm *metrics.Manager, region string, debug bool) fiber.Handler { acct := accounts{root: root, iam: iam} return func(ctx *fiber.Ctx) error { @@ -38,16 +39,16 @@ func VerifyPresignedV4Signature(root RootUserConfig, iam auth.IAMService, logger authData, err := utils.ParsePresignedURIParts(ctx) if err != nil { - return sendResponse(ctx, err, logger) + return sendResponse(ctx, err, logger, mm) } ctx.Locals("isRoot", authData.Access == root.Access) account, err := acct.getAccount(authData.Access) if err == auth.ErrNoSuchUser { - return sendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidAccessKeyID), logger) + return sendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidAccessKeyID), logger, mm) } if err != nil { - return sendResponse(ctx, err, logger) + return sendResponse(ctx, err, logger, mm) } ctx.Locals("account", account) @@ -61,7 +62,7 @@ func VerifyPresignedV4Signature(root RootUserConfig, iam auth.IAMService, logger err = utils.CheckPresignedSignature(ctx, authData, account.Secret, debug) if err != nil { - return sendResponse(ctx, err, logger) + return sendResponse(ctx, err, logger, mm) } return ctx.Next() diff --git a/s3api/middlewares/url-decoder.go b/s3api/middlewares/url-decoder.go index 34b6002..5918211 100644 --- a/s3api/middlewares/url-decoder.go +++ b/s3api/middlewares/url-decoder.go @@ -18,17 +18,18 @@ import ( "net/url" "github.com/gofiber/fiber/v2" + "github.com/versity/versitygw/metrics" "github.com/versity/versitygw/s3api/controllers" "github.com/versity/versitygw/s3err" "github.com/versity/versitygw/s3log" ) -func DecodeURL(logger s3log.AuditLogger) fiber.Handler { +func DecodeURL(logger s3log.AuditLogger, mm *metrics.Manager) fiber.Handler { return func(ctx *fiber.Ctx) error { reqURL := ctx.Request().URI().String() decoded, err := url.Parse(reqURL) if err != nil { - return controllers.SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidURI), &controllers.MetaOpts{Logger: logger}) + return controllers.SendResponse(ctx, s3err.GetAPIError(s3err.ErrInvalidURI), &controllers.MetaOpts{Logger: logger, MetricsMng: mm}) } ctx.Path(decoded.Path) return ctx.Next() diff --git a/s3api/router.go b/s3api/router.go index 0ec44c5..9e85ea2 100644 --- a/s3api/router.go +++ b/s3api/router.go @@ -18,6 +18,7 @@ import ( "github.com/gofiber/fiber/v2" "github.com/versity/versitygw/auth" "github.com/versity/versitygw/backend" + "github.com/versity/versitygw/metrics" "github.com/versity/versitygw/s3api/controllers" "github.com/versity/versitygw/s3event" "github.com/versity/versitygw/s3log" @@ -27,8 +28,8 @@ type S3ApiRouter struct { WithAdmSrv bool } -func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs s3event.S3EventSender, debug bool, readonly bool) { - s3ApiController := controllers.New(be, iam, logger, evs, debug, readonly) +func (sa *S3ApiRouter) Init(app *fiber.App, be backend.Backend, iam auth.IAMService, logger s3log.AuditLogger, evs s3event.S3EventSender, mm *metrics.Manager, debug bool, readonly bool) { + s3ApiController := controllers.New(be, iam, logger, evs, mm, debug, readonly) if sa.WithAdmSrv { adminController := controllers.NewAdminController(iam, be) diff --git a/s3api/router_test.go b/s3api/router_test.go index 8ee07e8..19b7372 100644 --- a/s3api/router_test.go +++ b/s3api/router_test.go @@ -45,7 +45,7 @@ func TestS3ApiRouter_Init(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - tt.sa.Init(tt.args.app, tt.args.be, tt.args.iam, nil, nil, false, false) + tt.sa.Init(tt.args.app, tt.args.be, tt.args.iam, nil, nil, nil, false, false) }) } } diff --git a/s3api/server.go b/s3api/server.go index db9a78f..1b1ef5e 100644 --- a/s3api/server.go +++ b/s3api/server.go @@ -22,6 +22,7 @@ import ( "github.com/gofiber/fiber/v2/middleware/logger" "github.com/versity/versitygw/auth" "github.com/versity/versitygw/backend" + "github.com/versity/versitygw/metrics" "github.com/versity/versitygw/s3api/middlewares" "github.com/versity/versitygw/s3event" "github.com/versity/versitygw/s3log" @@ -39,7 +40,17 @@ type S3ApiServer struct { health string } -func New(app *fiber.App, be backend.Backend, root middlewares.RootUserConfig, port, region string, iam auth.IAMService, l s3log.AuditLogger, evs s3event.S3EventSender, opts ...Option) (*S3ApiServer, error) { +func New( + app *fiber.App, + be backend.Backend, + root middlewares.RootUserConfig, + port, region string, + iam auth.IAMService, + l s3log.AuditLogger, + evs s3event.S3EventSender, + mm *metrics.Manager, + opts ...Option, +) (*S3ApiServer, error) { server := &S3ApiServer{ app: app, backend: be, @@ -61,17 +72,17 @@ func New(app *fiber.App, be backend.Backend, root middlewares.RootUserConfig, po return ctx.SendStatus(http.StatusOK) }) } - app.Use(middlewares.DecodeURL(l)) + app.Use(middlewares.DecodeURL(l, mm)) app.Use(middlewares.RequestLogger(server.debug)) // Authentication middlewares - app.Use(middlewares.VerifyPresignedV4Signature(root, iam, l, region, server.debug)) - app.Use(middlewares.VerifyV4Signature(root, iam, l, region, server.debug)) - app.Use(middlewares.ProcessChunkedBody(root, iam, l, region)) + app.Use(middlewares.VerifyPresignedV4Signature(root, iam, l, mm, region, server.debug)) + app.Use(middlewares.VerifyV4Signature(root, iam, l, mm, region, server.debug)) + app.Use(middlewares.ProcessChunkedBody(root, iam, l, mm, region)) app.Use(middlewares.VerifyMD5Body(l)) app.Use(middlewares.AclParser(be, l, server.readonly)) - server.router.Init(app, be, iam, l, evs, server.debug, server.readonly) + server.router.Init(app, be, iam, l, evs, mm, server.debug, server.readonly) return server, nil } diff --git a/s3api/server_test.go b/s3api/server_test.go index 9d4890b..aebf9dc 100644 --- a/s3api/server_test.go +++ b/s3api/server_test.go @@ -64,7 +64,7 @@ func TestNew(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { gotS3ApiServer, err := New(tt.args.app, tt.args.be, tt.args.root, - tt.args.port, "us-east-1", &auth.IAMServiceInternal{}, nil, nil) + tt.args.port, "us-east-1", &auth.IAMServiceInternal{}, nil, nil, nil) if (err != nil) != tt.wantErr { t.Errorf("New() error = %v, wantErr %v", err, tt.wantErr) return