diff --git a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h index 217b69def30..893bc1436a3 100644 --- a/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h +++ b/generated/src/aws-cpp-sdk-s3/include/aws/s3/S3PaginationBase.h @@ -5,6 +5,7 @@ #pragma once +#include #include #include #include @@ -26,6 +27,7 @@ class S3PaginationBase { */ Aws::Utils::Pagination::Paginator> ListBucketsPaginator(const Model::ListBucketsRequest& request) { + request.AddUserAgentFeature(Aws::Client::UserAgentFeature::PAGINATOR); return Aws::Utils::Pagination::Paginator>{static_cast(this), request}; @@ -37,6 +39,7 @@ class S3PaginationBase { Aws::Utils::Pagination::Paginator> ListDirectoryBucketsPaginator(const Model::ListDirectoryBucketsRequest& request) { + request.AddUserAgentFeature(Aws::Client::UserAgentFeature::PAGINATOR); return Aws::Utils::Pagination::Paginator>{ static_cast(this), request}; @@ -47,6 +50,7 @@ class S3PaginationBase { */ Aws::Utils::Pagination::Paginator> ListObjectsV2Paginator(const Model::ListObjectsV2Request& request) { + request.AddUserAgentFeature(Aws::Client::UserAgentFeature::PAGINATOR); return Aws::Utils::Pagination::Paginator>{static_cast(this), request}; @@ -57,6 +61,7 @@ class S3PaginationBase { */ Aws::Utils::Pagination::Paginator> ListPartsPaginator(const Model::ListPartsRequest& request) { + request.AddUserAgentFeature(Aws::Client::UserAgentFeature::PAGINATOR); return Aws::Utils::Pagination::Paginator>{ static_cast(this), request}; } diff --git a/src/aws-cpp-sdk-core/include/aws/core/client/UserAgent.h b/src/aws-cpp-sdk-core/include/aws/core/client/UserAgent.h index 63227053c69..fa0e50ce065 100644 --- a/src/aws-cpp-sdk-core/include/aws/core/client/UserAgent.h +++ b/src/aws-cpp-sdk-core/include/aws/core/client/UserAgent.h @@ -48,7 +48,8 @@ enum class UserAgentFeature { FLEXIBLE_CHECKSUMS_REQ_SHA512, FLEXIBLE_CHECKSUMS_REQ_XXHASH64, FLEXIBLE_CHECKSUMS_REQ_XXHASH3, - FLEXIBLE_CHECKSUMS_REQ_XXHASH128 + FLEXIBLE_CHECKSUMS_REQ_XXHASH128, + PAGINATOR }; class AWS_CORE_API UserAgent { diff --git a/src/aws-cpp-sdk-core/source/client/UserAgent.cpp b/src/aws-cpp-sdk-core/source/client/UserAgent.cpp index b764223d960..f0fb6678951 100644 --- a/src/aws-cpp-sdk-core/source/client/UserAgent.cpp +++ b/src/aws-cpp-sdk-core/source/client/UserAgent.cpp @@ -58,7 +58,8 @@ const std::pair BUSINESS_METRIC_MAPPING[] = { {UserAgentFeature::FLEXIBLE_CHECKSUMS_REQ_SHA512, "AE"}, {UserAgentFeature::FLEXIBLE_CHECKSUMS_REQ_XXHASH64, "AG"}, {UserAgentFeature::FLEXIBLE_CHECKSUMS_REQ_XXHASH3, "AF"}, - {UserAgentFeature::FLEXIBLE_CHECKSUMS_REQ_XXHASH128, "AH"} + {UserAgentFeature::FLEXIBLE_CHECKSUMS_REQ_XXHASH128, "AH"}, + {UserAgentFeature::PAGINATOR, "C"}, }; const std::pair RETRY_FEATURE_MAPPING[] = { diff --git a/tests/aws-cpp-sdk-s3-unit-tests/S3UnitTests.cpp b/tests/aws-cpp-sdk-s3-unit-tests/S3UnitTests.cpp index 057a12f995a..0194ccdeb8d 100644 --- a/tests/aws-cpp-sdk-s3-unit-tests/S3UnitTests.cpp +++ b/tests/aws-cpp-sdk-s3-unit-tests/S3UnitTests.cpp @@ -15,6 +15,7 @@ #include #include #include +#include using namespace Aws; using namespace Aws::Client; @@ -671,4 +672,36 @@ TEST_F(S3UnitTest, PartiallyConsumedStreamChecksumReuse) { EXPECT_TRUE(seenChecksum.IsSuccess()); const auto seenChecksumBase64 = base64.Encode(seenChecksum.GetResult()); EXPECT_EQ(seenChecksumBase64, expectedChecksumBase64); -} \ No newline at end of file +} + +TEST_F(S3UnitTest, ListObjectsV2PaginatorShouldHaveCMetric) { + auto request = ListObjectsV2Request().WithBucket("test-bucket"); + + auto mockRequest = Aws::MakeShared(ALLOCATION_TAG, "test-bucket.s3.amazonaws.com/", HttpMethod::HTTP_GET); + mockRequest->SetResponseStreamFactory([]() -> IOStream* { + return Aws::New(ALLOCATION_TAG, "", std::ios_base::in | std::ios_base::binary); + }); + auto mockResponse = Aws::MakeShared(ALLOCATION_TAG, mockRequest); + mockResponse->SetResponseCode(HttpResponseCode::OK); + mockResponse->GetResponseBody() << + "" + "" + "test-bucket01000false" + ""; + _mockHttpClient->AddResponseToReturn(mockResponse); + + auto paginator = _s3Client->ListObjectsV2Paginator(request); + for (const auto& outcome : paginator) { + AWS_ASSERT_SUCCESS(outcome); + } + + const auto requestSeen = _mockHttpClient->GetMostRecentHttpRequest(); + EXPECT_TRUE(requestSeen.HasUserAgent()); + const auto& userAgent = requestSeen.GetUserAgent(); + EXPECT_FALSE(userAgent.empty()); + const auto userAgentParsed = Utils::StringUtils::Split(userAgent, ' '); + + auto businessMetrics = std::find_if(userAgentParsed.begin(), userAgentParsed.end(), + [](const Aws::String& value) { return value.find("m/") != Aws::String::npos && value.find("C") != Aws::String::npos; }); + EXPECT_TRUE(businessMetrics != userAgentParsed.end()); +} diff --git a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java index 2837e368b3e..dd78fce6104 100644 --- a/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java +++ b/tools/code-generation/smithy/cpp-codegen/smithy-cpp-codegen/src/main/java/com/amazonaws/util/awsclientsmithygenerator/generators/pagination/PaginationBaseGenerator.java @@ -24,6 +24,7 @@ public PaginationBaseGenerator(ServiceShape service, List data : operations) { @@ -65,7 +66,8 @@ protected void writeSpecificContent(CppWriter writer, String serviceName) { .write(opName + "Paginator(const Model::" + methodName + "Request& request)"); writer.openBlock("{", "}", () -> { - writer.write("return Aws::Utils::Pagination::Paginator>{") + writer.write("request.AddUserAgentFeature(Aws::Client::UserAgentFeature::PAGINATOR);") + .write("return Aws::Utils::Pagination::Paginator>{") .write(" static_cast(this), request};"); }); }