Skip to content

Commit 6a7b812

Browse files
committed
Move credentials business metrics to credentials attributes
1 parent 03ca91f commit 6a7b812

29 files changed

+445
-268
lines changed

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/auth/credentials/DefaultChainCredentialsProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ package aws.sdk.kotlin.runtime.auth.credentials
77

88
import aws.sdk.kotlin.runtime.config.AwsSdkSetting
99
import aws.sdk.kotlin.runtime.config.imds.ImdsClient
10-
import aws.sdk.kotlin.runtime.http.interceptors.AwsBusinessMetric
10+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.AwsBusinessMetric
1111
import aws.smithy.kotlin.runtime.auth.awscredentials.*
1212
import aws.smithy.kotlin.runtime.collections.Attributes
1313
import aws.smithy.kotlin.runtime.http.engine.DefaultHttpEngine

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/auth/credentials/EcsCredentialsProvider.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ package aws.sdk.kotlin.runtime.auth.credentials
77

88
import aws.sdk.kotlin.runtime.auth.credentials.internal.credentials
99
import aws.sdk.kotlin.runtime.config.AwsSdkSetting
10-
import aws.sdk.kotlin.runtime.http.interceptors.AwsBusinessMetric
10+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.AwsBusinessMetric
11+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.emitBusinessMetric
1112
import aws.smithy.kotlin.runtime.ErrorMetadata
1213
import aws.smithy.kotlin.runtime.auth.awscredentials.*
13-
import aws.smithy.kotlin.runtime.businessmetrics.emitBusinessMetric
1414
import aws.smithy.kotlin.runtime.client.endpoints.Endpoint
1515
import aws.smithy.kotlin.runtime.collections.Attributes
1616
import aws.smithy.kotlin.runtime.config.resolve
@@ -113,9 +113,7 @@ public class EcsCredentialsProvider(
113113

114114
logger.debug { "obtained credentials from container metadata service; expiration=${creds.expiration?.format(TimestampFormat.ISO_8601)}" }
115115

116-
return creds.also {
117-
attributes.emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_HTTP)
118-
}
116+
return creds.emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_HTTP)
119117
}
120118

121119
private suspend fun loadAuthToken(): String? {

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/auth/credentials/EnvironmentCredentialsProvider.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@ package aws.sdk.kotlin.runtime.auth.credentials
77

88
import aws.sdk.kotlin.runtime.auth.credentials.internal.credentials
99
import aws.sdk.kotlin.runtime.config.AwsSdkSetting
10-
import aws.sdk.kotlin.runtime.http.interceptors.AwsBusinessMetric
10+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.AwsBusinessMetric
11+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.emitBusinessMetric
1112
import aws.smithy.kotlin.runtime.auth.awscredentials.Credentials
1213
import aws.smithy.kotlin.runtime.auth.awscredentials.CredentialsProvider
1314
import aws.smithy.kotlin.runtime.auth.awscredentials.simpleClassName
14-
import aws.smithy.kotlin.runtime.businessmetrics.emitBusinessMetric
1515
import aws.smithy.kotlin.runtime.collections.Attributes
1616
import aws.smithy.kotlin.runtime.telemetry.logging.trace
1717
import aws.smithy.kotlin.runtime.util.PlatformProvider
@@ -45,9 +45,7 @@ public class EnvironmentCredentialsProvider(
4545
sessionToken = getEnv(SESSION_TOKEN),
4646
providerName = PROVIDER_NAME,
4747
accountId = getEnv(ACCOUNT_ID),
48-
).also {
49-
attributes.emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_ENV_VARS)
50-
}
48+
).emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_ENV_VARS)
5149
}
5250

