diff --git a/lib/events/s3sessions/s3handler.go b/lib/events/s3sessions/s3handler.go index 6b9da90ca8db6..c4f48ff203f73 100644 --- a/lib/events/s3sessions/s3handler.go +++ b/lib/events/s3sessions/s3handler.go @@ -48,6 +48,7 @@ import ( "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/modules" awsmetrics "github.com/gravitational/teleport/lib/observability/metrics/aws" + s3metrics "github.com/gravitational/teleport/lib/observability/metrics/s3" "github.com/gravitational/teleport/lib/session" awsutils "github.com/gravitational/teleport/lib/utils/aws" "github.com/gravitational/teleport/lib/utils/aws/endpoint" @@ -197,7 +198,10 @@ func NewHandler(ctx context.Context, cfg Config) (*Handler, error) { opts = append(opts, config.WithCredentialsProvider(cfg.CredentialsProvider)) } - opts = append(opts, config.WithAPIOptions(awsmetrics.MetricsMiddleware())) + opts = append(opts, + config.WithAPIOptions(awsmetrics.MetricsMiddleware()), + config.WithAPIOptions(s3metrics.MetricsMiddleware()), + ) resolver, err := endpoint.NewLoggingResolver( s3.NewDefaultEndpointResolverV2(), diff --git a/lib/observability/metrics/s3/manager.go b/lib/observability/metrics/s3/manager.go deleted file mode 100644 index 324141f6b7b2d..0000000000000 --- a/lib/observability/metrics/s3/manager.go +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Teleport - * Copyright (C) 2023 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package s3 - -import ( - "context" - "io" - "time" - - "github.com/aws/aws-sdk-go/service/s3" - "github.com/aws/aws-sdk-go/service/s3/s3manager" - "github.com/aws/aws-sdk-go/service/s3/s3manager/s3manageriface" - "github.com/gravitational/trace" - - "github.com/gravitational/teleport/lib/observability/metrics" -) - -type UploadAPIMetrics struct { - s3manageriface.UploaderAPI -} - -func NewUploadAPIMetrics(api s3manageriface.UploaderAPI) (*UploadAPIMetrics, error) { - if err := metrics.RegisterPrometheusCollectors(s3Collectors...); err != nil { - return nil, trace.Wrap(err) - } - - return &UploadAPIMetrics{UploaderAPI: api}, nil -} - -func (m *UploadAPIMetrics) UploadWithContext(ctx context.Context, input *s3manager.UploadInput, opts ...func(*s3manager.Uploader)) (*s3manager.UploadOutput, error) { - start := time.Now() - output, err := m.UploaderAPI.UploadWithContext(ctx, input, opts...) - - recordMetrics("upload", err, time.Since(start).Seconds()) - - return output, err -} - -type DownloadAPIMetrics struct { - s3manageriface.DownloaderAPI -} - -func NewDownloadAPIMetrics(api s3manageriface.DownloaderAPI) (*DownloadAPIMetrics, error) { - if err := metrics.RegisterPrometheusCollectors(s3Collectors...); err != nil { - return nil, trace.Wrap(err) - } - - return &DownloadAPIMetrics{DownloaderAPI: api}, nil -} - -func (m *DownloadAPIMetrics) DownloadWithContext(ctx context.Context, w io.WriterAt, input *s3.GetObjectInput, opts ...func(*s3manager.Downloader)) (int64, error) { - start := time.Now() - n, err := m.DownloaderAPI.DownloadWithContext(ctx, w, input, opts...) - - recordMetrics("download", err, time.Since(start).Seconds()) - - return n, err -} diff --git a/lib/observability/metrics/s3/s3.go b/lib/observability/metrics/s3/s3.go index a803fc587078b..eb738f47ee97c 100644 --- a/lib/observability/metrics/s3/s3.go +++ b/lib/observability/metrics/s3/s3.go @@ -25,6 +25,8 @@ import ( awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" "github.com/aws/smithy-go/middleware" "github.com/prometheus/client_golang/prometheus" + + "github.com/gravitational/teleport/lib/observability/metrics" ) var ( @@ -52,24 +54,10 @@ var ( }, []string{"operation"}, ) - - s3Collectors = []prometheus.Collector{ - apiRequestsTotal, - apiRequests, - apiRequestLatencies, - } ) -// recordMetrics updates the set of s3 api metrics -func recordMetrics(operation string, err error, latency float64) { - apiRequestLatencies.WithLabelValues(operation).Observe(latency) - apiRequestsTotal.WithLabelValues(operation).Inc() - - result := "success" - if err != nil { - result = "error" - } - apiRequests.WithLabelValues(operation, result).Inc() +func init() { + _ = metrics.RegisterPrometheusCollectors(apiRequests, apiRequestsTotal, apiRequestLatencies) } // MetricsMiddleware returns middleware that can be used to capture @@ -97,13 +85,12 @@ func MetricsMiddleware() []func(stack *middleware.Stack) error { } then := ctx.Value(timestampKey{}).(time.Time) - service := awsmiddleware.GetServiceID(ctx) operation := awsmiddleware.GetOperationName(ctx) latency := time.Since(then).Seconds() - apiRequestsTotal.WithLabelValues(service, operation).Inc() - apiRequestLatencies.WithLabelValues(service, operation).Observe(latency) - apiRequests.WithLabelValues(service, operation, result).Inc() + apiRequestsTotal.WithLabelValues(operation).Inc() + apiRequestLatencies.WithLabelValues(operation).Observe(latency) + apiRequests.WithLabelValues(operation, result).Inc() return out, md, err }), middleware.After)