Skip to content

Commit 583b5da

Browse files
authored
feat: use opaque key to identify trace-provider (#241)
* opaque key to identify traceproviders * using semconv.ServiceNameKey * nit fix
1 parent 1fd91b9 commit 583b5da

File tree

2 files changed

+27
-16
lines changed

2 files changed

+27
-16
lines changed

instrumentation/opentelemetry/init.go

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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
497508
type SpanProcessorWrapper interface {

instrumentation/opentelemetry/init_additional.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ func InitAsAdditional(cfg *config.AgentConfig) (trace.SpanProcessor, func()) {
3535
if cfg.GetServiceName().GetValue() != "" {
3636
resource, err := resource.New(
3737
context.Background(),
38-
resource.WithAttributes(createResources(cfg.GetServiceName().GetValue(), cfg.ResourceAttributes, versionInfoAttributes)...),
38+
resource.WithAttributes(createResources(getResourceAttrsWithServiceName(cfg.ResourceAttributes, cfg.GetServiceName().GetValue()), versionInfoAttributes)...),
3939
)
4040
if err != nil {
4141
log.Fatal(err)

0 commit comments

Comments
 (0)