Skip to content

Commit 15d4e4c

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 39f11a0 commit 15d4e4c

File tree

5 files changed

+49
-0
lines changed

5 files changed

+49
-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: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
#include <aws/core/monitoring/MonitoringFactory.h>
1212
#include <aws/core/monitoring/MonitoringManager.h>
1313
#include <aws/core/monitoring/DefaultMonitoring.h>
14+
#include <aws/core/utils/StringUtils.h>
15+
#include <aws/core/utils/memory/stl/AWSStringStream.h>
1416

1517
using namespace Aws::Client;
1618
using namespace Aws::Http;
@@ -196,6 +198,8 @@ class MonitoringTestSuite : public Aws::Testing::AwsCppSdkGTestSuite
196198
config.scheme = Scheme::HTTP;
197199
config.connectTimeoutMs = 30000;
198200
config.requestTimeoutMs = 30000;
201+
config.requestCompressionConfig.useRequestCompression = UseRequestCompression::ENABLE;
202+
config.requestCompressionConfig.requestMinCompressionSizeBytes = 10240;
199203
auto countedRetryStrategy = Aws::MakeShared<CountedRetryStrategy>(ALLOCATION_TAG);
200204
config.retryStrategy = std::static_pointer_cast<DefaultRetryStrategy>(countedRetryStrategy);
201205

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

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)