Skip to content

Commit 0c0625d

Browse files
Cosmos Metrics: allow enabling only metrics of certain categories (Azure#33436)
* Cosmos Metrics: allow enabling only metrics of certain categories * Updating changelogs * Small refactoring removing unnecessary metricTagNames/metricCategories fields in AsyncDoclmplementations * Linting fixes * Fixing test regressions * Adding tests * Fixing test failure * Aligning MetricNames with the new categories * Update CosmosClientTelemetryConfig.java * Update RntbdServiceEndpoint.java * Test changes * Fixing test issues * Public API refactoring * Update ci.yml * Trying to fix build issue * Trying to fix build issue * Adding missing javadoc comments * Refactoring to allow more granular option definition for metrics * Fixing linting violations * Fixing tests * Making system meters configurable * NITs * Update CosmosMeterOptions.java * Test fix * Adding few more tests and fixing javadoc violations * Reacting to Code review feedback * Reacting to API review feedback * Refactoring based on API review * Update pom.xml * Update CosmosMeterOptions.java * Update CosmosMeterOptions.java * Update CosmosMeterOptions.java * Update CosmosMeterOptions.java * Update pom.xml * Update pom.xml * Update ClientMetricsTest.java * Refactoring to avoid dependency on ExtendableStringEnum * Fixing regression from removing ExpandableStringENum * Update CosmosMetricName.java * Update ClientMetricsTest.java
1 parent f9eadbc commit 0c0625d

32 files changed

+2872
-571
lines changed

sdk/cosmos/azure-cosmos-spark_3_2-12/src/main/scala/com/azure/cosmos/spark/CosmosClientCache.scala

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import com.azure.core.management.AzureEnvironment
66
import com.azure.core.management.profile.AzureProfile
77
import com.azure.cosmos.implementation.clienttelemetry.TagName
88
import com.azure.cosmos.implementation.{CosmosClientMetadataCachesSnapshot, CosmosDaemonThreadFactory, SparkBridgeImplementationInternal, Strings}
9-
import com.azure.cosmos.models.{CosmosClientTelemetryConfig, CosmosMicrometerMetricsOptions}
9+
import com.azure.cosmos.models.{CosmosClientTelemetryConfig, CosmosMetricCategory, CosmosMetricTagName, CosmosMicrometerMetricsOptions}
1010
import com.azure.cosmos.spark.CosmosPredicates.isOnSparkDriver
1111
import com.azure.cosmos.spark.catalog.{CosmosCatalogClient, CosmosCatalogCosmosSDKClient, CosmosCatalogManagementSDKClient}
1212
import com.azure.cosmos.spark.diagnostics.BasicLoggingTrait
@@ -212,20 +212,32 @@ private[spark] object CosmosClientCache extends BasicLoggingTrait {
212212
case None => customApplicationNameSuffix
213213
}
214214

215+
val metricsOptions = new CosmosMicrometerMetricsOptions()
216+
.meterRegistry(CosmosClientMetrics.meterRegistry.get)
217+
.defaultTagNames(
218+
CosmosMetricTagName.CONTAINER,
219+
CosmosMetricTagName.CLIENT_CORRELATION_ID,
220+
CosmosMetricTagName.OPERATION,
221+
CosmosMetricTagName.OPERATION_STATUS_CODE,
222+
CosmosMetricTagName.PARTITION_KEY_RANGE_ID,
223+
CosmosMetricTagName.SERVICE_ADDRESS,
224+
CosmosMetricTagName.ADDRESS_RESOLUTION_COLLECTION_MAP_REFRESH,
225+
CosmosMetricTagName.ADDRESS_RESOLUTION_FORCED_REFRESH,
226+
CosmosMetricTagName.REQUEST_STATUS_CODE,
227+
CosmosMetricTagName.REQUEST_OPERATION_TYPE
228+
)
229+
.setMetricCategories(
230+
CosmosMetricCategory.SYSTEM,
231+
CosmosMetricCategory.OPERATION_SUMMARY,
232+
CosmosMetricCategory.REQUEST_SUMMARY,
233+
CosmosMetricCategory.DIRECT_ADDRESS_RESOLUTIONS,
234+
CosmosMetricCategory.DIRECT_REQUESTS,
235+
CosmosMetricCategory.DIRECT_CHANNELS
236+
)
237+
215238
val telemetryConfig = new CosmosClientTelemetryConfig()
216-
.metricsOptions(
217-
new CosmosMicrometerMetricsOptions().meterRegistry(CosmosClientMetrics.meterRegistry.get)
218-
)
239+
.metricsOptions(metricsOptions)
219240
.clientCorrelationId(clientCorrelationId)
220-
.metricTagNames(
221-
TagName.Container.toString,
222-
TagName.ClientCorrelationId.toString,
223-
TagName.Operation.toString,
224-
TagName.OperationStatusCode.toString,
225-
TagName.PartitionKeyRangeId.toString,
226-
TagName.ServiceEndpoint.toString,
227-
TagName.ServiceAddress.toString
228-
)
229241

230242
builder.clientTelemetryConfig(telemetryConfig)
231243
}

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

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import com.azure.cosmos.implementation.TracerProvider;
2020
import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry;
2121
import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetryMetrics;
22+
import com.azure.cosmos.implementation.clienttelemetry.CosmosMeterOptions;
23+
import com.azure.cosmos.implementation.clienttelemetry.MetricCategory;
2224
import com.azure.cosmos.implementation.clienttelemetry.TagName;
2325
import com.azure.cosmos.implementation.directconnectivity.rntbd.RntbdMetrics;
2426
import com.azure.cosmos.implementation.throughputControl.config.ThroughputControlGroupInternal;
@@ -27,6 +29,8 @@
2729
import com.azure.cosmos.models.CosmosDatabaseProperties;
2830
import com.azure.cosmos.models.CosmosDatabaseRequestOptions;
2931
import com.azure.cosmos.models.CosmosDatabaseResponse;
32+
import com.azure.cosmos.models.CosmosMetricName;
33+
import com.azure.cosmos.models.CosmosMicrometerMeterOptions;
3034
import com.azure.cosmos.models.CosmosPermissionProperties;
3135
import com.azure.cosmos.models.CosmosQueryRequestOptions;
3236
import com.azure.cosmos.models.ModelBridgeInternal;
@@ -62,6 +66,11 @@
6266
isAsync = true)
6367
public final class CosmosAsyncClient implements Closeable {
6468

69+
private static final ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor
70+
telemetryConfigAccessor = ImplementationBridgeHelpers
71+
.CosmosClientTelemetryConfigHelper
72+
.getCosmosClientTelemetryConfigAccessor();
73+
6574
// Async Cosmos client wrapper
6675
private final Configs configs;
6776
private final AsyncDocumentClient asyncDocumentClient;
@@ -83,7 +92,6 @@ public final class CosmosAsyncClient implements Closeable {
8392
private final String clientCorrelationId;
8493
private final Tag clientCorrelationTag;
8594
private final String accountTagValue;
86-
private final EnumSet<TagName> metricTagNames;
8795
private final boolean clientMetricsEnabled;
8896
private final boolean isSendClientTelemetryToServiceEnabled;
8997
private final MeterRegistry clientMetricRegistrySnapshot;
@@ -114,10 +122,6 @@ public final class CosmosAsyncClient implements Closeable {
114122
this.sessionCapturingOverride = builder.isSessionCapturingOverrideEnabled();
115123
this.enableTransportClientSharing = builder.isConnectionSharingAcrossClientsEnabled();
116124
this.proactiveContainerInitConfig = builder.getProactiveContainerInitConfig();
117-
ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor
118-
telemetryConfigAccessor = ImplementationBridgeHelpers
119-
.CosmosClientTelemetryConfigHelper
120-
.getCosmosClientTelemetryConfigAccessor();
121125

122126
CosmosClientTelemetryConfig effectiveTelemetryConfig = telemetryConfigAccessor
123127
.createSnapshot(
@@ -137,8 +141,6 @@ public final class CosmosAsyncClient implements Closeable {
137141
this.apiType = builder.apiType();
138142
this.clientCorrelationId = telemetryConfigAccessor
139143
.getClientCorrelationId(effectiveTelemetryConfig);
140-
this.metricTagNames = telemetryConfigAccessor
141-
.getMetricTagNames(effectiveTelemetryConfig);
142144

143145
List<Permission> permissionList = new ArrayList<>();
144146
if (this.permissions != null) {
@@ -167,7 +169,6 @@ public final class CosmosAsyncClient implements Closeable {
167169
.withApiType(this.apiType)
168170
.withClientTelemetryConfig(this.clientTelemetryConfig)
169171
.withClientCorrelationId(this.clientCorrelationId)
170-
.withMetricTagNames(this.metricTagNames)
171172
.build();
172173

173174
String effectiveClientCorrelationId = this.asyncDocumentClient.getClientCorrelationId();
@@ -190,8 +191,15 @@ public final class CosmosAsyncClient implements Closeable {
190191
this.clientMetricRegistrySnapshot = telemetryConfigAccessor
191192
.getClientMetricRegistry(effectiveTelemetryConfig);
192193
this.clientMetricsEnabled = clientMetricRegistrySnapshot != null;
194+
195+
CosmosMeterOptions cpuMeterOptions = telemetryConfigAccessor
196+
.getMeterOptions(effectiveTelemetryConfig, CosmosMetricName.SYSTEM_CPU);
197+
CosmosMeterOptions memoryMeterOptions = telemetryConfigAccessor
198+
.getMeterOptions(effectiveTelemetryConfig, CosmosMetricName.SYSTEM_MEMORY_FREE);
199+
200+
193201
if (clientMetricRegistrySnapshot != null) {
194-
ClientTelemetryMetrics.add(clientMetricRegistrySnapshot);
202+
ClientTelemetryMetrics.add(clientMetricRegistrySnapshot, cpuMeterOptions, memoryMeterOptions);
195203
}
196204
this.accountTagValue = URI.create(this.serviceEndpoint).getHost().replace(
197205
".documents.azure.com", ""
@@ -725,7 +733,14 @@ public String getAccountTagValue(CosmosAsyncClient client) {
725733

726734
@Override
727735
public EnumSet<TagName> getMetricTagNames(CosmosAsyncClient client) {
728-
return client.metricTagNames;
736+
return telemetryConfigAccessor
737+
.getMetricTagNames(client.clientTelemetryConfig);
738+
}
739+
740+
@Override
741+
public EnumSet<MetricCategory> getMetricCategories(CosmosAsyncClient client) {
742+
return telemetryConfigAccessor
743+
.getMetricCategories(client.clientTelemetryConfig);
729744
}
730745

731746
@Override
@@ -747,6 +762,12 @@ public List<String> getPreferredRegions(CosmosAsyncClient client) {
747762
public boolean isEndpointDiscoveryEnabled(CosmosAsyncClient client) {
748763
return client.connectionPolicy.isEndpointDiscoveryEnabled();
749764
}
765+
766+
@Override
767+
public CosmosMeterOptions getMeterOptions(CosmosAsyncClient client, CosmosMetricName name) {
768+
return telemetryConfigAccessor
769+
.getMeterOptions(client.clientTelemetryConfig, name);
770+
}
750771
}
751772
);
752773
}

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

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -658,20 +658,6 @@ public CosmosClientBuilder multipleWriteRegionsEnabled(boolean multipleWriteRegi
658658
* @return current CosmosClientBuilder
659659
*/
660660
public CosmosClientBuilder clientTelemetryEnabled(boolean clientTelemetryEnabled) {
661-
ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor accessor =
662-
ImplementationBridgeHelpers
663-
.CosmosClientTelemetryConfigHelper
664-
.getCosmosClientTelemetryConfigAccessor();
665-
666-
Boolean explicitlySetInConfig = accessor.isSendClientTelemetryToServiceEnabled(this.clientTelemetryConfig);
667-
668-
if (explicitlySetInConfig != null) {
669-
CosmosClientTelemetryConfig newTelemetryConfig = accessor
670-
.createSnapshot(this.clientTelemetryConfig, clientTelemetryEnabled);
671-
accessor.resetIsSendClientTelemetryToServiceEnabled(newTelemetryConfig);
672-
this.clientTelemetryConfig = newTelemetryConfig;
673-
}
674-
675661
this.clientTelemetryEnabledOverride = clientTelemetryEnabled;
676662
return this;
677663
}
@@ -796,8 +782,6 @@ boolean isClientTelemetryEnabled() {
796782
.getCosmosClientTelemetryConfigAccessor()
797783
.isSendClientTelemetryToServiceEnabled(this.clientTelemetryConfig);
798784

799-
assert(this.clientTelemetryEnabledOverride == null || explicitlySetInConfig == null);
800-
801785
if (this.clientTelemetryEnabledOverride != null) {
802786
return this.clientTelemetryEnabledOverride;
803787
}

sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/AsyncDocumentClient.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
import com.azure.cosmos.implementation.caches.RxClientCollectionCache;
1212
import com.azure.cosmos.implementation.caches.RxPartitionKeyRangeCache;
1313
import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry;
14-
import com.azure.cosmos.implementation.clienttelemetry.TagName;
1514
import com.azure.cosmos.implementation.query.PartitionedQueryExecutionInfo;
1615
import com.azure.cosmos.implementation.throughputControl.config.ThroughputControlGroupInternal;
1716
import com.azure.cosmos.models.CosmosClientTelemetryConfig;
@@ -30,7 +29,6 @@
3029

3130
import java.net.URI;
3231
import java.net.URISyntaxException;
33-
import java.util.EnumSet;
3432
import java.util.List;
3533
import java.util.Map;
3634

@@ -98,7 +96,6 @@ class Builder {
9896
private ApiType apiType;
9997
CosmosClientTelemetryConfig clientTelemetryConfig;
10098
private String clientCorrelationId = null;
101-
private EnumSet<TagName> metricTagNames = EnumSet.allOf(TagName.class);
10299

103100
public Builder withServiceEndpoint(String serviceEndpoint) {
104101
try {
@@ -125,12 +122,6 @@ public Builder withClientCorrelationId(String clientCorrelationId) {
125122
return this;
126123
}
127124

128-
public Builder withMetricTagNames(EnumSet<TagName> tagNames) {
129-
this.metricTagNames = tagNames;
130-
131-
return this;
132-
}
133-
134125
/**
135126
* New method withMasterKeyOrResourceToken will take either master key or resource token
136127
* and perform authentication for accessing resource.
@@ -273,8 +264,7 @@ public AsyncDocumentClient build() {
273264
state,
274265
apiType,
275266
clientTelemetryConfig,
276-
clientCorrelationId,
277-
metricTagNames);
267+
clientCorrelationId);
278268

279269
client.init(state, null);
280270
return client;

sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ImplementationBridgeHelpers.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import com.azure.cosmos.ThroughputControlGroupConfig;
2020
import com.azure.cosmos.implementation.batch.ItemBatchOperation;
2121
import com.azure.cosmos.implementation.batch.PartitionScopeThresholds;
22+
import com.azure.cosmos.implementation.clienttelemetry.CosmosMeterOptions;
23+
import com.azure.cosmos.implementation.clienttelemetry.MetricCategory;
2224
import com.azure.cosmos.implementation.clienttelemetry.TagName;
2325
import com.azure.cosmos.implementation.directconnectivity.rntbd.RntbdChannelStatistics;
2426
import com.azure.cosmos.implementation.patch.PatchOperation;
@@ -38,6 +40,8 @@
3840
import com.azure.cosmos.models.CosmosContainerProperties;
3941
import com.azure.cosmos.models.CosmosItemRequestOptions;
4042
import com.azure.cosmos.models.CosmosItemResponse;
43+
import com.azure.cosmos.models.CosmosMetricName;
44+
import com.azure.cosmos.models.CosmosMicrometerMeterOptions;
4145
import com.azure.cosmos.models.CosmosPatchOperations;
4246
import com.azure.cosmos.models.CosmosQueryRequestOptions;
4347
import com.azure.cosmos.models.FeedResponse;
@@ -1044,10 +1048,12 @@ public interface CosmosAsyncClientAccessor {
10441048
Tag getClientCorrelationTag(CosmosAsyncClient client);
10451049
String getAccountTagValue(CosmosAsyncClient client);
10461050
EnumSet<TagName> getMetricTagNames(CosmosAsyncClient client);
1051+
EnumSet<MetricCategory> getMetricCategories(CosmosAsyncClient client);
10471052
boolean isClientTelemetryMetricsEnabled(CosmosAsyncClient client);
10481053
boolean isSendClientTelemetryToServiceEnabled(CosmosAsyncClient client);
10491054
List<String> getPreferredRegions(CosmosAsyncClient client);
10501055
boolean isEndpointDiscoveryEnabled(CosmosAsyncClient client);
1056+
CosmosMeterOptions getMeterOptions(CosmosAsyncClient client, CosmosMetricName name);
10511057
}
10521058
}
10531059

@@ -1130,12 +1136,15 @@ public interface CosmosClientTelemetryConfigAccessor {
11301136
int getMaxConnectionPoolSize(CosmosClientTelemetryConfig config);
11311137
Duration getIdleHttpConnectionTimeout(CosmosClientTelemetryConfig config);
11321138
ProxyOptions getProxy(CosmosClientTelemetryConfig config);
1139+
EnumSet<MetricCategory> getMetricCategories(CosmosClientTelemetryConfig config);
11331140
EnumSet<TagName> getMetricTagNames(CosmosClientTelemetryConfig config);
11341141
String getClientCorrelationId(CosmosClientTelemetryConfig config);
11351142
MeterRegistry getClientMetricRegistry(CosmosClientTelemetryConfig config);
11361143
Boolean isSendClientTelemetryToServiceEnabled(CosmosClientTelemetryConfig config);
11371144
boolean isClientMetricsEnabled(CosmosClientTelemetryConfig config);
11381145
void resetIsSendClientTelemetryToServiceEnabled(CosmosClientTelemetryConfig config);
1146+
CosmosMeterOptions getMeterOptions(CosmosClientTelemetryConfig config, CosmosMetricName name);
1147+
CosmosMeterOptions createDisabledMeterOptions(CosmosMetricName name);
11391148
CosmosClientTelemetryConfig createSnapshot(
11401149
CosmosClientTelemetryConfig config,
11411150
boolean effectiveIsClientTelemetryEnabled);

0 commit comments

Comments
 (0)