Skip to content

Commit 84218cb

Browse files
committed
feat: Add environment credentials feature tracking to User-Agent
- Add CREDENTIALS_ENV_VARS enum to UserAgentFeature with metric ID 'g' - Track environment credentials usage in AWSClient::AttemptOneRequest - Check for AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY presence - Implements env-credentials SEP specification for business metrics - Add unit test for environment credentials feature tracking Resolves environment credentials tracking for User-Agent 2.1 business metrics.
1 parent 6b6b715 commit 84218cb

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,11 @@ namespace Aws
336336
*/
337337
static void AppendRecursionDetectionHeader(std::shared_ptr<Aws::Http::HttpRequest> ioRequest);
338338

339+
/**
340+
* Track credential provider usage and add User-Agent features.
341+
*/
342+
void TrackCredentialProviderUsage(const Aws::AmazonWebServiceRequest& request) const;
343+
339344
static CoreErrors GuessBodylessErrorType(Aws::Http::HttpResponseCode responseCode);
340345
static bool DoesResponseGenerateError(const std::shared_ptr<Aws::Http::HttpResponse>& response);
341346
std::shared_ptr<smithy::components::tracing::TelemetryProvider> m_telemetryProvider;

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

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
#include <aws/core/Version.h>
4444
#include <aws/core/platform/Environment.h>
4545
#include <aws/core/platform/OSVersionInfo.h>
46+
#include <aws/core/auth/AWSCredentialsProviderChain.h>
47+
#include <typeinfo>
4648

4749
#include <smithy/tracing/TracingUtils.h>
4850
#include <smithy/client/features/ChecksumInterceptor.h>
@@ -582,6 +584,9 @@ HttpResponseOutcome AWSClient::AttemptOneRequest(const std::shared_ptr<Aws::Http
582584
}
583585
}
584586

587+
// Track credential provider usage for User-Agent features
588+
TrackCredentialProviderUsage(request);
589+
585590
auto signer = GetSignerByName(signerName);
586591
auto signedRequest = TracingUtils::MakeCallWithTiming<bool>([&]() -> bool {
587592
return signer->SignRequest(*httpRequest, signerRegionOverride, signerServiceNameOverride, true);
@@ -912,7 +917,7 @@ void AWSClient::BuildHttpRequest(const Aws::AmazonWebServiceRequest& request, co
912917
if (Aws::Client::CompressionAlgorithm::NONE != selectedCompressionAlgorithm) {
913918
Aws::Client::RequestCompression rc;
914919
auto compressOutcome = rc.compress(request.GetBody(), selectedCompressionAlgorithm);
915-
920+
// TODO: is this successful -- its not
916921
if (compressOutcome.IsSuccess()) {
917922
Aws::String compressionAlgorithmId = Aws::Client::GetCompressionAlgorithmId(selectedCompressionAlgorithm);
918923
AppendHeaderValueToRequest(httpRequest, CONTENT_ENCODING_HEADER, compressionAlgorithmId);
@@ -1068,4 +1073,42 @@ void AWSClient::AppendRecursionDetectionHeader(std::shared_ptr<Aws::Http::HttpRe
10681073
xAmznTraceIdVal = xAmznTraceIdValEncodedStr.str();
10691074

10701075
ioRequest->SetHeaderValue(Aws::Http::X_AMZN_TRACE_ID_HEADER, xAmznTraceIdVal);
1076+
}
1077+
1078+
void AWSClient::TrackCredentialProviderUsage(const Aws::AmazonWebServiceRequest& request) const
1079+
{
1080+
auto credentialsProvider = GetCredentialsProvider();
1081+
if (!credentialsProvider)
1082+
{
1083+
return;
1084+
}
1085+
1086+
// Check if using environment credentials
1087+
const auto& provider = *credentialsProvider;
1088+
const std::type_info& providerType = typeid(provider);
1089+
1090+
if (providerType == typeid(Aws::Auth::DefaultAWSCredentialsProviderChain))
1091+
{
1092+
// For provider chains, we need to check which provider was actually used
1093+
auto providerChain = std::dynamic_pointer_cast<Aws::Auth::DefaultAWSCredentialsProviderChain>(credentialsProvider);
1094+
if (providerChain)
1095+
{
1096+
// Check if environment variables are set (indicating env provider usage)
1097+
if (!Aws::Environment::GetEnv("AWS_ACCESS_KEY_ID").empty())
1098+
{
1099+
// Environment credentials are being used
1100+
request.AddUserAgentFeature(Aws::Client::UserAgentFeature::CREDENTIALS_ENV_VARS);
1101+
AWS_LOGSTREAM_DEBUG(AWS_CLIENT_LOG_TAG, "Added CREDENTIALS_ENV_VARS to User-Agent");
1102+
}
1103+
// Add other providers
1104+
}
1105+
}
1106+
// direct provider usage
1107+
else if (providerType == typeid(Aws::Auth::EnvironmentAWSCredentialsProvider))
1108+
{
1109+
// Direct environment provider usage
1110+
request.AddUserAgentFeature(Aws::Client::UserAgentFeature::CREDENTIALS_ENV_VARS);
1111+
AWS_LOGSTREAM_DEBUG(AWS_CLIENT_LOG_TAG, "Added CREDENTIALS_ENV_VARS to User-Agent");
1112+
}
1113+
// Add more provider types as needed
10711114
}

0 commit comments

Comments
 (0)