@@ -495,15 +495,15 @@ func TestServiceTelemetryCreateProvidersError(t *testing.T) {
495495 }
496496 for name , tc := range map [string ]testcase {
497497 "CreateLogger" : {
498- opts : []telemetry.FactoryOption {loggerOpt , meterOpt , tracerOpt , resourceOpt },
498+ opts : []telemetry.FactoryOption {loggerOpt , meterOpt , tracerOpt },
499499 expectedErr : "failed to create logger: something went wrong" ,
500500 },
501501 "CreateMeterProvider" : {
502- opts : []telemetry.FactoryOption {meterOpt , tracerOpt , resourceOpt },
502+ opts : []telemetry.FactoryOption {meterOpt , tracerOpt },
503503 expectedErr : "failed to create meter provider: something went wrong" ,
504504 },
505505 "CreateTracerProvider" : {
506- opts : []telemetry.FactoryOption {tracerOpt , resourceOpt },
506+ opts : []telemetry.FactoryOption {tracerOpt },
507507 expectedErr : "failed to create tracer provider: something went wrong" ,
508508 },
509509 "CreateResource" : {
@@ -527,6 +527,81 @@ func TestNew_NilTelemetryProvider(t *testing.T) {
527527 require .EqualError (t , err , "telemetry factory not provided" )
528528}
529529
530+ func TestServiceTelemetryConsistentInstanceID (t * testing.T ) {
531+ var loggerResource , meterResource , tracerResource * pcommon.Resource
532+
533+ createLoggerCalled := false
534+ createMeterCalled := false
535+ createTracerCalled := false
536+
537+ baseFactory := otelconftelemetry .NewFactory ()
538+
539+ set := newNopSettings ()
540+ set .TelemetryFactory = telemetry .NewFactory (
541+ baseFactory .CreateDefaultConfig ,
542+ telemetry .WithCreateResource (baseFactory .CreateResource ),
543+ telemetry .WithCreateLogger (func (ctx context.Context , settings telemetry.LoggerSettings , cfg component.Config ) (* zap.Logger , component.ShutdownFunc , error ) {
544+ createLoggerCalled = true
545+ loggerResource = settings .Resource
546+ return baseFactory .CreateLogger (ctx , settings , cfg )
547+ }),
548+ telemetry .WithCreateMeterProvider (func (ctx context.Context , settings telemetry.MeterSettings , cfg component.Config ) (telemetry.MeterProvider , error ) {
549+ createMeterCalled = true
550+ meterResource = settings .Resource
551+ return baseFactory .CreateMeterProvider (ctx , settings , cfg )
552+ }),
553+ telemetry .WithCreateTracerProvider (func (ctx context.Context , settings telemetry.TracerSettings , cfg component.Config ) (telemetry.TracerProvider , error ) {
554+ createTracerCalled = true
555+ tracerResource = settings .Resource
556+ return baseFactory .CreateTracerProvider (ctx , settings , cfg )
557+ }),
558+ )
559+
560+ cfg := newNopConfig ()
561+ srv , err := New (context .Background (), set , cfg )
562+ require .NoError (t , err )
563+
564+ require .True (t , createLoggerCalled , "logger should have been created" )
565+ require .True (t , createMeterCalled , "meter provider should have been created" )
566+ require .True (t , createTracerCalled , "tracer provider should have been created" )
567+
568+ var serviceInstanceID string
569+ if sid , ok := srv .telemetrySettings .Resource .Attributes ().Get ("service.instance.id" ); ok {
570+ serviceInstanceID = sid .AsString ()
571+ }
572+ require .NotEmpty (t , serviceInstanceID , "service.instance.id not found in service resource" )
573+
574+ require .NotNil (t , loggerResource , "logger should have received a resource" )
575+ require .NotNil (t , meterResource , "meter provider should have received a resource" )
576+ require .NotNil (t , tracerResource , "tracer provider should have received a resource" )
577+
578+ var loggerInstanceID , meterInstanceID , tracerInstanceID string
579+ if sid , ok := loggerResource .Attributes ().Get ("service.instance.id" ); ok {
580+ loggerInstanceID = sid .AsString ()
581+ }
582+ if sid , ok := meterResource .Attributes ().Get ("service.instance.id" ); ok {
583+ meterInstanceID = sid .AsString ()
584+ }
585+ if sid , ok := tracerResource .Attributes ().Get ("service.instance.id" ); ok {
586+ tracerInstanceID = sid .AsString ()
587+ }
588+
589+ require .NotEmpty (t , loggerInstanceID , "logger resource should have service.instance.id" )
590+ require .NotEmpty (t , meterInstanceID , "meter resource should have service.instance.id" )
591+ require .NotEmpty (t , tracerInstanceID , "tracer resource should have service.instance.id" )
592+
593+ assert .Equal (t , serviceInstanceID , loggerInstanceID ,
594+ "logger should use the same service.instance.id as the service resource" )
595+ assert .Equal (t , serviceInstanceID , meterInstanceID ,
596+ "meter provider should use the same service.instance.id as the service resource" )
597+ assert .Equal (t , serviceInstanceID , tracerInstanceID ,
598+ "tracer provider should use the same service.instance.id as the service resource" )
599+
600+ t .Logf ("service.instance.id = %s (shared by logger, meter, and tracer)" , serviceInstanceID )
601+
602+ require .NoError (t , srv .Shutdown (context .Background ()))
603+ }
604+
530605func newNopSettings () Settings {
531606 receiversConfigs , receiversFactories := builders .NewNopReceiverConfigsAndFactories ()
532607 processorsConfigs , processorsFactories := builders .NewNopProcessorConfigsAndFactories ()
@@ -582,7 +657,7 @@ func newNopConfigPipelineConfigs(pipelineCfgs pipelines.Config) Config {
582657 return Config {
583658 Extensions : extensions.Config {component .NewID (nopType )},
584659 Pipelines : pipelineCfgs ,
585- Telemetry : otelconftelemetry.Config {
660+ Telemetry : & otelconftelemetry.Config {
586661 Logs : otelconftelemetry.LogsConfig {
587662 Level : zapcore .InfoLevel ,
588663 Development : false ,
0 commit comments