6
6
package io .opentelemetry .instrumentation .spring .autoconfigure ;
7
7
8
8
import io .opentelemetry .api .OpenTelemetry ;
9
+ import io .opentelemetry .api .common .Attributes ;
9
10
import io .opentelemetry .api .trace .TracerProvider ;
10
11
import io .opentelemetry .context .propagation .ContextPropagators ;
11
12
import io .opentelemetry .sdk .OpenTelemetrySdk ;
13
+ import io .opentelemetry .sdk .resources .Resource ;
12
14
import io .opentelemetry .sdk .trace .SdkTracerProvider ;
13
15
import io .opentelemetry .sdk .trace .SdkTracerProviderBuilder ;
14
16
import io .opentelemetry .sdk .trace .export .BatchSpanProcessor ;
15
17
import io .opentelemetry .sdk .trace .export .SpanExporter ;
16
18
import io .opentelemetry .sdk .trace .samplers .Sampler ;
19
+ import io .opentelemetry .semconv .resource .attributes .ResourceAttributes ;
17
20
import java .util .Collections ;
18
21
import java .util .List ;
22
+ import java .util .function .Supplier ;
19
23
import org .springframework .beans .factory .ObjectProvider ;
20
24
import org .springframework .boot .autoconfigure .condition .ConditionalOnMissingBean ;
21
25
import org .springframework .boot .context .properties .EnableConfigurationProperties ;
22
26
import org .springframework .context .annotation .Bean ;
23
27
import org .springframework .context .annotation .Configuration ;
28
+ import org .springframework .core .env .Environment ;
24
29
25
30
/**
26
31
* Create {@link io.opentelemetry.api.trace.Tracer} bean if bean is missing.
@@ -41,18 +46,42 @@ public static class OpenTelemetryBeanConfig {
41
46
@ ConditionalOnMissingBean
42
47
public SdkTracerProvider sdkTracerProvider (
43
48
SamplerProperties samplerProperties ,
44
- ObjectProvider <List <SpanExporter >> spanExportersProvider ) {
49
+ ObjectProvider <List <SpanExporter >> spanExportersProvider ,
50
+ Resource otelResource ) {
45
51
SdkTracerProviderBuilder tracerProviderBuilder = SdkTracerProvider .builder ();
46
52
47
53
spanExportersProvider .getIfAvailable (Collections ::emptyList ).stream ()
48
54
.map (spanExporter -> BatchSpanProcessor .builder (spanExporter ).build ())
49
55
.forEach (tracerProviderBuilder ::addSpanProcessor );
50
56
51
57
return tracerProviderBuilder
58
+ .setResource (otelResource )
52
59
.setSampler (Sampler .traceIdRatioBased (samplerProperties .getProbability ()))
53
60
.build ();
54
61
}
55
62
63
+ @ Bean
64
+ @ ConditionalOnMissingBean
65
+ public Resource otelResource (
66
+ Environment env , ObjectProvider <List <Supplier <Resource >>> resourceProviders ) {
67
+ String applicationName = env .getProperty ("spring.application.name" );
68
+ Resource resource = defaultResource (applicationName );
69
+ List <Supplier <Resource >> resourceCustomizers =
70
+ resourceProviders .getIfAvailable (Collections ::emptyList );
71
+ for (Supplier <Resource > resourceCustomizer : resourceCustomizers ) {
72
+ resource = resource .merge (resourceCustomizer .get ());
73
+ }
74
+ return resource ;
75
+ }
76
+
77
+ private static Resource defaultResource (String applicationName ) {
78
+ if (applicationName == null ) {
79
+ return Resource .getDefault ();
80
+ }
81
+ return Resource .getDefault ()
82
+ .merge (Resource .create (Attributes .of (ResourceAttributes .SERVICE_NAME , applicationName )));
83
+ }
84
+
56
85
@ Bean
57
86
public OpenTelemetry openTelemetry (
58
87
ObjectProvider <ContextPropagators > propagatorsProvider , SdkTracerProvider tracerProvider ) {
0 commit comments