1616import io .opentelemetry .instrumentation .docs .internal .EmittedMetrics ;
1717import io .opentelemetry .instrumentation .docs .internal .EmittedSpans ;
1818import io .opentelemetry .instrumentation .docs .internal .InstrumentationClassification ;
19+ import io .opentelemetry .instrumentation .docs .internal .InstrumentationFeature ;
1920import io .opentelemetry .instrumentation .docs .internal .InstrumentationMetadata ;
2021import io .opentelemetry .instrumentation .docs .internal .InstrumentationModule ;
2122import io .opentelemetry .instrumentation .docs .internal .InstrumentationType ;
@@ -122,6 +123,10 @@ void testGenerateInstrumentationYamlSeparatesClassifications() throws Exception
122123 .description ("Spring Web 6.0 instrumentation" )
123124 .classification (InstrumentationClassification .LIBRARY .name ())
124125 .disabledByDefault (false )
126+ .features (
127+ List .of (
128+ InstrumentationFeature .HTTP_ROUTE , InstrumentationFeature .CONTEXT_PROPAGATION ))
129+ .semanticConventions (List .of (DATABASE_CLIENT_METRICS , DATABASE_CLIENT_SPANS ))
125130 .configurations (
126131 List .of (
127132 new ConfigurationOption (
@@ -189,6 +194,12 @@ void testGenerateInstrumentationYamlSeparatesClassifications() throws Exception
189194 spring:
190195 - name: spring-web-6.0
191196 description: Spring Web 6.0 instrumentation
197+ semantic_conventions:
198+ - DATABASE_CLIENT_METRICS
199+ - DATABASE_CLIENT_SPANS
200+ features:
201+ - HTTP_ROUTE
202+ - CONTEXT_PROPAGATION
192203 source_path: instrumentation/spring/spring-web/spring-web-6.0
193204 minimum_java_version: 11
194205 scope:
@@ -227,6 +238,9 @@ void testMetadataParser() throws JsonProcessingException {
227238 classification: internal
228239 disabled_by_default: true
229240 library_link: https://example.com/test-library
241+ features:
242+ - HTTP_ROUTE
243+ - CONTROLLER_SPANS
230244 configurations:
231245 - name: otel.instrumentation.common.db-statement-sanitizer.enabled
232246 description: Enables statement sanitization for database queries.
@@ -243,6 +257,10 @@ void testMetadataParser() throws JsonProcessingException {
243257 .isEqualTo ("Enables statement sanitization for database queries." );
244258 assertThat (config .defaultValue ()).isEqualTo ("true" );
245259
260+ assertThat (metadata .getFeatures ())
261+ .containsExactly (
262+ InstrumentationFeature .HTTP_ROUTE , InstrumentationFeature .CONTROLLER_SPANS );
263+
246264 assertThat (metadata .getClassification ()).isEqualTo (InstrumentationClassification .INTERNAL );
247265 assertThat (metadata .getDescription ()).isEqualTo ("test description" );
248266 assertThat (metadata .getDisabledByDefault ()).isEqualTo (true );
@@ -315,6 +333,21 @@ void testMetadataParserWithOnlyConfigurations() throws JsonProcessingException {
315333 assertThat (config .type ()).isEqualTo (ConfigurationType .BOOLEAN );
316334 }
317335
336+ @ Test
337+ void testMetadataParserWithOnlyFeatures () throws JsonProcessingException {
338+ String input =
339+ """
340+ features:
341+ - HTTP_ROUTE
342+ """ ;
343+ InstrumentationMetadata metadata = YamlHelper .metaDataParser (input );
344+
345+ assertThat (metadata .getClassification ()).isEqualTo (InstrumentationClassification .LIBRARY );
346+ assertThat (metadata .getDescription ()).isNull ();
347+ assertThat (metadata .getDisabledByDefault ()).isFalse ();
348+ assertThat (metadata .getFeatures ()).containsExactly (InstrumentationFeature .HTTP_ROUTE );
349+ }
350+
318351 @ Test
319352 void testMetricsParsing () throws Exception {
320353 List <InstrumentationModule > modules = new ArrayList <>();
0 commit comments