1111import io .opentelemetry .sdk .metrics .SdkMeterProvider ;
1212import io .opentelemetry .sdk .metrics .export .AggregationTemporalitySelector ;
1313import io .opentelemetry .sdk .metrics .export .PeriodicMetricReader ;
14+ import io .opentelemetry .sdk .resources .Resource ;
1415import java .io .Closeable ;
1516import java .time .Duration ;
1617import 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