Skip to content

Commit 7a3ccbf

Browse files
sameerankdevflow.devflow-routing-intake
andauthored
fix(openfeature): read OTEL_SERVICE_NAME for metrics resource (#11424)
fix(openfeature): read OTEL_SERVICE_NAME for metrics resource Merge branch 'master' into sameerank/fix-flag-eval-metrics-service-name Fix spotless formatting violations Apply google-java-format to FlagEvalMetrics.java Merge branch 'master' into sameerank/fix-flag-eval-metrics-service-name Co-authored-by: devflow.devflow-routing-intake <devflow.devflow-routing-intake@kubernetes.us1.ddbuild.io>
1 parent 0ae18bb commit 7a3ccbf

1 file changed

Lines changed: 26 additions & 4 deletions

File tree

  • products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature

products/feature-flagging/feature-flagging-api/src/main/java/datadog/trace/api/openfeature/FlagEvalMetrics.java

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
1212
import io.opentelemetry.sdk.metrics.export.AggregationTemporalitySelector;
1313
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader;
14+
import io.opentelemetry.sdk.resources.Resource;
1415
import java.io.Closeable;
1516
import java.time.Duration;
1617
import org.slf4j.Logger;
@@ -31,6 +32,10 @@ class FlagEvalMetrics implements Closeable {
3132
private static final String ENDPOINT_ENV = "OTEL_EXPORTER_OTLP_METRICS_ENDPOINT";
3233
// Generic env var fallback (base URL, /v1/metrics is appended)
3334
private static final String ENDPOINT_GENERIC_ENV = "OTEL_EXPORTER_OTLP_ENDPOINT";
35+
// OTel standard env vars for service name
36+
private static final String SERVICE_NAME_ENV = "OTEL_SERVICE_NAME";
37+
private static final AttributeKey<String> SERVICE_NAME_KEY =
38+
AttributeKey.stringKey("service.name");
3439

3540
private static final AttributeKey<String> ATTR_FLAG_KEY =
3641
AttributeKey.stringKey("feature_flag.key");
@@ -68,8 +73,12 @@ class FlagEvalMetrics implements Closeable {
6873
PeriodicMetricReader reader =
6974
PeriodicMetricReader.builder(exporter).setInterval(EXPORT_INTERVAL).build();
7075

76+
// Build resource with service name from OTEL_SERVICE_NAME env var
77+
// Resource.getDefault() only provides unknown_service:java, so we read env vars manually
78+
Resource resource = buildResource();
79+
7180
SdkMeterProvider sdkMeterProvider =
72-
SdkMeterProvider.builder().registerMetricReader(reader).build();
81+
SdkMeterProvider.builder().setResource(resource).registerMetricReader(reader).build();
7382
meterProvider = sdkMeterProvider;
7483

7584
Meter meter = sdkMeterProvider.meterBuilder(METER_NAME).build();
@@ -83,9 +92,9 @@ class FlagEvalMetrics implements Closeable {
8392
log.debug("Flag evaluation metrics initialized, exporting to {}", endpoint);
8493
} catch (NoClassDefFoundError e) {
8594
log.error(
86-
"OpenTelemetry SDK is not on the classpath — evaluation metrics disabled. "
87-
+ "Add opentelemetry-sdk-metrics and opentelemetry-exporter-otlp to your dependencies "
88-
+ "to enable flag evaluation metrics.",
95+
"OpenTelemetry SDK is not on the classpath — evaluation metrics disabled. Add"
96+
+ " opentelemetry-sdk-metrics and opentelemetry-exporter-otlp to your dependencies to"
97+
+ " enable flag evaluation metrics.",
8998
e);
9099
counter = null;
91100
meterProvider = null;
@@ -154,4 +163,17 @@ void shutdown() {
154163
}
155164
}
156165
}
166+
167+
/**
168+
* Builds a Resource with the service name from OTEL_SERVICE_NAME environment variable. Falls back
169+
* to Resource.getDefault() if OTEL_SERVICE_NAME is not set.
170+
*/
171+
private static Resource buildResource() {
172+
String serviceName = ConfigHelper.env(SERVICE_NAME_ENV);
173+
if (serviceName != null && !serviceName.isEmpty()) {
174+
return Resource.getDefault()
175+
.merge(Resource.builder().put(SERVICE_NAME_KEY, serviceName).build());
176+
}
177+
return Resource.getDefault();
178+
}
157179
}

0 commit comments

Comments
 (0)