createContainerIfNotExists(String id, String partitionKeyPath) {
CosmosAsyncContainer container = getContainer(id);
- return createContainerIfNotExistsInternal(new CosmosContainerProperties(id, partitionKeyPath),
- container,
- null);
+ if (!client.getTracerProvider().isEnabled()) {
+ return createContainerIfNotExistsInternal(container.read(), new CosmosContainerProperties(id,
+ partitionKeyPath), null, null);
+ }
+
+ return withContext(context -> createContainerIfNotExistsInternal(new CosmosContainerProperties(id,
+ partitionKeyPath), container, null,
+ context));
}
/**
* Creates a Cosmos container if it does not exist on the service.
*
- * The throughput setting will only be used if the specified container
- * does not exist and a new container will be created.
+ * The throughput properties will only be used if the specified container
+ * does not exist and therefor a new container will be created.
*
* After subscription the operation will be performed. The {@link Mono} upon
* successful completion will contain a cosmos container response with the
@@ -362,25 +396,29 @@ public Mono createContainerIfNotExists(String id, Strin
*
* @param id the cosmos container id.
* @param partitionKeyPath the partition key path.
- * @param throughput the throughput for the container.
+ * @param throughputProperties the throughput properties for the container.
* @return a {@link Mono} containing the cosmos container response with the
* created container or an error.
*/
- Mono createContainerIfNotExists(
+ public Mono createContainerIfNotExists(
String id, String partitionKeyPath,
- int throughput) {
+ ThroughputProperties throughputProperties) {
CosmosContainerRequestOptions options = new CosmosContainerRequestOptions();
- ModelBridgeInternal.setThroughputProperties(options, ThroughputProperties.createManualThroughput(throughput));
+ ModelBridgeInternal.setThroughputProperties(options, throughputProperties);
CosmosAsyncContainer container = getContainer(id);
- return createContainerIfNotExistsInternal(new CosmosContainerProperties(id, partitionKeyPath), container,
- options);
+ if (!client.getTracerProvider().isEnabled()) {
+ return createContainerIfNotExistsInternal(container.read(), new CosmosContainerProperties(id, partitionKeyPath), options, null);
+ }
+
+ return withContext(context -> createContainerIfNotExistsInternal(new CosmosContainerProperties(id,
+ partitionKeyPath), container, options, context));
}
/**
* Creates a Cosmos container if it does not exist on the service.
*
- * The throughput properties will only be used if the specified container
- * does not exist and therefor a new container will be created.
+ * The throughput setting will only be used if the specified container
+ * does not exist and a new container will be created.
*
* After subscription the operation will be performed. The {@link Mono} upon
* successful completion will contain a cosmos container response with the
@@ -388,33 +426,24 @@ Mono createContainerIfNotExists(
*
* @param id the cosmos container id.
* @param partitionKeyPath the partition key path.
- * @param throughputProperties the throughput properties for the container.
+ * @param throughput the throughput for the container.
* @return a {@link Mono} containing the cosmos container response with the
* created container or an error.
*/
- public Mono createContainerIfNotExists(
+ Mono createContainerIfNotExists(
String id, String partitionKeyPath,
- ThroughputProperties throughputProperties) {
+ int throughput) {
CosmosContainerRequestOptions options = new CosmosContainerRequestOptions();
- ModelBridgeInternal.setThroughputProperties(options, throughputProperties);
+ ModelBridgeInternal.setThroughputProperties(options, ThroughputProperties.createManualThroughput(throughput));
CosmosAsyncContainer container = getContainer(id);
- return createContainerIfNotExistsInternal(new CosmosContainerProperties(id, partitionKeyPath), container,
- options);
- }
+ if (!client.getTracerProvider().isEnabled()) {
+ return createContainerIfNotExistsInternal(container.read(), new CosmosContainerProperties(id,
+ partitionKeyPath),
+ options, null);
+ }
- private Mono createContainerIfNotExistsInternal(
- CosmosContainerProperties containerProperties, CosmosAsyncContainer container,
- CosmosContainerRequestOptions options) {
- return container.read(options).onErrorResume(exception -> {
- final Throwable unwrappedException = Exceptions.unwrap(exception);
- if (unwrappedException instanceof CosmosException) {
- final CosmosException cosmosException = (CosmosException) unwrappedException;
- if (cosmosException.getStatusCode() == HttpConstants.StatusCodes.NOTFOUND) {
- return createContainer(containerProperties, options);
- }
- }
- return Mono.error(unwrappedException);
- });
+ return withContext(context -> createContainerIfNotExistsInternal(new CosmosContainerProperties(id,
+ partitionKeyPath), container, options, context));
}
/**
@@ -430,12 +459,15 @@ private Mono createContainerIfNotExistsInternal(
*/
public CosmosPagedFlux readAllContainers(CosmosQueryRequestOptions options) {
return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
+ String spanName = "readAllContainers." + this.getId();
+ pagedFluxOptions.setTracerInformation(this.getClient().getTracerProvider(), spanName,
+ this.getClient().getServiceEndpoint(), getId());
setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
return getDocClientWrapper().readCollections(getLink(), options)
.map(response -> BridgeInternal.createFeedResponse(
ModelBridgeInternal.getCosmosContainerPropertiesFromV2Results(response.getResults()),
response.getResponseHeaders()));
- });
+ }, this.getClient().getTracerProvider().isEnabled());
}
/**
@@ -464,7 +496,7 @@ public CosmosPagedFlux readAllContainers() {
* obtained containers or an error.
*/
public CosmosPagedFlux queryContainers(String query) {
- return queryContainers(new SqlQuerySpec(query));
+ return queryContainersInternal(new SqlQuerySpec(query), new CosmosQueryRequestOptions());
}
/**
@@ -480,7 +512,7 @@ public CosmosPagedFlux queryContainers(String query)
* obtained containers or an error.
*/
public CosmosPagedFlux queryContainers(String query, CosmosQueryRequestOptions options) {
- return queryContainers(new SqlQuerySpec(query), options);
+ return queryContainersInternal(new SqlQuerySpec(query), options);
}
/**
@@ -495,7 +527,7 @@ public CosmosPagedFlux queryContainers(String query,
* obtained containers or an error.
*/
public CosmosPagedFlux queryContainers(SqlQuerySpec querySpec) {
- return queryContainers(querySpec, new CosmosQueryRequestOptions());
+ return queryContainersInternal(querySpec, new CosmosQueryRequestOptions());
}
/**
@@ -510,14 +542,9 @@ public CosmosPagedFlux queryContainers(SqlQuerySpec q
* @return a {@link CosmosPagedFlux} containing one or several feed response pages of the
* obtained containers or an error.
*/
- public CosmosPagedFlux queryContainers(SqlQuerySpec querySpec, CosmosQueryRequestOptions options) {
- return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
- setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
- return getDocClientWrapper().queryCollections(getLink(), querySpec, options)
- .map(response -> BridgeInternal.createFeedResponse(
- ModelBridgeInternal.getCosmosContainerPropertiesFromV2Results(response.getResults()),
- response.getResponseHeaders()));
- });
+ public CosmosPagedFlux queryContainers(SqlQuerySpec querySpec
+ , CosmosQueryRequestOptions options) {
+ return queryContainersInternal(querySpec, options);
}
/**
@@ -530,8 +557,6 @@ public CosmosAsyncContainer getContainer(String id) {
return new CosmosAsyncContainer(id, this);
}
- /** User operations **/
-
/**
* Creates a user After subscription the operation will be performed. The
* {@link Mono} upon successful completion will contain a single resource
@@ -543,11 +568,12 @@ public CosmosAsyncContainer getContainer(String id) {
* created cosmos user or an error.
*/
public Mono createUser(CosmosUserProperties userProperties) {
- return getDocClientWrapper().createUser(this.getLink(), ModelBridgeInternal.getV2User(userProperties), null)
- .map(response -> ModelBridgeInternal.createCosmosUserResponse(response)).single();
+ if (!client.getTracerProvider().isEnabled()) {
+ return createUserInternal(userProperties);
+ }
+ return withContext(context -> createUserInternal(userProperties, context));
}
-
/**
* Upsert a user. Upsert will create a new user if it doesn't exist, or replace
* the existing one if it does. After subscription the operation will be
@@ -560,8 +586,11 @@ public Mono createUser(CosmosUserProperties userProperties)
* upserted user or an error.
*/
public Mono upsertUser(CosmosUserProperties userProperties) {
- return getDocClientWrapper().upsertUser(this.getLink(), ModelBridgeInternal.getV2User(userProperties), null)
- .map(response -> ModelBridgeInternal.createCosmosUserResponse(response)).single();
+ if (!client.getTracerProvider().isEnabled()) {
+ return upsertUserInternal(userProperties);
+ }
+
+ return withContext(context -> upsertUserInternal(userProperties, context));
}
/**
@@ -591,12 +620,15 @@ public CosmosPagedFlux readAllUsers() {
*/
CosmosPagedFlux readAllUsers(CosmosQueryRequestOptions options) {
return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
+ String spanName = "readAllUsers." + this.getId();
+ pagedFluxOptions.setTracerInformation(this.getClient().getTracerProvider(), spanName,
+ this.getClient().getServiceEndpoint(), getId());
setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
return getDocClientWrapper().readUsers(getLink(), options)
.map(response -> BridgeInternal.createFeedResponse(
ModelBridgeInternal.getCosmosUserPropertiesFromV2Results(response.getResults()), response
.getResponseHeaders()));
- });
+ }, this.getClient().getTracerProvider().isEnabled());
}
/**
@@ -627,7 +659,7 @@ public CosmosPagedFlux queryUsers(String query) {
* obtained users or an error.
*/
public CosmosPagedFlux queryUsers(String query, CosmosQueryRequestOptions options) {
- return queryUsers(new SqlQuerySpec(query), options);
+ return queryUsersInternal(new SqlQuerySpec(query), options);
}
/**
@@ -642,7 +674,7 @@ public CosmosPagedFlux queryUsers(String query, CosmosQuer
* obtained users or an error.
*/
public CosmosPagedFlux queryUsers(SqlQuerySpec querySpec) {
- return queryUsers(querySpec, new CosmosQueryRequestOptions());
+ return queryUsersInternal(querySpec, new CosmosQueryRequestOptions());
}
/**
@@ -658,13 +690,7 @@ public CosmosPagedFlux queryUsers(SqlQuerySpec querySpec)
* obtained users or an error.
*/
public CosmosPagedFlux queryUsers(SqlQuerySpec querySpec, CosmosQueryRequestOptions options) {
- return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
- setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
- return getDocClientWrapper().queryUsers(getLink(), querySpec, options)
- .map(response -> BridgeInternal.createFeedResponseWithQueryMetrics(
- ModelBridgeInternal.getCosmosUserPropertiesFromV2Results(response.getResults()), response.getResponseHeaders(),
- ModelBridgeInternal.queryMetrics(response)));
- });
+ return queryUsersInternal(querySpec, options);
}
/**
@@ -685,30 +711,11 @@ public CosmosAsyncUser getUser(String id) {
* @return the mono.
*/
public Mono replaceThroughput(ThroughputProperties throughputProperties) {
- return this.read()
- .flatMap(response -> this.getDocClientWrapper()
- .queryOffers(getOfferQuerySpecFromResourceId(response.getProperties().getResourceId()),
- new CosmosQueryRequestOptions())
- .single()
- .flatMap(offerFeedResponse -> {
- if (offerFeedResponse.getResults().isEmpty()) {
- return Mono.error(BridgeInternal
- .createCosmosException(
- HttpConstants.StatusCodes.BADREQUEST,
- "No offers found for the " +
- "resource " + this.getId()));
- }
-
- Offer existingOffer = offerFeedResponse.getResults().get(0);
- Offer updatedOffer =
- ModelBridgeInternal.updateOfferFromProperties(existingOffer,
- throughputProperties);
-
- return this.getDocClientWrapper()
- .replaceOffer(updatedOffer)
- .single();
- })
- .map(ModelBridgeInternal::createThroughputRespose));
+ if(!this.client.getTracerProvider().isEnabled()) {
+ return replaceThroughputInternal(this.read(), throughputProperties);
+ }
+
+ return withContext(context -> replaceThroughputInternal(throughputProperties, context));
}
/**
@@ -717,26 +724,11 @@ public Mono replaceThroughput(ThroughputProperties throughpu
* @return the mono containing throughput response.
*/
public Mono readThroughput() {
- return this.read()
- .flatMap(response -> getDocClientWrapper()
- .queryOffers(getOfferQuerySpecFromResourceId(response.getProperties().getResourceId()),
- new CosmosQueryRequestOptions())
- .single()
- .flatMap(offerFeedResponse -> {
- if (offerFeedResponse.getResults().isEmpty()) {
- return Mono.error(BridgeInternal
- .createCosmosException(
- HttpConstants.StatusCodes.BADREQUEST,
- "No offers found for the " +
- "resource " + this.getId()));
- }
- return getDocClientWrapper()
- .readOffer(offerFeedResponse.getResults()
- .get(0)
- .getSelfLink())
- .single();
- })
- .map(ModelBridgeInternal::createThroughputRespose));
+ if(!this.client.getTracerProvider().isEnabled()) {
+ return readThroughputInternal(this.read());
+ }
+
+ return withContext(context -> readThroughputInternal(context));
}
SqlQuerySpec getOfferQuerySpecFromResourceId(String resourceId) {
@@ -768,4 +760,218 @@ String getLink() {
return this.link;
}
+ private CosmosPagedFlux queryContainersInternal(SqlQuerySpec querySpec
+ , CosmosQueryRequestOptions options) {
+ return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
+ String spanName = "queryContainers." + this.getId();
+ pagedFluxOptions.setTracerInformation(this.getClient().getTracerProvider(), spanName,
+ this.getClient().getServiceEndpoint(), getId());
+ setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
+ return getDocClientWrapper().queryCollections(getLink(), querySpec, options)
+ .map(response -> BridgeInternal.createFeedResponse(
+ ModelBridgeInternal.getCosmosContainerPropertiesFromV2Results(response.getResults()),
+ response.getResponseHeaders()));
+ }, this.getClient().getTracerProvider().isEnabled());
+ }
+
+ private CosmosPagedFlux queryUsersInternal(SqlQuerySpec querySpec, CosmosQueryRequestOptions options) {
+ return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
+ String spanName = "queryUsers." + this.getId();
+ pagedFluxOptions.setTracerInformation(this.getClient().getTracerProvider(), spanName,
+ this.getClient().getServiceEndpoint(), getId());
+ setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
+ return getDocClientWrapper().queryUsers(getLink(), querySpec, options)
+ .map(response -> BridgeInternal.createFeedResponseWithQueryMetrics(
+ ModelBridgeInternal.getCosmosUserPropertiesFromV2Results(response.getResults()), response.getResponseHeaders(),
+ ModelBridgeInternal.queryMetrics(response)));
+ }, this.getClient().getTracerProvider().isEnabled());
+ }
+
+ private Mono createContainerIfNotExistsInternal(
+ CosmosContainerProperties containerProperties,
+ CosmosAsyncContainer container,
+ CosmosContainerRequestOptions options,
+ Context context) {
+ String spanName = "createContainerIfNotExistsInternal." + containerProperties.getId();
+ Context nestedContext = context.addData(TracerProvider.COSMOS_CALL_DEPTH, TracerProvider.COSMOS_CALL_DEPTH_VAL);
+ if (options == null) {
+ options = new CosmosContainerRequestOptions();
+ }
+
+ Mono responseMono = createContainerIfNotExistsInternal(container.read(options, nestedContext), containerProperties, options, nestedContext);
+ return this.client.getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono, context,
+ spanName,
+ getId(),
+ getClient().getServiceEndpoint());
+ }
+
+ private Mono createContainerIfNotExistsInternal(
+ Mono responseMono,
+ CosmosContainerProperties containerProperties,
+ CosmosContainerRequestOptions options,
+ Context context) {
+ return responseMono.onErrorResume(exception -> {
+ final Throwable unwrappedException = Exceptions.unwrap(exception);
+ if (unwrappedException instanceof CosmosException) {
+ final CosmosException cosmosException = (CosmosException) unwrappedException;
+ if (cosmosException.getStatusCode() == HttpConstants.StatusCodes.NOTFOUND) {
+ if(context != null) {
+ return createContainerInternal(containerProperties, options, context);
+ }
+
+ return createContainer(containerProperties, options);
+ }
+ }
+ return Mono.error(unwrappedException);
+ });
+ }
+
+ private Mono createContainerInternal(
+ CosmosContainerProperties containerProperties,
+ CosmosContainerRequestOptions options,
+ Context context) {
+ String spanName = "createContainer." + containerProperties.getId();
+ Mono responseMono = createContainerInternal(containerProperties, options);
+ return this.client.getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono, context,
+ spanName,
+ getId(),
+ getClient().getServiceEndpoint());
+ }
+
+ private Mono createContainerInternal(
+ CosmosContainerProperties containerProperties,
+ CosmosContainerRequestOptions options) {
+ return getDocClientWrapper()
+ .createCollection(this.getLink(), ModelBridgeInternal.getV2Collection(containerProperties),
+ ModelBridgeInternal.toRequestOptions(options))
+ .map(response -> ModelBridgeInternal.createCosmosContainerResponse(response)).single();
+ }
+
+ Mono readInternal(CosmosDatabaseRequestOptions options, Context context) {
+ String spanName = "readDatabase." + this.getId();
+ Mono responseMono = readInternal(options);
+ return this.client.getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono, context,
+ spanName,
+ getId(),
+ getClient().getServiceEndpoint());
+ }
+
+ private Mono readInternal(CosmosDatabaseRequestOptions options) {
+ return getDocClientWrapper().readDatabase(getLink(),
+ ModelBridgeInternal.toRequestOptions(options))
+ .map(response -> ModelBridgeInternal.createCosmosDatabaseResponse(response)).single();
+ }
+
+ private Mono deleteInternal(CosmosDatabaseRequestOptions options, Context context) {
+ String spanName = "deleteDatabase." + this.getId();
+ Mono responseMono = deleteInternal(options);
+ return this.client.getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono, context,
+ spanName,
+ getId(),
+ getClient().getServiceEndpoint());
+ }
+
+ private Mono deleteInternal(CosmosDatabaseRequestOptions options) {
+ return getDocClientWrapper().deleteDatabase(getLink(),
+ ModelBridgeInternal.toRequestOptions(options))
+ .map(response -> ModelBridgeInternal.createCosmosDatabaseResponse(response)).single();
+ }
+
+ private Mono createUserInternal(CosmosUserProperties userProperties, Context context) {
+ String spanName = "createUser." + this.getId();
+ Mono responseMono = createUserInternal(userProperties);
+ return this.client.getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono, context,
+ spanName,
+ getId(),
+ getClient().getServiceEndpoint());
+ }
+
+ private Mono createUserInternal(CosmosUserProperties userProperties) {
+ return getDocClientWrapper().createUser(this.getLink(), ModelBridgeInternal.getV2User(userProperties), null)
+ .map(response -> ModelBridgeInternal.createCosmosUserResponse(response)).single();
+ }
+
+ private Mono upsertUserInternal(CosmosUserProperties userProperties, Context context) {
+ String spanName = "upsertUser." + this.getId();
+ Mono responseMono = upsertUserInternal(userProperties);
+ return this.client.getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono, context,
+ spanName, getId(), getClient().getServiceEndpoint());
+ }
+
+ private Mono upsertUserInternal(CosmosUserProperties userProperties) {
+ return getDocClientWrapper().upsertUser(this.getLink(), ModelBridgeInternal.getV2User(userProperties), null)
+ .map(response -> ModelBridgeInternal.createCosmosUserResponse(response)).single();
+ }
+
+ private Mono replaceThroughputInternal(ThroughputProperties throughputProperties, Context context){
+ String spanName = "replaceThroughput." + this.getId();
+ Context nestedContext = context.addData(TracerProvider.COSMOS_CALL_DEPTH, TracerProvider.COSMOS_CALL_DEPTH_VAL);
+ Mono responseMono = replaceThroughputInternal(this.readInternal(new CosmosDatabaseRequestOptions(), nestedContext), throughputProperties);
+ return this.client.getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono,
+ context,
+ spanName,
+ getId(),
+ getClient().getServiceEndpoint());
+ }
+
+ private Mono replaceThroughputInternal(Mono responseMono, ThroughputProperties throughputProperties) {
+ return responseMono
+ .flatMap(response -> this.getDocClientWrapper()
+ .queryOffers(getOfferQuerySpecFromResourceId(response.getProperties().getResourceId()),
+ new CosmosQueryRequestOptions())
+ .single()
+ .flatMap(offerFeedResponse -> {
+ if (offerFeedResponse.getResults().isEmpty()) {
+ return Mono.error(BridgeInternal
+ .createCosmosException(
+ HttpConstants.StatusCodes.BADREQUEST,
+ "No offers found for the " +
+ "resource " + this.getId()));
+ }
+
+ Offer existingOffer = offerFeedResponse.getResults().get(0);
+ Offer updatedOffer =
+ ModelBridgeInternal.updateOfferFromProperties(existingOffer,
+ throughputProperties);
+
+ return this.getDocClientWrapper()
+ .replaceOffer(updatedOffer)
+ .single();
+ })
+ .map(ModelBridgeInternal::createThroughputRespose));
+ }
+
+ private Mono readThroughputInternal(Context context){
+ String spanName = "readThroughput." + this.getId();
+ Context nestedContext = context.addData(TracerProvider.COSMOS_CALL_DEPTH, TracerProvider.COSMOS_CALL_DEPTH_VAL);
+ Mono responseMono = readThroughputInternal(this.readInternal(new CosmosDatabaseRequestOptions(), nestedContext));
+ return this.client.getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono,
+ context,
+ spanName,
+ getId(),
+ getClient().getServiceEndpoint());
+ }
+
+ private Mono readThroughputInternal(Mono responseMono) {
+ return responseMono
+ .flatMap(response -> getDocClientWrapper()
+ .queryOffers(getOfferQuerySpecFromResourceId(response.getProperties().getResourceId()),
+ new CosmosQueryRequestOptions())
+ .single()
+ .flatMap(offerFeedResponse -> {
+ if (offerFeedResponse.getResults().isEmpty()) {
+ return Mono.error(BridgeInternal
+ .createCosmosException(
+ HttpConstants.StatusCodes.BADREQUEST,
+ "No offers found for the " +
+ "resource " + this.getId()));
+ }
+ return getDocClientWrapper()
+ .readOffer(offerFeedResponse.getResults()
+ .get(0)
+ .getSelfLink())
+ .single();
+ })
+ .map(ModelBridgeInternal::createThroughputRespose));
+ }
}
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncPermission.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncPermission.java
index f01a52766820..128937f4f762 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncPermission.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncPermission.java
@@ -2,6 +2,7 @@
// Licensed under the MIT License.
package com.azure.cosmos;
+import com.azure.core.util.Context;
import com.azure.cosmos.implementation.Paths;
import com.azure.cosmos.models.CosmosPermissionResponse;
import com.azure.cosmos.models.CosmosPermissionProperties;
@@ -9,6 +10,8 @@
import com.azure.cosmos.models.ModelBridgeInternal;
import reactor.core.publisher.Mono;
+import static com.azure.core.util.FluxUtil.withContext;
+
/**
* Has methods to operate on a per-User Permission to access a specific resource
*/
@@ -56,11 +59,13 @@ public Mono read(CosmosPermissionRequestOptions option
if (options == null) {
options = new CosmosPermissionRequestOptions();
}
- return cosmosUser.getDatabase()
- .getDocClientWrapper()
- .readPermission(getLink(), ModelBridgeInternal.toRequestOptions(options))
- .map(response -> ModelBridgeInternal.createCosmosPermissionResponse(response))
- .single();
+
+ if (!cosmosUser.getDatabase().getClient().getTracerProvider().isEnabled()) {
+ return readInternal(options);
+ }
+
+ final CosmosPermissionRequestOptions requestOptions = options;
+ return withContext(context -> readInternal(requestOptions, context));
}
/**
@@ -79,13 +84,13 @@ public Mono replace(CosmosPermissionProperties permiss
if (options == null) {
options = new CosmosPermissionRequestOptions();
}
- CosmosAsyncDatabase databaseContext = cosmosUser.getDatabase();
- return databaseContext
- .getDocClientWrapper()
- .replacePermission(ModelBridgeInternal.getPermission(permissionProperties, databaseContext.getId()),
- ModelBridgeInternal.toRequestOptions(options))
- .map(response -> ModelBridgeInternal.createCosmosPermissionResponse(response))
- .single();
+
+ if (!cosmosUser.getDatabase().getClient().getTracerProvider().isEnabled()) {
+ return replaceInternal(permissionProperties, options);
+ }
+
+ final CosmosPermissionRequestOptions requestOptions = options;
+ return withContext(context -> replaceInternal(permissionProperties, requestOptions, context));
}
/**
@@ -102,11 +107,13 @@ public Mono delete(CosmosPermissionRequestOptions opti
if (options == null) {
options = new CosmosPermissionRequestOptions();
}
- return cosmosUser.getDatabase()
- .getDocClientWrapper()
- .deletePermission(getLink(), ModelBridgeInternal.toRequestOptions(options))
- .map(response -> ModelBridgeInternal.createCosmosPermissionResponse(response))
- .single();
+
+ if (!cosmosUser.getDatabase().getClient().getTracerProvider().isEnabled()) {
+ return deleteInternal(options);
+ }
+
+ final CosmosPermissionRequestOptions requestOptions = options;
+ return withContext(context -> deleteInternal(requestOptions, context));
}
String getURIPathSegment() {
@@ -126,4 +133,67 @@ String getLink() {
builder.append(getId());
return builder.toString();
}
+
+ private Mono readInternal(CosmosPermissionRequestOptions options, Context context) {
+
+ String spanName = "readPermission." + cosmosUser.getId();
+ Mono responseMono = readInternal(options);
+ return cosmosUser.getDatabase().getClient().getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono, context,
+ spanName,
+ cosmosUser.getDatabase().getId(),
+ cosmosUser.getDatabase().getClient().getServiceEndpoint());
+ }
+
+ private Mono readInternal(CosmosPermissionRequestOptions options) {
+
+ return cosmosUser.getDatabase()
+ .getDocClientWrapper()
+ .readPermission(getLink(), ModelBridgeInternal.toRequestOptions(options))
+ .map(response -> ModelBridgeInternal.createCosmosPermissionResponse(response))
+ .single();
+ }
+
+ private Mono replaceInternal(CosmosPermissionProperties permissionProperties,
+ CosmosPermissionRequestOptions options,
+ Context context) {
+
+ String spanName = "replacePermission." + cosmosUser.getId();
+ Mono responseMono = replaceInternal(permissionProperties, options);
+ return cosmosUser.getDatabase().getClient().getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono, context,
+ spanName,
+ cosmosUser.getDatabase().getId(),
+ cosmosUser.getDatabase().getClient().getServiceEndpoint());
+ }
+
+ private Mono replaceInternal(CosmosPermissionProperties permissionProperties,
+ CosmosPermissionRequestOptions options) {
+ CosmosAsyncDatabase databaseContext = cosmosUser.getDatabase();
+ return cosmosUser.getDatabase()
+ .getDocClientWrapper()
+ .replacePermission(ModelBridgeInternal.getPermission(permissionProperties, databaseContext.getId()),
+ ModelBridgeInternal.toRequestOptions(options))
+ .map(response -> ModelBridgeInternal.createCosmosPermissionResponse(response))
+ .single();
+ }
+
+ private Mono deleteInternal(CosmosPermissionRequestOptions options,
+ Context context) {
+
+ String spanName = "deletePermission." + cosmosUser.getId();
+ Mono responseMono = deleteInternal(options);
+ return cosmosUser.getDatabase().getClient().getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono, context,
+ spanName,
+ cosmosUser.getDatabase().getId(),
+ cosmosUser.getDatabase().getClient().getServiceEndpoint());
+ }
+
+ private Mono deleteInternal(CosmosPermissionRequestOptions options) {
+
+ return cosmosUser.getDatabase()
+ .getDocClientWrapper()
+ .deletePermission(getLink(), ModelBridgeInternal.toRequestOptions(options))
+ .map(response -> ModelBridgeInternal.createCosmosPermissionResponse(response))
+ .single();
+ }
+
}
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncScripts.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncScripts.java
index 7ea5249b8b70..7d4e22244948 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncScripts.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncScripts.java
@@ -2,23 +2,25 @@
// Licensed under the MIT License.
package com.azure.cosmos;
+import com.azure.core.util.Context;
import com.azure.cosmos.implementation.StoredProcedure;
import com.azure.cosmos.implementation.Trigger;
import com.azure.cosmos.implementation.UserDefinedFunction;
-import com.azure.cosmos.models.CosmosStoredProcedureResponse;
-import com.azure.cosmos.models.CosmosTriggerResponse;
-import com.azure.cosmos.models.CosmosUserDefinedFunctionResponse;
+import com.azure.cosmos.models.CosmosQueryRequestOptions;
import com.azure.cosmos.models.CosmosStoredProcedureProperties;
import com.azure.cosmos.models.CosmosStoredProcedureRequestOptions;
+import com.azure.cosmos.models.CosmosStoredProcedureResponse;
import com.azure.cosmos.models.CosmosTriggerProperties;
+import com.azure.cosmos.models.CosmosTriggerResponse;
import com.azure.cosmos.models.CosmosUserDefinedFunctionProperties;
-import com.azure.cosmos.models.CosmosQueryRequestOptions;
+import com.azure.cosmos.models.CosmosUserDefinedFunctionResponse;
import com.azure.cosmos.models.ModelBridgeInternal;
import com.azure.cosmos.models.SqlQuerySpec;
import com.azure.cosmos.util.CosmosPagedFlux;
import com.azure.cosmos.util.UtilBridgeInternal;
import reactor.core.publisher.Mono;
+import static com.azure.core.util.FluxUtil.withContext;
import static com.azure.cosmos.implementation.Utils.setContinuationTokenAndMaxItemCount;
/**
@@ -71,10 +73,12 @@ public Mono createStoredProcedure(
StoredProcedure sProc = new StoredProcedure();
sProc.setId(properties.getId());
sProc.setBody(properties.getBody());
- return database.getDocClientWrapper()
- .createStoredProcedure(container.getLink(), sProc, ModelBridgeInternal.toRequestOptions(options))
- .map(response -> ModelBridgeInternal.createCosmosStoredProcedureResponse(response))
- .single();
+ if (!container.getDatabase().getClient().getTracerProvider().isEnabled()) {
+ return createStoredProcedureInternal(sProc, options);
+ }
+
+ final CosmosStoredProcedureRequestOptions requestOptions = options;
+ return withContext(context -> createStoredProcedureInternal(sProc, requestOptions, context));
}
/**
@@ -108,13 +112,18 @@ public CosmosPagedFlux readAllStoredProcedures(
*/
CosmosPagedFlux readAllStoredProcedures(CosmosQueryRequestOptions options) {
return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
+ String spanName = "readAllStoredProcedures." + this.container.getId();
+ pagedFluxOptions.setTracerInformation(this.container.getDatabase().getClient().getTracerProvider(),
+ spanName,
+ this.container.getDatabase().getClient().getServiceEndpoint(),
+ this.container.getDatabase().getId());
setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
return database.getDocClientWrapper()
.readStoredProcedures(container.getLink(), options)
.map(response -> BridgeInternal.createFeedResponse(
ModelBridgeInternal.getCosmosStoredProcedurePropertiesFromV2Results(response.getResults()),
response.getResponseHeaders()));
- });
+ }, this.container.getDatabase().getClient().getTracerProvider().isEnabled());
}
/**
@@ -132,8 +141,8 @@ CosmosPagedFlux readAllStoredProcedures(CosmosQ
*/
public CosmosPagedFlux queryStoredProcedures(
String query,
- CosmosQueryRequestOptions options) {
- return queryStoredProcedures(new SqlQuerySpec(query), options);
+ CosmosQueryRequestOptions options) {
+ return queryStoredProceduresInternal(new SqlQuerySpec(query), options);
}
/**
@@ -152,14 +161,7 @@ public CosmosPagedFlux queryStoredProcedures(
public CosmosPagedFlux queryStoredProcedures(
SqlQuerySpec querySpec,
CosmosQueryRequestOptions options) {
- return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
- setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
- return database.getDocClientWrapper()
- .queryStoredProcedures(container.getLink(), querySpec, options)
- .map(response -> BridgeInternal.createFeedResponse(
- ModelBridgeInternal.getCosmosStoredProcedurePropertiesFromV2Results(response.getResults()),
- response.getResponseHeaders()));
- });
+ return queryStoredProceduresInternal(querySpec, options);
}
/**
@@ -172,7 +174,6 @@ public CosmosAsyncStoredProcedure getStoredProcedure(String id) {
return new CosmosAsyncStoredProcedure(id, this.container);
}
-
/* UDF Operations */
/**
@@ -191,10 +192,11 @@ public Mono createUserDefinedFunction(
UserDefinedFunction udf = new UserDefinedFunction();
udf.setId(properties.getId());
udf.setBody(properties.getBody());
+ if (!container.getDatabase().getClient().getTracerProvider().isEnabled()) {
+ return createUserDefinedFunctionInternal(udf);
+ }
- return database.getDocClientWrapper()
- .createUserDefinedFunction(container.getLink(), udf, null)
- .map(response -> ModelBridgeInternal.createCosmosUserDefinedFunctionResponse(response)).single();
+ return withContext(context -> createUserDefinedFunctionInternal(udf, context));
}
/**
@@ -226,13 +228,18 @@ public CosmosPagedFlux readAllUserDefinedFu
*/
CosmosPagedFlux readAllUserDefinedFunctions(CosmosQueryRequestOptions options) {
return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
+ String spanName = "readAllUserDefinedFunctions." + this.container.getId();
+ pagedFluxOptions.setTracerInformation(this.container.getDatabase().getClient().getTracerProvider(),
+ spanName,
+ this.container.getDatabase().getClient().getServiceEndpoint(),
+ this.container.getDatabase().getId());
setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
return database.getDocClientWrapper()
- .readUserDefinedFunctions(container.getLink(), options)
- .map(response -> BridgeInternal.createFeedResponse(
- ModelBridgeInternal.getCosmosUserDefinedFunctionPropertiesFromV2Results(response.getResults()),
- response.getResponseHeaders()));
- });
+ .readUserDefinedFunctions(container.getLink(), options)
+ .map(response -> BridgeInternal.createFeedResponse(
+ ModelBridgeInternal.getCosmosUserDefinedFunctionPropertiesFromV2Results(response.getResults()),
+ response.getResponseHeaders()));
+ }, this.container.getDatabase().getClient().getTracerProvider().isEnabled());
}
/**
@@ -272,14 +279,7 @@ public CosmosPagedFlux queryUserDefinedFunc
public CosmosPagedFlux queryUserDefinedFunctions(
SqlQuerySpec querySpec,
CosmosQueryRequestOptions options) {
- return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
- setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
- return database.getDocClientWrapper()
- .queryUserDefinedFunctions(container.getLink(), querySpec, options)
- .map(response -> BridgeInternal.createFeedResponse(
- ModelBridgeInternal.getCosmosUserDefinedFunctionPropertiesFromV2Results(response.getResults()),
- response.getResponseHeaders()));
- });
+ return queryUserDefinedFunctionsInternal(querySpec, options);
}
/**
@@ -305,12 +305,11 @@ public CosmosAsyncUserDefinedFunction getUserDefinedFunction(String id) {
* @return an {@link Mono} containing the single resource response with the created trigger or an error.
*/
public Mono createTrigger(CosmosTriggerProperties properties) {
- Trigger trigger = new Trigger(ModelBridgeInternal.toJsonFromJsonSerializable(ModelBridgeInternal.getResource(properties)));
+ if (!container.getDatabase().getClient().getTracerProvider().isEnabled()) {
+ return createTriggerInternal(properties);
+ }
- return database.getDocClientWrapper()
- .createTrigger(container.getLink(), trigger, null)
- .map(response -> ModelBridgeInternal.createCosmosTriggerResponse(response))
- .single();
+ return withContext(context -> createTriggerInternal(properties, context));
}
/**
@@ -344,13 +343,18 @@ public CosmosPagedFlux readAllTriggers() {
*/
CosmosPagedFlux readAllTriggers(CosmosQueryRequestOptions options) {
return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
+ String spanName = "readAllTriggers." + this.container.getId();
+ pagedFluxOptions.setTracerInformation(this.container.getDatabase().getClient().getTracerProvider(),
+ spanName,
+ this.container.getDatabase().getClient().getServiceEndpoint(),
+ this.container.getDatabase().getId());
setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
return database.getDocClientWrapper()
.readTriggers(container.getLink(), options)
.map(response -> BridgeInternal.createFeedResponse(
ModelBridgeInternal.getCosmosTriggerPropertiesFromV2Results(response.getResults()),
response.getResponseHeaders()));
- });
+ }, this.container.getDatabase().getClient().getTracerProvider().isEnabled());
}
/**
@@ -366,7 +370,7 @@ CosmosPagedFlux readAllTriggers(CosmosQueryRequestOptio
* error.
*/
public CosmosPagedFlux queryTriggers(String query, CosmosQueryRequestOptions options) {
- return queryTriggers(new SqlQuerySpec(query), options);
+ return queryTriggersInternal(false, new SqlQuerySpec(query), options);
}
/**
@@ -384,14 +388,7 @@ public CosmosPagedFlux queryTriggers(String query, Cosm
public CosmosPagedFlux queryTriggers(
SqlQuerySpec querySpec,
CosmosQueryRequestOptions options) {
- return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
- setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
- return database.getDocClientWrapper()
- .queryTriggers(container.getLink(), querySpec, options)
- .map(response -> BridgeInternal.createFeedResponse(
- ModelBridgeInternal.getCosmosTriggerPropertiesFromV2Results(response.getResults()),
- response.getResponseHeaders()));
- });
+ return queryTriggersInternal(true, querySpec, options);
}
/**
@@ -404,4 +401,120 @@ public CosmosAsyncTrigger getTrigger(String id) {
return new CosmosAsyncTrigger(id, this.container);
}
+ private CosmosPagedFlux queryStoredProceduresInternal(
+ SqlQuerySpec querySpec,
+ CosmosQueryRequestOptions options) {
+ return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
+ String spanName = "queryStoredProcedures." + this.container.getId();
+ pagedFluxOptions.setTracerInformation(this.container.getDatabase().getClient().getTracerProvider(),
+ spanName,
+ this.container.getDatabase().getClient().getServiceEndpoint(),
+ this.container.getDatabase().getId());
+ setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
+ return database.getDocClientWrapper()
+ .queryStoredProcedures(container.getLink(), querySpec, options)
+ .map(response -> BridgeInternal.createFeedResponse(
+ ModelBridgeInternal.getCosmosStoredProcedurePropertiesFromV2Results(response.getResults()),
+ response.getResponseHeaders()));
+ }, this.container.getDatabase().getClient().getTracerProvider().isEnabled());
+ }
+
+ private CosmosPagedFlux queryUserDefinedFunctionsInternal(
+ SqlQuerySpec querySpec,
+ CosmosQueryRequestOptions options) {
+ return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
+ String spanName = "queryUserDefinedFunctions." + this.container.getId();
+ pagedFluxOptions.setTracerInformation(this.container.getDatabase().getClient().getTracerProvider(),
+ spanName,
+ this.container.getDatabase().getClient().getServiceEndpoint(),
+ this.container.getDatabase().getId());
+ setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
+ return database.getDocClientWrapper()
+ .queryUserDefinedFunctions(container.getLink(), querySpec, options)
+ .map(response -> BridgeInternal.createFeedResponse(
+ ModelBridgeInternal.getCosmosUserDefinedFunctionPropertiesFromV2Results(response.getResults()),
+ response.getResponseHeaders()));
+ }, this.container.getDatabase().getClient().getTracerProvider().isEnabled());
+ }
+
+ private CosmosPagedFlux queryTriggersInternal(
+ boolean isParameterised,
+ SqlQuerySpec querySpec,
+ CosmosQueryRequestOptions options) {
+ return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
+ String spanName;
+ if (isParameterised) {
+ spanName = "queryTriggers." + this.container.getId() + "." + querySpec.getQueryText();
+ } else {
+ spanName = "queryTriggers." + this.container.getId();
+ }
+
+ pagedFluxOptions.setTracerInformation(this.container.getDatabase().getClient().getTracerProvider(),
+ spanName,
+ this.container.getDatabase().getClient().getServiceEndpoint(),
+ this.container.getDatabase().getId());
+ setContinuationTokenAndMaxItemCount(pagedFluxOptions, options);
+ return database.getDocClientWrapper()
+ .queryTriggers(container.getLink(), querySpec, options)
+ .map(response -> BridgeInternal.createFeedResponse(
+ ModelBridgeInternal.getCosmosTriggerPropertiesFromV2Results(response.getResults()),
+ response.getResponseHeaders()));
+ }, this.container.getDatabase().getClient().getTracerProvider().isEnabled());
+ }
+
+ private Mono createStoredProcedureInternal(StoredProcedure sProc,
+ CosmosStoredProcedureRequestOptions options,
+ Context context) {
+ String spanName = "createStoredProcedure." + container.getId();
+ Mono responseMono = createStoredProcedureInternal(sProc, options);
+ return this.container.getDatabase().getClient().getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono,
+ context,
+ spanName,
+ database.getId(),
+ database.getClient().getServiceEndpoint());
+ }
+
+ private Mono createStoredProcedureInternal(StoredProcedure sProc,
+ CosmosStoredProcedureRequestOptions options) {
+ return database.getDocClientWrapper()
+ .createStoredProcedure(container.getLink(), sProc, ModelBridgeInternal.toRequestOptions(options)).map(response -> ModelBridgeInternal.createCosmosStoredProcedureResponse(response))
+ .single();
+ }
+
+ private Mono createUserDefinedFunctionInternal(
+ UserDefinedFunction udf,
+ Context context) {
+ String spanName = "createUserDefinedFunction." + container.getId();
+ Mono responseMono = createUserDefinedFunctionInternal(udf);
+ return this.container.getDatabase().getClient().getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono,
+ context,
+ spanName,
+ database.getId(),
+ database.getClient().getServiceEndpoint());
+ }
+
+ private Mono createUserDefinedFunctionInternal(
+ UserDefinedFunction udf) {
+ return database.getDocClientWrapper()
+ .createUserDefinedFunction(container.getLink(), udf, null).map(response -> ModelBridgeInternal.createCosmosUserDefinedFunctionResponse(response)).single();
+ }
+
+ private Mono createTriggerInternal(CosmosTriggerProperties properties, Context context) {
+ String spanName = "createTrigger." + container.getId();
+ Mono responseMono = createTriggerInternal(properties);
+ return this.container.getDatabase().getClient().getTracerProvider().traceEnabledCosmosResponsePublisher(responseMono,
+ context,
+ spanName,
+ database.getId(),
+ database.getClient().getServiceEndpoint());
+ }
+
+ private Mono createTriggerInternal(CosmosTriggerProperties properties) {
+ Trigger trigger = new Trigger(ModelBridgeInternal.toJsonFromJsonSerializable(ModelBridgeInternal.getResource(properties)));
+ return database.getDocClientWrapper()
+ .createTrigger(container.getLink(), trigger, null)
+ .map(response -> ModelBridgeInternal.createCosmosTriggerResponse(response))
+ .single();
+ }
+
}
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncStoredProcedure.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncStoredProcedure.java
index 8e0a51768818..e6d4433de989 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncStoredProcedure.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncStoredProcedure.java
@@ -2,6 +2,7 @@
// Licensed under the MIT License.
package com.azure.cosmos;
+import com.azure.core.util.Context;
import com.azure.cosmos.implementation.Paths;
import com.azure.cosmos.implementation.StoredProcedure;
import com.azure.cosmos.models.CosmosStoredProcedureResponse;
@@ -10,6 +11,7 @@
import com.azure.cosmos.models.ModelBridgeInternal;
import reactor.core.publisher.Mono;
+import static com.azure.core.util.FluxUtil.withContext;
import java.util.List;
/**
@@ -72,12 +74,11 @@ public Mono read() {
* @return an {@link Mono} containing the single resource response with the read stored procedure or an error.
*/
public Mono read(CosmosStoredProcedureRequestOptions options) {
- if (options == null) {
- options = new CosmosStoredProcedureRequestOptions();
+ if (!cosmosContainer.getDatabase().getClient().getTracerProvider().isEnabled()) {
+ return readInternal(options);
}
- return cosmosContainer.getDatabase().getDocClientWrapper().readStoredProcedure(getLink(),
- ModelBridgeInternal.toRequestOptions(options))
- .map(response -> ModelBridgeInternal.createCosmosStoredProcedureResponse(response)).single();
+
+ return withContext(context -> readInternal(options, context));
}
/**
@@ -106,14 +107,11 @@ public Mono