@@ -316,7 +316,7 @@ func InitWithSpanProcessorWrapperAndZap(cfg *config.AgentConfig, wrapper SpanPro
316316
317317 resources , err := resource .New (
318318 context .Background (),
319- resource .WithAttributes (createResources (cfg .GetServiceName ().GetValue (), cfg . ResourceAttributes ,
319+ resource .WithAttributes (createResources (getResourceAttrsWithServiceName ( cfg .ResourceAttributes , cfg . GetServiceName ().GetValue ()) ,
320320 versionInfoAttrs )... ),
321321 )
322322 if err != nil {
@@ -351,12 +351,12 @@ func InitWithSpanProcessorWrapperAndZap(cfg *config.AgentConfig, wrapper SpanPro
351351 return func () {
352352 mu .Lock ()
353353 defer mu .Unlock ()
354- for serviceName , tracerProvider := range traceProviders {
354+ for key , tracerProvider := range traceProviders {
355355 err := tracerProvider .Shutdown (context .Background ())
356356 if err != nil {
357357 log .Printf ("error while shutting down tracer provider: %v\n " , err )
358358 }
359- delete (traceProviders , serviceName )
359+ delete (traceProviders , key )
360360 }
361361 traceProviders = map [string ]* sdktrace.TracerProvider {}
362362 err := tp .Shutdown (context .Background ())
@@ -371,10 +371,9 @@ func InitWithSpanProcessorWrapperAndZap(cfg *config.AgentConfig, wrapper SpanPro
371371 }
372372}
373373
374- func createResources (serviceName string , resources map [string ]string ,
374+ func createResources (resources map [string ]string ,
375375 versionInfo []attribute.KeyValue ) []attribute.KeyValue {
376376 retValues := []attribute.KeyValue {
377- semconv .ServiceNameKey .String (serviceName ),
378377 semconv .TelemetrySDKLanguageGo ,
379378 }
380379
@@ -386,14 +385,14 @@ func createResources(serviceName string, resources map[string]string,
386385 return retValues
387386}
388387
389- // RegisterService creates tracerprovider for a new service and returns a func which can be used to create spans and the TracerProvider
390- func RegisterService (serviceName string , resourceAttributes map [string ]string ) (sdk.StartSpan , trace.TracerProvider , error ) {
391- return RegisterServiceWithSpanProcessorWrapper (serviceName , resourceAttributes , nil , versionInfoAttributes )
388+ // RegisterService creates tracerprovider for a new service (represented via a unique key) and returns a func which can be used to create spans and the TracerProvider
389+ func RegisterService (key string , resourceAttributes map [string ]string ) (sdk.StartSpan , trace.TracerProvider , error ) {
390+ return RegisterServiceWithSpanProcessorWrapper (key , resourceAttributes , nil , versionInfoAttributes )
392391}
393392
394- // RegisterServiceWithSpanProcessorWrapper creates a tracerprovider for a new service with a wrapper over opentelemetry span processor
393+ // RegisterServiceWithSpanProcessorWrapper creates a tracerprovider for a new service (represented via a unique key) with a wrapper over opentelemetry span processor
395394// and returns a func which can be used to create spans and the TracerProvider
396- func RegisterServiceWithSpanProcessorWrapper (serviceName string , resourceAttributes map [string ]string ,
395+ func RegisterServiceWithSpanProcessorWrapper (key string , resourceAttributes map [string ]string ,
397396 wrapper SpanProcessorWrapper , versionInfoAttrs []attribute.KeyValue ) (sdk.StartSpan , trace.TracerProvider , error ) {
398397 mu .Lock ()
399398 defer mu .Unlock ()
@@ -405,8 +404,8 @@ func RegisterServiceWithSpanProcessorWrapper(serviceName string, resourceAttribu
405404 return NoopStartSpan , noop .NewTracerProvider (), nil
406405 }
407406
408- if _ , ok := traceProviders [serviceName ]; ok {
409- return nil , noop .NewTracerProvider (), fmt .Errorf ("service %v already initialized " , serviceName )
407+ if _ , ok := traceProviders [key ]; ok {
408+ return nil , noop .NewTracerProvider (), fmt .Errorf ("key %v is already used for initialization " , key )
410409 }
411410
412411 exporter , err := exporterFactory ()
@@ -424,7 +423,7 @@ func RegisterServiceWithSpanProcessorWrapper(serviceName string, resourceAttribu
424423
425424 resources , err := resource .New (
426425 context .Background (),
427- resource .WithAttributes (createResources (serviceName , resourceAttributes , versionInfoAttrs )... ),
426+ resource .WithAttributes (createResources (resourceAttributes , versionInfoAttrs )... ),
428427 )
429428 if err != nil {
430429 log .Fatal (err )
@@ -435,7 +434,7 @@ func RegisterServiceWithSpanProcessorWrapper(serviceName string, resourceAttribu
435434 sdktrace .WithResource (resources ),
436435 )
437436
438- traceProviders [serviceName ] = tp
437+ traceProviders [key ] = tp
439438 return startSpan (func () trace.TracerProvider {
440439 return tp
441440 }), tp , nil
@@ -453,7 +452,7 @@ func initializeMetrics(cfg *config.AgentConfig, versionInfoAttrs []attribute.Key
453452 }
454453 periodicReader := metric .NewPeriodicReader (metricsExporter )
455454
456- resourceKvps := createResources (cfg .GetServiceName ().GetValue (), cfg . ResourceAttributes , versionInfoAttrs )
455+ resourceKvps := createResources (getResourceAttrsWithServiceName ( cfg .ResourceAttributes , cfg . GetServiceName ().GetValue ()) , versionInfoAttrs )
457456 resourceKvps = append (resourceKvps , identifier .ServiceInstanceKeyValue )
458457 metricResources , err := resource .New (context .Background (), resource .WithAttributes (resourceKvps ... ))
459458 if err != nil {
@@ -492,6 +491,18 @@ func shouldUseCustomBatchSpanProcessor(cfg *config.AgentConfig) bool {
492491 (cfg .GetTelemetry () != nil && cfg .GetTelemetry ().GetMetricsEnabled ().GetValue ()) // metrics enabled
493492}
494493
494+ func getResourceAttrsWithServiceName (resourceMap map [string ]string , serviceName string ) map [string ]string {
495+ if resourceMap == nil {
496+ resourceMap = make (map [string ]string )
497+ }
498+ serviceNameKey := string (semconv .ServiceNameKey )
499+ if _ , ok := resourceMap [serviceNameKey ]; ! ok && (len (serviceName ) > 0 ) {
500+ resourceMap [serviceNameKey ] = serviceName
501+ }
502+
503+ return resourceMap
504+ }
505+
495506// SpanProcessorWrapper wraps otel span processor
496507// and is responsible to delegate calls to the wrapped processor
497508type SpanProcessorWrapper interface {
0 commit comments