5351
override fun toString(): String = this.simpleClassName

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/auth/credentials/ImdsCredentialsProvider.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import aws.sdk.kotlin.runtime.config.AwsSdkSetting
99
import aws.sdk.kotlin.runtime.config.imds.EC2MetadataError
1010
import aws.sdk.kotlin.runtime.config.imds.ImdsClient
1111
import aws.sdk.kotlin.runtime.config.imds.InstanceMetadataProvider
12-
import aws.sdk.kotlin.runtime.http.interceptors.AwsBusinessMetric
12+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.AwsBusinessMetric
13+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.emitBusinessMetric
1314
import aws.smithy.kotlin.runtime.auth.awscredentials.*
14-
import aws.smithy.kotlin.runtime.businessmetrics.emitBusinessMetric
1515
import aws.smithy.kotlin.runtime.collections.Attributes
1616
import aws.smithy.kotlin.runtime.config.resolve
1717
import aws.smithy.kotlin.runtime.http.HttpStatusCode
@@ -108,11 +108,10 @@ public class ImdsCredentialsProvider(
108108
resp.sessionToken,
109109
resp.expiration,
110110
PROVIDER_NAME,
111-
)
111+
).emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_IMDS)
112112

113113
creds.also {
114114
mu.withLock { previousCredentials = it }
115-
attributes.emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_IMDS)
116115
}
117116
}
118117
is JsonCredentialsResponse.Error -> {
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package aws.sdk.kotlin.runtime.auth.credentials
22

3+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.emitBusinessMetric
34
import aws.smithy.kotlin.runtime.auth.awscredentials.Credentials
45
import aws.smithy.kotlin.runtime.auth.awscredentials.CredentialsProvider
56
import aws.smithy.kotlin.runtime.businessmetrics.BusinessMetric
6-
import aws.smithy.kotlin.runtime.businessmetrics.emitBusinessMetric
77
import aws.smithy.kotlin.runtime.collections.Attributes
88

99
/**
@@ -17,15 +17,16 @@ import aws.smithy.kotlin.runtime.collections.Attributes
1717
*/
1818
public class LazilyInitializedCredentialsProvider(
1919
private val providerName: String = "LazilyInitializedCredentialsProvider",
20-
private val businessMetric: BusinessMetric,
20+
private val businessMetric: BusinessMetric? = null,
2121
initializer: () -> CredentialsProvider,
2222
) : CredentialsProvider {
2323
private val provider = lazy(initializer)
2424

25-
override suspend fun resolve(attributes: Attributes): Credentials =
26-
provider.value.resolve(attributes).also {
27-
attributes.emitBusinessMetric(businessMetric)
28-
}
25+
override suspend fun resolve(attributes: Attributes): Credentials {
26+
val credentials = provider.value.resolve(attributes)
27+
if (businessMetric == null) return credentials
28+
return credentials.emitBusinessMetric(businessMetric)
29+
}
2930

3031
override fun toString(): String = providerName
3132
}

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/auth/credentials/ProcessCredentialsProvider.kt

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,9 @@
55
package aws.sdk.kotlin.runtime.auth.credentials
66

77
import aws.sdk.kotlin.runtime.auth.credentials.internal.credentials
8-
import aws.sdk.kotlin.runtime.http.interceptors.AwsBusinessMetric
9-
import aws.smithy.kotlin.runtime.auth.awscredentials.Credentials
10-
import aws.smithy.kotlin.runtime.auth.awscredentials.CredentialsProvider
11-
import aws.smithy.kotlin.runtime.auth.awscredentials.CredentialsProviderException
12-
import aws.smithy.kotlin.runtime.auth.awscredentials.simpleClassName
13-
import aws.smithy.kotlin.runtime.businessmetrics.emitBusinessMetric
8+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.AwsBusinessMetric
9+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.emitBusinessMetric
10+
import aws.smithy.kotlin.runtime.auth.awscredentials.*
1411
import aws.smithy.kotlin.runtime.collections.Attributes
1512
import aws.smithy.kotlin.runtime.serde.json.JsonDeserializer
1613
import aws.smithy.kotlin.runtime.telemetry.logging.logger
@@ -78,9 +75,7 @@ public class ProcessCredentialsProvider(
7875
resp.expiration ?: Instant.MAX_VALUE,
7976
PROVIDER_NAME,
8077
resp.accountId,
81-
).also {
82-
attributes.emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_PROCESS)
83-
}
78+
).emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_PROCESS)
8479
}
8580
else -> throw CredentialsProviderException("Credentials response was not of expected format")
8681
}

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/auth/credentials/ProfileCredentialsProvider.kt

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,11 @@ import aws.sdk.kotlin.runtime.config.AwsSdkSetting
1515
import aws.sdk.kotlin.runtime.config.imds.ImdsClient
1616
import aws.sdk.kotlin.runtime.config.profile.AwsConfigurationSource
1717
import aws.sdk.kotlin.runtime.config.profile.loadAwsSharedConfig
18-
import aws.sdk.kotlin.runtime.http.interceptors.AwsBusinessMetric
18+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.AwsBusinessMetric
19+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.emitBusinessMetrics
1920
import aws.sdk.kotlin.runtime.region.resolveRegion
20-
import aws.smithy.kotlin.runtime.auth.awscredentials.CloseableCredentialsProvider
21-
import aws.smithy.kotlin.runtime.auth.awscredentials.Credentials
22-
import aws.smithy.kotlin.runtime.auth.awscredentials.CredentialsProvider
23-
import aws.smithy.kotlin.runtime.auth.awscredentials.simpleClassName
24-
import aws.smithy.kotlin.runtime.businessmetrics.emitBusinessMetric
21+
import aws.smithy.kotlin.runtime.auth.awscredentials.*
22+
import aws.smithy.kotlin.runtime.businessmetrics.BusinessMetrics
2523
import aws.smithy.kotlin.runtime.collections.Attributes
2624
import aws.smithy.kotlin.runtime.http.engine.HttpClientEngine
2725
import aws.smithy.kotlin.runtime.io.closeIfCloseable
@@ -89,7 +87,7 @@ public class ProfileCredentialsProvider @InternalSdkApi constructor(
8987
public val httpClient: HttpClientEngine? = null,
9088
public val configurationSource: AwsConfigurationSource? = null,
9189
) : CloseableCredentialsProvider {
92-
private val credentialsBusinessMetrics: MutableSet<AwsBusinessMetric.Credentials> = mutableSetOf()
90+
private val credentialsBusinessMetrics: MutableSet<String> = mutableSetOf()
9391

9492
public constructor(
9593
profileName: String? = null,
@@ -136,19 +134,20 @@ public class ProfileCredentialsProvider @InternalSdkApi constructor(
136134
chain.roles.forEach { roleArn ->
137135
logger.debug { "Assuming role `${roleArn.roleArn}`" }
138136
if (roleArn.source == RoleArnSource.SOURCE_PROFILE) {
139-
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_SOURCE_PROFILE)
137+
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_SOURCE_PROFILE.identifier)
140138
}
141139

142140
val assumeProvider = roleArn.toCredentialsProvider(creds, region)
141+
142+
creds.attributes.getOrNull(BusinessMetrics)?.forEach { metric ->
143+
credentialsBusinessMetrics.add(metric)
144+
}
145+
143146
creds = assumeProvider.resolve(attributes)
144147
}
145148

146149
logger.debug { "Obtained credentials from profile; expiration=${creds.expiration?.format(TimestampFormat.ISO_8601)}" }
147-
return creds.also {
148-
credentialsBusinessMetrics.forEach { metric ->
149-
attributes.emitBusinessMetric(metric)
150-
}
151-
}
150+
return creds.emitBusinessMetrics(credentialsBusinessMetrics)
152151
}
153152

