Skip to content

Commit e062926

Browse files
committed
add error and fault paths for secrets manager
1 parent bfd0f31 commit e062926

File tree

5 files changed

+241
-0
lines changed

5 files changed

+241
-0
lines changed

appsignals-tests/contract-tests/src/test/java/software/amazon/opentelemetry/appsignals/test/awssdk/base/AwsSdkBaseTest.java

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2311,6 +2311,148 @@ protected void doTestSecretsManagerDescribeSecret() throws Exception {
23112311
0.0);
23122312
}
23132313

2314+
protected void doTestSecretsManagerError() throws Exception {
2315+
appClient.get("/secretsmanager/error").aggregate().join();
2316+
var traces = mockCollectorClient.getTraces();
2317+
var metrics =
2318+
mockCollectorClient.getMetrics(
2319+
Set.of(
2320+
AppSignalsConstants.ERROR_METRIC,
2321+
AppSignalsConstants.FAULT_METRIC,
2322+
AppSignalsConstants.LATENCY_METRIC));
2323+
var localService = getApplicationOtelServiceName();
2324+
var localOperation = "GET /secretsmanager/error";
2325+
var type = "AWS::SecretsManager::Secret";
2326+
var identifier = "nonexistent-secret-id";
2327+
var cloudformationIdentifier =
2328+
"arn:aws:secretsmanager:us-west-2:000000000000:secret:nonexistent-secret-id";
2329+
2330+
assertSpanClientAttributes(
2331+
traces,
2332+
secretsManagerSpanName("DescribeSecret"),
2333+
getSecretsManagerRpcServiceName(),
2334+
localService,
2335+
localOperation,
2336+
getSecretsManagerServiceName(),
2337+
"DescribeSecret",
2338+
type,
2339+
identifier,
2340+
cloudformationIdentifier,
2341+
"error.test",
2342+
8080,
2343+
"http://error.test:8080",
2344+
400,
2345+
List.of(
2346+
assertAttribute(
2347+
SemanticConventionsConstants.AWS_SECRET_ARN,
2348+
"arn:aws:secretsmanager:us-west-2:000000000000:secret:nonexistent-secret-id")));
2349+
2350+
assertMetricClientAttributes(
2351+
metrics,
2352+
AppSignalsConstants.LATENCY_METRIC,
2353+
localService,
2354+
localOperation,
2355+
getSecretsManagerServiceName(),
2356+
"DescribeSecret",
2357+
type,
2358+
identifier,
2359+
cloudformationIdentifier,
2360+
5000.0);
2361+
assertMetricClientAttributes(
2362+
metrics,
2363+
AppSignalsConstants.FAULT_METRIC,
2364+
localService,
2365+
localOperation,
2366+
getSecretsManagerServiceName(),
2367+
"DescribeSecret",
2368+
type,
2369+
identifier,
2370+
cloudformationIdentifier,
2371+
0.0);
2372+
assertMetricClientAttributes(
2373+
metrics,
2374+
AppSignalsConstants.ERROR_METRIC,
2375+
localService,
2376+
localOperation,
2377+
getSecretsManagerServiceName(),
2378+
"DescribeSecret",
2379+
type,
2380+
identifier,
2381+
cloudformationIdentifier,
2382+
1.0); // Error metric should be 1.0 for 4xx response
2383+
}
2384+
2385+
protected void doTestSecretsManagerFault() throws Exception {
2386+
appClient.get("/secretsmanager/fault").aggregate().join();
2387+
var traces = mockCollectorClient.getTraces();
2388+
var metrics =
2389+
mockCollectorClient.getMetrics(
2390+
Set.of(
2391+
AppSignalsConstants.ERROR_METRIC,
2392+
AppSignalsConstants.FAULT_METRIC,
2393+
AppSignalsConstants.LATENCY_METRIC));
2394+
var localService = getApplicationOtelServiceName();
2395+
var localOperation = "GET /secretsmanager/fault";
2396+
var type = "AWS::SecretsManager::Secret";
2397+
var identifier = "fault-secret-id";
2398+
var cloudformationIdentifier =
2399+
"arn:aws:secretsmanager:us-west-2:000000000000:secret:fault-secret-id";
2400+
2401+
assertSpanClientAttributes(
2402+
traces,
2403+
secretsManagerSpanName("DescribeSecret"),
2404+
getSecretsManagerRpcServiceName(),
2405+
localService,
2406+
localOperation,
2407+
getSecretsManagerServiceName(),
2408+
"DescribeSecret",
2409+
type,
2410+
identifier,
2411+
cloudformationIdentifier,
2412+
"fault.test",
2413+
8080,
2414+
"http://fault.test:8080",
2415+
500,
2416+
List.of(
2417+
assertAttribute(
2418+
SemanticConventionsConstants.AWS_SECRET_ARN,
2419+
"arn:aws:secretsmanager:us-west-2:000000000000:secret:fault-secret-id")));
2420+
2421+
assertMetricClientAttributes(
2422+
metrics,
2423+
AppSignalsConstants.LATENCY_METRIC,
2424+
localService,
2425+
localOperation,
2426+
getSecretsManagerServiceName(),
2427+
"DescribeSecret",
2428+
type,
2429+
identifier,
2430+
cloudformationIdentifier,
2431+
5000.0);
2432+
assertMetricClientAttributes(
2433+
metrics,
2434+
AppSignalsConstants.FAULT_METRIC,
2435+
localService,
2436+
localOperation,
2437+
getSecretsManagerServiceName(),
2438+
"DescribeSecret",
2439+
type,
2440+
identifier,
2441+
cloudformationIdentifier,
2442+
1.0); // Fault metric should be 1.0 for 5xx response
2443+
assertMetricClientAttributes(
2444+
metrics,
2445+
AppSignalsConstants.ERROR_METRIC,
2446+
localService,
2447+
localOperation,
2448+
getSecretsManagerServiceName(),
2449+
"DescribeSecret",
2450+
type,
2451+
identifier,
2452+
cloudformationIdentifier,
2453+
0.0);
2454+
}
2455+
23142456
protected void doTestStepFunctionsDescribeStateMachine() throws Exception {
23152457
appClient.get("/sfn/describestatemachine/test-state-machine").aggregate().join();
23162458
var traces = mockCollectorClient.getTraces();

appsignals-tests/contract-tests/src/test/java/software/amazon/opentelemetry/appsignals/test/awssdk/v1/AwsSdkV1Test.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,16 @@ void testSecretsManagerDescribeSecret() throws Exception {
261261
doTestSecretsManagerDescribeSecret();
262262
}
263263

264+
@Test
265+
void testSecretsManagerError() throws Exception {
266+
doTestSecretsManagerError();
267+
}
268+
269+
@Test
270+
void testSecretsManagerFault() throws Exception {
271+
doTestSecretsManagerFault();
272+
}
273+
264274
@Test
265275
void testStepFunctionsDescribeStateMachine() throws Exception {
266276
doTestStepFunctionsDescribeStateMachine();

appsignals-tests/contract-tests/src/test/java/software/amazon/opentelemetry/appsignals/test/awssdk/v2/AwsSdkV2Test.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,16 @@ void testSecretsManagerDescribeSecret() throws Exception {
266266
doTestSecretsManagerDescribeSecret();
267267
}
268268

269+
@Test
270+
void testSecretsManagerError() throws Exception {
271+
doTestSecretsManagerError();
272+
}
273+
274+
@Test
275+
void testSecretsManagerFault() throws Exception {
276+
doTestSecretsManagerFault();
277+
}
278+
269279
@Test
270280
void testStepFunctionsDescribeStateMachine() throws Exception {
271281
doTestStepFunctionsDescribeStateMachine();

appsignals-tests/images/aws-sdk/aws-sdk-v1/src/main/java/com/amazon/sampleapp/App.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,40 @@ private static void setupSecretsManager() {
684684
secretsManagerClient.describeSecret(describeRequest);
685685
return "";
686686
});
687+
get(
688+
"/secretsmanager/error",
689+
(req, res) -> {
690+
setMainStatus(400);
691+
var errorClient = AWSSecretsManagerClient.builder()
692+
.withCredentials(CREDENTIALS_PROVIDER)
693+
.withEndpointConfiguration(new EndpointConfiguration("http://error.test:8080", Regions.US_WEST_2.getName()))
694+
.build();
695+
696+
try {
697+
var describeRequest = new DescribeSecretRequest().withSecretId("nonexistent-secret-id");
698+
errorClient.describeSecret(describeRequest);
699+
} catch (Exception e) {
700+
logger.error("Error caught in sample app", e);
701+
}
702+
return "";
703+
});
704+
get(
705+
"/secretsmanager/fault",
706+
(req, res) -> {
707+
setMainStatus(500);
708+
var faultClient = AWSSecretsManagerClient.builder()
709+
.withCredentials(CREDENTIALS_PROVIDER)
710+
.withEndpointConfiguration(new EndpointConfiguration("http://fault.test:8080", Regions.US_WEST_2.getName()))
711+
.build();
712+
713+
try {
714+
var describeRequest = new DescribeSecretRequest().withSecretId("fault-secret-id");
715+
faultClient.describeSecret(describeRequest);
716+
} catch (Exception e) {
717+
logger.info("Error caught in sample app", e);
718+
}
719+
return "";
720+
});
687721
}
688722

689723
private static void setupStepFunctions() {

appsignals-tests/images/aws-sdk/aws-sdk-v2/src/main/java/com/amazon/sampleapp/App.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,51 @@ private static void setupSecretsManager() {
711711
secretsManagerClient.describeSecret(describeRequest);
712712
return "";
713713
});
714+
get(
715+
"/secretsmanager/error",
716+
(req, res) -> {
717+
setMainStatus(400);
718+
var errorClient =
719+
SecretsManagerClient.builder()
720+
.endpointOverride(URI.create("http://error.test:8080"))
721+
.credentialsProvider(CREDENTIALS_PROVIDER)
722+
.build();
723+
724+
try {
725+
var describeRequest = DescribeSecretRequest.builder()
726+
.secretId("nonexistent-secret-id")
727+
.build();
728+
errorClient.describeSecret(describeRequest);
729+
} catch (Exception ex) {
730+
logger.info("Exception Caught in Sample App");
731+
ex.printStackTrace();
732+
}
733+
return "";
734+
});
735+
get(
736+
"/secretsmanager/fault",
737+
(req, res) -> {
738+
setMainStatus(500);
739+
var faultClient =
740+
SecretsManagerClient.builder()
741+
.endpointOverride(URI.create("http://fault.test:8080"))
742+
.credentialsProvider(CREDENTIALS_PROVIDER)
743+
.overrideConfiguration(
744+
ClientOverrideConfiguration.builder()
745+
.retryPolicy(RetryPolicy.builder().numRetries(0).build())
746+
.build())
747+
.build();
748+
749+
try {
750+
var describeRequest = DescribeSecretRequest.builder()
751+
.secretId("fault-secret-id")
752+
.build();
753+
faultClient.describeSecret(describeRequest);
754+
} catch (Exception ex) {
755+
logger.info("Fault caught in Sample App", ex);
756+
}
757+
return "";
758+
});
714759
}
715760

716761
private static void setupStepFunctions() {

0 commit comments

Comments
 (0)