From 198d7846b965572e4e782def096ff269d8d7b1f3 Mon Sep 17 00:00:00 2001 From: Sameeran Kunche Date: Tue, 19 May 2026 17:00:55 -0700 Subject: [PATCH 1/2] fix(openfeature): read OTEL_SERVICE_NAME for metrics resource --- .../api/openfeature/FlagEvalMetrics.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java index 83ca85af9b0..19db5279bba 100644 --- a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java +++ b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java @@ -11,6 +11,7 @@ import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector; import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader; +import io.opentelemetry.sdk.resources.Resource; import java.io.Closeable; import java.time.Duration; import org.slf4j.Logger; @@ -31,6 +32,10 @@ class FlagEvalMetrics implements Closeable { private static final String ENDPOINT_ENV = "OTEL_EXPORTER_OTLP_METRICS_ENDPOINT"; // Generic env var fallback (base URL, /v1/metrics is appended) private static final String ENDPOINT_GENERIC_ENV = "OTEL_EXPORTER_OTLP_ENDPOINT"; + // OTel standard env vars for service name + private static final String SERVICE_NAME_ENV = "OTEL_SERVICE_NAME"; + private static final AttributeKey SERVICE_NAME_KEY = + AttributeKey.stringKey("service.name"); private static final AttributeKey ATTR_FLAG_KEY = AttributeKey.stringKey("feature_flag.key"); @@ -68,8 +73,15 @@ class FlagEvalMetrics implements Closeable { PeriodicMetricReader reader = PeriodicMetricReader.builder(exporter).setInterval(EXPORT_INTERVAL).build(); + // Build resource with service name from OTEL_SERVICE_NAME env var + // Resource.getDefault() only provides unknown_service:java, so we read env vars manually + Resource resource = buildResource(); + SdkMeterProvider sdkMeterProvider = - SdkMeterProvider.builder().registerMetricReader(reader).build(); + SdkMeterProvider.builder() + .setResource(resource) + .registerMetricReader(reader) + .build(); meterProvider = sdkMeterProvider; Meter meter = sdkMeterProvider.meterBuilder(METER_NAME).build(); @@ -154,4 +166,17 @@ void shutdown() { } } } + + /** + * Builds a Resource with the service name from OTEL_SERVICE_NAME environment variable. + * Falls back to Resource.getDefault() if OTEL_SERVICE_NAME is not set. + */ + private static Resource buildResource() { + String serviceName = ConfigHelper.env(SERVICE_NAME_ENV); + if (serviceName != null && !serviceName.isEmpty()) { + return Resource.getDefault() + .merge(Resource.builder().put(SERVICE_NAME_KEY, serviceName).build()); + } + return Resource.getDefault(); + } } From 5786a003e84908a0ec7e871d6cf9fd0ce2037afa Mon Sep 17 00:00:00 2001 From: Sameeran Kunche Date: Thu, 21 May 2026 08:55:22 -0700 Subject: [PATCH 2/2] Fix spotless formatting violations Apply google-java-format to FlagEvalMetrics.java --- .../trace/api/openfeature/FlagEvalMetrics.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java index 19db5279bba..50f67fccc4f 100644 --- a/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java +++ b/products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java @@ -78,10 +78,7 @@ class FlagEvalMetrics implements Closeable { Resource resource = buildResource(); SdkMeterProvider sdkMeterProvider = - SdkMeterProvider.builder() - .setResource(resource) - .registerMetricReader(reader) - .build(); + SdkMeterProvider.builder().setResource(resource).registerMetricReader(reader).build(); meterProvider = sdkMeterProvider; Meter meter = sdkMeterProvider.meterBuilder(METER_NAME).build(); @@ -95,9 +92,9 @@ class FlagEvalMetrics implements Closeable { log.debug("Flag evaluation metrics initialized, exporting to {}", endpoint); } catch (NoClassDefFoundError e) { log.error( - "OpenTelemetry SDK is not on the classpath — evaluation metrics disabled. " - + "Add opentelemetry-sdk-metrics and opentelemetry-exporter-otlp to your dependencies " - + "to enable flag evaluation metrics.", + "OpenTelemetry SDK is not on the classpath — evaluation metrics disabled. Add" + + " opentelemetry-sdk-metrics and opentelemetry-exporter-otlp to your dependencies to" + + " enable flag evaluation metrics.", e); counter = null; meterProvider = null; @@ -168,8 +165,8 @@ void shutdown() { } /** - * Builds a Resource with the service name from OTEL_SERVICE_NAME environment variable. - * Falls back to Resource.getDefault() if OTEL_SERVICE_NAME is not set. + * Builds a Resource with the service name from OTEL_SERVICE_NAME environment variable. Falls back + * to Resource.getDefault() if OTEL_SERVICE_NAME is not set. */ private static Resource buildResource() { String serviceName = ConfigHelper.env(SERVICE_NAME_ENV);