154153
override fun close() {
@@ -160,11 +159,11 @@ public class ProfileCredentialsProvider @InternalSdkApi constructor(
160159
private suspend fun LeafProvider.toCredentialsProvider(region: LazyAsyncValue<String?>): CredentialsProvider =
161160
when (this) {
162161
is LeafProvider.NamedSource -> namedProviders[name].also {
163-
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_NAMED_PROVIDER)
162+
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_NAMED_PROVIDER.identifier)
164163
} ?: throw ProviderConfigurationException("unknown credentials source: $name")
165164

166165
is LeafProvider.AccessKey -> StaticCredentialsProvider(credentials).also {
167-
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE)
166+
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE.identifier)
168167
}
169168

170169
is LeafProvider.WebIdentityTokenRole -> StsWebIdentityCredentialsProvider(
@@ -175,7 +174,7 @@ public class ProfileCredentialsProvider @InternalSdkApi constructor(
175174
platformProvider = platformProvider,
176175
httpClient = httpClient,
177176
).also {
178-
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_STS_WEB_ID_TOKEN)
177+
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_STS_WEB_ID_TOKEN.identifier)
179178
}
180179

181180
is LeafProvider.SsoSession -> SsoCredentialsProvider(
@@ -187,7 +186,7 @@ public class ProfileCredentialsProvider @InternalSdkApi constructor(
187186
httpClient = httpClient,
188187
platformProvider = platformProvider,
189188
).also {
190-
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_SSO)
189+
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_SSO.identifier)
191190
}
192191

