This is an automated email from the ASF dual-hosted git repository. eolivelli pushed a commit to branch maven-metrics in repository https://gitbox.apache.org/repos/asf/maven-studies.git
commit 80067987947f97c96c80c4c164319e7fd8c01355 Author: Enrico Olivelli <eolive...@apache.org> AuthorDate: Sun Apr 5 14:18:56 2020 +0200 Use Injection in order to load MetricsSystem from extensions --- .../main/java/org/apache/maven/DefaultMaven.java | 37 +++++++--------------- .../maven/lifecycle/internal/LifecycleStarter.java | 7 ++-- .../metrics/internal/DefaultMetricsSystem.java | 19 ++++------- .../main/java/org/apache/maven/cli/MavenCli.java | 19 +++++++++++ .../org/apache/maven/metrics/MetricsProvider.java | 33 ++++++------------- .../org/apache/maven/metrics/MetricsSystem.java | 2 ++ .../maven/metrics/impl/NullMetricsProvider.java | 28 ---------------- 7 files changed, 52 insertions(+), 93 deletions(-) diff --git a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java index 6a847c8..7f052c1 100644 --- a/maven-core/src/main/java/org/apache/maven/DefaultMaven.java +++ b/maven-core/src/main/java/org/apache/maven/DefaultMaven.java @@ -31,10 +31,6 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.execution.DefaultMavenExecutionResult; import org.apache.maven.execution.ExecutionEvent; @@ -46,7 +42,6 @@ import org.apache.maven.graph.GraphBuilder; import org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory; import org.apache.maven.lifecycle.internal.ExecutionEventCatapult; import org.apache.maven.lifecycle.internal.LifecycleStarter; -import org.apache.maven.metrics.MetricsSystem; import org.apache.maven.model.Prerequisites; import org.apache.maven.model.building.ModelProblem; import org.apache.maven.model.building.Result; @@ -56,6 +51,8 @@ import org.apache.maven.project.ProjectBuilder; import org.apache.maven.repository.LocalRepositoryNotAccessibleException; import org.apache.maven.session.scope.internal.SessionScope; import org.codehaus.plexus.PlexusContainer; +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.component.annotations.Requirement; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.codehaus.plexus.logging.Logger; import org.eclipse.aether.DefaultRepositorySystemSession; @@ -66,42 +63,37 @@ import org.eclipse.aether.util.repository.ChainedWorkspaceReader; /** * @author Jason van Zyl */ -@Named -@Singleton +@Component( role = Maven.class ) public class DefaultMaven implements Maven { - @Inject + @Requirement private Logger logger; - @Inject + @Requirement protected ProjectBuilder projectBuilder; - @Inject + @Requirement private LifecycleStarter lifecycleStarter; - @Inject + @Requirement protected PlexusContainer container; - @Inject + @Requirement private ExecutionEventCatapult eventCatapult; - @Inject + @Requirement private LegacySupport legacySupport; - @Inject + @Requirement private SessionScope sessionScope; - @Inject + @Requirement private DefaultRepositorySystemSessionFactory repositorySessionFactory; - @Inject - @Named( GraphBuilder.HINT ) + @Requirement( hint = GraphBuilder.HINT ) private GraphBuilder graphBuilder; - - @Requirement - private MetricsSystem metricsSystem; @Override public MavenExecutionResult execute( MavenExecutionRequest request ) @@ -132,11 +124,6 @@ public class DefaultMaven finally { legacySupport.setSession( null ); - - logger.info("Dumping metrics provider info ("+metricsSystem.getMetricsProvider()+"): "); - metricsSystem.getMetricsProvider().dump((k,v) -> { - logger.info(k+": "+v); - }); } return result; diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleStarter.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleStarter.java index c0c1278..7d04361 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleStarter.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleStarter.java @@ -72,8 +72,9 @@ public class LifecycleStarter @Inject private SessionScope sessionScope; - - @Requirement + + @Inject + @Named( MetricsSystem.HINT ) private MetricsSystem metricsSystem; public void execute( MavenSession session ) @@ -134,7 +135,7 @@ public class LifecycleStarter } long startBuild = System.currentTimeMillis(); builder.build( session, reactorContext, projectBuilds, taskSegments, reactorBuildStatus ); - metricsSystem.getMetricsContext().getSummary("buildTime").add(System.currentTimeMillis() - startBuild); + metricsSystem.getMetricsContext().getSummary( "buildTime" ).add(System.currentTimeMillis() - startBuild); } catch ( Exception e ) { diff --git a/maven-core/src/main/java/org/apache/maven/metrics/internal/DefaultMetricsSystem.java b/maven-core/src/main/java/org/apache/maven/metrics/internal/DefaultMetricsSystem.java index 2e45c85..79dd9a4 100644 --- a/maven-core/src/main/java/org/apache/maven/metrics/internal/DefaultMetricsSystem.java +++ b/maven-core/src/main/java/org/apache/maven/metrics/internal/DefaultMetricsSystem.java @@ -32,33 +32,26 @@ import org.apache.maven.metrics.impl.NullMetricsProvider; import org.codehaus.plexus.logging.Logger; /** - * Default Implementation of Metrics System Runtime + * Default Implementation of Metrics System Runtime. + * Implementations are supposed to be configured as Maven Extensions. * @author Enrico Olivelli */ @Singleton -@Named +@Named( MetricsSystem.HINT ) public class DefaultMetricsSystem implements MetricsSystem { - - private final Logger log; - private final MetricsProvider metricsProvider; @Inject - public DefaultMetricsSystem(Logger log, ClassRealmManager classRealmManager) throws Exception { - this.log = log; - String metricsProviderClass = System.getProperty("maven.metrics.provider", NullMetricsProvider.class.getName()); - log.info("Starting DefaultMetricsSystem maven.metrics.provider="+metricsProviderClass); - metricsProvider = (MetricsProvider) Class.forName(metricsProviderClass, true, classRealmManager.getCoreRealm()).getConstructor().newInstance(); - log.info("Metrics provider: "+metricsProvider); + public DefaultMetricsSystem() { } @Override public MetricsContext getMetricsContext() { - return metricsProvider.getRootContext(); + return NullMetricsProvider.INSTANCE.getRootContext(); } @Override public MetricsProvider getMetricsProvider() { - return metricsProvider; + return NullMetricsProvider.INSTANCE; } } diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java index cbdf47f..58abe73 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java @@ -116,6 +116,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import static org.apache.maven.cli.ResolveFile.resolveFile; +import org.apache.maven.metrics.MetricsProviderLifeCycleException; +import org.apache.maven.metrics.MetricsSystem; +import org.apache.maven.metrics.internal.DefaultMetricsSystem; import static org.apache.maven.shared.utils.logging.MessageUtils.buffer; // TODO push all common bits back to plexus cli and prepare for transition to Guice. We don't need 50 ways to make CLIs @@ -155,6 +158,8 @@ public class MavenCli private Logger slf4jLogger; private EventSpyDispatcher eventSpyDispatcher; + + private MetricsSystem metricsSystem; private ModelProcessor modelProcessor; @@ -679,6 +684,10 @@ public class MavenCli container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() ); + metricsSystem = container.lookup(MetricsSystem.class); + System.out.println("metricsSystem: "+metricsSystem); + System.out.println("LIST: "+container.lookupList(MetricsSystem.class)); + eventSpyDispatcher = container.lookup( EventSpyDispatcher.class ); DefaultEventSpyContext eventSpyContext = new DefaultEventSpyContext(); @@ -970,6 +979,14 @@ public class MavenCli private int execute( CliRequest cliRequest ) throws MavenExecutionRequestPopulationException { + slf4jLogger.info("MetricsSystem: " + metricsSystem); + try { + metricsSystem.getMetricsProvider().start(); + } catch (MetricsProviderLifeCycleException error) { + slf4jLogger.error( "Cannot start MetricsProvider, falling back to default", error); + metricsSystem = new DefaultMetricsSystem(); + } + MavenExecutionRequest request = executionRequestPopulator.populateDefaults( cliRequest.request ); eventSpyDispatcher.onEvent( request ); @@ -979,6 +996,8 @@ public class MavenCli eventSpyDispatcher.onEvent( result ); eventSpyDispatcher.close(); + + metricsSystem.getMetricsProvider().stop(); if ( result.hasExceptions() ) { diff --git a/maven-metrics/src/main/java/org/apache/maven/metrics/MetricsProvider.java b/maven-metrics/src/main/java/org/apache/maven/metrics/MetricsProvider.java index 66d197c..2f4bcb6 100644 --- a/maven-metrics/src/main/java/org/apache/maven/metrics/MetricsProvider.java +++ b/maven-metrics/src/main/java/org/apache/maven/metrics/MetricsProvider.java @@ -19,9 +19,6 @@ package org.apache.maven.metrics; * under the License. */ -import java.util.Properties; -import java.util.function.BiConsumer; - /** * A MetricsProvider is a system which collects Metrics and publishes current values to external facilities. * @@ -34,23 +31,14 @@ import java.util.function.BiConsumer; */ public interface MetricsProvider { - - /** - * Configure the provider. - * - * @param configuration the configuration. - * - * @throws MetricsProviderLifeCycleException in case of invalid configuration. - */ - void configure( Properties configuration ) throws MetricsProviderLifeCycleException; - /** * Start the provider. * For instance such method will start a network endpoint. * * @throws MetricsProviderLifeCycleException in case of failure */ - void start() throws MetricsProviderLifeCycleException; + default void start() throws MetricsProviderLifeCycleException { + } /** * Provides access to the root context. @@ -61,23 +49,20 @@ public interface MetricsProvider /** * Releases resources held by the provider.<br> - * This method must not throw exceptions.<br> + * This method must not throw exceptions. + * The provider may dump the results to the logs or send + * the results to an external <br> * This method can be called more than once. */ - void stop(); - - /** - * Dumps all metrics as a key-value pair. - * This method will be used in legacy monitor command. - * @param sink the receiver of all of the current values. - */ - void dump( BiConsumer<String, Object> sink ); + default void stop() { + } /** * Reset all values. * This method is optional and can be noop, depending * on the underlying implementation. */ - void resetAllValues(); + default void resetAllValues() { + } } diff --git a/maven-metrics/src/main/java/org/apache/maven/metrics/MetricsSystem.java b/maven-metrics/src/main/java/org/apache/maven/metrics/MetricsSystem.java index d24a580..8874354 100644 --- a/maven-metrics/src/main/java/org/apache/maven/metrics/MetricsSystem.java +++ b/maven-metrics/src/main/java/org/apache/maven/metrics/MetricsSystem.java @@ -26,6 +26,8 @@ package org.apache.maven.metrics; public interface MetricsSystem { + static final String HINT = "metricsSystem"; + /** * Access current metrics context. * @return the metrics context diff --git a/maven-metrics/src/main/java/org/apache/maven/metrics/impl/NullMetricsProvider.java b/maven-metrics/src/main/java/org/apache/maven/metrics/impl/NullMetricsProvider.java index f7ed453..12aeb87 100644 --- a/maven-metrics/src/main/java/org/apache/maven/metrics/impl/NullMetricsProvider.java +++ b/maven-metrics/src/main/java/org/apache/maven/metrics/impl/NullMetricsProvider.java @@ -19,13 +19,10 @@ package org.apache.maven.metrics.impl; * under the License. */ -import java.util.Properties; -import java.util.function.BiConsumer; import org.apache.maven.metrics.Counter; import org.apache.maven.metrics.Gauge; import org.apache.maven.metrics.MetricsContext; import org.apache.maven.metrics.MetricsProvider; -import org.apache.maven.metrics.MetricsProviderLifeCycleException; import org.apache.maven.metrics.Summary; import org.apache.maven.metrics.SummarySet; @@ -41,36 +38,11 @@ public class NullMetricsProvider implements MetricsProvider public static final MetricsProvider INSTANCE = new NullMetricsProvider(); @Override - public void configure( Properties configuration ) throws MetricsProviderLifeCycleException - { - } - - @Override - public void start() throws MetricsProviderLifeCycleException - { - } - - @Override public MetricsContext getRootContext() { return NullMetricsContext.INSTANCE; } - @Override - public void dump( BiConsumer<String, Object> sink ) - { - } - - @Override - public void resetAllValues() - { - } - - @Override - public void stop() - { - } - /** * Default no-op implementation. */