Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1967,7 +1967,7 @@

<!-- False positive, equals method is implemented correctly by using equality of member variables -->
<Match>
<Class name="com.azure.cosmos.implementation.clientTelemetry.ReportPayload"/>
<Class name="com.azure.cosmos.implementation.clienttelemetry.ReportPayload"/>
<Method name="equals"/>
<Bug pattern="EQ_UNUSUAL"/>
</Match>
Expand Down
1 change: 1 addition & 0 deletions sdk/cosmos/azure-cosmos/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,7 @@ Licensed under the MIT License.
--add-opens com.azure.cosmos/com.azure.cosmos.rx.proxy=ALL-UNNAMED
--add-opens com.azure.cosmos/com.azure.cosmos.implementation.throughputControl=ALL-UNNAMED
--add-opens com.azure.cosmos/com.azure.cosmos.implementation.throughputControl.controller.request=ALL-UNNAMED
--add-opens com.azure.cosmos/com.azure.cosmos.implementation.clienttelemetry=ALL-UNNAMED
</argLine>
</configuration>
</plugin>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,9 @@
import com.azure.cosmos.implementation.apachecommons.lang.StringUtils;
import com.azure.cosmos.implementation.batch.ServerBatchRequest;
import com.azure.cosmos.CosmosPatchOperations;
import com.azure.cosmos.TransactionalBatchResponse;
import com.azure.cosmos.implementation.apachecommons.lang.StringUtils;
import com.azure.cosmos.implementation.batch.ServerBatchRequest;
import com.azure.cosmos.implementation.caches.RxClientCollectionCache;
import com.azure.cosmos.implementation.caches.RxPartitionKeyRangeCache;
import com.azure.cosmos.implementation.clientTelemetry.ClientTelemetry;
import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry;
import com.azure.cosmos.implementation.query.PartitionedQueryExecutionInfo;
import com.azure.cosmos.implementation.throughputControl.config.ThroughputControlGroupInternal;
import com.azure.cosmos.models.CosmosChangeFeedRequestOptions;
Expand All @@ -30,7 +27,6 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
import com.azure.cosmos.implementation.caches.RxClientCollectionCache;
import com.azure.cosmos.implementation.caches.RxCollectionCache;
import com.azure.cosmos.implementation.caches.RxPartitionKeyRangeCache;
import com.azure.cosmos.implementation.clientTelemetry.ClientTelemetry;
import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry;
import com.azure.cosmos.implementation.cpu.CpuMemoryListener;
import com.azure.cosmos.implementation.cpu.CpuMemoryMonitor;
import com.azure.cosmos.implementation.directconnectivity.GatewayServiceConfigurationReader;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
import com.azure.cosmos.CosmosDiagnostics;
import com.azure.cosmos.CosmosException;
import com.azure.cosmos.TransactionalBatchResponse;
import com.azure.cosmos.implementation.clientTelemetry.ClientTelemetry;
import com.azure.cosmos.implementation.clientTelemetry.ReportPayload;
import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry;
import com.azure.cosmos.implementation.clienttelemetry.ReportPayload;
import com.azure.cosmos.implementation.directconnectivity.DirectBridgeInternal;
import com.azure.cosmos.models.CosmosItemResponse;
import com.azure.cosmos.models.CosmosResponse;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.cosmos.implementation.clientTelemetry;
package com.azure.cosmos.implementation.clienttelemetry;