193192
is LeafProvider.LegacySso -> SsoCredentialsProvider(
@@ -198,11 +197,11 @@ public class ProfileCredentialsProvider @InternalSdkApi constructor(
198197
httpClient = httpClient,
199198
platformProvider = platformProvider,
200199
).also {
201-
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_SSO_LEGACY)
200+
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_SSO_LEGACY.identifier)
202201
}
203202

204203
is LeafProvider.Process -> ProcessCredentialsProvider(command).also {
205-
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_PROCESS)
204+
credentialsBusinessMetrics.add(AwsBusinessMetric.Credentials.CREDENTIALS_PROFILE_PROCESS.identifier)
206205
}
207206
}
208207

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/auth/credentials/SsoCredentialsProvider.kt

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,12 @@ package aws.sdk.kotlin.runtime.auth.credentials
88
import aws.sdk.kotlin.runtime.auth.credentials.internal.credentials
99
import aws.sdk.kotlin.runtime.auth.credentials.internal.sso.SsoClient
1010
import aws.sdk.kotlin.runtime.auth.credentials.internal.sso.getRoleCredentials
11-
import aws.sdk.kotlin.runtime.http.interceptors.AwsBusinessMetric
12-
import aws.smithy.kotlin.runtime.auth.awscredentials.Credentials
13-
import aws.smithy.kotlin.runtime.auth.awscredentials.CredentialsProvider
14-
import aws.smithy.kotlin.runtime.auth.awscredentials.CredentialsProviderException
15-
import aws.smithy.kotlin.runtime.auth.awscredentials.simpleClassName
16-
import aws.smithy.kotlin.runtime.businessmetrics.emitBusinessMetric
11+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.AwsBusinessMetric
12+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.emitBusinessMetric
13+
import aws.smithy.kotlin.runtime.auth.awscredentials.*
1714
import aws.smithy.kotlin.runtime.client.SdkClientOption
1815
import aws.smithy.kotlin.runtime.collections.Attributes
1916
import aws.smithy.kotlin.runtime.http.engine.HttpClientEngine
20-
import aws.smithy.kotlin.runtime.serde.json.*
2117
import aws.smithy.kotlin.runtime.telemetry.logging.logger
2218
import aws.smithy.kotlin.runtime.telemetry.telemetryProvider
2319
import aws.smithy.kotlin.runtime.time.Clock
@@ -123,19 +119,19 @@ public class SsoCredentialsProvider public constructor(
123119

124120
val roleCredentials = resp.roleCredentials ?: throw CredentialsProviderException("Expected SSO roleCredentials to not be null")
125121

126-
return credentials(
122+
val creds = credentials(
127123
accessKeyId = checkNotNull(roleCredentials.accessKeyId) { "Expected accessKeyId in SSO roleCredentials response" },
128124
secretAccessKey = checkNotNull(roleCredentials.secretAccessKey) { "Expected secretAccessKey in SSO roleCredentials response" },
129125
sessionToken = roleCredentials.sessionToken,
130126
expiration = Instant.fromEpochMilliseconds(roleCredentials.expiration),
131127
PROVIDER_NAME,
132128
accountId = accountId,
133-
).also {
134-
if (ssoTokenProvider != null) {
135-
attributes.emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_SSO)
136-
} else {
137-
attributes.emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_SSO_LEGACY)
138-
}
129+
)
130+
131+
return if (ssoTokenProvider != null) {
132+
creds.emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_SSO)
133+
} else {
134+
creds.emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_SSO_LEGACY)
139135
}
140136
}
141137

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/auth/credentials/StsAssumeRoleCredentialsProvider.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import aws.sdk.kotlin.runtime.auth.credentials.internal.sts.model.PolicyDescript
1313
import aws.sdk.kotlin.runtime.auth.credentials.internal.sts.model.RegionDisabledException
1414
import aws.sdk.kotlin.runtime.auth.credentials.internal.sts.model.Tag
1515
import aws.sdk.kotlin.runtime.config.AwsSdkSetting
16-
import aws.sdk.kotlin.runtime.http.interceptors.AwsBusinessMetric
16+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.AwsBusinessMetric
17+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.emitBusinessMetric
1718
import aws.smithy.kotlin.runtime.auth.awscredentials.*
18-
import aws.smithy.kotlin.runtime.businessmetrics.emitBusinessMetric
1919
import aws.smithy.kotlin.runtime.client.SdkClientOption
2020
import aws.smithy.kotlin.runtime.collections.Attributes
2121
import aws.smithy.kotlin.runtime.config.resolve
@@ -148,9 +148,7 @@ public class StsAssumeRoleCredentialsProvider(
148148
expiration = roleCredentials.expiration,
149149
providerName = PROVIDER_NAME,
150150
accountId = accountId,
151-
).also {
152-
attributes.emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_STS_ASSUME_ROLE)
153-
}
151+
).emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_STS_ASSUME_ROLE)
154152
}
155153

