Skip to content

Commit 29ea908

Browse files
Fixes bug resetting client-level diagnostic thresholds for point read operations (#45488)
1 parent 6d339f6 commit 29ea908

File tree

3 files changed

+85
-1
lines changed

3 files changed

+85
-1
lines changed

sdk/cosmos/azure-cosmos-tests/src/test/java/com/azure/cosmos/CosmosItemTest.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.azure.cosmos.implementation.Utils;
1717
import com.azure.cosmos.implementation.apachecommons.lang.StringUtils;
1818
import com.azure.cosmos.implementation.apachecommons.lang.tuple.ImmutablePair;
19+
import com.azure.cosmos.models.CosmosClientTelemetryConfig;
1920
import com.azure.cosmos.models.CosmosContainerProperties;
2021
import com.azure.cosmos.models.CosmosItemIdentity;
2122
import com.azure.cosmos.models.CosmosItemRequestOptions;
@@ -195,6 +196,76 @@ public void readItem() throws Exception {
195196

196197
}
197198

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+
198269
@Test(groups = { "fast" }, timeOut = TIMEOUT)
199270
public void readMany() throws Exception {
200271
List<CosmosItemIdentity> cosmosItemIdentities = new ArrayList<>();

sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosDiagnosticsContext.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,13 @@ String getRequestDiagnostics() {
633633
if (this.subStatusCode != 0) {
634634
ctxNode.put("subStatus", this.subStatusCode);
635635
}
636+
637+
if (this.duration != null) {
638+
ctxNode.put("durationInMs", this.duration.toNanos() / 1_000_000d);
639+
} else {
640+
ctxNode.put("durationInMs", (Double)null);
641+
}
642+
636643
ctxNode.put("RUs", this.totalRequestCharge);
637644
ctxNode.put("maxRequestSizeInBytes", this.maxRequestSize);
638645
ctxNode.put("maxResponseSizeInBytes", this.maxResponseSize);

sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosItemRequestOptions.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,6 @@ public CosmosItemRequestOptions() {
9898
super();
9999

100100
setPartitionKey(partitionKey);
101-
this.thresholds = new CosmosDiagnosticsThresholds();
102101
}
103102

104103
/**
@@ -540,6 +539,9 @@ public void setThroughputControlGroupName(String throughputControlGroupName) {
540539
* @return thresholdForDiagnosticsOnTracerInMS the latency threshold for diagnostics on tracer.
541540
*/
542541
public Duration getThresholdForDiagnosticsOnTracer() {
542+
if (this.thresholds == null) {
543+
return Duration.ofMillis(100);
544+
}
543545

544546
return thresholdsAccessor.getPointReadLatencyThreshold(this.thresholds);
545547
}
@@ -554,6 +556,10 @@ public Duration getThresholdForDiagnosticsOnTracer() {
554556
* @return the CosmosItemRequestOptions
555557
*/
556558
public CosmosItemRequestOptions setThresholdForDiagnosticsOnTracer(Duration thresholdForDiagnosticsOnTracer) {
559+
if (this.thresholds == null) {
560+
this.thresholds = new CosmosDiagnosticsThresholds();
561+
}
562+
557563
this.thresholds.setPointOperationLatencyThreshold(thresholdForDiagnosticsOnTracer);
558564

559565
return this;

0 commit comments

Comments
 (0)