open-telemetry / opentelemetry-java-contrib

https://opentelemetry.io
Apache License 2.0
144 stars 117 forks source link

[Maven Extension] Migrate from Plexus to JSR 330 dependency injection APIs #1320

Closed cyrille-leclerc closed 1 month ago

cyrille-leclerc commented 1 month ago

Description:

Maven is migrating its Dependency Injection framework from Plexus to JSR-330 and Eclipse Sisu as documented in https://maven.apache.org/maven-jsr330.html .

This PR migrates the OTel Maven Extension from Plexus to JSR-330.

The OpenTelemetry Maven Extension primarily relies on the AbstractExecutionListener API which is unfortunately not supported by Maven's JSR-330 / Sisu APIs as it was by Maven's Plexus APIs. This PR works around this limitation hooking the OtelExecutionListener using the AbstractMavenLifecycleParticipant#afterProjectsRead API that is well supported by Maven's JSR-330/Sisu APIs.

Details on MAven JSR-330 / Sisu APIs behavior

See test Maven extensions https://github.com/cyrille-leclerc/maven-extension-test

Maven Extension APIMaven EventExtension loading mechanism
${maven.home}/lib/extmvn -Dmaven.ext.class.path=pom.xml's <extensions>.mvn/extensions.xml
JSR330AbstractExecutionListener πŸ”΄ πŸ”΄ πŸ”΄ πŸ”΄
JSR330AbstractMavenLifecycleParticipant#afterSessionStart 🟒 🟒 πŸ”΄ 🟒
JSR330AbstractMavenLifecycleParticipant#afterProjectsRead 🟒 🟒 🟒 🟒
JSR330AbstractMavenLifecycleParticipant#afterSessionEnd 🟒 🟒 🟒 🟒
JSR330AbstractEventSpy#init 🟒 🟒 πŸ”΄ 🟒
JSR330AbstractEventSpy#onEvent 🟒 🟒 πŸ”΄ 🟒
JSR330AbstractEventSpy#close 🟒 🟒 πŸ”΄ 🟒

Existing Issue(s):

Testing:

Unfortunately, there is no testing framework for Maven extensions. I've done manual tests including tests of a Jenkins + Maven pipeline.

Documentation:

No change for the users

Outstanding items:

None

cyrille-leclerc commented 1 month ago

works building with a pom.xml but not yet with the Gradle build.

pom.xml to build the Maven Extension ```xml 4.0.0 io.opentelemetry.contrib opentelemetry-maven-extension 0.0.1-SNAPSHOT 17 1.10.4 javax.inject javax.inject 1 provided io.opentelemetry opentelemetry-api io.opentelemetry opentelemetry-sdk io.opentelemetry opentelemetry-sdk-trace io.opentelemetry opentelemetry-sdk-extension-autoconfigure io.opentelemetry opentelemetry-sdk-extension-autoconfigure-spi io.opentelemetry.semconv opentelemetry-semconv 1.25.0-alpha io.opentelemetry.semconv opentelemetry-semconv-incubating 1.25.0-alpha io.opentelemetry opentelemetry-exporter-otlp com.google.auto.value auto-value-annotations ${auto-value.version} provided org.slf4j slf4j-api 1.7.36 provided com.google.code.findbugs jsr305 3.0.2 compile org.apache.maven maven-core 3.5.0 provided org.slf4j slf4j-simple 1.7.36 test org.junit.jupiter junit-jupiter-api 5.10.2 test org.assertj assertj-core 3.25.3 test io.opentelemetry opentelemetry-bom 1.37.0 pom import io.opentelemetry opentelemetry-bom-alpha 1.37.0-alpha pom import maven-compiler-plugin com.google.auto.value auto-value ${auto-value.version} org.eclipse.sisu sisu-maven-plugin 0.9.0.M2 generate-index main-index org.apache.maven.plugins maven-shade-plugin 3.5.3 package shade ```
cyrille-leclerc commented 1 month ago

The Gradle build of the Maven Extension now produces a valid Maven extension. I'm doing more tests.