156154
override fun toString(): String = this.simpleClassName

aws-runtime/aws-config/common/src/aws/sdk/kotlin/runtime/auth/credentials/StsWebIdentityCredentialsProvider.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ import aws.sdk.kotlin.runtime.auth.credentials.internal.sts.StsClient
1111
import aws.sdk.kotlin.runtime.auth.credentials.internal.sts.assumeRoleWithWebIdentity
1212
import aws.sdk.kotlin.runtime.auth.credentials.internal.sts.model.PolicyDescriptorType
1313
import aws.sdk.kotlin.runtime.config.AwsSdkSetting
14-
import aws.sdk.kotlin.runtime.http.interceptors.AwsBusinessMetric
14+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.AwsBusinessMetric
15+
import aws.sdk.kotlin.runtime.http.interceptors.businessmetrics.emitBusinessMetric
1516
import aws.smithy.kotlin.runtime.auth.awscredentials.*
16-
import aws.smithy.kotlin.runtime.businessmetrics.emitBusinessMetric
1717
import aws.smithy.kotlin.runtime.client.SdkClientOption
1818
import aws.smithy.kotlin.runtime.collections.Attributes
1919
import aws.smithy.kotlin.runtime.config.EnvironmentSetting
@@ -152,9 +152,7 @@ public class StsWebIdentityCredentialsProvider(
152152
expiration = roleCredentials.expiration,
153153
providerName = PROVIDER_NAME,
154154
accountId = accountId,
155-
).also {
156-
attributes.emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_STS_ASSUME_ROLE_WEB_ID)
157-
}
155+
).emitBusinessMetric(AwsBusinessMetric.Credentials.CREDENTIALS_STS_ASSUME_ROLE_WEB_ID)
158156
}
159157

160158
override fun toString(): String = this.simpleClassName

0 commit comments

Comments
 (0)