diff --git a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml index e174f0ebcfd7..866ee29ccb8f 100755 --- a/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml +++ b/eng/code-quality-reports/src/main/resources/spotbugs/spotbugs-exclude.xml @@ -1123,6 +1123,13 @@ + + + + + + + diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java index 730c5dd8d40f..c7fd60df9313 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java @@ -457,16 +457,16 @@ public void init(CosmosClientMetadataCachesSnapshot metadataCachesSnapshot, Func collectionCache); updateGatewayProxy(); - if (this.connectionPolicy.getConnectionMode() == ConnectionMode.GATEWAY) { - this.storeModel = this.gatewayProxy; - } else { - this.initializeDirectConnectivity(); - } clientTelemetry = new ClientTelemetry(null, UUID.randomUUID().toString(), ManagementFactory.getRuntimeMXBean().getName(), userAgentContainer.getUserAgent(), connectionPolicy.getConnectionMode(), globalEndpointManager.getLatestDatabaseAccount().getId(), null, null, this.reactorHttpClient, connectionPolicy.isClientTelemetryEnabled(), this, this.connectionPolicy.getPreferredRegions()); clientTelemetry.init(); + if (this.connectionPolicy.getConnectionMode() == ConnectionMode.GATEWAY) { + this.storeModel = this.gatewayProxy; + } else { + this.initializeDirectConnectivity(); + } this.queryPlanCache = new ConcurrentHashMap<>(); this.retryPolicy.setRxCollectionCache(this.collectionCache); } catch (Exception e) { @@ -503,7 +503,8 @@ private void initializeDirectConnectivity() { this.connectionPolicy, // this.maxConcurrentConnectionOpenRequests, this.userAgentContainer, - this.connectionSharingAcrossClientsEnabled + this.connectionSharingAcrossClientsEnabled, + this.clientTelemetry ); this.createStoreModel(true); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetry.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetry.java index 9d43dd12f194..f570393466c4 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetry.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetry.java @@ -61,6 +61,11 @@ public class ClientTelemetry { public final static String REQUEST_CHARGE_NAME = "RequestCharge"; public final static String REQUEST_CHARGE_UNIT = "RU"; + public final static String TCP_NEW_CHANNEL_LATENCY_NAME = "TcpNewChannelOpenLatency"; + public final static String TCP_NEW_CHANNEL_LATENCY_UNIT = "MilliSecond"; + public final static int TCP_NEW_CHANNEL_LATENCY_MAX_MILLI_SEC = 300000; + public final static int TCP_NEW_CHANNEL_LATENCY_PRECISION = 2; + public final static int CPU_MAX = 100; public final static int CPU_PRECISION = 2; private final static String CPU_NAME = "CPU"; @@ -136,6 +141,10 @@ public static void recordValue(ConcurrentDoubleHistogram doubleHistogram, double } } + public boolean isClientTelemetryEnabled() { + return isClientTelemetryEnabled; + } + public void init() { loadAzureVmMetaData(); sendClientTelemetry().subscribe(); @@ -266,6 +275,7 @@ private static T parse(String itemResponseBodyAsString, Class itemClassTy } private void clearDataForNextRun() { + this.clientTelemetryInfo.getSystemInfoMap().clear(); this.clientTelemetryInfo.getOperationInfoMap().clear(); this.clientTelemetryInfo.getCacheRefreshInfoMap().clear(); for (ConcurrentDoubleHistogram histogram : this.clientTelemetryInfo.getSystemInfoMap().values()) { diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java index e29ae460c70d..911210f6e58a 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java @@ -11,6 +11,7 @@ import com.azure.cosmos.implementation.RequestTimeline; import com.azure.cosmos.implementation.RxDocumentServiceRequest; import com.azure.cosmos.implementation.UserAgentContainer; +import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry; import com.azure.cosmos.implementation.directconnectivity.rntbd.RntbdEndpoint; import com.azure.cosmos.implementation.directconnectivity.rntbd.RntbdObjectMapper; import com.azure.cosmos.implementation.directconnectivity.rntbd.RntbdRequestArgs; @@ -88,6 +89,7 @@ public class RntbdTransportClient extends TransportClient { private final RntbdEndpoint.Provider endpointProvider; private final long id; private final Tag tag; + private boolean channelAcquisitionContextEnabled; // endregion @@ -106,12 +108,14 @@ public RntbdTransportClient( final Configs configs, final ConnectionPolicy connectionPolicy, final UserAgentContainer userAgent, - final IAddressResolver addressResolver) { + final IAddressResolver addressResolver, + final ClientTelemetry clientTelemetry) { this( new Options.Builder(connectionPolicy).userAgent(userAgent).build(), configs.getSslContext(), - addressResolver); + addressResolver, + clientTelemetry); } RntbdTransportClient(final RntbdEndpoint.Provider endpointProvider) { @@ -123,16 +127,19 @@ public RntbdTransportClient( RntbdTransportClient( final Options options, final SslContext sslContext, - final IAddressResolver addressResolver) { + final IAddressResolver addressResolver, + final ClientTelemetry clientTelemetry) { this.endpointProvider = new RntbdServiceEndpoint.Provider( this, options, checkNotNull(sslContext, "expected non-null sslContext"), - addressResolver); + addressResolver, + clientTelemetry); this.id = instanceCount.incrementAndGet(); this.tag = RntbdTransportClient.tag(this.id); + this.channelAcquisitionContextEnabled = options.channelAcquisitionContextEnabled; } // endregion @@ -229,7 +236,9 @@ public Mono invokeStoreAsync(final Uri addressUri, final RxDocume response.setRequestPayloadLength(request.getContentLength()); response.setRntbdChannelTaskQueueSize(record.channelTaskQueueLength()); response.setRntbdPendingRequestSize(record.pendingRequestQueueSize()); - response.setChannelAcquisitionTimeline(record.getChannelAcquisitionTimeline()); + if(this.channelAcquisitionContextEnabled) { + response.setChannelAcquisitionTimeline(record.getChannelAcquisitionTimeline()); + } } })).onErrorMap(throwable -> { @@ -263,7 +272,9 @@ public Mono invokeStoreAsync(final Uri addressUri, final RxDocume BridgeInternal.setRntbdPendingRequestQueueSize(cosmosException, record.pendingRequestQueueSize()); BridgeInternal.setChannelTaskQueueSize(cosmosException, record.channelTaskQueueLength()); BridgeInternal.setSendingRequestStarted(cosmosException, record.hasSendingRequestStarted()); - BridgeInternal.setChannelAcquisitionTimeline(cosmosException, record.getChannelAcquisitionTimeline()); + if(this.channelAcquisitionContextEnabled) { + BridgeInternal.setChannelAcquisitionTimeline(cosmosException, record.getChannelAcquisitionTimeline()); + } return cosmosException; }); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/SharedTransportClient.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/SharedTransportClient.java index e9b622e35089..5b332f14b586 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/SharedTransportClient.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/SharedTransportClient.java @@ -9,6 +9,7 @@ import com.azure.cosmos.implementation.LifeCycleUtils; import com.azure.cosmos.implementation.RxDocumentServiceRequest; import com.azure.cosmos.implementation.UserAgentContainer; +import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import reactor.core.publisher.Mono; @@ -37,13 +38,14 @@ public static TransportClient getOrCreateInstance( ConnectionPolicy connectionPolicy, UserAgentContainer userAgent, DiagnosticsClientContext.DiagnosticsClientConfig diagnosticsClientConfig, - IAddressResolver addressResolver) { + IAddressResolver addressResolver, + ClientTelemetry clientTelemetry) { synchronized (SharedTransportClient.class) { if (sharedTransportClient == null) { assert counter.get() == 0; logger.info("creating a new shared RntbdTransportClient"); - sharedTransportClient = new SharedTransportClient(protocol, configs, connectionPolicy, userAgent, addressResolver); + sharedTransportClient = new SharedTransportClient(protocol, configs, connectionPolicy, userAgent, addressResolver, clientTelemetry); } else { logger.info("Reusing an instance of RntbdTransportClient"); } @@ -62,11 +64,12 @@ private SharedTransportClient( Configs configs, ConnectionPolicy connectionPolicy, UserAgentContainer userAgent, - IAddressResolver addressResolver) { + IAddressResolver addressResolver, + ClientTelemetry clientTelemetry) { if (protocol == Protocol.TCP) { this.rntbdOptions = new RntbdTransportClient.Options.Builder(connectionPolicy).userAgent(userAgent).build(); - this.transportClient = new RntbdTransportClient(rntbdOptions, configs.getSslContext(), addressResolver); + this.transportClient = new RntbdTransportClient(rntbdOptions, configs.getSslContext(), addressResolver, clientTelemetry); } else if (protocol == Protocol.HTTPS){ this.rntbdOptions = null; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreClientFactory.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreClientFactory.java index 4d6468fff20b..3d9f0e6ccddf 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreClientFactory.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreClientFactory.java @@ -9,6 +9,7 @@ import com.azure.cosmos.implementation.IAuthorizationTokenProvider; import com.azure.cosmos.implementation.SessionContainer; import com.azure.cosmos.implementation.UserAgentContainer; +import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry; // We suppress the "try" warning here because the close() method's signature // allows it to throw InterruptedException which is strongly advised against @@ -21,6 +22,7 @@ public class StoreClientFactory implements AutoCloseable { private final Configs configs; private final TransportClient transportClient; private volatile boolean isClosed; + private final ClientTelemetry clientTelemetry; public StoreClientFactory( IAddressResolver addressResolver, @@ -28,9 +30,11 @@ public StoreClientFactory( Configs configs, ConnectionPolicy connectionPolicy, UserAgentContainer userAgent, - boolean enableTransportClientSharing) { + boolean enableTransportClientSharing, + ClientTelemetry clientTelemetry) { this.configs = configs; + this.clientTelemetry = clientTelemetry; Protocol protocol = configs.getProtocol(); if (enableTransportClientSharing) { this.transportClient = SharedTransportClient.getOrCreateInstance( @@ -39,7 +43,8 @@ public StoreClientFactory( connectionPolicy, userAgent, diagnosticsClientConfig, - addressResolver); + addressResolver, + clientTelemetry); } else { if (protocol == Protocol.HTTPS) { this.transportClient = new HttpTransportClient(configs, connectionPolicy, userAgent); @@ -47,7 +52,7 @@ public StoreClientFactory( RntbdTransportClient.Options rntbdOptions = new RntbdTransportClient.Options.Builder(connectionPolicy).userAgent(userAgent).build(); - this.transportClient = new RntbdTransportClient(rntbdOptions, configs.getSslContext(), addressResolver); + this.transportClient = new RntbdTransportClient(rntbdOptions, configs.getSslContext(), addressResolver, clientTelemetry); diagnosticsClientConfig.withRntbdOptions(rntbdOptions); } else { diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdChannelAcquisitionTimeline.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdChannelAcquisitionTimeline.java index 4692a64dbe6c..24aa9c6ca8b0 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdChannelAcquisitionTimeline.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdChannelAcquisitionTimeline.java @@ -3,9 +3,15 @@ package com.azure.cosmos.implementation.directconnectivity.rntbd; +import com.azure.cosmos.BridgeInternal; +import com.azure.cosmos.implementation.Configs; +import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry; +import com.azure.cosmos.implementation.clienttelemetry.ReportPayload; +import org.HdrHistogram.ConcurrentDoubleHistogram; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.time.Duration; import java.time.Instant; import java.util.ArrayList; import java.util.List; @@ -25,11 +31,12 @@ public List getEvents() { public static RntbdChannelAcquisitionEvent startNewEvent( RntbdChannelAcquisitionTimeline timeline, - RntbdChannelAcquisitionEventType eventType) { + RntbdChannelAcquisitionEventType eventType, + ClientTelemetry clientTelemetry) { if (timeline != null) { RntbdChannelAcquisitionEvent newEvent = new RntbdChannelAcquisitionEvent(eventType, Instant.now()); - timeline.addNewEvent(newEvent); + timeline.addNewEvent(newEvent, clientTelemetry); return newEvent; } @@ -39,20 +46,37 @@ public static RntbdChannelAcquisitionEvent startNewEvent( public static RntbdPollChannelEvent startNewPollEvent( RntbdChannelAcquisitionTimeline timeline, int availableChannels, - int acquiredChannels) { + int acquiredChannels, + ClientTelemetry clientTelemetry) { if (timeline != null) { RntbdPollChannelEvent newEvent = new RntbdPollChannelEvent(availableChannels, acquiredChannels, Instant.now()); - timeline.addNewEvent(newEvent); + timeline.addNewEvent(newEvent, clientTelemetry); return newEvent; } return null; } - private void addNewEvent(RntbdChannelAcquisitionEvent event) { + private void addNewEvent(RntbdChannelAcquisitionEvent event, ClientTelemetry clientTelemetry) { if (this.currentEvent != null) { this.currentEvent.complete(event.getCreatedTime()); + if(clientTelemetry!= null && Configs.isClientTelemetryEnabled(clientTelemetry.isClientTelemetryEnabled())) { + if (event.getEventType().equals(RntbdChannelAcquisitionEventType.ATTEMPT_TO_CREATE_NEW_CHANNEL_COMPLETE)) { + ReportPayload reportPayload = new ReportPayload(ClientTelemetry.TCP_NEW_CHANNEL_LATENCY_NAME, + ClientTelemetry.TCP_NEW_CHANNEL_LATENCY_UNIT); + ConcurrentDoubleHistogram newChannelLatencyHistogram = + clientTelemetry.getClientTelemetryInfo().getSystemInfoMap().get(reportPayload); + if (newChannelLatencyHistogram == null) { + newChannelLatencyHistogram = + new ConcurrentDoubleHistogram(ClientTelemetry.TCP_NEW_CHANNEL_LATENCY_MAX_MILLI_SEC, + ClientTelemetry.TCP_NEW_CHANNEL_LATENCY_PRECISION); + clientTelemetry.getClientTelemetryInfo().getSystemInfoMap().put(reportPayload, newChannelLatencyHistogram); + } + ClientTelemetry.recordValue(newChannelLatencyHistogram, + Duration.between(this.currentEvent.getCreatedTime(), this.currentEvent.getCompleteTime()).toMillis()); + } + } } this.events.add(event); this.currentEvent = event; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelPool.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelPool.java index 66b4487540ab..cd952fe94741 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelPool.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/RntbdClientChannelPool.java @@ -3,6 +3,7 @@ package com.azure.cosmos.implementation.directconnectivity.rntbd; +import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry; import com.azure.cosmos.implementation.directconnectivity.rntbd.RntbdEndpoint.Config; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.SerializerProvider; @@ -181,22 +182,23 @@ public final class RntbdClientChannelPool implements ChannelPool { Comparator.comparingLong((task) -> task.originalPromise.getExpiryTimeInNanos())); private final ScheduledFuture pendingAcquisitionExpirationFuture; - + private final ClientTelemetry clientTelemetry; /** * Initializes a newly created {@link RntbdClientChannelPool} instance. * * @param bootstrap the {@link Bootstrap} that is used for connections. * @param config the {@link Config} that is used for the channel pool instance created. */ - RntbdClientChannelPool(final RntbdServiceEndpoint endpoint, final Bootstrap bootstrap, final Config config) { - this(endpoint, bootstrap, config, new RntbdClientChannelHealthChecker(config)); + RntbdClientChannelPool(final RntbdServiceEndpoint endpoint, final Bootstrap bootstrap, final Config config, final ClientTelemetry clientTelemetry) { + this(endpoint, bootstrap, config, new RntbdClientChannelHealthChecker(config), clientTelemetry); } private RntbdClientChannelPool( final RntbdServiceEndpoint endpoint, final Bootstrap bootstrap, final Config config, - final RntbdClientChannelHealthChecker healthChecker) { + final RntbdClientChannelHealthChecker healthChecker, + final ClientTelemetry clientTelemetry) { checkNotNull(endpoint, "expected non-null endpoint"); checkNotNull(bootstrap, "expected non-null bootstrap"); @@ -239,7 +241,8 @@ public void onTimeout(AcquireListener task) { task.originalPromise.setFailure(ACQUISITION_TIMEOUT); RntbdChannelAcquisitionTimeline.startNewEvent( task.originalPromise.getChannelAcquisitionTimeline(), - RntbdChannelAcquisitionEventType.PENDING_TIME_OUT); + RntbdChannelAcquisitionEventType.PENDING_TIME_OUT, + clientTelemetry); } }; @@ -255,6 +258,7 @@ public void onTimeout(AcquireListener task) { } else { this.pendingAcquisitionExpirationFuture = null; } + this.clientTelemetry = clientTelemetry; // this.idleStateDetectionScheduledFuture = this.executor.scheduleAtFixedRate( // () -> { @@ -640,7 +644,8 @@ private void acquireChannel(final ChannelPromiseWithExpiryTime promise) { RntbdChannelAcquisitionTimeline.startNewEvent( channelAcquisitionTimeline, - RntbdChannelAcquisitionEventType.ATTEMPT_TO_CREATE_NEW_CHANNEL); + RntbdChannelAcquisitionEventType.ATTEMPT_TO_CREATE_NEW_CHANNEL, + clientTelemetry); final ChannelFuture future = this.bootstrap.clone().attr(POOL_KEY, this).connect(); @@ -743,7 +748,8 @@ private void addTaskToPendingAcquisitionQueue(ChannelPromiseWithExpiryTime promi } else { RntbdChannelAcquisitionTimeline.startNewEvent( promise.getChannelAcquisitionTimeline(), - RntbdChannelAcquisitionEventType.ADD_TO_PENDING_QUEUE); + RntbdChannelAcquisitionEventType.ADD_TO_PENDING_QUEUE, + clientTelemetry); } } } @@ -1118,7 +1124,8 @@ private void notifyChannelConnect(final ChannelFuture future, final Promise connectedChannel = this.channelPool.acquire(requestRecord.getChannelAcquisitionTimeline()); @@ -476,12 +478,14 @@ public static final class Provider implements RntbdEndpoint.Provider { private final RntbdRequestTimer requestTimer; private final RntbdTransportClient transportClient; private final IAddressResolver addressResolver; + private final ClientTelemetry clientTelemetry; public Provider( final RntbdTransportClient transportClient, final Options options, final SslContext sslContext, - final IAddressResolver addressResolver) { + final IAddressResolver addressResolver, + final ClientTelemetry clientTelemetry) { checkNotNull(transportClient, "expected non-null provider"); checkNotNull(options, "expected non-null options"); @@ -507,6 +511,7 @@ public Provider( this.endpoints = new ConcurrentHashMap<>(); this.evictions = new AtomicInteger(); this.closed = new AtomicBoolean(); + this.clientTelemetry = clientTelemetry; this.monitoring = new RntbdEndpointMonitoringProvider(this); this.monitoring.init(); } @@ -575,7 +580,8 @@ public RntbdEndpoint get(final URI physicalAddress) { this.config, this.eventLoopGroup, this.requestTimer, - physicalAddress)); + physicalAddress, + this.clientTelemetry)); } @Override diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/ClientTelemetryTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/ClientTelemetryTest.java index 7fe930406957..efbcc63bf40a 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/ClientTelemetryTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/ClientTelemetryTest.java @@ -126,12 +126,20 @@ public void operationsList(CosmosClient cosmosClient) throws Exception { cosmosContainer.deleteItem(internalObjectNode.getId(), new PartitionKey(internalObjectNode.getId()), new CosmosItemRequestOptions()); // delete operation + readClientTelemetry(clientTelemetry); //Verifying above 5 operation, we should have 10 operation (5 latency, 5 request charge) String json = Utils.getSimpleObjectMapper().writeValueAsString(clientTelemetry); if(cosmosClient.asyncClient().getConnectionPolicy().getConnectionMode().equals(ConnectionMode.GATEWAY)) { validateCTJsonFields(json, true, true); } else { validateCTJsonFields(json, false, false); + assertThat(clientTelemetry.getClientTelemetryInfo().getSystemInfoMap().size()).isEqualTo(3); + for(ReportPayload reportPayload : clientTelemetry.getClientTelemetryInfo().getSystemInfoMap().keySet()) { + if(reportPayload.getMetricInfo().getMetricsName().equals(ClientTelemetry.TCP_NEW_CHANNEL_LATENCY_NAME)) { + //Validate that we have open at least 1 channel + assertThat(reportPayload.getMetricInfo().getCount()).isGreaterThanOrEqualTo(1); + } + } } assertThat(clientTelemetry.getClientTelemetryInfo().getOperationInfoMap().size()).isEqualTo(10); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ConnectionStateListenerTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ConnectionStateListenerTest.java index adc999835704..35f1ee4f00bd 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ConnectionStateListenerTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/ConnectionStateListenerTest.java @@ -74,7 +74,8 @@ public void connectionStateListener_OnConnectionEvent( config, connectionPolicy, new UserAgentContainer(), - addressResolver); + addressResolver, + null); RxDocumentServiceRequest req = RxDocumentServiceRequest.create(mockDiagnosticsClientContext(), OperationType.Create, ResourceType.Document, diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdServiceEndpointTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdServiceEndpointTest.java index 4f2226f6be13..8a3c96a9bd99 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdServiceEndpointTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdServiceEndpointTest.java @@ -26,7 +26,7 @@ public void endpointCloseOnIdleEndpointTimeout() throws Exception { ConnectionPolicy connectionPolicy = new ConnectionPolicy(directConnectionConfig); final RntbdTransportClient.Options options = new RntbdTransportClient.Options.Builder(connectionPolicy).build(); final SslContext sslContext = SslContextBuilder.forClient().build(); - RntbdTransportClient transportClient = new RntbdTransportClient(options, sslContext, null); + RntbdTransportClient transportClient = new RntbdTransportClient(options, sslContext, null, null); URI uri = new URI(TestConfigurations.HOST); List uriList = new ArrayList<>(); diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClientTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClientTest.java index 7eeb07a67d7d..0ad4a29d44bb 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClientTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClientTest.java @@ -619,7 +619,7 @@ public void verifyGoneResponseMapsToGoneException() throws Exception { final RntbdTransportClient.Options options = new RntbdTransportClient.Options.Builder(connectionPolicy).build(); final SslContext sslContext = SslContextBuilder.forClient().build(); - try (final RntbdTransportClient transportClient = new RntbdTransportClient(options, sslContext, null)) { + try (final RntbdTransportClient transportClient = new RntbdTransportClient(options, sslContext, null, null)) { final BaseAuthorizationTokenProvider authorizationTokenProvider = new BaseAuthorizationTokenProvider( new AzureKeyCredential(RntbdTestConfiguration.AccountKey) diff --git a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/SharedTransportClientTest.java b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/SharedTransportClientTest.java index 50498c0c5818..06f572212d21 100644 --- a/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/SharedTransportClientTest.java +++ b/sdk/cosmos/azure-cosmos/src/test/java/com/azure/cosmos/implementation/directconnectivity/SharedTransportClientTest.java @@ -17,8 +17,8 @@ public void createTwoClient_SharedReference() { TransportClient transportClient1 = null; TransportClient transportClient2 = null; try { - transportClient1 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null); - transportClient2 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null); + transportClient1 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null, null); + transportClient2 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null, null); assertThat(transportClient2).isSameAs(transportClient1); assertThat(((SharedTransportClient) transportClient1).getReferenceCounter()).isEqualTo(2); @@ -33,8 +33,8 @@ public void createTwoHttpsClient_SharedReference() { TransportClient transportClient1 = null; TransportClient transportClient2 = null; try { - transportClient1 = SharedTransportClient.getOrCreateInstance(Protocol.HTTPS, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null); - transportClient2 = SharedTransportClient.getOrCreateInstance(Protocol.HTTPS, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null); + transportClient1 = SharedTransportClient.getOrCreateInstance(Protocol.HTTPS, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null, null); + transportClient2 = SharedTransportClient.getOrCreateInstance(Protocol.HTTPS, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null, null); assertThat(transportClient2).isSameAs(transportClient1); assertThat(((SharedTransportClient) transportClient1).getReferenceCounter()).isEqualTo(2); @@ -51,12 +51,12 @@ public void createTwoClient_CloseOne_CreateAnotherClient_SharedReference() throw TransportClient transportClient3 = null; try { - transportClient1 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null); - transportClient2 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null); + transportClient1 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null, null); + transportClient2 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null, null); transportClient2.close(); assertThat(((SharedTransportClient) transportClient1).getReferenceCounter()).isEqualTo(1); - transportClient3 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null); + transportClient3 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null, null); assertThat(transportClient3).isSameAs(transportClient1); assertThat(((SharedTransportClient) transportClient1).getReferenceCounter()).isEqualTo(2); } finally { @@ -72,13 +72,13 @@ public void createTwoClient_CloseBoth_ReCreateClient_NewReference() throws Excep TransportClient transportClient3 = null; try { - transportClient1 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null); - transportClient2 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null); + transportClient1 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null, null); + transportClient2 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null, null); transportClient1.close(); transportClient2.close(); assertThat(((SharedTransportClient) transportClient1).getReferenceCounter()).isEqualTo(0); - transportClient3 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null); + transportClient3 = SharedTransportClient.getOrCreateInstance(Protocol.TCP, new Configs(), ConnectionPolicy.getDefaultPolicy(), new UserAgentContainer(), new DiagnosticsClientContext.DiagnosticsClientConfig(), null, null); assertThat(transportClient3).isNotSameAs(transportClient1); assertThat(((SharedTransportClient) transportClient3).getReferenceCounter()).isEqualTo(1); } finally {