2727import io .opentelemetry .instrumentation .api .internal .SpanKey ;
2828import io .opentelemetry .instrumentation .api .internal .SpanKeyProvider ;
2929import java .util .ArrayList ;
30+ import java .util .HashMap ;
3031import java .util .List ;
32+ import java .util .Map ;
33+ import java .util .ServiceLoader ;
3134import java .util .Set ;
3235import java .util .logging .Logger ;
3336import java .util .stream .Collectors ;
@@ -69,6 +72,41 @@ public final class InstrumenterBuilder<REQUEST, RESPONSE> {
6972 boolean propagateOperationListenersToOnEnd = false ;
7073 boolean enabled = true ;
7174
75+ private static final Map <String , List <ConditionalContextCustomizerProvider >>
76+ CONTEXT_CUSTOMIZER_MAP = new HashMap <>();
77+ private static final Map <String , List <ConditionalAttributesExtractorProvider >>
78+ ATTRIBUTES_EXTRACTOR_MAP = new HashMap <>();
79+ private static final Map <String , List <ConditionalOperationMetricsProvider >>
80+ OPERATION_METRICS_MAP = new HashMap <>();
81+
82+ static {
83+ ServiceLoader .load (ConditionalContextCustomizerProvider .class )
84+ .forEach (
85+ provider -> {
86+ for (String name : provider .supportedNames ()) {
87+ CONTEXT_CUSTOMIZER_MAP .computeIfAbsent (name , k -> new ArrayList <>()).add (provider );
88+ }
89+ });
90+
91+ ServiceLoader .load (ConditionalAttributesExtractorProvider .class )
92+ .forEach (
93+ provider -> {
94+ for (String name : provider .supportedNames ()) {
95+ ATTRIBUTES_EXTRACTOR_MAP
96+ .computeIfAbsent (name , k -> new ArrayList <>())
97+ .add (provider );
98+ }
99+ });
100+
101+ ServiceLoader .load (ConditionalOperationMetricsProvider .class )
102+ .forEach (
103+ provider -> {
104+ for (String name : provider .supportedNames ()) {
105+ OPERATION_METRICS_MAP .computeIfAbsent (name , k -> new ArrayList <>()).add (provider );
106+ }
107+ });
108+ }
109+
72110 InstrumenterBuilder (
73111 OpenTelemetry openTelemetry ,
74112 String instrumentationName ,
@@ -78,6 +116,30 @@ public final class InstrumenterBuilder<REQUEST, RESPONSE> {
78116 this .spanNameExtractor = spanNameExtractor ;
79117 this .instrumentationVersion =
80118 EmbeddedInstrumentationProperties .findVersion (instrumentationName );
119+
120+ List <ConditionalContextCustomizerProvider > contextProviders =
121+ CONTEXT_CUSTOMIZER_MAP .get (instrumentationName );
122+ if (contextProviders != null ) {
123+ for (ConditionalContextCustomizerProvider provider : contextProviders ) {
124+ addContextCustomizer (provider .get ());
125+ }
126+ }
127+
128+ List <ConditionalAttributesExtractorProvider > attributeProviders =
129+ ATTRIBUTES_EXTRACTOR_MAP .get (instrumentationName );
130+ if (attributeProviders != null ) {
131+ for (ConditionalAttributesExtractorProvider provider : attributeProviders ) {
132+ addAttributesExtractor (provider .get ());
133+ }
134+ }
135+
136+ List <ConditionalOperationMetricsProvider > metricsProviders =
137+ OPERATION_METRICS_MAP .get (instrumentationName );
138+ if (metricsProviders != null ) {
139+ for (ConditionalOperationMetricsProvider provider : metricsProviders ) {
140+ addOperationMetrics (provider .get ());
141+ }
142+ }
81143 }
82144
83145 /**
0 commit comments