You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by eo...@apache.org on 2020/05/10 14:08:02 UTC

[maven-studies] 18/23: Use Injection in order to load MetricsSystem from extensions

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 <eo...@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.
      */