diff --git a/common/src/main/java/com/zegelin/cassandra/exporter/FactoriesProvider.java b/common/src/main/java/com/zegelin/cassandra/exporter/FactoriesProvider.java
new file mode 100644
index 0000000..0bea14d
--- /dev/null
+++ b/common/src/main/java/com/zegelin/cassandra/exporter/FactoriesProvider.java
@@ -0,0 +1,25 @@
+package com.zegelin.cassandra.exporter;
+
+import com.zegelin.cassandra.exporter.MBeanGroupMetricFamilyCollector.Factory;
+import com.zegelin.cassandra.exporter.cli.HarvesterOptions;
+
+import java.util.List;
+import java.util.ServiceLoader;
+
+/**
+ * Service Provider interface whose implementations will be loaded via {@link ServiceLoader}.
+ *
+ *
Allows runtime modules to provide pluggable metrics via classpath registration.
+ *
+ */
+public interface FactoriesProvider
+{
+ /**
+ * Provides a list of {@link Factory} to be registered on the exporter.
+ *
+ * @param metadataFactory
+ * @param options
+ * @return factories
+ */
+ List getFactories(final MetadataFactory metadataFactory, final HarvesterOptions options);
+}
diff --git a/common/src/main/java/com/zegelin/cassandra/exporter/Harvester.java b/common/src/main/java/com/zegelin/cassandra/exporter/Harvester.java
index ae433c9..2765157 100644
--- a/common/src/main/java/com/zegelin/cassandra/exporter/Harvester.java
+++ b/common/src/main/java/com/zegelin/cassandra/exporter/Harvester.java
@@ -141,6 +141,10 @@ public boolean equals(final Object o) {
protected Harvester(final MetadataFactory metadataFactory, final HarvesterOptions options) {
this.collectorFactories = new ArrayList<>(new FactoriesSupplier(metadataFactory, options).get());
+
+ ServiceLoader providers = ServiceLoader.load(FactoriesProvider.class);
+ providers.forEach(p -> collectorFactories.addAll(p.getFactories(metadataFactory, options)));
+
this.metadataFactory = metadataFactory;
this.exclusions = options.exclusions;
this.enabledGlobalLabels = options.globalLabels;
diff --git a/common/src/main/java/com/zegelin/cassandra/exporter/MBeanGroupMetricFamilyCollector.java b/common/src/main/java/com/zegelin/cassandra/exporter/MBeanGroupMetricFamilyCollector.java
index 2d2f803..70e1533 100644
--- a/common/src/main/java/com/zegelin/cassandra/exporter/MBeanGroupMetricFamilyCollector.java
+++ b/common/src/main/java/com/zegelin/cassandra/exporter/MBeanGroupMetricFamilyCollector.java
@@ -37,7 +37,8 @@ public MBeanGroupMetricFamilyCollector removeMBean(final ObjectName mBeanName) {
public abstract Stream collect();
- protected interface Factory {
+ public interface Factory
+ {
/**
* Create a {@link MBeanGroupMetricFamilyCollector} for the given MBean, or null if this collector
* doesn't support the given MBean.