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 13:04:37 UTC

[maven-metric] branch master created (now cab4edb)

This is an automated email from the ASF dual-hosted git repository.

eolivelli pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/maven-metric.git.


      at cab4edb  Initial commit

This branch includes the following new commits:

     new cab4edb  Initial commit

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[maven-metric] 01/01: Initial commit

Posted by eo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

eolivelli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-metric.git

commit cab4edb943be56d379123fb8b41c2e3dab1b43f9
Author: Enrico Olivelli <eo...@apache.org>
AuthorDate: Sun May 10 15:04:24 2020 +0200

    Initial commit
---
 .gitignore                                         |  15 ++
 maven-metrics-api/pom.xml                          |  44 ++++++
 .../java/org/apache/maven/metrics/Counter.java     |  54 +++++++
 .../main/java/org/apache/maven/metrics/Gauge.java  |  38 +++++
 .../main/java/org/apache/maven/metrics/Metric.java |  47 +++++++
 .../org/apache/maven/metrics/MetricsContext.java   |  92 ++++++++++++
 .../org/apache/maven/metrics/MetricsProvider.java  |  71 ++++++++++
 .../metrics/MetricsProviderLifeCycleException.java |  51 +++++++
 .../org/apache/maven/metrics/MetricsSystem.java    |  42 ++++++
 .../java/org/apache/maven/metrics/Summary.java     |  37 +++++
 .../java/org/apache/maven/metrics/SummarySet.java  |  39 ++++++
 .../maven/metrics/impl/NullMetricsProvider.java    | 132 ++++++++++++++++++
 pom.xml                                            | 155 +++++++++++++++++++++
 13 files changed, 817 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f79c928
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,15 @@
+target/
+.project
+.classpath
+.settings/
+.svn/
+bin/
+# Intellij
+*.ipr
+*.iml
+.idea
+out/
+.DS_Store
+/bootstrap
+/dependencies.xml
+.java-version
diff --git a/maven-metrics-api/pom.xml b/maven-metrics-api/pom.xml
new file mode 100644
index 0000000..6f4fb93
--- /dev/null
+++ b/maven-metrics-api/pom.xml
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven</groupId>
+    <artifactId>maven-metric</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>maven-metrics-api</artifactId>
+
+  <name>Maven Metrics API</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+  </dependencies>
+
+  <build>
+  </build>
+</project>
diff --git a/maven-metrics-api/src/main/java/org/apache/maven/metrics/Counter.java b/maven-metrics-api/src/main/java/org/apache/maven/metrics/Counter.java
new file mode 100644
index 0000000..e2eb1d1
--- /dev/null
+++ b/maven-metrics-api/src/main/java/org/apache/maven/metrics/Counter.java
@@ -0,0 +1,54 @@
+package org.apache.maven.metrics;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * A counter refers to a value which can only increase.
+ * Usually the value is reset when the process starts.
+ */
+public interface Counter
+{
+
+    /**
+     * Increment the value by one.
+     * <p>This method is thread safe, The MetricsProvider will take care of synchronization.</p>
+     */
+    default void inc()
+    {
+        add( 1 );
+    }
+
+    /**
+     * Increment the value by a given amount.
+     * <p>This method is thread safe, The MetricsProvider will take care of synchronization.</p>
+     *
+     * @param delta amount to increment, this cannot be a negative number.
+     */
+    void add( long delta );
+
+    /**
+     * Get the current value held by the counter.
+     * <p>This method is thread safe, The MetricsProvider will take care of synchronization.</p>
+     *
+     * @return the current value
+     */
+    long get();
+
+}
diff --git a/maven-metrics-api/src/main/java/org/apache/maven/metrics/Gauge.java b/maven-metrics-api/src/main/java/org/apache/maven/metrics/Gauge.java
new file mode 100644
index 0000000..1c6559c
--- /dev/null
+++ b/maven-metrics-api/src/main/java/org/apache/maven/metrics/Gauge.java
@@ -0,0 +1,38 @@
+package org.apache.maven.metrics;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * A Gauge is an application provided object which will be called by the framework in order to sample the value
+ * of an integer value.
+ */
+public interface Gauge
+{
+
+    /**
+     * Returns the current value associated with this gauge.
+     * The MetricsProvider will call this callback without taking care of synchronization, it is up to the application
+     * to handle thread safety.
+     *
+     * @return the current value for the gauge
+     */
+    Number get();
+
+}
diff --git a/maven-metrics-api/src/main/java/org/apache/maven/metrics/Metric.java b/maven-metrics-api/src/main/java/org/apache/maven/metrics/Metric.java
new file mode 100644
index 0000000..f77c850
--- /dev/null
+++ b/maven-metrics-api/src/main/java/org/apache/maven/metrics/Metric.java
@@ -0,0 +1,47 @@
+package org.apache.maven.metrics;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Interface common to every metrics.
+ * It allows the user to define common metadata about the metric.
+ */
+public interface Metric
+{
+    /**
+     * Define a textual label for the metric
+     * @param label the label (plain text)
+     * @return the metric handle itself
+     */
+    default <T extends Metric> T setLabel( String label )
+    {
+        return (T) this;
+    }
+
+    /**
+     * Define a textual help for the metric
+     * @param help the help (plain text)
+     * @return the metric handle itself
+     */
+    default <T extends Metric> T setHelp( String help )
+    {
+        return (T) this;
+    }
+}
diff --git a/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsContext.java b/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsContext.java
new file mode 100644
index 0000000..cb85793
--- /dev/null
+++ b/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsContext.java
@@ -0,0 +1,92 @@
+package org.apache.maven.metrics;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * A MetricsContext is like a namespace for metrics. Each component/submodule
+ * will have its own MetricsContext.
+ * <p>
+ * In some cases it is possible to have a separate MetricsContext for each
+ * instance of a component, for instance on the server side a possible usecase
+ * it to gather metrics for every other peer.
+ * </p>
+ * <p>
+ * Contexts are organized in a hierarchy.
+ * </p>
+ *
+ */
+public interface MetricsContext
+{
+
+    /**
+     * Returns a sub context.
+     *
+     * @param name the name of the subcontext
+     *
+     * @return a new metrics context.
+     */
+    MetricsContext getContext( String name );
+
+    /**
+     * Returns a counter.
+     *
+     * @param name
+     * @return the counter identified by name in this context.
+     */
+    Counter getCounter( String name, String description );
+
+    /**
+     * Registers an user provided {@link Gauge} which will be called by the
+     * MetricsProvider in order to sample an integer value.
+     * If another Gauge was already registered the new one will
+     * take its place.
+     * Registering a null callback is not allowed.
+     *
+     * @param name unique name of the Gauge in this context
+     * @param gauge the implementation of the Gauge
+     *
+     */
+    void registerGauge( String name, String description, Gauge gauge );
+
+    /**
+     * Unregisters the user provided {@link Gauge} bound to the given name.
+     *
+     * @param name unique name of the Gauge in this context
+     *
+     */
+    void unregisterGauge( String name );
+
+    /**
+     * Returns a summary.
+     *
+     * @param name
+     * @return the summary identified by name in this context.
+     */
+    Summary getSummary( String name, String description );
+
+    /**
+     * Returns a set of summaries.
+     *
+     * @param name
+     * @return the summary identified by name in this context.
+     */
+    SummarySet getSummarySet( String name, String description );
+
+}
diff --git a/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsProvider.java b/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsProvider.java
new file mode 100644
index 0000000..f4af144
--- /dev/null
+++ b/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsProvider.java
@@ -0,0 +1,71 @@
+package org.apache.maven.metrics;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * A MetricsProvider is a system which collects Metrics and publishes current values to external facilities.
+ *
+ * The system will create an instance of the configured class using the default constructor, which must be public.<br>
+ * After the instantiation of the provider, the system will call {@link #configure(java.util.Properties) }
+ * in order to provide configuration,
+ * and then when the system is ready to work it will call {@link #start() }.
+ * <br>
+ * Providers can be used both on ZooKeeper servers and on ZooKeeper clients.
+ */
+public interface MetricsProvider
+{
+    /**
+     * Start the provider.
+     * For instance such method will start a network endpoint.
+     *
+     * @throws MetricsProviderLifeCycleException in case of failure
+     */
+    default void start() throws MetricsProviderLifeCycleException
+    {
+    }
+
+    /**
+     * Provides access to the root context.
+     *
+     * @return the root context
+     */
+    MetricsContext getRootContext();
+
+    /**
+     * Releases resources held by the provider.<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.
+     */
+    default void stop()
+    {
+    }
+
+    /**
+     * Reset all values.
+     * This method is optional and can be noop, depending
+     * on the underlying implementation.
+     */
+    default void resetAllValues()
+    {
+    }
+
+}
diff --git a/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsProviderLifeCycleException.java b/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsProviderLifeCycleException.java
new file mode 100644
index 0000000..ecf7d5b
--- /dev/null
+++ b/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsProviderLifeCycleException.java
@@ -0,0 +1,51 @@
+package org.apache.maven.metrics;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * A generic exception thrown during the licecycle of a MetricsProvider.
+ * <p>These exception will prevent the system from booting.</p>
+ * <p>Normally these exception will be ignored during shutdown.</p>
+ */
+public class MetricsProviderLifeCycleException extends Exception
+{
+
+    private static final long serialVersionUID = 1L;
+
+    public MetricsProviderLifeCycleException()
+    {
+    }
+
+    public MetricsProviderLifeCycleException( String message )
+    {
+        super( message );
+    }
+
+    public MetricsProviderLifeCycleException( String message, Throwable cause )
+    {
+        super( message, cause );
+    }
+
+    public MetricsProviderLifeCycleException( Throwable cause )
+    {
+        super( cause );
+    }
+
+}
diff --git a/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsSystem.java b/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsSystem.java
new file mode 100644
index 0000000..9e70db5
--- /dev/null
+++ b/maven-metrics-api/src/main/java/org/apache/maven/metrics/MetricsSystem.java
@@ -0,0 +1,42 @@
+package org.apache.maven.metrics;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Component to access Metrics System
+ * @author Enrico Olivelli
+ */
+public interface MetricsSystem
+{
+
+    String HINT = "metricsSystem";
+    
+    /**
+     * Access current metrics context.
+     * @return the metrics context
+     */
+    MetricsContext getMetricsContext();
+    
+    /**
+     * Low level Access to the Provider
+     * @return the provider
+     */
+    MetricsProvider getMetricsProvider();
+}
diff --git a/maven-metrics-api/src/main/java/org/apache/maven/metrics/Summary.java b/maven-metrics-api/src/main/java/org/apache/maven/metrics/Summary.java
new file mode 100644
index 0000000..9ad49c1
--- /dev/null
+++ b/maven-metrics-api/src/main/java/org/apache/maven/metrics/Summary.java
@@ -0,0 +1,37 @@
+package org.apache.maven.metrics;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Summaries track the size and number of events.
+ * They are able to publish minumum, maximum, average values, depending on the capabilities of the MetricsProvider.
+ */
+public interface Summary
+{
+
+    /**
+     * Register a value.
+     * <p>This method is thread safe, The MetricsProvider will take care of synchronization.</p>
+     *
+     * @param value current value
+     */
+    void add( long value );
+
+}
diff --git a/maven-metrics-api/src/main/java/org/apache/maven/metrics/SummarySet.java b/maven-metrics-api/src/main/java/org/apache/maven/metrics/SummarySet.java
new file mode 100644
index 0000000..e31764a
--- /dev/null
+++ b/maven-metrics-api/src/main/java/org/apache/maven/metrics/SummarySet.java
@@ -0,0 +1,39 @@
+package org.apache.maven.metrics;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/**
+ * Summaries track the size and number of events.
+ * They are able to publish minumum, maximum, average values, depending on the capabilities of the MetricsProvider.
+ * A SummarySet is a set of {@link Summary}.
+ */
+public interface SummarySet
+{
+
+    /**
+     * Register a value.
+     * <p>This method is thread safe, The MetricsProvider will take care of synchronization.</p>
+     *
+     * @param key the key to access the Summary for the given key
+     * @param value current value
+     */
+    void add( String key, long value );
+
+}
diff --git a/maven-metrics-api/src/main/java/org/apache/maven/metrics/impl/NullMetricsProvider.java b/maven-metrics-api/src/main/java/org/apache/maven/metrics/impl/NullMetricsProvider.java
new file mode 100644
index 0000000..a94c3b2
--- /dev/null
+++ b/maven-metrics-api/src/main/java/org/apache/maven/metrics/impl/NullMetricsProvider.java
@@ -0,0 +1,132 @@
+package org.apache.maven.metrics.impl;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+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.Summary;
+import org.apache.maven.metrics.SummarySet;
+
+/**
+ * This is a dummy MetricsProvider which does nothing.
+ */
+public class NullMetricsProvider implements MetricsProvider
+{
+
+    /**
+     * Instance of NullMetricsProvider useful for tests.
+     */
+    public static final MetricsProvider INSTANCE = new NullMetricsProvider();
+
+    @Override
+    public MetricsContext getRootContext()
+    {
+        return NullMetricsContext.INSTANCE;
+    }
+
+    /**
+     * Default no-op implementation.
+     */
+    public static final class NullMetricsContext implements MetricsContext
+    {
+
+        public static final NullMetricsContext INSTANCE = new NullMetricsContext();
+
+        @Override
+        public MetricsContext getContext( String name )
+        {
+            return INSTANCE;
+        }
+
+        @Override
+        public Counter getCounter( String name, String description )
+        {
+            return NullCounter.INSTANCE;
+        }
+
+        @Override
+        public void registerGauge( String name, String description, Gauge gauge )
+        {
+        }
+
+        @Override
+        public void unregisterGauge( String name )
+        {
+        }
+
+        @Override
+        public Summary getSummary( String name, String description )
+        {
+            return NullSummary.INSTANCE;
+        }
+
+        @Override
+        public SummarySet getSummarySet( String name, String description )
+        {
+            return NullSummarySet.INSTANCE;
+        }
+
+    }
+
+    private static final class NullCounter implements Counter
+    {
+
+        private static final NullCounter INSTANCE = new NullCounter();
+
+        @Override
+        public void add( long delta )
+        {
+        }
+
+        @Override
+        public long get()
+        {
+            return 0;
+        }
+
+    }
+
+    private static final class NullSummary implements Summary
+    {
+
+        private static final NullSummary INSTANCE = new NullSummary();
+
+        @Override
+        public void add( long value )
+        {
+        }
+
+    }
+
+    private static final class NullSummarySet implements SummarySet
+    {
+
+        private static final NullSummarySet INSTANCE = new NullSummarySet();
+
+        @Override
+        public void add( String key, long value )
+        {
+        }
+
+    }
+
+}
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..cbdd8bb
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,155 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven</groupId>
+    <artifactId>maven-parent</artifactId>
+    <version>34</version>
+    <relativePath>../pom/maven/pom.xml</relativePath>
+  </parent>
+
+  <artifactId>maven-metric</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <name>Apache Maven Metrics</name>
+  <description>Maven is a software build management and
+    comprehension tool. Based on the concept of a project object model:
+    builds, dependency management, documentation creation, site
+    publication, and distribution publication are all controlled from
+    the declarative file. Maven can be extended by plugins to utilise a
+    number of other development tools for reporting or the build
+    process.
+  </description>
+  <url>https://maven.apache.org/</url>
+  <inceptionYear>2020</inceptionYear>
+
+  <properties>
+    <maven.compiler.source>1.8</maven.compiler.source>
+    <maven.compiler.target>1.8</maven.compiler.target>
+    <commonsLangVersion>3.8.1</commonsLangVersion>
+    <project.build.outputTimestamp>2019-11-07T12:32:18Z</project.build.outputTimestamp>
+  </properties>
+
+  <modules>
+    <module>maven-metrics-api</module>
+  </modules>
+
+  <scm>
+    <connection>scm:git:https://gitbox.apache.org/repos/asf/maven-metric.git</connection>
+    <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/maven-metric.git</developerConnection>
+    <url>https://github.com/apache/maven-metric/tree/${project.scm.tag}</url>
+    <tag>master</tag>
+  </scm>
+  <issueManagement>
+    <system>jira</system>
+    <url>https://issues.apache.org/jira/browse/MNG</url>
+  </issueManagement>
+  <ciManagement>
+    <system>Jenkins</system>
+    <url>https://builds.apache.org/job/maven-box/job/maven/</url>
+  </ciManagement>
+  <distributionManagement>
+    <downloadUrl>https://maven.apache.org/download.html</downloadUrl>
+    <site>
+      <id>apache.website</id>
+      <url>scm:svn:https://svn.apache.org/repos/asf/maven-metric/website/components/${maven.site.path}</url>
+    </site>
+  </distributionManagement>
+
+  <contributors>
+  </contributors>
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.apache.commons</groupId>
+        <artifactId>commons-lang3</artifactId>
+        <version>${commonsLangVersion}</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+  <build>
+    <pluginManagement>
+      <plugins>
+        <plugin>
+          <groupId>org.codehaus.plexus</groupId>
+          <artifactId>plexus-component-metadata</artifactId>
+          <version>${plexusVersion}</version>
+          <executions>
+            <execution>
+              <goals>
+                <goal>generate-metadata</goal>
+                <goal>generate-test-metadata</goal>
+              </goals>
+            </execution>
+          </executions>
+        </plugin>
+        <plugin>
+          <groupId>org.eclipse.sisu</groupId>
+          <artifactId>sisu-maven-plugin</artifactId>
+          <version>${sisuInjectVersion}</version>
+          <executions>
+            <execution>
+              <goals>
+                <goal>main-index</goal>
+                <goal>test-index</goal>
+              </goals>
+            </execution>
+          </executions>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-release-plugin</artifactId>
+          <configuration>
+            <autoVersionSubmodules>true</autoVersionSubmodules>
+          </configuration>
+        </plugin>
+      </plugins>
+    </pluginManagement>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>animal-sniffer-maven-plugin</artifactId>
+        <version>1.18</version>
+        <configuration>
+          <signature>
+            <groupId>org.codehaus.mojo.signature</groupId>
+            <artifactId>java18</artifactId>
+            <version>1.0</version>
+          </signature>
+        </configuration>
+        <executions>
+          <execution>
+            <id>check-java-compat</id>
+            <phase>process-classes</phase>
+            <goals>
+              <goal>check</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  
+</project>