import com.azure.cosmos.implementation.apachecommons.lang.StringUtils;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
Expand Down Expand Up @@ -85,4 +85,4 @@ public void setVmSize(String vmSize) {
this.vmSize = vmSize;
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.cosmos.implementation.clientTelemetry;
package com.azure.cosmos.implementation.clienttelemetry;

import com.azure.cosmos.BridgeInternal;
import com.azure.cosmos.ConnectionMode;
Expand Down Expand Up @@ -200,7 +200,8 @@ private Mono<Void> sendClientTelemetry() {

HttpRequest httpRequest = new HttpRequest(HttpMethod.POST, targetEndpoint,
targetEndpoint.getPort(), httpHeaders, fluxBytes);
Mono<HttpResponse> httpResponseMono = this.httpClient.send(httpRequest);
Mono<HttpResponse> httpResponseMono = this.httpClient.send(httpRequest,
Duration.ofSeconds(Configs.getHttpResponseTimeoutInSeconds()));
return httpResponseMono.flatMap(response -> {
if (response.statusCode() != HttpConstants.StatusCodes.OK) {
logger.error("Client telemetry request did not succeeded, status code {}",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.cosmos.implementation.clientTelemetry;
package com.azure.cosmos.implementation.clienttelemetry;

import com.azure.cosmos.ConnectionMode;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.cosmos.implementation.clientTelemetry;
package com.azure.cosmos.implementation.clienttelemetry;

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.cosmos.implementation.clientTelemetry;
package com.azure.cosmos.implementation.clienttelemetry;

import com.fasterxml.jackson.annotation.JsonInclude;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.cosmos.implementation.clientTelemetry;
package com.azure.cosmos.implementation.clienttelemetry;

import com.azure.cosmos.ConsistencyLevel;
import com.azure.cosmos.implementation.OperationType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,8 @@
import com.azure.cosmos.implementation.ResourceType;
import com.azure.cosmos.implementation.SerializationDiagnosticsContext;
import com.azure.cosmos.implementation.TracerProvider;
import com.azure.cosmos.implementation.Utils;
import com.azure.cosmos.implementation.clientTelemetry.ClientTelemetry;
import com.azure.cosmos.implementation.clientTelemetry.ReportPayload;
import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry;
import com.azure.cosmos.implementation.clienttelemetry.ReportPayload;
import com.azure.cosmos.implementation.query.QueryInfo;
import com.azure.cosmos.models.FeedResponse;
import com.fasterxml.jackson.core.JsonProcessingException;
Expand Down
2 changes: 1 addition & 1 deletion sdk/cosmos/azure-cosmos/src/main/java/module-info.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
opens com.azure.cosmos.implementation.query.metrics to com.fasterxml.jackson.databind;
opens com.azure.cosmos.implementation.query.orderbyquery to com.fasterxml.jackson.databind;
opens com.azure.cosmos.implementation.routing to com.fasterxml.jackson.databind;
opens com.azure.cosmos.implementation.clientTelemetry to com.fasterxml.jackson.databind;
opens com.azure.cosmos.implementation.clienttelemetry to com.fasterxml.jackson.databind;
opens com.azure.cosmos.models to com.fasterxml.jackson.databind;
opens com.azure.cosmos.util to com.fasterxml.jackson.databind;
opens com.azure.cosmos.implementation.throughputControl to com.fasterxml.jackson.databind;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,23 +5,33 @@
import com.azure.cosmos.implementation.Configs;
import com.azure.cosmos.implementation.HttpConstants;
import com.azure.cosmos.implementation.InternalObjectNode;
import com.azure.cosmos.implementation.RxDocumentClientImpl;
import com.azure.cosmos.implementation.TestConfigurations;
import com.azure.cosmos.implementation.clientTelemetry.ClientTelemetry;
import com.azure.cosmos.implementation.clientTelemetry.ReportPayload;
import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry;
import com.azure.cosmos.implementation.clienttelemetry.ReportPayload;
import com.azure.cosmos.implementation.directconnectivity.ReflectionUtils;
import com.azure.cosmos.implementation.http.HttpClient;
import com.azure.cosmos.implementation.http.HttpResponse;
import com.azure.cosmos.models.CosmosContainerProperties;
import com.azure.cosmos.models.CosmosItemRequestOptions;
import com.azure.cosmos.models.CosmosQueryRequestOptions;
import com.azure.cosmos.models.FeedResponse;
import com.azure.cosmos.models.PartitionKey;
import com.azure.cosmos.rx.TestSuiteBase;
import org.mockito.ArgumentMatchers;
import org.mockito.Mockito;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;

import static org.assertj.core.api.Assertions.assertThat;

Expand Down Expand Up @@ -86,10 +96,7 @@ public void operationsList(CosmosClient cosmosClient) throws Exception {
cosmosClient.getDatabase(asyncContainer.getDatabase().getId()).getContainer(asyncContainer.getId());

ClientTelemetry clientTelemetry = cosmosClient.asyncClient().getContextClient().getClientTelemetry();
Field backgroundRefreshLocationTimeIntervalInSecField = ClientTelemetry.class.getDeclaredField(
"clientTelemetrySchedulingSec");
backgroundRefreshLocationTimeIntervalInSecField.setAccessible(true);
backgroundRefreshLocationTimeIntervalInSecField.setInt(clientTelemetry, 5);
setClientTelemetrySchedulingInSec(clientTelemetry, 5);
clientTelemetry.init();

InternalObjectNode internalObjectNode = getInternalObjectNode();
Expand Down Expand Up @@ -205,6 +212,70 @@ public void clientTelemetryScheduling() {
System.setProperty("COSMOS.CLIENT_TELEMETRY_SCHEDULING_IN_SECONDS", "600");// setting it back for other tests
}

@SuppressWarnings("unchecked")
@Test(groups = {"non-emulator"}, timeOut = TIMEOUT)
public void clientTelemetryWithStageJunoEndpoint() throws InterruptedException, NoSuchFieldException,
IllegalAccessException {
CosmosClient cosmosClient = null;
String databaseId = UUID.randomUUID().toString();
try {
String whiteListedAccountForTelemetry = System.getProperty("COSMOS.CLIENT_TELEMETRY_COSMOS_ACCOUNT");
String[] credentialList = whiteListedAccountForTelemetry.split(";");
String host = credentialList[0].substring("AccountEndpoint=".length());
String key = credentialList[1].substring("AccountKey=".length());

cosmosClient = new CosmosClientBuilder()
.endpoint(host)
.key(key)
.clientTelemetryEnabled(true)
.buildClient();
String containerId = UUID.randomUUID().toString();
cosmosClient.createDatabase(databaseId);

CosmosContainerProperties containerProperties =
new CosmosContainerProperties(containerId, "/id");
cosmosClient.getDatabase(databaseId).createContainer(containerProperties);
CosmosContainer cosmosContainer =
cosmosClient.getDatabase(databaseId).getContainer(containerId);
ClientTelemetry clientTelemetry = cosmosClient.asyncClient().getContextClient().getClientTelemetry();
setClientTelemetrySchedulingInSec(clientTelemetry, 5);
clientTelemetry.init();

// If this test need to run on local machine please add below env property,
// in test env we add the env property with cosmos-client-telemetry-endpoint variable in tests.yml,
// which gets its value from key vault TestSecrets-Cosmos

logger.info("clientTelemetryWithStageJunoEndpoint client telemetry endpoint {}", System.getProperty("COSMOS.CLIENT_TELEMETRY_ENDPOINT").split("/")[2]);
logger.info("clientTelemetryWithStageJunoEndpoint cosmos account name {}",
ReflectionUtils.getGlobalEndpointManager((RxDocumentClientImpl) CosmosBridgeInternal.getAsyncDocumentClient(cosmosClient)).getLatestDatabaseAccount().getResourceId());


HttpClient httpClient = ReflectionUtils.getHttpClient(clientTelemetry);
HttpClient spyHttpClient = Mockito.spy(httpClient);
ReflectionUtils.setHttpClient(clientTelemetry, spyHttpClient);

AtomicReference<Mono<HttpResponse>> httpResponseMono = new AtomicReference<>();
Mockito.doAnswer(invocationOnMock -> {
httpResponseMono.set((Mono<HttpResponse>) invocationOnMock.callRealMethod());
return httpResponseMono.get();
}).when(spyHttpClient).send(ArgumentMatchers.any(),
ArgumentMatchers.any());
InternalObjectNode internalObjectNode = getInternalObjectNode();
cosmosContainer.createItem(internalObjectNode);
cosmosContainer.readItem(internalObjectNode.getId(),
new PartitionKey(internalObjectNode.getId()),
InternalObjectNode.class);
Thread.sleep(5000);
StepVerifier.create(httpResponseMono.get()).expectNextMatches(httpResponse -> {
logger.info("clientTelemetryWithStageJunoEndpoint statusCode from juno {}", httpResponse.statusCode());
return httpResponse.statusCode() == HttpConstants.StatusCodes.OK;
}).verifyComplete();
} finally {
cosmosClient.getDatabase(databaseId).delete();
safeCloseSyncClient(cosmosClient);
}
}

private InternalObjectNode getInternalObjectNode() {
InternalObjectNode internalObjectNode = new InternalObjectNode();
String uuid = UUID.randomUUID().toString();
Expand All @@ -218,4 +289,11 @@ private void readClientTelemetry(ClientTelemetry telemetry) throws Exception {
readHistogram.setAccessible(true);
readHistogram.invoke(telemetry);
}

private void setClientTelemetrySchedulingInSec(ClientTelemetry clientTelemetry, int backgroundScheduling) throws IllegalAccessException, NoSuchFieldException {
Field backgroundRefreshLocationTimeIntervalInSecField = ClientTelemetry.class.getDeclaredField(
"clientTelemetrySchedulingSec");
backgroundRefreshLocationTimeIntervalInSecField.setAccessible(true);
backgroundRefreshLocationTimeIntervalInSecField.setInt(clientTelemetry, backgroundScheduling);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import com.azure.cosmos.implementation.caches.RxClientCollectionCache;
import com.azure.cosmos.implementation.caches.RxCollectionCache;
import com.azure.cosmos.implementation.caches.RxPartitionKeyRangeCache;
import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry;
import com.azure.cosmos.implementation.cpu.CpuMemoryListener;
import com.azure.cosmos.implementation.cpu.CpuMemoryMonitor;
import com.azure.cosmos.implementation.directconnectivity.rntbd.RntbdEndpoint;
Expand Down Expand Up @@ -307,4 +308,12 @@ public static ConcurrentHashMap<OperationType, ThroughputControlTrackingUnit> ge
ThroughputRequestThrottler requestThrottler) {
return get(ConcurrentHashMap.class, requestThrottler, "trackingDictionary");
}

public static HttpClient getHttpClient(ClientTelemetry telemetry) {
return get(HttpClient.class, telemetry, "httpClient");
}

public static void setHttpClient(ClientTelemetry telemetry, HttpClient httpClient) {
set(telemetry, httpClient, "httpClient");
}
}
2 changes: 1 addition & 1 deletion sdk/cosmos/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ trigger: none
variables:
- template: ../../eng/pipelines/templates/variables/globals.yml
- name: AdditionalArgs
value: ''
value: '-DCOSMOS.CLIENT_TELEMETRY_ENDPOINT=$(cosmos-client-telemetry-endpoint) -DCOSMOS.CLIENT_TELEMETRY_COSMOS_ACCOUNT=$(cosmos-client-telemetry-cosmos-account)'

stages:
- template: /eng/pipelines/templates/stages/archetype-sdk-tests.yml
Expand Down