From 3408470d7b4472307d927a8f5a2817fcc5542326 Mon Sep 17 00:00:00 2001 From: Ben McClelland Date: Mon, 22 Apr 2024 14:05:40 -0700 Subject: [PATCH 1/5] feat: add metrics module for forwarding gateway metrics This creates a metrics service for the rest of the gateway that can be used to send metrics stats to any number of metrics plugins. To start, a statsd plugin is implemented for generic statsd capability. --- go.mod | 1 + go.sum | 2 + metrics/metrics.go | 172 +++++++++++++++++++++++++++++++++++++++++++++ metrics/statsd.go | 63 +++++++++++++++++ 4 files changed, 238 insertions(+) create mode 100644 metrics/metrics.go create mode 100644 metrics/statsd.go diff --git a/go.mod b/go.mod index c6b1121..db619f3 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( github.com/nats-io/nats.go v1.35.0 github.com/pkg/xattr v0.4.9 github.com/segmentio/kafka-go v0.4.47 + github.com/smira/go-statsd v1.3.3 github.com/urfave/cli/v2 v2.27.2 github.com/valyala/fasthttp v1.54.0 github.com/versity/scoutfs-go v0.0.0-20240325223134-38eb2f5f7d44 diff --git a/go.sum b/go.sum index d4ad88e..ce839ac 100644 --- a/go.sum +++ b/go.sum @@ -127,6 +127,8 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/segmentio/kafka-go v0.4.47 h1:IqziR4pA3vrZq7YdRxaT3w1/5fvIH5qpCwstUanQQB0= github.com/segmentio/kafka-go v0.4.47/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg= +github.com/smira/go-statsd v1.3.3 h1:WnMlmGTyMpzto+HvOJWRPoLaLlk5EGfzsnlQBcvj4yI= +github.com/smira/go-statsd v1.3.3/go.mod h1:RjdsESPgDODtg1VpVVf9MJrEW2Hw0wtRNbmB1CAhu6A= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= diff --git a/metrics/metrics.go b/metrics/metrics.go new file mode 100644 index 0000000..c63c307 --- /dev/null +++ b/metrics/metrics.go @@ -0,0 +1,172 @@ +// Copyright 2024 Versity Software +// This file is licensed under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package metrics + +import ( + "context" + "fmt" + "os" + "sync" +) + +var ( + // max size of data items to buffer before dropping + // new incoming data items + dataItemCount = 100000 +) + +// Tag is added metadata for metrics +type Tag struct { + // Key is tag name + Key string + // Value is tag data + Value string +} + +// Manager is a manager of metrics plugins +type Manager struct { + wg sync.WaitGroup + ctx context.Context + + publishers []publisher + addDataChan chan datapoint + gaugeDataChan chan datapoint +} + +type Config struct { + StatsdServers []string +} + +// NewManager initializes metrics plugins and returns a new metrics manager +func NewManager(ctx context.Context, conf Config) (*Manager, error) { + hostname, err := os.Hostname() + if err != nil { + return nil, fmt.Errorf("failed to get hostname: %w", err) + } + + addDataChan := make(chan datapoint, dataItemCount) + gaugeDataChan := make(chan datapoint, dataItemCount) + + mgr := &Manager{ + addDataChan: addDataChan, + gaugeDataChan: gaugeDataChan, + ctx: ctx, + } + + for _, server := range conf.StatsdServers { + statsd, err := NewStatsd(server, hostname) + if err != nil { + return nil, err + } + mgr.publishers = append(mgr.publishers, statsd) + } + + mgr.wg.Add(1) + go mgr.addForwarder(addDataChan) + mgr.wg.Add(1) + go mgr.gaugeForwarder(gaugeDataChan) + + return mgr, nil +} + +// 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) { + if m.ctx.Err() != nil { + return + } + + d := datapoint{ + module: module, + key: key, + value: value, + tags: tags, + } + + select { + case m.addDataChan <- d: + default: + // channel full, drop the updates + } +} + +// Gauge sets key to value +func (m *Manager) Gauge(module, key string, value int, tags ...Tag) { + if m.ctx.Err() != nil { + return + } + + d := datapoint{ + module: module, + key: key, + value: value, + tags: tags, + } + + select { + case m.gaugeDataChan <- d: + default: + // channel full, drop the updates + } +} + +// Close closes metrics channels, waits for data to cmplete, closes all plugins +func (m *Manager) Close() { + // drain the datapoint channels + close(m.addDataChan) + close(m.gaugeDataChan) + m.wg.Wait() + + // close all publishers + for _, p := range m.publishers { + p.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) + Close() +} + +func (m *Manager) addForwarder(addChan <-chan datapoint) { + for data := range addChan { + for _, s := range m.publishers { + s.Add(data.module, data.key, data.value, data.tags...) + } + } + m.wg.Done() +} + +func (m *Manager) gaugeForwarder(gaugeChan <-chan datapoint) { + for data := range gaugeChan { + for _, s := range m.publishers { + s.Gauge(data.module, data.key, data.value, data.tags...) + } + } + m.wg.Done() +} + +type datapoint struct { + module string + key string + value int + tags []Tag +} diff --git a/metrics/statsd.go b/metrics/statsd.go new file mode 100644 index 0000000..6e12a3e --- /dev/null +++ b/metrics/statsd.go @@ -0,0 +1,63 @@ +// Copyright 2024 Versity Software +// This file is licensed under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package metrics + +import ( + "fmt" + + "github.com/smira/go-statsd" +) + +// Statsd metrics type +type Statsd struct { + c *statsd.Client +} + +// NewStatsd takes a server address and returns a statsd merics +// Supply service name to be used as a tag to identify the spcific +// gateway instance, this may typically be the gateway hostname +func NewStatsd(server string, service string) (*Statsd, error) { + c := statsd.NewClient( + server, + statsd.MaxPacketSize(1400), + statsd.MetricPrefix("versitygw."), + statsd.TagStyle(statsd.TagFormatInfluxDB), + statsd.DefaultTags(statsd.StringTag("service", service)), + ) + return &Statsd{c: c}, nil +} + +// Close closes statsd connections +func (s *Statsd) Close() { + s.c.Close() +} + +// Add adds value to key +func (s *Statsd) Add(module, key string, value int, 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...) +} + +// Gauge sets key to value +func (s *Statsd) Gauge(module, key string, value int, tags ...Tag) { + stags := make([]statsd.Tag, len(tags)) + for i, t := range tags { + stags[i] = statsd.StringTag(t.Key, t.Value) + } + s.c.Gauge(fmt.Sprintf("%v.%v", module, key), int64(value), stags...) +} From be6f9a86cdcc72d3a78ff4b8b6ff01d5f1c51698 Mon Sep 17 00:00:00 2001 From: jonaustin09 Date: Fri, 10 May 2024 16:47:52 -0400 Subject: [PATCH 2/5] 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 From 983da28a7efb929b8500c83d5071b113b494ce0f Mon Sep 17 00:00:00 2001 From: Ben McClelland Date: Wed, 22 May 2024 17:13:46 -0700 Subject: [PATCH 3/5] feat: define action names in metrics module --- metrics/actions.go | 63 ++++++++ metrics/metrics.go | 29 ++-- s3api/controllers/base.go | 292 ++++++++++++++++++++------------------ 3 files changed, 227 insertions(+), 157 deletions(-) create mode 100644 metrics/actions.go diff --git a/metrics/actions.go b/metrics/actions.go new file mode 100644 index 0000000..035e831 --- /dev/null +++ b/metrics/actions.go @@ -0,0 +1,63 @@ +// Copyright 2024 Versity Software +// This file is licensed under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package metrics + +var ( + ActionUndetected = "ActionUnDetected" + ActionAbortMultipartUpload = "s3_AbortMultipartUpload" + ActionCompleteMultipartUpload = "s3_CompleteMultipartUpload" + ActionCopyObject = "s3_CopyObject" + ActionCreateBucket = "s3_CreateBucket" + ActionCreateMultipartUpload = "s3_CreateMultipartUpload" + ActionDeleteBucket = "s3_DeleteBucket" + ActionDeleteBucketPolicy = "s3_DeleteBucketPolicy" + ActionDeleteBucketTagging = "s3_DeleteBucketTagging" + ActionDeleteObject = "s3_DeleteObject" + ActionDeleteObjectTagging = "s3_DeleteObjectTagging" + ActionDeleteObjects = "s3_DeleteObjects" + ActionGetBucketAcl = "s3_GetBucketAcl" + ActionGetBucketPolicy = "s3_GetBucketPolicy" + ActionGetBucketTagging = "s3_GetBucketTagging" + ActionGetBucketVersioning = "s3_GetBucketVersioning" + ActionGetObject = "s3_GetObject" + ActionGetObjectAcl = "s3_GetObjectAcl" + ActionGetObjectAttributes = "s3_GetObjectAttributes" + ActionGetObjectLegalHold = "s3_GetObjectLegalHold" + ActionGetObjectLockConfiguration = "s3_GetObjectLockConfiguration" + ActionGetObjectRetention = "s3_GetObjectRetention" + ActionGetObjectTagging = "s3_GetObjectTagging" + ActionHeadBucket = "s3_HeadBucket" + ActionHeadObject = "s3_HeadObject" + ActionListAllMyBuckets = "s3_ListAllMyBuckets" + ActionListMultipartUploads = "s3_ListMultipartUploads" + ActionListObjectVersions = "s3_ListObjectVersions" + ActionListObjects = "s3_ListObjects" + ActionListObjectsV2 = "s3_ListObjectsV2" + ActionListParts = "s3_ListParts" + ActionPutBucketAcl = "s3_PutBucketAcl" + ActionPutBucketPolicy = "s3_PutBucketPolicy" + ActionPutBucketTagging = "s3_PutBucketTagging" + ActionPutBucketVersioning = "s3_PutBucketVersioning" + ActionPutObject = "s3_PutObject" + ActionPutObjectAcl = "s3_PutObjectAcl" + ActionPutObjectLegalHold = "s3_PutObjectLegalHold" + ActionPutObjectLockConfiguration = "s3_PutObjectLockConfiguration" + ActionPutObjectRetention = "s3_PutObjectRetention" + ActionPutObjectTagging = "s3_PutObjectTagging" + ActionRestoreObject = "s3_RestoreObject" + ActionSelectObjectContent = "s3_SelectObjectContent" + ActionUploadPart = "s3_UploadPart" + ActionUploadPartCopy = "s3_UploadPartCopy" +) diff --git a/metrics/metrics.go b/metrics/metrics.go index 891f63b..a0aad32 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -87,33 +87,32 @@ func NewManager(ctx context.Context, conf Config) (*Manager, error) { return mgr, nil } -func (m *Manager) Send(err error, action string, objSize int64, objCount int64) { +func (m *Manager) Send(err error, action string, count int64) { // In case of Authentication failures, url parsing ... if action == "" { - action = "s3:UnDetected" + action = ActionUndetected } if err != nil { m.Increment(action, "failed_count") + } else { + m.Increment(action, "success_count") } - m.Increment(action, "success_count") switch action { - case "s3:PutObject": - m.Add(action, "bytes_written", objSize) + case ActionPutObject: + m.Add(action, "bytes_written", count) m.Increment(action, "object_created_count") - case "s3:CompleteMultipartUpload": + case ActionCompleteMultipartUpload: 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": + case ActionUploadPart: + m.Add(action, "bytes_written", count) + case ActionGetObject: + m.Add(action, "bytes_read", count) + case ActionDeleteObject: m.Increment(action, "object_removed_count") - case "s3:DeleteObjects": - m.Add(action, "object_removed_count", objCount) + case ActionDeleteObjects: + m.Add(action, "object_removed_count", count) } - //TODO: Handle UploadPartCopy case - //TODO: Handle CopyObject case } // Increment increments the key by one diff --git a/s3api/controllers/base.go b/s3api/controllers/base.go index d549b60..50fa52c 100644 --- a/s3api/controllers/base.go +++ b/s3api/controllers/base.go @@ -72,7 +72,7 @@ func (c S3ApiController) ListBuckets(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListAllMyBuckets", + Action: metrics.ActionListAllMyBuckets, }) } @@ -108,7 +108,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectTagging", + Action: metrics.ActionGetObjectTagging, BucketOwner: parsedAcl.Owner, }) } @@ -119,7 +119,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectTagging", + Action: metrics.ActionGetObjectTagging, BucketOwner: parsedAcl.Owner, }) } @@ -136,7 +136,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectTagging", + Action: metrics.ActionGetObjectTagging, BucketOwner: parsedAcl.Owner, }) } @@ -157,7 +157,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectRetention", + Action: metrics.ActionGetObjectRetention, BucketOwner: parsedAcl.Owner, }) } @@ -168,7 +168,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectRetention", + Action: metrics.ActionGetObjectRetention, BucketOwner: parsedAcl.Owner, }) } @@ -178,7 +178,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectRetention", + Action: metrics.ActionGetObjectRetention, BucketOwner: parsedAcl.Owner, }) } @@ -199,7 +199,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectLegalHold", + Action: metrics.ActionGetObjectLegalHold, BucketOwner: parsedAcl.Owner, }) } @@ -209,7 +209,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectLegalHold", + Action: metrics.ActionGetObjectLegalHold, BucketOwner: parsedAcl.Owner, }) } @@ -221,7 +221,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListParts", + Action: metrics.ActionListParts, BucketOwner: parsedAcl.Owner, }) } @@ -237,7 +237,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListParts", + Action: metrics.ActionListParts, BucketOwner: parsedAcl.Owner, }) } @@ -258,7 +258,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListParts", + Action: metrics.ActionListParts, BucketOwner: parsedAcl.Owner, }) } @@ -278,7 +278,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListParts", + Action: metrics.ActionListParts, BucketOwner: parsedAcl.Owner, }) } @@ -299,7 +299,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectAcl", + Action: metrics.ActionGetObjectAcl, BucketOwner: parsedAcl.Owner, }) } @@ -311,7 +311,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectAcl", + Action: metrics.ActionGetObjectAcl, BucketOwner: parsedAcl.Owner, }) } @@ -332,7 +332,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectAttributes", + Action: metrics.ActionGetObjectAttributes, BucketOwner: parsedAcl.Owner, }) } @@ -344,7 +344,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectAttributes", + Action: metrics.ActionGetObjectAttributes, BucketOwner: parsedAcl.Owner, }) } @@ -363,7 +363,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectAttributes", + Action: metrics.ActionGetObjectAttributes, BucketOwner: parsedAcl.Owner, }) } @@ -371,7 +371,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectAttributes", + Action: metrics.ActionGetObjectAttributes, BucketOwner: parsedAcl.Owner, }) } @@ -391,7 +391,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObject", + Action: metrics.ActionGetObject, BucketOwner: parsedAcl.Owner, }) } @@ -408,7 +408,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObject", + Action: metrics.ActionGetObject, BucketOwner: parsedAcl.Owner, }) } @@ -417,7 +417,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObject", + Action: metrics.ActionGetObject, BucketOwner: parsedAcl.Owner, }) } @@ -481,7 +481,7 @@ func (c S3ApiController) GetActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObject", + Action: metrics.ActionGetObject, ContentLength: getint64(res.ContentLength), BucketOwner: parsedAcl.Owner, Status: status, @@ -533,7 +533,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetBucketTagging", + Action: metrics.ActionGetBucketTagging, BucketOwner: parsedAcl.Owner, }) } @@ -544,7 +544,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetBucketTagging", + Action: metrics.ActionGetBucketTagging, BucketOwner: parsedAcl.Owner, }) } @@ -561,7 +561,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetBucketTagging", + Action: metrics.ActionGetBucketTagging, BucketOwner: parsedAcl.Owner, }) } @@ -581,7 +581,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetBucketVersioning", + Action: metrics.ActionGetBucketVersioning, BucketOwner: parsedAcl.Owner, }) } @@ -591,7 +591,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetBucketVersioning", + Action: metrics.ActionGetBucketVersioning, BucketOwner: parsedAcl.Owner, }) } @@ -601,7 +601,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetBucketVersioning", + Action: metrics.ActionGetBucketVersioning, BucketOwner: parsedAcl.Owner, }) } @@ -621,7 +621,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetBucketPolicy", + Action: metrics.ActionGetBucketPolicy, BucketOwner: parsedAcl.Owner, }) } @@ -631,7 +631,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetBucketPolicy", + Action: metrics.ActionGetBucketPolicy, BucketOwner: parsedAcl.Owner, }) } @@ -651,7 +651,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListObjectVersions", + Action: metrics.ActionListObjectVersions, BucketOwner: parsedAcl.Owner, }) } @@ -666,7 +666,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListObjectVersions", + Action: metrics.ActionListObjectVersions, BucketOwner: parsedAcl.Owner, }) } @@ -684,7 +684,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListObjectVersions", + Action: metrics.ActionListObjectVersions, BucketOwner: parsedAcl.Owner, }) } @@ -704,7 +704,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectLockConfiguration", + Action: metrics.ActionGetObjectLockConfiguration, BucketOwner: parsedAcl.Owner, }) } @@ -715,7 +715,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectLockConfiguration", + Action: metrics.ActionGetObjectLockConfiguration, BucketOwner: parsedAcl.Owner, }) } @@ -725,7 +725,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetObjectLockConfiguration", + Action: metrics.ActionGetObjectLockConfiguration, BucketOwner: parsedAcl.Owner, }) } @@ -745,7 +745,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetBucketAcl", + Action: metrics.ActionGetBucketAcl, BucketOwner: parsedAcl.Owner, }) } @@ -765,7 +765,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:GetBucketAcl", + Action: metrics.ActionGetBucketAcl, BucketOwner: parsedAcl.Owner, }) } @@ -785,7 +785,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListMultipartUploads", + Action: metrics.ActionListMultipartUploads, BucketOwner: parsedAcl.Owner, }) } @@ -798,7 +798,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { return SendXMLResponse(ctx, nil, err, &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListMultipartUploads", + Action: metrics.ActionListMultipartUploads, BucketOwner: parsedAcl.Owner, }) } @@ -815,7 +815,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListMultipartUploads", + Action: metrics.ActionListMultipartUploads, BucketOwner: parsedAcl.Owner, }) } @@ -835,7 +835,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListObjectsV2", + Action: metrics.ActionListObjectsV2, BucketOwner: parsedAcl.Owner, }) } @@ -849,7 +849,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListObjectsV2", + Action: metrics.ActionListObjectsV2, BucketOwner: parsedAcl.Owner, }) } @@ -866,7 +866,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListObjectsV2", + Action: metrics.ActionListObjectsV2, BucketOwner: parsedAcl.Owner, }) } @@ -885,7 +885,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListObjects", + Action: metrics.ActionListObjects, BucketOwner: parsedAcl.Owner, }) } @@ -900,7 +900,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListObjects", + Action: metrics.ActionListObjects, BucketOwner: parsedAcl.Owner, }) } @@ -920,7 +920,7 @@ func (c S3ApiController) ListActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:ListObjects", + Action: metrics.ActionListObjects, BucketOwner: parsedAcl.Owner, }) } @@ -951,7 +951,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketTagging", + Action: metrics.ActionPutBucketTagging, BucketOwner: parsedAcl.Owner, }) } @@ -964,7 +964,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketTagging", + Action: metrics.ActionPutBucketTagging, BucketOwner: parsedAcl.Owner, }) } @@ -985,7 +985,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketTagging", + Action: metrics.ActionPutBucketTagging, BucketOwner: parsedAcl.Owner, }) } @@ -995,7 +995,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketTagging", + Action: metrics.ActionPutBucketTagging, BucketOwner: parsedAcl.Owner, }) } @@ -1016,7 +1016,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketVersioning", + Action: metrics.ActionPutBucketVersioning, BucketOwner: parsedAcl.Owner, }) } @@ -1032,7 +1032,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketVersioning", + Action: metrics.ActionPutBucketVersioning, BucketOwner: parsedAcl.Owner, }) } @@ -1048,7 +1048,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketVersioning", + Action: metrics.ActionPutBucketVersioning, BucketOwner: parsedAcl.Owner, }) } @@ -1069,7 +1069,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectLockConfiguration", + Action: metrics.ActionPutObjectLockConfiguration, BucketOwner: parsedAcl.Owner, }) } @@ -1080,7 +1080,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectLockConfiguration", + Action: metrics.ActionPutObjectLockConfiguration, BucketOwner: parsedAcl.Owner, }) } @@ -1090,7 +1090,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectLockConfiguration", + Action: metrics.ActionPutObjectLockConfiguration, BucketOwner: parsedAcl.Owner, }) } @@ -1111,7 +1111,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketPolicy", + Action: metrics.ActionPutBucketPolicy, BucketOwner: parsedAcl.Owner, }) } @@ -1122,7 +1122,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketPolicy", + Action: metrics.ActionPutBucketPolicy, BucketOwner: parsedAcl.Owner, }, ) @@ -1133,7 +1133,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketPolicy", + Action: metrics.ActionPutBucketPolicy, BucketOwner: parsedAcl.Owner, }) } @@ -1160,7 +1160,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketAcl", + Action: metrics.ActionPutBucketAcl, BucketOwner: parsedAcl.Owner, }) } @@ -1174,7 +1174,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketAcl", + Action: metrics.ActionPutBucketAcl, BucketOwner: parsedAcl.Owner, }) } @@ -1190,7 +1190,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketAcl", + Action: metrics.ActionPutBucketAcl, BucketOwner: parsedAcl.Owner, }) } @@ -1214,7 +1214,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketAcl", + Action: metrics.ActionPutBucketAcl, BucketOwner: parsedAcl.Owner, }) } @@ -1228,7 +1228,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketAcl", + Action: metrics.ActionPutBucketAcl, BucketOwner: parsedAcl.Owner, }) } @@ -1262,7 +1262,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketAcl", + Action: metrics.ActionPutBucketAcl, BucketOwner: parsedAcl.Owner, }) } @@ -1272,7 +1272,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketAcl", + Action: metrics.ActionPutBucketAcl, BucketOwner: parsedAcl.Owner, }) } @@ -1282,7 +1282,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CreateBucket", + Action: metrics.ActionCreateBucket, }) } @@ -1294,7 +1294,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutBucketAcl", + Action: metrics.ActionPutBucketAcl, BucketOwner: acct.Access, }) } @@ -1319,7 +1319,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CreateBucket", + Action: metrics.ActionCreateBucket, BucketOwner: acct.Access, }) } @@ -1337,7 +1337,7 @@ func (c S3ApiController) PutBucketActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CreateBucket", + Action: metrics.ActionCreateBucket, BucketOwner: acct.Access, }) } @@ -1397,7 +1397,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectTagging", + Action: metrics.ActionPutObjectTagging, BucketOwner: parsedAcl.Owner, }) } @@ -1414,7 +1414,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectTagging", + Action: metrics.ActionPutObjectTagging, BucketOwner: parsedAcl.Owner, }) } @@ -1436,7 +1436,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectTagging", + Action: metrics.ActionPutObjectTagging, BucketOwner: parsedAcl.Owner, }) } @@ -1447,7 +1447,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { Logger: c.logger, MetricsMng: c.mm, EvSender: c.evSender, - Action: "s3:PutObjectTagging", + Action: metrics.ActionPutObjectTagging, BucketOwner: parsedAcl.Owner, EventName: s3event.EventObjectTaggingPut, }) @@ -1468,7 +1468,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectRetention", + Action: metrics.ActionPutObjectRetention, BucketOwner: parsedAcl.Owner, }) } @@ -1491,7 +1491,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectRetention", + Action: metrics.ActionPutObjectRetention, BucketOwner: parsedAcl.Owner, }) } @@ -1500,7 +1500,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectRetention", + Action: metrics.ActionPutObjectRetention, BucketOwner: parsedAcl.Owner, }) } @@ -1512,7 +1512,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectLegalHold", + Action: metrics.ActionPutObjectLegalHold, BucketOwner: parsedAcl.Owner, }) } @@ -1522,7 +1522,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectLegalHold", + Action: metrics.ActionPutObjectLegalHold, BucketOwner: parsedAcl.Owner, }) } @@ -1541,7 +1541,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectLegalHold", + Action: metrics.ActionPutObjectLegalHold, BucketOwner: parsedAcl.Owner, }) } @@ -1550,7 +1550,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { return SendResponse(ctx, err, &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectLegalHold", + Action: metrics.ActionPutObjectLegalHold, BucketOwner: parsedAcl.Owner, }) } @@ -1568,7 +1568,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:UploadPartCopy", + Action: metrics.ActionUploadPartCopy, BucketOwner: parsedAcl.Owner, }) } @@ -1588,7 +1588,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:UploadPartCopy", + Action: metrics.ActionUploadPartCopy, BucketOwner: parsedAcl.Owner, }) } @@ -1607,7 +1607,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:UploadPartCopy", + Action: metrics.ActionUploadPartCopy, BucketOwner: parsedAcl.Owner, }) } @@ -1623,7 +1623,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:UploadPart", + Action: metrics.ActionUploadPart, BucketOwner: parsedAcl.Owner, }) } @@ -1644,7 +1644,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:UploadPart", + Action: metrics.ActionUploadPart, BucketOwner: parsedAcl.Owner, }) } @@ -1659,7 +1659,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:UploadPart", + Action: metrics.ActionUploadPart, BucketOwner: parsedAcl.Owner, }) } @@ -1688,7 +1688,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { Logger: c.logger, MetricsMng: c.mm, ContentLength: contentLength, - Action: "s3:UploadPart", + Action: metrics.ActionUploadPart, BucketOwner: parsedAcl.Owner, }) } @@ -1707,7 +1707,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectAcl", + Action: metrics.ActionPutObjectAcl, BucketOwner: parsedAcl.Owner, }) } @@ -1724,7 +1724,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectAcl", + Action: metrics.ActionPutObjectAcl, BucketOwner: parsedAcl.Owner, }) } @@ -1749,7 +1749,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectAcl", + Action: metrics.ActionPutObjectAcl, BucketOwner: parsedAcl.Owner, }) } @@ -1763,7 +1763,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObjectAcl", + Action: metrics.ActionPutObjectAcl, BucketOwner: parsedAcl.Owner, }) } @@ -1799,7 +1799,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { Logger: c.logger, MetricsMng: c.mm, EvSender: c.evSender, - Action: "s3:PutObjectAcl", + Action: metrics.ActionPutObjectAcl, BucketOwner: parsedAcl.Owner, EventName: s3event.EventObjectAclPut, }) @@ -1821,7 +1821,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CopyObject", + Action: metrics.ActionCopyObject, BucketOwner: parsedAcl.Owner, }) } @@ -1840,7 +1840,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CopyObject", + Action: metrics.ActionCopyObject, BucketOwner: parsedAcl.Owner, }) } @@ -1858,7 +1858,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CopyObject", + Action: metrics.ActionCopyObject, BucketOwner: parsedAcl.Owner, }) } @@ -1885,7 +1885,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { Logger: c.logger, MetricsMng: c.mm, EvSender: c.evSender, - Action: "s3:CopyObject", + Action: metrics.ActionCopyObject, BucketOwner: parsedAcl.Owner, ObjectETag: res.CopyObjectResult.ETag, VersionId: res.VersionId, @@ -1896,7 +1896,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CopyObject", + Action: metrics.ActionCopyObject, BucketOwner: parsedAcl.Owner, }) } @@ -1920,7 +1920,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObject", + Action: metrics.ActionPutObject, BucketOwner: parsedAcl.Owner, }) } @@ -1931,7 +1931,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObject", + Action: metrics.ActionPutObject, BucketOwner: parsedAcl.Owner, }) } @@ -1946,7 +1946,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObject", + Action: metrics.ActionPutObject, BucketOwner: parsedAcl.Owner, }) } @@ -1957,7 +1957,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:PutObject", + Action: metrics.ActionPutObject, BucketOwner: parsedAcl.Owner, }) } @@ -1990,7 +1990,7 @@ func (c S3ApiController) PutActions(ctx *fiber.Ctx) error { MetricsMng: c.mm, ContentLength: contentLength, EvSender: c.evSender, - Action: "s3:PutObject", + Action: metrics.ActionPutObject, BucketOwner: parsedAcl.Owner, ObjectETag: &etag, ObjectSize: contentLength, @@ -2020,7 +2020,7 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteBucketTagging", + Action: metrics.ActionDeleteBucketTagging, BucketOwner: parsedAcl.Owner, }) } @@ -2030,7 +2030,7 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteBucketTagging", + Action: metrics.ActionDeleteBucketTagging, BucketOwner: parsedAcl.Owner, Status: http.StatusNoContent, }) @@ -2052,7 +2052,7 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteBucketPolicy", + Action: metrics.ActionDeleteBucketPolicy, BucketOwner: parsedAcl.Owner, }) } @@ -2062,7 +2062,7 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteBucketPolicy", + Action: metrics.ActionDeleteBucketPolicy, BucketOwner: parsedAcl.Owner, Status: http.StatusNoContent, }) @@ -2083,7 +2083,7 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteBucket", + Action: metrics.ActionDeleteBucket, BucketOwner: parsedAcl.Owner, }) } @@ -2096,7 +2096,7 @@ func (c S3ApiController) DeleteBucket(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteBucket", + Action: metrics.ActionDeleteBucket, BucketOwner: parsedAcl.Owner, Status: http.StatusNoContent, }) @@ -2119,7 +2119,7 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteObjects", + Action: metrics.ActionDeleteObjects, BucketOwner: parsedAcl.Owner, }) } @@ -2139,7 +2139,7 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteObjects", + Action: metrics.ActionDeleteObjects, BucketOwner: parsedAcl.Owner, }) } @@ -2150,7 +2150,7 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteObjects", + Action: metrics.ActionDeleteObjects, BucketOwner: parsedAcl.Owner, }) } @@ -2166,7 +2166,7 @@ func (c S3ApiController) DeleteObjects(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteObjects", + Action: metrics.ActionDeleteObjects, ObjectCount: int64(len(dObj.Objects)), BucketOwner: parsedAcl.Owner, EvSender: c.evSender, @@ -2206,7 +2206,7 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteObjectTagging", + Action: metrics.ActionDeleteObjectTagging, BucketOwner: parsedAcl.Owner, }) } @@ -2218,7 +2218,7 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { Logger: c.logger, MetricsMng: c.mm, EvSender: c.evSender, - Action: "s3:DeleteObjectTagging", + Action: metrics.ActionDeleteObjectTagging, BucketOwner: parsedAcl.Owner, EventName: s3event.EventObjectTaggingDelete, }) @@ -2244,7 +2244,7 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:AbortMultipartUpload", + Action: metrics.ActionAbortMultipartUpload, BucketOwner: parsedAcl.Owner, }) } @@ -2261,7 +2261,7 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:AbortMultipartUpload", + Action: metrics.ActionAbortMultipartUpload, BucketOwner: parsedAcl.Owner, Status: http.StatusNoContent, }) @@ -2283,7 +2283,7 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteObject", + Action: metrics.ActionDeleteObject, BucketOwner: parsedAcl.Owner, }) } @@ -2294,7 +2294,7 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:DeleteObject", + Action: metrics.ActionDeleteObject, BucketOwner: parsedAcl.Owner, }) } @@ -2310,7 +2310,7 @@ func (c S3ApiController) DeleteActions(ctx *fiber.Ctx) error { Logger: c.logger, MetricsMng: c.mm, EvSender: c.evSender, - Action: "s3:DeleteObject", + Action: metrics.ActionDeleteObject, BucketOwner: parsedAcl.Owner, EventName: s3event.EventObjectRemovedDelete, Status: http.StatusNoContent, @@ -2339,7 +2339,7 @@ func (c S3ApiController) HeadBucket(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:HeadBucket", + Action: metrics.ActionHeadBucket, BucketOwner: parsedAcl.Owner, }) } @@ -2363,7 +2363,7 @@ func (c S3ApiController) HeadBucket(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:HeadBucket", + Action: metrics.ActionHeadBucket, BucketOwner: parsedAcl.Owner, }) } @@ -2394,7 +2394,7 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:HeadObject", + Action: metrics.ActionHeadObject, BucketOwner: parsedAcl.Owner, }) } @@ -2418,7 +2418,7 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:HeadObject", + Action: metrics.ActionHeadObject, BucketOwner: parsedAcl.Owner, }) } @@ -2434,7 +2434,7 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:HeadObject", + Action: metrics.ActionHeadObject, BucketOwner: parsedAcl.Owner, }) } @@ -2443,7 +2443,7 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:HeadObject", + Action: metrics.ActionHeadObject, BucketOwner: parsedAcl.Owner, }) } @@ -2517,7 +2517,7 @@ func (c S3ApiController) HeadObject(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:HeadObject", + Action: metrics.ActionHeadObject, BucketOwner: parsedAcl.Owner, }) } @@ -2553,7 +2553,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:RestoreObject", + Action: metrics.ActionRestoreObject, BucketOwner: parsedAcl.Owner, }) } @@ -2574,7 +2574,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:RestoreObject", + Action: metrics.ActionRestoreObject, BucketOwner: parsedAcl.Owner, }) } @@ -2588,7 +2588,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { Logger: c.logger, MetricsMng: c.mm, EvSender: c.evSender, - Action: "s3:RestoreObject", + Action: metrics.ActionRestoreObject, BucketOwner: parsedAcl.Owner, EventName: s3event.EventObjectRestoreCompleted, }) @@ -2607,7 +2607,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:SelectObjectContent", + Action: metrics.ActionSelectObjectContent, BucketOwner: parsedAcl.Owner, }) } @@ -2628,7 +2628,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:SelectObjectContent", + Action: metrics.ActionSelectObjectContent, BucketOwner: parsedAcl.Owner, }) } @@ -2665,7 +2665,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CompleteMultipartUpload", + Action: metrics.ActionCompleteMultipartUpload, BucketOwner: parsedAcl.Owner, }) } @@ -2686,7 +2686,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CompleteMultipartUpload", + Action: metrics.ActionCompleteMultipartUpload, BucketOwner: parsedAcl.Owner, }) } @@ -2706,7 +2706,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { Logger: c.logger, MetricsMng: c.mm, EvSender: c.evSender, - Action: "s3:CompleteMultipartUpload", + Action: metrics.ActionCompleteMultipartUpload, BucketOwner: parsedAcl.Owner, ObjectETag: res.ETag, EventName: s3event.EventCompleteMultipartUpload, @@ -2717,7 +2717,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CompleteMultipartUpload", + Action: metrics.ActionCompleteMultipartUpload, BucketOwner: parsedAcl.Owner, }) } @@ -2738,7 +2738,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CreateMultipartUpload", + Action: metrics.ActionCreateMultipartUpload, BucketOwner: parsedAcl.Owner, }) } @@ -2771,7 +2771,7 @@ func (c S3ApiController) CreateActions(ctx *fiber.Ctx) error { &MetaOpts{ Logger: c.logger, MetricsMng: c.mm, - Action: "s3:CreateMultipartUpload", + Action: metrics.ActionCreateMultipartUpload, BucketOwner: parsedAcl.Owner, }) } @@ -2800,7 +2800,11 @@ func SendResponse(ctx *fiber.Ctx, err error, l *MetaOpts) error { }) } if l.MetricsMng != nil { - l.MetricsMng.Send(err, l.Action, l.ContentLength, l.ObjectCount) + if l.ObjectCount > 0 { + l.MetricsMng.Send(err, l.Action, l.ObjectCount) + } else { + l.MetricsMng.Send(err, l.Action, l.ContentLength) + } } if err != nil { var apierr s3err.APIError @@ -2845,7 +2849,11 @@ 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 l.ObjectCount > 0 { + l.MetricsMng.Send(err, l.Action, l.ObjectCount) + } else { + l.MetricsMng.Send(err, l.Action, l.ContentLength) + } } if err != nil { if l.Logger != nil { From 50541e092148ed6934ffec838dcbfd34e440fd0a Mon Sep 17 00:00:00 2001 From: Ben McClelland Date: Tue, 28 May 2024 15:06:13 -0700 Subject: [PATCH 4/5] feat: remove unused gauge metrics and add service name option --- cmd/versitygw/main.go | 11 +++++- metrics/metrics.go | 85 ++++++++++++++----------------------------- metrics/statsd.go | 24 ++++-------- 3 files changed, 44 insertions(+), 76 deletions(-) diff --git a/cmd/versitygw/main.go b/cmd/versitygw/main.go index 2d9adeb..43ba24b 100644 --- a/cmd/versitygw/main.go +++ b/cmd/versitygw/main.go @@ -63,6 +63,7 @@ var ( iamCacheDisable bool iamCacheTTL int iamCachePrune int + metricsService string statsdServers string ) @@ -400,9 +401,16 @@ func initFlags() []cli.Flag { EnvVars: []string{"VGW_READ_ONLY"}, Destination: &readonly, }, + &cli.StringFlag{ + Name: "metrics-service-name", + Usage: "service name tag for metrics, hostname if blank", + EnvVars: []string{"VGW_METRICS_SERVICE_NAME"}, + Aliases: []string{"msn"}, + Destination: &metricsService, + }, &cli.StringFlag{ Name: "metrics-statsd-servers", - Usage: "StatsD server urls comma separated. e.g. 'statsd.example1.com:8125, statsd.example2.com:8125'", + Usage: "StatsD server urls comma separated. e.g. 'statsd1.example.com:8125,statsd2.example.com:8125'", EnvVars: []string{"VGW_METRICS_STATSD_SERVERS"}, Aliases: []string{"mss"}, Destination: &statsdServers, @@ -518,6 +526,7 @@ func runGateway(ctx context.Context, be backend.Backend) error { } metricsManager, err := metrics.NewManager(ctx, metrics.Config{ + ServiceName: metricsService, StatsdServers: statsdServers, }) if err != nil { diff --git a/metrics/metrics.go b/metrics/metrics.go index a0aad32..7ae66ea 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -41,12 +41,12 @@ type Manager struct { wg sync.WaitGroup ctx context.Context - publishers []publisher - addDataChan chan datapoint - gaugeDataChan chan datapoint + publishers []publisher + addDataChan chan datapoint } type Config struct { + ServiceName string StatsdServers string } @@ -55,24 +55,26 @@ 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) + + if conf.ServiceName == "" { + hostname, err := os.Hostname() + if err != nil { + return nil, fmt.Errorf("failed to get hostname: %w", err) + } + conf.ServiceName = hostname } addDataChan := make(chan datapoint, dataItemCount) - gaugeDataChan := make(chan datapoint, dataItemCount) mgr := &Manager{ - addDataChan: addDataChan, - gaugeDataChan: gaugeDataChan, - ctx: ctx, + addDataChan: addDataChan, + ctx: ctx, } statsdServers := strings.Split(conf.StatsdServers, ",") for _, server := range statsdServers { - statsd, err := NewStatsd(server, hostname) + statsd, err := newStatsd(server, conf.ServiceName) if err != nil { return nil, err } @@ -81,8 +83,6 @@ func NewManager(ctx context.Context, conf Config) (*Manager, error) { mgr.wg.Add(1) go mgr.addForwarder(addDataChan) - mgr.wg.Add(1) - go mgr.gaugeForwarder(gaugeDataChan) return mgr, nil } @@ -93,35 +93,35 @@ func (m *Manager) Send(err error, action string, count int64) { action = ActionUndetected } if err != nil { - m.Increment(action, "failed_count") + m.increment(action, "failed_count") } else { - m.Increment(action, "success_count") + m.increment(action, "success_count") } switch action { case ActionPutObject: - m.Add(action, "bytes_written", count) - m.Increment(action, "object_created_count") + m.add(action, "bytes_written", count) + m.increment(action, "object_created_count") case ActionCompleteMultipartUpload: - m.Increment(action, "object_created_count") + m.increment(action, "object_created_count") case ActionUploadPart: - m.Add(action, "bytes_written", count) + m.add(action, "bytes_written", count) case ActionGetObject: - m.Add(action, "bytes_read", count) + m.add(action, "bytes_read", count) case ActionDeleteObject: - m.Increment(action, "object_removed_count") + m.increment(action, "object_removed_count") case ActionDeleteObjects: - m.Add(action, "object_removed_count", count) + m.add(action, "object_removed_count", count) } } -// Increment increments the key by one -func (m *Manager) Increment(module, key string, tags ...Tag) { - m.Add(module, key, 1, tags...) +// 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 int64, tags ...Tag) { +// add adds value to key +func (m *Manager) add(module, key string, value int64, tags ...Tag) { if m.ctx.Err() != nil { return } @@ -140,31 +140,10 @@ func (m *Manager) Add(module, key string, value int64, tags ...Tag) { } } -// Gauge sets key to value -func (m *Manager) Gauge(module, key string, value int64, tags ...Tag) { - if m.ctx.Err() != nil { - return - } - - d := datapoint{ - module: module, - key: key, - value: value, - tags: tags, - } - - select { - case m.gaugeDataChan <- d: - default: - // channel full, drop the updates - } -} - // Close closes metrics channels, waits for data to complete, closes all plugins func (m *Manager) Close() { // drain the datapoint channels close(m.addDataChan) - close(m.gaugeDataChan) m.wg.Wait() // close all publishers @@ -176,7 +155,6 @@ func (m *Manager) Close() { // publisher is the interface for interacting with the metrics plugins type publisher interface { Add(module, key string, value int64, tags ...Tag) - Gauge(module, key string, value int64, tags ...Tag) Close() } @@ -189,15 +167,6 @@ func (m *Manager) addForwarder(addChan <-chan datapoint) { m.wg.Done() } -func (m *Manager) gaugeForwarder(gaugeChan <-chan datapoint) { - for data := range gaugeChan { - for _, s := range m.publishers { - s.Gauge(data.module, data.key, data.value, data.tags...) - } - } - m.wg.Done() -} - type datapoint struct { module string key string diff --git a/metrics/statsd.go b/metrics/statsd.go index ee701c2..adcc333 100644 --- a/metrics/statsd.go +++ b/metrics/statsd.go @@ -20,44 +20,34 @@ import ( "github.com/smira/go-statsd" ) -// Statsd metrics type -type Statsd struct { +// vgwStatsd metrics type +type vgwStatsd struct { c *statsd.Client } -// NewStatsd takes a server address and returns a statsd merics +// newStatsd takes a server address and returns a statsd merics // Supply service name to be used as a tag to identify the spcific // gateway instance, this may typically be the gateway hostname -func NewStatsd(server string, service string) (*Statsd, error) { +func newStatsd(server string, service string) (*vgwStatsd, error) { c := statsd.NewClient( server, - statsd.MaxPacketSize(1400), statsd.MetricPrefix("versitygw."), statsd.TagStyle(statsd.TagFormatInfluxDB), statsd.DefaultTags(statsd.StringTag("service", service)), ) - return &Statsd{c: c}, nil + return &vgwStatsd{c: c}, nil } // Close closes statsd connections -func (s *Statsd) Close() { +func (s *vgwStatsd) Close() { s.c.Close() } // Add adds value to key -func (s *Statsd) Add(module, key string, value int64, tags ...Tag) { +func (s *vgwStatsd) 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), value, stags...) } - -// Gauge sets key to value -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) - } - s.c.Gauge(fmt.Sprintf("%v.%v", module, key), int64(value), stags...) -} From bdef050231ab2bf417859fe3e20ac0ad05ba323b Mon Sep 17 00:00:00 2001 From: Ben McClelland Date: Tue, 28 May 2024 15:34:31 -0700 Subject: [PATCH 5/5] feat: add dogstats to metrics manager --- cmd/versitygw/main.go | 13 +++++++++-- go.mod | 2 ++ go.sum | 23 +++++++++++++++++++ metrics/dogstats.go | 51 +++++++++++++++++++++++++++++++++++++++++++ metrics/metrics.go | 38 ++++++++++++++++++++++++-------- 5 files changed, 116 insertions(+), 11 deletions(-) create mode 100644 metrics/dogstats.go diff --git a/cmd/versitygw/main.go b/cmd/versitygw/main.go index 43ba24b..2b3fb80 100644 --- a/cmd/versitygw/main.go +++ b/cmd/versitygw/main.go @@ -65,6 +65,7 @@ var ( iamCachePrune int metricsService string statsdServers string + dogstatsServers string ) var ( @@ -415,6 +416,13 @@ func initFlags() []cli.Flag { Aliases: []string{"mss"}, Destination: &statsdServers, }, + &cli.StringFlag{ + Name: "metrics-dogstatsd-servers", + Usage: "DogStatsD server urls comma separated. e.g. '127.0.0.1:8125,dogstats.example.com:8125'", + EnvVars: []string{"VGW_METRICS_DOGSTATS_SERVERS"}, + Aliases: []string{"mds"}, + Destination: &dogstatsServers, + }, } } @@ -526,8 +534,9 @@ func runGateway(ctx context.Context, be backend.Backend) error { } metricsManager, err := metrics.NewManager(ctx, metrics.Config{ - ServiceName: metricsService, - StatsdServers: statsdServers, + ServiceName: metricsService, + StatsdServers: statsdServers, + DogStatsdServers: dogstatsServers, }) if err != nil { return fmt.Errorf("init metrics manager: %w", err) diff --git a/go.mod b/go.mod index db619f3..da95898 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,8 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/internal v1.8.0 // indirect github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // indirect + github.com/DataDog/datadog-go/v5 v5.5.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.3 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.20.9 // indirect diff --git a/go.sum b/go.sum index ce839ac..4642ea7 100644 --- a/go.sum +++ b/go.sum @@ -12,6 +12,11 @@ github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+ github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 h1:XHOnouVk1mxXfQidrMEnLlPk9UMeRtyBTnEFtxkV0kU= github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/DataDog/datadog-go/v5 v5.5.0 h1:G5KHeB8pWBNXT4Jtw0zAkhdxEAWSpWH00geHI6LDrKU= +github.com/DataDog/datadog-go/v5 v5.5.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7VVbI0o4wBRNQIgn917usHWOd6VAffYI= github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= @@ -68,6 +73,7 @@ github.com/gofiber/fiber/v2 v2.52.4 h1:P+T+4iK7VaqUsq2PALYEfBBo6bJZ4q3FP8cZ84Egg github.com/gofiber/fiber/v2 v2.52.4/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk= github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -116,6 +122,7 @@ github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/xattr v0.4.9 h1:5883YPCtkSd8LFbs13nXplj9g9tlrwoJRjgpgMu1/fE= github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -127,11 +134,13 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/segmentio/kafka-go v0.4.47 h1:IqziR4pA3vrZq7YdRxaT3w1/5fvIH5qpCwstUanQQB0= github.com/segmentio/kafka-go v0.4.47/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smira/go-statsd v1.3.3 h1:WnMlmGTyMpzto+HvOJWRPoLaLlk5EGfzsnlQBcvj4yI= github.com/smira/go-statsd v1.3.3/go.mod h1:RjdsESPgDODtg1VpVVf9MJrEW2Hw0wtRNbmB1CAhu6A= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -156,8 +165,10 @@ github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6 github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913 h1:+qGGcbkzsfDQNPPe9UDgpxAWQrhbbBXOYJFQDq/dtJw= github.com/xrash/smetrics v0.0.0-20240312152122-5f08fbb34913/go.mod h1:4aEEwZQutDLsQv2Deui4iYQ6DWTxR14g6m8Wv88+Xqk= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= @@ -165,11 +176,14 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= @@ -180,10 +194,16 @@ golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -217,9 +237,12 @@ golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/metrics/dogstats.go b/metrics/dogstats.go new file mode 100644 index 0000000..4c3117c --- /dev/null +++ b/metrics/dogstats.go @@ -0,0 +1,51 @@ +package metrics + +import ( + "fmt" + + dogstats "github.com/DataDog/datadog-go/v5/statsd" +) + +// vgwDogStatsd metrics type +type vgwDogStatsd struct { + c *dogstats.Client +} + +var ( + rateSampleAlways = 1.0 +) + +// newDogStatsd takes a server address and returns a statsd merics +func newDogStatsd(server string, service string) (*vgwDogStatsd, error) { + c, err := dogstats.New(server, + dogstats.WithMaxMessagesPerPayload(1000), + dogstats.WithNamespace("versitygw"), + dogstats.WithTags([]string{ + "service:" + service, + })) + if err != nil { + return nil, err + } + return &vgwDogStatsd{c: c}, nil +} + +// Close closes statsd connections +func (s *vgwDogStatsd) Close() { + s.c.Close() +} + +func (t Tag) ddString() string { + if t.Value == "" { + return t.Key + } + return fmt.Sprintf("%v:%v", t.Key, t.Value) +} + +// Add adds value to key +func (s *vgwDogStatsd) Add(module, key string, value int64, tags ...Tag) { + stags := make([]string, len(tags)) + for i, t := range tags { + stags[i] = t.ddString() + } + s.c.Count(fmt.Sprintf("%v.%v", module, key), value, stags, rateSampleAlways) +} diff --git a/metrics/metrics.go b/metrics/metrics.go index 7ae66ea..b8be840 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -41,18 +41,21 @@ type Manager struct { wg sync.WaitGroup ctx context.Context + config Config + publishers []publisher addDataChan chan datapoint } type Config struct { - ServiceName string - StatsdServers string + ServiceName string + StatsdServers string + DogStatsdServers 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 { + if len(conf.StatsdServers) == 0 && len(conf.DogStatsdServers) == 0 { return nil, nil } @@ -69,16 +72,33 @@ func NewManager(ctx context.Context, conf Config) (*Manager, error) { mgr := &Manager{ addDataChan: addDataChan, ctx: ctx, + config: conf, } - statsdServers := strings.Split(conf.StatsdServers, ",") + // setup statsd endpoints + if len(conf.StatsdServers) > 0 { + statsdServers := strings.Split(conf.StatsdServers, ",") - for _, server := range statsdServers { - statsd, err := newStatsd(server, conf.ServiceName) - if err != nil { - return nil, err + for _, server := range statsdServers { + statsd, err := newStatsd(server, conf.ServiceName) + if err != nil { + return nil, err + } + mgr.publishers = append(mgr.publishers, statsd) + } + } + + // setup dogstatsd endpoints + if len(conf.DogStatsdServers) > 0 { + dogStatsdServers := strings.Split(conf.DogStatsdServers, ",") + + for _, server := range dogStatsdServers { + dogStatsd, err := newDogStatsd(server, conf.ServiceName) + if err != nil { + return nil, err + } + mgr.publishers = append(mgr.publishers, dogStatsd) } - mgr.publishers = append(mgr.publishers, statsd) } mgr.wg.Add(1)