Skip to content

Commit 24269f0

Browse files
committed
feat: add gzip compression tracking to User-Agent metrics
- Add test to verify 'L' metric appears in User-Agent when gzip compression is used - Enable compression in test setup and mock client - Validate business metrics tracking for request compression feature
1 parent d268c70 commit 24269f0

File tree

5 files changed

+47
-0
lines changed

5 files changed

+47
-0
lines changed

src/aws-cpp-sdk-core/include/aws/core/client/UserAgent.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ enum class UserAgentFeature {
3131
ACCOUNT_ID_MODE_DISABLED,
3232
ACCOUNT_ID_MODE_REQUIRED,
3333
RESOLVED_ACCOUNT_ID,
34+
GZIP_REQUEST_COMPRESSION,
3435
};
3536

3637
class AWS_CORE_API UserAgent {

src/aws-cpp-sdk-core/source/client/AWSClient.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -910,6 +910,9 @@ void AWSClient::BuildHttpRequest(const Aws::AmazonWebServiceRequest& request, co
910910
if (compressOutcome.IsSuccess()) {
911911
Aws::String compressionAlgorithmId = Aws::Client::GetCompressionAlgorithmId(selectedCompressionAlgorithm);
912912
AppendHeaderValueToRequest(httpRequest, CONTENT_ENCODING_HEADER, compressionAlgorithmId);
913+
if (selectedCompressionAlgorithm == Aws::Client::CompressionAlgorithm::GZIP) {
914+
request.AddUserAgentFeature(Aws::Client::UserAgentFeature::GZIP_REQUEST_COMPRESSION);
915+
}
913916
AddContentBodyToRequest(
914917
httpRequest, compressOutcome.GetResult(),
915918
request.ShouldComputeContentMd5(),

src/aws-cpp-sdk-core/source/client/UserAgent.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const std::pair<UserAgentFeature, const char*> BUSINESS_METRIC_MAPPING[] = {
4141
{UserAgentFeature::ACCOUNT_ID_MODE_DISABLED , "Q"},
4242
{UserAgentFeature::ACCOUNT_ID_MODE_REQUIRED, "R"},
4343
{UserAgentFeature::RESOLVED_ACCOUNT_ID, "T"},
44+
{UserAgentFeature::GZIP_REQUEST_COMPRESSION, "L"},
4445
};
4546

4647
Aws::String BusinessMetricForFeature(UserAgentFeature feature) {

tests/aws-cpp-sdk-core-tests/monitoring/MonitoringTest.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,8 @@ class MonitoringTestSuite : public Aws::Testing::AwsCppSdkGTestSuite
196196
config.scheme = Scheme::HTTP;
197197
config.connectTimeoutMs = 30000;
198198
config.requestTimeoutMs = 30000;
199+
config.requestCompressionConfig.useRequestCompression = UseRequestCompression::ENABLE;
200+
config.requestCompressionConfig.requestMinCompressionSizeBytes = 10240;
199201
auto countedRetryStrategy = Aws::MakeShared<CountedRetryStrategy>(ALLOCATION_TAG);
200202
config.retryStrategy = std::static_pointer_cast<DefaultRetryStrategy>(countedRetryStrategy);
201203

@@ -330,3 +332,31 @@ TEST_F(MonitoringTestSuite, TestHttpClientMetrics)
330332
ASSERT_STREQ("SslLatency", GetHttpClientMetricNameByType(HttpClientMetricsType::SslLatency).c_str());
331333
ASSERT_STREQ("Unknown", GetHttpClientMetricNameByType(HttpClientMetricsType::Unknown).c_str());
332334
}
335+
336+
TEST_F(MonitoringTestSuite, TestUserAgentCompressionTracking)
337+
{
338+
HeaderValueCollection responseHeaders;
339+
AmazonWebServiceRequestMock request;
340+
341+
// Create large request body to trigger compression
342+
std::string largeBody(20000, 'A');
343+
auto bodyStream = Aws::MakeShared<Aws::StringStream>(ALLOCATION_TAG);
344+
*bodyStream << largeBody;
345+
request.SetBody(bodyStream);
346+
347+
QueueMockResponse(HttpResponseCode::OK, responseHeaders);
348+
const auto outcome = client->MakeRequest(request);
349+
AWS_ASSERT_SUCCESS(outcome);
350+
351+
const auto requestSeen = mockHttpClient->GetMostRecentHttpRequest();
352+
EXPECT_TRUE(requestSeen.HasUserAgent());
353+
const auto& userAgent = requestSeen.GetUserAgent();
354+
EXPECT_TRUE(!userAgent.empty());
355+
const auto userAgentParsed = Aws::Utils::StringUtils::Split(userAgent, ' ');
356+
357+
// Check for gzip compression business metric (L) in user agent
358+
auto businessMetrics = std::find_if(userAgentParsed.begin(), userAgentParsed.end(),
359+
[](const Aws::String& value) { return value.find("m/") != Aws::String::npos && value.find("L") != Aws::String::npos; });
360+
EXPECT_TRUE(businessMetrics != userAgentParsed.end());
361+
}
362+

tests/testing-resources/include/aws/testing/mocks/aws/client/MockAWSClient.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ class AmazonWebServiceRequestMock : public Aws::AmazonWebServiceRequest
5454
auto bodyString = ss.str();
5555
return bodyString.find("TestErrorInBodyOfResponse") != std::string::npos;
5656
}
57+
58+
Aws::Client::CompressionAlgorithm GetSelectedCompressionAlgorithm(Aws::Client::RequestCompressionConfig config) const override {
59+
if (config.useRequestCompression == Aws::Client::UseRequestCompression::ENABLE && m_body) {
60+
m_body->seekg(0, m_body->end);
61+
size_t bodySize = m_body->tellg();
62+
m_body->seekg(0, m_body->beg);
63+
if (bodySize >= config.requestMinCompressionSizeBytes) {
64+
return Aws::Client::CompressionAlgorithm::GZIP;
65+
}
66+
}
67+
return Aws::Client::CompressionAlgorithm::NONE;
68+
}
5769

5870
private:
5971
std::shared_ptr<Aws::IOStream> m_body;

0 commit comments

Comments
 (0)