javaspring-bootmetricsnewrelicopen-telemetry

OpenTelemetry SDK Cardinality limit change


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.


Solution

  • 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);