|
16 | 16 | import com.azure.cosmos.implementation.Utils;
|
17 | 17 | import com.azure.cosmos.implementation.apachecommons.lang.StringUtils;
|
18 | 18 | import com.azure.cosmos.implementation.apachecommons.lang.tuple.ImmutablePair;
|
| 19 | +import com.azure.cosmos.models.CosmosClientTelemetryConfig; |
19 | 20 | import com.azure.cosmos.models.CosmosContainerProperties;
|
20 | 21 | import com.azure.cosmos.models.CosmosItemIdentity;
|
21 | 22 | import com.azure.cosmos.models.CosmosItemRequestOptions;
|
@@ -195,6 +196,76 @@ public void readItem() throws Exception {
|
195 | 196 |
|
196 | 197 | }
|
197 | 198 |
|
| 199 | + @Test(groups = { "fast" }, timeOut = TIMEOUT) |
| 200 | + public void readItemWithTimeout() throws Exception { |
| 201 | + String id = UUID.randomUUID().toString(); |
| 202 | + ObjectNode document = getDocumentDefinition(id, id); |
| 203 | + container.createItem(document); |
| 204 | + |
| 205 | + CosmosClientTelemetryConfig clientTelemetryConfig = new CosmosClientTelemetryConfig() |
| 206 | + .diagnosticsThresholds( |
| 207 | + new CosmosDiagnosticsThresholds() |
| 208 | + .setPointOperationLatencyThreshold(Duration.ofMillis(100)) |
| 209 | + ); |
| 210 | + |
| 211 | + FaultInjectionRule transitTimeout = null; |
| 212 | + try (CosmosAsyncClient clientWithCustomDiagnosticThresholds = copyCosmosClientBuilder(getClientBuilder()) |
| 213 | + .clientTelemetryConfig(clientTelemetryConfig) |
| 214 | + .buildAsyncClient()) { |
| 215 | + |
| 216 | + CosmosAsyncContainer containerWithClientLevelThresholds = clientWithCustomDiagnosticThresholds |
| 217 | + .getDatabase(container.asyncContainer.getDatabase().getId()) |
| 218 | + .getContainer(container.getId()); |
| 219 | + |
| 220 | + FaultInjectionRuleBuilder ruleBuilder = new FaultInjectionRuleBuilder("extremelyLongResponseDelayRead"); |
| 221 | + FaultInjectionConditionBuilder conditionBuilder = new FaultInjectionConditionBuilder() |
| 222 | + .operationType(FaultInjectionOperationType.READ_ITEM); |
| 223 | + |
| 224 | + if (client.asyncClient().getConnectionPolicy().getConnectionMode() != ConnectionMode.DIRECT) { |
| 225 | + conditionBuilder = conditionBuilder.connectionType(FaultInjectionConnectionType.GATEWAY); |
| 226 | + } else { |
| 227 | + conditionBuilder = conditionBuilder.connectionType(FaultInjectionConnectionType.DIRECT); |
| 228 | + } |
| 229 | + |
| 230 | + conditionBuilder = conditionBuilder.endpoints( |
| 231 | + new FaultInjectionEndpointBuilder(FeedRange.forLogicalPartition(new PartitionKey(id))) |
| 232 | + .replicaCount(4) |
| 233 | + .includePrimary(true) |
| 234 | + .build() |
| 235 | + ); |
| 236 | + FaultInjectionCondition faultInjectionCondition = conditionBuilder.build(); |
| 237 | + FaultInjectionServerErrorResult retryWithResult = FaultInjectionResultBuilders |
| 238 | + .getResultBuilder(FaultInjectionServerErrorType.RESPONSE_DELAY) |
| 239 | + .times(1) |
| 240 | + .delay(Duration.ofMillis(200)) |
| 241 | + .build(); |
| 242 | + transitTimeout = ruleBuilder |
| 243 | + .condition(faultInjectionCondition) |
| 244 | + .result(retryWithResult) |
| 245 | + .duration(Duration.ofSeconds(240)) |
| 246 | + .build(); |
| 247 | + |
| 248 | + CosmosFaultInjectionHelper |
| 249 | + .configureFaultInjectionRules(containerWithClientLevelThresholds, Arrays.asList(transitTimeout)) |
| 250 | + .block(); |
| 251 | + |
| 252 | + CosmosItemResponse<ObjectNode> itemResponse = containerWithClientLevelThresholds |
| 253 | + .readItem(id, new PartitionKey(id), ObjectNode.class) |
| 254 | + .block(); |
| 255 | + |
| 256 | + assertThat(itemResponse.getStatusCode()).isEqualTo(200); |
| 257 | + assertThat(itemResponse.getDiagnostics()).isNotNull(); |
| 258 | + assertThat(itemResponse.getDiagnostics().getDiagnosticsContext()).isNotNull(); |
| 259 | + assertThat(itemResponse.getDiagnostics().getDiagnosticsContext().isThresholdViolated()) |
| 260 | + .as("Threshold not met - " + itemResponse.getDiagnostics().getDiagnosticsContext().toJson()) |
| 261 | + .isEqualTo(true); |
| 262 | + } finally { |
| 263 | + if (transitTimeout != null) { |
| 264 | + transitTimeout.disable(); |
| 265 | + } |
| 266 | + } |
| 267 | + } |
| 268 | + |
198 | 269 | @Test(groups = { "fast" }, timeOut = TIMEOUT)
|
199 | 270 | public void readMany() throws Exception {
|
200 | 271 | List<CosmosItemIdentity> cosmosItemIdentities = new ArrayList<>();
|
|
0 commit comments