making tags binding in @Metric
diff --git a/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/ConcurrentGaugeImpl.java b/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/ConcurrentGaugeImpl.java
index 6f3d218..b888d71 100644
--- a/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/ConcurrentGaugeImpl.java
+++ b/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/ConcurrentGaugeImpl.java
@@ -33,8 +33,8 @@
 
     private volatile Instant currentMinute = CLOCK.instant();
 
-    private volatile long lastMax = -1;
-    private volatile long lastMin = -1;
+    private volatile long lastMax = 0;
+    private volatile long lastMin = 0;
     private final String unit;
 
     public ConcurrentGaugeImpl(final String unit) {
diff --git a/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/RegistryImpl.java b/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/RegistryImpl.java
index 17ab35b..61cb4eb 100644
--- a/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/RegistryImpl.java
+++ b/geronimo-metrics-common/src/main/java/org/apache/geronimo/microprofile/metrics/common/RegistryImpl.java
@@ -20,12 +20,14 @@
 import static java.util.stream.Collectors.toMap;
 
 import java.util.Map;
+import java.util.Objects;
 import java.util.SortedMap;
 import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.eclipse.microprofile.metrics.ConcurrentGauge;
 import org.eclipse.microprofile.metrics.Counter;
@@ -48,7 +50,12 @@
 
     @Override
     public <T extends Metric> T register(final Metadata metadata, final T metric) throws IllegalArgumentException {
-        final MetricID metricID = new MetricID(metadata.getName());
+        return register(metadata, metric, NO_TAG);
+    }
+
+    @Override
+    public <T extends Metric> T register(final Metadata metadata, final T metric, final Tag... tags) throws IllegalArgumentException {
+        final MetricID metricID = new MetricID(metadata.getName(), tags);
         final Holder<? extends Metric> holder = metrics.putIfAbsent(
                 metricID, new Holder<>(metric, metadata, metricID));
         if (holder != null && !metadata.isReusable() && !holder.metadata.isReusable()) {
@@ -58,11 +65,6 @@
     }
 
     @Override
-    public <T extends Metric> T register(final Metadata metadata, final T metric, final Tag... tags) throws IllegalArgumentException {
-        return register(Metadata.builder(metadata).build(), metric);
-    }
-
-    @Override
     public <T extends Metric> T register(final String name, final T metric) throws IllegalArgumentException {
         final MetricType type;
         if (Counter.class.isInstance(metric)) {
@@ -90,10 +92,11 @@
 
     @Override
     public Counter counter(final Metadata metadata, final Tag... tags) {
-        Holder<? extends Metric> holder = metrics.get(metadata.getName());
+        final MetricID metricID = new MetricID(metadata.getName(), tags);
+        Holder<? extends Metric> holder = metrics.get(metricID);
         if (holder == null) {
             holder = new Holder<>(new CounterImpl(
-                    metadata.getUnit().orElse("")), metadata, new MetricID(metadata.getName(), tags));
+                    metadata.getUnit().orElse("")), metadata, metricID);
             final Holder<? extends Metric> existing = metrics.putIfAbsent(holder.metricID, holder);
             if (existing != null) {
                 holder = existing;
@@ -266,7 +269,15 @@
 
     @Override
     public boolean remove(final String name) {
-        return remove(new MetricID(name));
+        final AtomicBoolean done = new AtomicBoolean(false);
+        removeMatching((metricID, metric) -> {
+            final boolean equals = Objects.equals(metricID.getName(), name);
+            if (equals) {
+                done.set(true);
+            }
+            return equals;
+        });
+        return done.get();
     }
 
     @Override
diff --git a/geronimo-metrics-extensions/geronimo-metrics-sigar/src/test/java/org/apache/geronimo/microprofile/metrics/extension/sigar/SigarTest.java b/geronimo-metrics-extensions/geronimo-metrics-sigar/src/test/java/org/apache/geronimo/microprofile/metrics/extension/sigar/SigarTest.java
index e3561ad..4c5934c 100644
--- a/geronimo-metrics-extensions/geronimo-metrics-sigar/src/test/java/org/apache/geronimo/microprofile/metrics/extension/sigar/SigarTest.java
+++ b/geronimo-metrics-extensions/geronimo-metrics-sigar/src/test/java/org/apache/geronimo/microprofile/metrics/extension/sigar/SigarTest.java
@@ -27,6 +27,7 @@
 
 import org.apache.meecrowave.Meecrowave;
 import org.apache.meecrowave.junit.MeecrowaveRule;
+import org.eclipse.microprofile.metrics.MetricID;
 import org.eclipse.microprofile.metrics.MetricRegistry;
 import org.eclipse.microprofile.metrics.annotation.RegistryType;
 import org.junit.ClassRule;
@@ -48,7 +49,8 @@
         final List<String> keys = registry.getGauges()
                                              .keySet()
                                              .stream()
-                                             .filter(it -> it.startsWith("sigar."))
+                                             .filter(it -> it.getName().startsWith("sigar."))
+                                             .map(MetricID::getName)
                                              .sorted()
                                              .collect(toList());
         assertTrue(keys.toString(), keys.size() > 10 /*whatever, just check it is registered*/);
diff --git a/geronimo-metrics/src/main/java/org/apache/geronimo/microprofile/metrics/cdi/MetricsExtension.java b/geronimo-metrics/src/main/java/org/apache/geronimo/microprofile/metrics/cdi/MetricsExtension.java
index bbb6967..b5fe0de 100644
--- a/geronimo-metrics/src/main/java/org/apache/geronimo/microprofile/metrics/cdi/MetricsExtension.java
+++ b/geronimo-metrics/src/main/java/org/apache/geronimo/microprofile/metrics/cdi/MetricsExtension.java
@@ -41,7 +41,6 @@
 import javax.enterprise.inject.spi.AfterBeanDiscovery;
 import javax.enterprise.inject.spi.AfterDeploymentValidation;
 import javax.enterprise.inject.spi.Annotated;
-import javax.enterprise.inject.spi.AnnotatedCallable;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
@@ -54,6 +53,7 @@
 import javax.enterprise.inject.spi.ProcessProducerField;
 import javax.enterprise.inject.spi.ProcessProducerMethod;
 import javax.enterprise.inject.spi.WithAnnotations;
+import javax.enterprise.inject.spi.configurator.BeanConfigurator;
 import javax.enterprise.util.AnnotationLiteral;
 import javax.enterprise.util.Nonbinding;
 
@@ -79,6 +79,8 @@
 import org.eclipse.microprofile.metrics.annotation.Timed;
 
 public class MetricsExtension implements Extension {
+    private static final Tag[] NO_TAG = new Tag[0];
+
     private final MetricRegistry applicationRegistry = new RegistryImpl();
     private final MetricRegistry baseRegistry = new RegistryImpl();
     private final MetricRegistry vendorRegistry = new RegistryImpl();
@@ -108,11 +110,13 @@
 
         // we make @Metric.name binding (to avoid to write producers relying on injection point)
         beforeBeanDiscovery.configureQualifier(org.eclipse.microprofile.metrics.annotation.Metric.class)
-                .methods().stream().filter(method -> method.getAnnotated().getJavaMember().getName().equals("name"))
-                .forEach(method -> method.remove(a -> a.annotationType() == Nonbinding.class));
+                .methods().stream().filter(method -> {
+            final String name = method.getAnnotated().getJavaMember().getName();
+            return name.equals("name") || name.equals("tags");
+        }).forEach(method -> method.remove(a -> a.annotationType() == Nonbinding.class));
     }
 
-    private void onMetric(@Observes final ProcessProducerField<? extends Metric, ?> processProducerField, final BeanManager beanManager) {
+    void onMetric(@Observes final ProcessProducerField<? extends Metric, ?> processProducerField, final BeanManager beanManager) {
         final org.eclipse.microprofile.metrics.annotation.Metric config = processProducerField.getAnnotated()
                 .getAnnotation(org.eclipse.microprofile.metrics.annotation.Metric.class);
         if (config == null) {
@@ -127,7 +131,7 @@
         producersRegistrations.add(() -> registerProducer(beanManager, config, clazz, javaMember, bean));
     }
 
-    private void onMetric(@Observes ProcessProducerMethod<? extends Metric, ?> processProducerMethod,
+    void onMetric(@Observes ProcessProducerMethod<? extends Metric, ?> processProducerMethod,
                           final BeanManager beanManager) {
         final org.eclipse.microprofile.metrics.annotation.Metric config = processProducerMethod.getAnnotated()
                 .getAnnotation(org.eclipse.microprofile.metrics.annotation.Metric.class);
@@ -160,15 +164,14 @@
                     of(config.name()).filter(it -> !it.isEmpty()).orElseGet(injectionPoint.getMember()::getName), config.absolute(),
                     "");
             final Metadata metadata = Metadata.builder()
-                .withName(name)
-                .withDisplayName(config.displayName())
-                .withDescription(config.description())
-                .withType(type)
-                .withUnit(config.unit())
-                .build();
-            final String[] tags = config.tags();
-            final MetricID id = new MetricID(name, createTags(tags));
-            final Metadata existing = registrations.putIfAbsent(id, metadata);
+                    .withName(name)
+                    .withDisplayName(config.displayName())
+                    .withDescription(config.description())
+                    .withType(type)
+                    .withUnit(config.unit())
+                    .build();
+            final MetricID id = new MetricID(name, createTags(config.tags()));
+            addRegistration(metadata, id, true);
 
             if (!name.equals(config.name())) {
                 final Annotation[] newQualifiers = Stream.concat(metricInjectionPointProcessEvent.getInjectionPoint().getQualifiers().stream()
@@ -182,7 +185,7 @@
             final String name = MetricRegistry.name(injectionPoint.getMember().getDeclaringClass(), injectionPoint.getMember().getName());
             final Metadata metadata = Metadata.builder().withName(name).withType(type).build();
             final MetricID metricID = new MetricID(name);
-            registrations.putIfAbsent(metricID, metadata);
+            addRegistration(metadata, metricID, true);
 
             // ensure the injection uses the qualifier since we'll not register it without
             final Annotation[] newQualifiers = Stream.concat(metricInjectionPointProcessEvent.getInjectionPoint().getQualifiers().stream()
@@ -194,6 +197,15 @@
         }
     }
 
+    private void addRegistration(final Metadata metadata, final MetricID id, final boolean reusable) {
+        final Metadata existing = registrations.putIfAbsent(id, metadata);
+        if (existing != null) {
+            if (!reusable && !metadata.isReusable()) {
+                throw new IllegalArgumentException(id.getName() + " is not set as reusable but is referenced twice");
+            }
+        }
+    }
+
     public Tag[] createTags(final String[] tags) {
         return Stream.of(tags).filter(it -> it.contains("=")).map(it -> {
             final int sep = it.indexOf("=");
@@ -229,14 +241,14 @@
                         final String name = Names.findName(javaClass, javaMember, isMethod ? counted.name() : "", counted.absolute(),
                                 ofNullable(annotatedType.getAnnotation(Counted.class)).map(Counted::name).orElse(""));
                         final Metadata metadata = Metadata.builder()
-                            .withName(name)
-                            .withDisplayName(counted.displayName())
-                            .withDescription(counted.description())
-                            .withType(MetricType.COUNTER)
-                            .withUnit(counted.unit())
-                            .build();
+                                .withName(name)
+                                .withDisplayName(counted.displayName())
+                                .withDescription(counted.description())
+                                .withType(MetricType.COUNTER)
+                                .withUnit(counted.unit())
+                                .build();
                         final MetricID metricID = new MetricID(name, createTags(counted.tags()));
-                        addRegistration(method, metricID, metadata, counted.reusable() || !isMethod, counted.tags());
+                        addRegistration(metadata, metricID, counted.reusable() || !isMethod);
                     }
 
                     final ConcurrentGauge concurrentGauge = ofNullable(method.getAnnotation(ConcurrentGauge.class)).orElseGet(() ->
@@ -246,14 +258,14 @@
                         final String name = Names.findName(javaClass, javaMember, isMethod ? concurrentGauge.name() : "", concurrentGauge.absolute(),
                                 ofNullable(annotatedType.getAnnotation(ConcurrentGauge.class)).map(ConcurrentGauge::name).orElse(""));
                         final Metadata metadata = Metadata.builder()
-                            .withName(name)
-                            .withDisplayName(concurrentGauge.displayName())
-                            .withDescription(concurrentGauge.description())
-                            .withType(MetricType.CONCURRENT_GAUGE)
-                            .withUnit(concurrentGauge.unit())
-                            .build();
+                                .withName(name)
+                                .withDisplayName(concurrentGauge.displayName())
+                                .withDescription(concurrentGauge.description())
+                                .withType(MetricType.CONCURRENT_GAUGE)
+                                .withUnit(concurrentGauge.unit())
+                                .build();
                         final MetricID metricID = new MetricID(name, createTags(concurrentGauge.tags()));
-                        addRegistration(method, metricID, metadata, concurrentGauge.reusable() || !isMethod, concurrentGauge.tags());
+                        addRegistration(metadata, metricID, concurrentGauge.reusable() || !isMethod);
                     }
 
                     final Timed timed = ofNullable(method.getAnnotation(Timed.class)).orElseGet(() -> annotatedType.getAnnotation(Timed.class));
@@ -269,7 +281,7 @@
                                 .withUnit(timed.unit())
                                 .build();
                         final MetricID metricID = new MetricID(name, createTags(timed.tags()));
-                        addRegistration(method, metricID, metadata, timed.reusable() || !isMethod, timed.tags());
+                        addRegistration(metadata, metricID, timed.reusable() || !isMethod);
                     }
 
                     final org.eclipse.microprofile.metrics.annotation.Metered metered = ofNullable(method.getAnnotation(org.eclipse.microprofile.metrics.annotation.Metered.class))
@@ -286,7 +298,7 @@
                                 .withUnit(metered.unit())
                                 .build();
                         final MetricID metricID = new MetricID(name, createTags(metered.tags()));
-                        addRegistration(method, metricID, metadata, metered.reusable() || !isMethod, metered.tags());
+                        addRegistration(metadata, metricID, metered.reusable() || !isMethod);
                     }
 
                     final org.eclipse.microprofile.metrics.annotation.Gauge gauge = ofNullable(method.getAnnotation(org.eclipse.microprofile.metrics.annotation.Gauge.class))
@@ -304,7 +316,7 @@
                                 .withUnit(gauge.unit())
                                 .build();
                         final MetricID metricID = new MetricID(name, createTags(gauge.tags()));
-                        addRegistration(method, metricID, metadata, false, gauge.tags());
+                        addRegistration(metadata, metricID, false);
                         gaugeFactories.put(name, beanManager -> {
                             final Object reference = getInstance(javaClass, beanManager);
                             final Method mtd = Method.class.cast(javaMember);
@@ -314,49 +326,50 @@
                 });
     }
 
-    void afterBeanDiscovery(@Observes final AfterBeanDiscovery afterBeanDiscovery, final BeanManager beanManager) {
-        addBean(afterBeanDiscovery, MetricRegistry.Type.APPLICATION.name() + "_@Default", MetricRegistry.class, Default.Literal.INSTANCE, applicationRegistry);
-        addBean(afterBeanDiscovery, MetricRegistry.Type.APPLICATION.name(), MetricRegistry.class, new RegistryTypeImpl(MetricRegistry.Type.APPLICATION), applicationRegistry);
-        addBean(afterBeanDiscovery, MetricRegistry.Type.BASE.name(), MetricRegistry.class, new RegistryTypeImpl(MetricRegistry.Type.BASE), baseRegistry);
-        addBean(afterBeanDiscovery, MetricRegistry.Type.VENDOR.name(), MetricRegistry.class, new RegistryTypeImpl(MetricRegistry.Type.VENDOR), vendorRegistry);
+    void afterBeanDiscovery(@Observes final AfterBeanDiscovery afterBeanDiscovery) {
+        addBean(afterBeanDiscovery, MetricRegistry.Type.APPLICATION.name(), MetricRegistry.class, new RegistryTypeImpl(MetricRegistry.Type.APPLICATION), applicationRegistry, true);
+        addBean(afterBeanDiscovery, MetricRegistry.Type.BASE.name(), MetricRegistry.class, new RegistryTypeImpl(MetricRegistry.Type.BASE), baseRegistry, false);
+        addBean(afterBeanDiscovery, MetricRegistry.Type.VENDOR.name(), MetricRegistry.class, new RegistryTypeImpl(MetricRegistry.Type.VENDOR), vendorRegistry, false);
 
         // metrics
-        registrations.forEach((name, registration) -> {
-            switch (registration.getTypeRaw()) {
+        registrations.forEach((id, metadata) -> {
+            final String idSuffix = id.getName() + "#" + id.getTagsAsString();
+            switch (metadata.getTypeRaw()) {
                 case GAUGE:
-                    addBean(afterBeanDiscovery, name.getName(), Gauge.class, new MetricImpl(registration, name), new Gauge<Object>() {
+                    addBean(afterBeanDiscovery, idSuffix, Gauge.class, new MetricImpl(metadata, id), new Gauge<Object>() {
                         private final AtomicReference<Gauge<?>> ref = new AtomicReference<>();
 
                         @Override
                         public Object getValue() {
                             Gauge<?> gauge = ref.get();
                             if (gauge == null) { // getGauges() is expensive in current form, avoid it
-                                gauge = applicationRegistry.getGauges().get(name);
+                                gauge = applicationRegistry.getGauges().get(id);
                                 ref.compareAndSet(null, gauge);
                             }
                             return gauge.getValue();
                         }
-                    });
+                    }, true);
                     break;
                 case TIMER:
-                    addBean(afterBeanDiscovery, name.getName(), Timer.class, new MetricImpl(registration, name),
-                            applicationRegistry.timer(registration, tags(name.getTags())));
+                    addBean(afterBeanDiscovery, idSuffix, Timer.class, new MetricImpl(metadata, id),
+                            applicationRegistry.timer(metadata, id.getTagsAsList().toArray(NO_TAG)), true);
                     break;
                 case COUNTER:
-                    addBean(afterBeanDiscovery, name.getName(), Counter.class, new MetricImpl(registration, name),
-                            applicationRegistry.counter(registration, tags(name.getTags())));
+                    addBean(afterBeanDiscovery, idSuffix, Counter.class, new MetricImpl(metadata, id),
+                            applicationRegistry.counter(metadata, id.getTagsAsList().toArray(NO_TAG)), true);
                     break;
                 case CONCURRENT_GAUGE:
-                    addBean(afterBeanDiscovery, name.getName(), org.eclipse.microprofile.metrics.ConcurrentGauge.class, new MetricImpl(registration, name),
-                            applicationRegistry.concurrentGauge(registration, tags(name.getTags())));
+                    addBean(afterBeanDiscovery, idSuffix, org.eclipse.microprofile.metrics.ConcurrentGauge.class,
+                            new MetricImpl(metadata, id),
+                            applicationRegistry.concurrentGauge(metadata, id.getTagsAsList().toArray(NO_TAG)), true);
                     break;
                 case METERED:
-                    addBean(afterBeanDiscovery, name.getName(), Meter.class, new MetricImpl(registration, name),
-                            applicationRegistry.meter(registration, tags(name.getTags())));
+                    addBean(afterBeanDiscovery, idSuffix, Meter.class, new MetricImpl(metadata, id),
+                            applicationRegistry.meter(metadata, id.getTagsAsList().toArray(NO_TAG)), true);
                     break;
                 case HISTOGRAM:
-                    addBean(afterBeanDiscovery, name.getName(), Histogram.class, new MetricImpl(registration, name),
-                            applicationRegistry.histogram(registration, tags(name.getTags())));
+                    addBean(afterBeanDiscovery, idSuffix, Histogram.class, new MetricImpl(metadata, id),
+                            applicationRegistry.histogram(metadata, id.getTagsAsList().toArray(NO_TAG)), true);
                     break;
                 default:
             }
@@ -365,10 +378,11 @@
 
     void afterDeploymentValidation(@Observes final AfterDeploymentValidation afterDeploymentValidation,
                                    final BeanManager beanManager) {
-        registrations.values().stream().filter(m -> m.getTypeRaw() == MetricType.GAUGE)
-                .forEach(registration -> {
-                    final Gauge<?> gauge = gaugeFactories.get(registration.getName()).apply(beanManager);
-                    applicationRegistry.register(registration, gauge);
+        registrations.values().stream()
+                .filter(m -> m.getTypeRaw() == MetricType.GAUGE)
+                .forEach(metadata -> {
+                    final Gauge<?> gauge = gaugeFactories.get(metadata.getName()).apply(beanManager);
+                    applicationRegistry.register(metadata, gauge);
                 });
         producersRegistrations.forEach(Runnable::run);
 
@@ -388,11 +402,6 @@
         creationalContexts.forEach(CreationalContext::release);
     }
 
-
-    private Tag[] tags(final Map<String, String> tags) {
-        return tags.entrySet().stream().map(e -> new Tag(e.getKey(), e.getValue())).toArray(Tag[]::new);
-    }
-
     private void registerProducer(final BeanManager beanManager, final org.eclipse.microprofile.metrics.annotation.Metric config,
                                   final Class<?> clazz, final Member javaMember, final Bean<?> bean) {
         Class<?> beanClass = bean.getBeanClass();
@@ -409,15 +418,14 @@
                 of(config.name()).filter(it -> !it.isEmpty()).orElseGet(javaMember::getName), config.absolute(),
                 "");
         final Metadata metadata = Metadata.builder()
-            .withName(name)
-            .withDisplayName(config.displayName())
-            .withDescription(config.description())
-            .withType(findType(clazz))
-            .withUnit(config.unit())
-            .build();
+                .withName(name)
+                .withDisplayName(config.displayName())
+                .withDescription(config.description())
+                .withType(findType(clazz))
+                .withUnit(config.unit())
+                .build();
         final MetricID id = new MetricID(name, createTags(config.tags()));
-        final Metadata existing = registrations.putIfAbsent(id, metadata);
-        // if (existing != null) { // todo: merge tags }
+        addRegistration(metadata, id, true);
         return metadata;
     }
 
@@ -466,27 +474,23 @@
         return reference;
     }
 
-    private void addRegistration(final AnnotatedCallable<?> executable, final MetricID name, final Metadata metadata, final boolean reusable, final String[] tags) {
-        final Metadata existing = registrations.putIfAbsent(name, metadata);
-        if (existing != null) { // todo: merge tags when reusable
-            if (!reusable) {
-                throw new IllegalArgumentException(name + " is not set as reusable on " + executable + " but was used somewhere else");
-            }
-        }
-    }
-
     private void addBean(final AfterBeanDiscovery afterBeanDiscovery,
                          final String idSuffix,
                          final Class<?> type,
                          final Annotation qualifier,
-                         final Object instance) {
-        afterBeanDiscovery.addBean()
+                         final Object instance,
+                         final boolean addDefaultQualifier) {
+        final BeanConfigurator<Object> base = afterBeanDiscovery.addBean()
                 .id(MetricsExtension.class.getName() + ":" + type.getName() + ":" + idSuffix)
                 .beanClass(type)
                 .types(type, Object.class)
-                .qualifiers(qualifier, Any.Literal.INSTANCE)
                 .scope(Dependent.class) // avoid proxies, tck use assertEquals(proxy, registry.get(xxx))
                 .createWith(c -> instance);
+        if (addDefaultQualifier) {
+            base.qualifiers(qualifier, Default.Literal.INSTANCE, Any.Literal.INSTANCE);
+        } else {
+            base.qualifiers(qualifier, Any.Literal.INSTANCE);
+        }
     }
 
     private static final class MetricImpl extends AnnotationLiteral<org.eclipse.microprofile.metrics.annotation.Metric> implements org.eclipse.microprofile.metrics.annotation.Metric {
@@ -495,7 +499,9 @@
 
         private MetricImpl(final Metadata metadata, final MetricID metricID) {
             this.metadata = metadata;
-            this.tags = metricID.getTagsAsString().split(",");
+            this.tags = metricID.getTags().entrySet().stream()
+                    .map(e -> e.getKey() + "=" + e.getValue())
+                    .toArray(String[]::new);
         }
 
         @Override
@@ -530,7 +536,7 @@
 
         @Override
         public String unit() {
-            return metadata.getUnit().orElse("null");
+            return metadata.getUnit().orElse("");
         }
     }
 
@@ -552,4 +558,14 @@
             return RegistryType.class;
         }
     }
+
+    private static class Registration {
+        private final MetricID id;
+        private final Metadata metadata;
+
+        private Registration(final MetricID id, final Metadata metadata) {
+            this.id = id;
+            this.metadata = metadata;
+        }
+    }
 }
diff --git a/geronimo-metrics/src/test/java/org/apache/geronimo/microprofile/metrics/test/ArquillianSetup.java b/geronimo-metrics/src/test/java/org/apache/geronimo/microprofile/metrics/test/ArquillianSetup.java
index 83b9771..7b8ab56 100644
--- a/geronimo-metrics/src/test/java/org/apache/geronimo/microprofile/metrics/test/ArquillianSetup.java
+++ b/geronimo-metrics/src/test/java/org/apache/geronimo/microprofile/metrics/test/ArquillianSetup.java
@@ -134,6 +134,7 @@
                             final Annotation[] qualifiers = Stream.of(p.getAnnotations()).filter(it -> cdi.getBeanManager().isQualifier(it.annotationType())).toArray(Annotation[]::new);
                             return cdi.select(p.getType(), qualifiers).get();
                         } catch (final RuntimeException re) {
+                            re.printStackTrace();
                             return null;
                         } finally {
                             thread.setContextClassLoader(classLoader);