I set up a configuration for openTelemtry in Spring Boot (New Relic exporter). I can see the metrics in New Relic so everything works fine. Also I see a lot of warnings about "Cardinality Limit (2000)". By default cardinality is set to 2000. I'm not sure how can I change it. I can see in optl docs something like this:
aggregation_cardinality_limit: A positive integer value defining the maximum number of data points allowed to be emitted in a collection cycle by a single instrument. See cardinality limits, below.
Link: https://opentelemetry.io/docs/specs/otel/metrics/sdk/#stream-configuration
My code:
@Bean
@ConditionalOnMissingBean
public OpenTelemetry openTelemetry() {
return OpenTelemetrySdk.builder()
.setMeterProvider(
SdkMeterProvider.builder()
.setResource(
Resource.getDefault().toBuilder()
.put("service.name", getAppName())
.put("instrumentation.provider", "micrometer")
.build())
.registerMetricReader(
PeriodicMetricReader.builder(
OtlpGrpcMetricExporter.builder()
.setCompression("gzip")
.setEndpoint(properties.getEndpoint())
.addHeader("api-key", getLicenceKey())
.setAggregationTemporalitySelector(AggregationTemporalitySelector.deltaPreferred())
.setDefaultAggregationSelector(
DefaultAggregationSelector.getDefault()
.with(InstrumentType.HISTOGRAM, Aggregation.base2ExponentialBucketHistogram()))
.build())
.setInterval(Duration.ofSeconds(properties.getInterval()))
.build())
.build())
.build();
}
I'm not sure if I can just pass another " .put("aggregation_cardinality_limit", 3000)" to Resource.
Configuring cardinality limits is still experimental, so the APIs you call to set the limits are internal and leave a lot to be desired in terms of ergonomics. This will change when the limits are marked as stable in the specification.
You need to use SdkMeterProviderUtil#registerMetricReaderWithCardinalitySelect, something like:
SdkMeterProviderBuilder meterProviderBuilder = SdkMeterProvider.builder();
PeriodicMetricReader periodicMetricReader = PeriodicMetricReader.builder()
// configuration omitted for brevity
.build();
SdkMeterProviderUtil.registerMetricReaderWithCardinalitySelector(meterProviderBuilder, periodicMetricReader, unused -> 3000);