From 34ec45dc81ab1c63cf09efb5b0b6bd7809ce1a87 Mon Sep 17 00:00:00 2001 From: T Van Doren <108194999+tvdfly@users.noreply.github.com> Date: Fri, 17 Nov 2023 22:40:49 -0800 Subject: [PATCH] Add new http transport params to s3 storage driver This enables s3 storage driver users to disable keep alives `"disablekeepalives"`, disable idle connections `"disableidleconnections"`, and enable tracing for http requests `"enablehttpotel"`. Fixes #4159 Signed-off-by: T Van Doren <108194999+tvdfly@users.noreply.github.com> --- docs/content/storage-drivers/s3.md | 6 ++ go.mod | 13 ++-- go.sum | 27 ++++--- registry/storage/driver/s3-aws/s3.go | 89 ++++++++++++++++++++++- registry/storage/driver/s3-aws/s3_test.go | 64 +++++++++++----- 5 files changed, 160 insertions(+), 39 deletions(-) diff --git a/docs/content/storage-drivers/s3.md b/docs/content/storage-drivers/s3.md index 491ed5ff828..680061d3842 100644 --- a/docs/content/storage-drivers/s3.md +++ b/docs/content/storage-drivers/s3.md @@ -21,11 +21,17 @@ Amazon S3 or S3 compatible services for object storage. | `keyid` | no | Optional KMS key ID to use for encryption (encrypt must be true, or this parameter is ignored). The default is `none`. | | `secure` | no | Indicates whether to use HTTPS instead of HTTP. A boolean value. The default is `true`. | | `skipverify` | no | Skips TLS verification when the value is set to `true`. The default is `false`. | +| `disablekeepalives` | no | Disables HTTP keep-alives on the HTTP tranport when `true`. Each connection to the server will be used for a single HTTP request. The default is `false`. | +| `disableidleconnections` | no | Disables idle HTTP connections on the HTTP transport when `true`. The default is `false`. | | `v4auth` | no | Indicates whether the registry uses Version 4 of AWS's authentication. The default is `true`. | | `chunksize` | no | The S3 API requires multipart upload chunks to be at least 5MB. This value should be a number that is larger than 5 * 1024 * 1024.| | `rootdirectory` | no | This is a prefix that is applied to all S3 keys to allow you to segment data in your bucket if necessary. | | `storageclass` | no | The S3 storage class applied to each registry file. The default is `STANDARD`. | | `objectacl` | no | The S3 Canned ACL for objects. The default value is "private". | +| `usedualstack` | no | Use AWS S3 dual-stack endpoints, which support both IPv6 and IPv4, when set to `true`. The default is `false`. | +| `multipartcombinesmallpart` | no | Combines small pending uploads with the ready part when `true`. The default is `true`. | +| `accelerate` | no | Use AWS S3 Transfer Acceleration endpoints when set to `true`. The default is `false`. | +| `enablehttpotel` | no | Wraps the HTTP transport with [otelhttp](https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp) when `true`. This will generate spans for each HTTP request. The default is `false`. | | `loglevel` | no | The log level for the S3 client. The default value is `off`. | > **Note** You can provide empty strings for your access and secret keys to run the driver diff --git a/go.mod b/go.mod index b32650d65b8..4defb82fdce 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/redis/go-redis/v9 v9.1.0 github.com/sirupsen/logrus v1.8.1 github.com/spf13/cobra v1.6.1 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 golang.org/x/crypto v0.14.0 golang.org/x/oauth2 v0.7.0 google.golang.org/api v0.114.0 @@ -45,13 +46,13 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/felixge/httpsnoop v1.0.1 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/golang/protobuf v1.5.3 // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.7.1 // indirect github.com/hashicorp/golang-lru/v2 v2.0.5 // indirect @@ -69,9 +70,9 @@ require ( github.com/redis/go-redis/extra/rediscmd/v9 v9.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel v1.21.0 // indirect + go.opentelemetry.io/otel/metric v1.21.0 // indirect + go.opentelemetry.io/otel/trace v1.21.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.13.0 // indirect golang.org/x/text v0.13.0 // indirect diff --git a/go.sum b/go.sum index 09a5d721f3b..497c1d6eb70 100644 --- a/go.sum +++ b/go.sum @@ -106,8 +106,9 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/felixge/httpsnoop v1.0.1 h1:lvB5Jl89CsZtGIWuTcDM1E/vkVs49/Ml7JJe07l8SPQ= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= +github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -120,8 +121,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= +github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -171,8 +172,8 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +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/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -314,7 +315,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ 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= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -326,13 +327,15 @@ go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= +go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= +go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= +go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= +go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= diff --git a/registry/storage/driver/s3-aws/s3.go b/registry/storage/driver/s3-aws/s3.go index 8092bb7ef68..bb1d37d42a0 100644 --- a/registry/storage/driver/s3-aws/s3.go +++ b/registry/storage/driver/s3-aws/s3.go @@ -40,6 +40,7 @@ import ( storagedriver "github.com/distribution/distribution/v3/registry/storage/driver" "github.com/distribution/distribution/v3/registry/storage/driver/base" "github.com/distribution/distribution/v3/registry/storage/driver/factory" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" ) const driverName = "s3aws" @@ -106,6 +107,8 @@ type DriverParameters struct { KeyID string Secure bool SkipVerify bool + DisableKeepAlives bool + DisableIdleConnections bool V4Auth bool ChunkSize int64 MultipartCopyChunkSize int64 @@ -119,6 +122,7 @@ type DriverParameters struct { SessionToken string UseDualStack bool Accelerate bool + EnableHttpOtel bool LogLevel aws.LogLevelType } @@ -292,6 +296,40 @@ func FromParameters(ctx context.Context, parameters map[string]interface{}) (*Dr return nil, fmt.Errorf("the skipVerify parameter should be a boolean") } + disableKeepAlivesBool := false + disableKeepAlives := parameters["disablekeepalives"] + switch disableKeepAlives := disableKeepAlives.(type) { + case string: + b, err := strconv.ParseBool(disableKeepAlives) + if err != nil { + return nil, fmt.Errorf("the disablekeepalives parameter should be a boolean") + } + disableKeepAlivesBool = b + case bool: + disableKeepAlivesBool = disableKeepAlives + case nil: + // do nothing + default: + return nil, fmt.Errorf("the disablekeepalives parameter should be a boolean") + } + + disableIdleConnectionsBool := false + disableIdleConnections := parameters["disableidleconnections"] + switch disableIdleConnections := disableIdleConnections.(type) { + case string: + b, err := strconv.ParseBool(disableIdleConnections) + if err != nil { + return nil, fmt.Errorf("the disableidleconnections parameter should be a boolean") + } + disableIdleConnectionsBool = b + case bool: + disableIdleConnectionsBool = disableIdleConnections + case nil: + // do nothing + default: + return nil, fmt.Errorf("the disableidleconnections parameter should be a boolean") + } + v4Bool := true v4auth := parameters["v4auth"] switch v4auth := v4auth.(type) { @@ -441,6 +479,24 @@ func FromParameters(ctx context.Context, parameters map[string]interface{}) (*Dr return nil, fmt.Errorf("the accelerate parameter should be a boolean") } + // EnableHttpOtel + enableHttpOtelBool := false + enableHttpOtel := parameters["enablehttpotel"] + switch enableHttpOtel := enableHttpOtel.(type) { + case string: + b, err := strconv.ParseBool(enableHttpOtel) + if err != nil { + return nil, fmt.Errorf("the enablehttpotel parameter should be a boolean") + } + enableHttpOtelBool = b + case bool: + enableHttpOtelBool = enableHttpOtel + case nil: + // do nothing + default: + return nil, fmt.Errorf("the enablehttpotel parameter should be a boolean") + } + params := DriverParameters{ fmt.Sprint(accessKey), fmt.Sprint(secretKey), @@ -452,6 +508,8 @@ func FromParameters(ctx context.Context, parameters map[string]interface{}) (*Dr fmt.Sprint(keyID), secureBool, skipVerifyBool, + disableKeepAlivesBool, + disableIdleConnectionsBool, v4Bool, chunkSize, multipartCopyChunkSize, @@ -465,6 +523,7 @@ func FromParameters(ctx context.Context, parameters map[string]interface{}) (*Dr fmt.Sprint(sessionToken), useDualStackBool, accelerateBool, + enableHttpOtelBool, getS3LogLevelFromParam(parameters["loglevel"]), } @@ -559,12 +618,34 @@ func New(ctx context.Context, params DriverParameters) (*Driver, error) { awsConfig.UseDualStackEndpoint = endpoints.DualStackEndpointStateEnabled } + httpTransportModified := false + httpTransport := &http.Transport{} + if params.SkipVerify { - httpTransport := &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, - } + httpTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} + httpTransportModified = true + } + + if params.DisableKeepAlives { + httpTransport.DisableKeepAlives = true + httpTransportModified = true + } + + if params.DisableIdleConnections { + httpTransport.MaxIdleConnsPerHost = -1 + httpTransportModified = true + } + + var httpRoundTripper http.RoundTripper = httpTransport + + if params.EnableHttpOtel { + httpRoundTripper = otelhttp.NewTransport(httpTransport) + httpTransportModified = true + } + + if httpTransportModified { awsConfig.WithHTTPClient(&http.Client{ - Transport: httpTransport, + Transport: httpRoundTripper, }) } diff --git a/registry/storage/driver/s3-aws/s3_test.go b/registry/storage/driver/s3-aws/s3_test.go index 5568ac86532..3e545e3526c 100644 --- a/registry/storage/driver/s3-aws/s3_test.go +++ b/registry/storage/driver/s3-aws/s3_test.go @@ -29,23 +29,26 @@ var ( func init() { var ( - accessKey = os.Getenv("AWS_ACCESS_KEY") - secretKey = os.Getenv("AWS_SECRET_KEY") - bucket = os.Getenv("S3_BUCKET") - encrypt = os.Getenv("S3_ENCRYPT") - keyID = os.Getenv("S3_KEY_ID") - secure = os.Getenv("S3_SECURE") - skipVerify = os.Getenv("S3_SKIP_VERIFY") - v4Auth = os.Getenv("S3_V4_AUTH") - region = os.Getenv("AWS_REGION") - objectACL = os.Getenv("S3_OBJECT_ACL") - regionEndpoint = os.Getenv("REGION_ENDPOINT") - forcePathStyle = os.Getenv("AWS_S3_FORCE_PATH_STYLE") - sessionToken = os.Getenv("AWS_SESSION_TOKEN") - useDualStack = os.Getenv("S3_USE_DUALSTACK") - combineSmallPart = os.Getenv("MULTIPART_COMBINE_SMALL_PART") - accelerate = os.Getenv("S3_ACCELERATE") - logLevel = os.Getenv("S3_LOGLEVEL") + accessKey = os.Getenv("AWS_ACCESS_KEY") + secretKey = os.Getenv("AWS_SECRET_KEY") + bucket = os.Getenv("S3_BUCKET") + encrypt = os.Getenv("S3_ENCRYPT") + keyID = os.Getenv("S3_KEY_ID") + secure = os.Getenv("S3_SECURE") + skipVerify = os.Getenv("S3_SKIP_VERIFY") + disableKeepAlives = os.Getenv("S3_DISABLE_KEEP_ALIVES") + disableIdleConnections = os.Getenv("S3_DISABLE_IDLE_CONNECTIONS") + v4Auth = os.Getenv("S3_V4_AUTH") + region = os.Getenv("AWS_REGION") + objectACL = os.Getenv("S3_OBJECT_ACL") + regionEndpoint = os.Getenv("REGION_ENDPOINT") + forcePathStyle = os.Getenv("AWS_S3_FORCE_PATH_STYLE") + sessionToken = os.Getenv("AWS_SESSION_TOKEN") + useDualStack = os.Getenv("S3_USE_DUALSTACK") + combineSmallPart = os.Getenv("MULTIPART_COMBINE_SMALL_PART") + accelerate = os.Getenv("S3_ACCELERATE") + enableHttpOtel = os.Getenv("S3_ENABLE_HTTP_OTEL") + logLevel = os.Getenv("S3_LOGLEVEL") ) root, err := os.MkdirTemp("", "driver-") @@ -79,6 +82,22 @@ func init() { } } + disableKeepAlivesBool := false + if disableKeepAlives != "" { + disableKeepAlivesBool, err = strconv.ParseBool(disableKeepAlives) + if err != nil { + return nil, err + } + } + + disableIdleConnectionsBool := false + if disableIdleConnections != "" { + disableIdleConnectionsBool, err = strconv.ParseBool(disableIdleConnections) + if err != nil { + return nil, err + } + } + v4Bool := true if v4Auth != "" { v4Bool, err = strconv.ParseBool(v4Auth) @@ -115,6 +134,14 @@ func init() { } } + enableHttpOtelBool := false + if enableHttpOtel != "" { + enableHttpOtelBool, err = strconv.ParseBool(enableHttpOtel) + if err != nil { + return nil, err + } + } + parameters := DriverParameters{ accessKey, secretKey, @@ -126,6 +153,8 @@ func init() { keyID, secureBool, skipVerifyBool, + disableKeepAlivesBool, + disableIdleConnectionsBool, v4Bool, minChunkSize, defaultMultipartCopyChunkSize, @@ -139,6 +168,7 @@ func init() { sessionToken, useDualStackBool, accelerateBool, + enableHttpOtelBool, getS3LogLevelFromParam(logLevel), }