Index: oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/NodeStoreFixtureProvider.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/NodeStoreFixtureProvider.java (date 1551868593000) +++ oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/NodeStoreFixtureProvider.java (date 1551695913000) @@ -21,6 +21,7 @@ import java.io.File; import java.io.IOException; +import java.util.List; import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledThreadPoolExecutor; @@ -28,8 +29,12 @@ import com.codahale.metrics.ConsoleReporter; import com.codahale.metrics.Counting; import com.codahale.metrics.MetricRegistry; +import com.google.common.base.Splitter; import com.google.common.io.Closer; import com.google.common.util.concurrent.MoreExecutors; +import io.prometheus.client.CollectorRegistry; +import io.prometheus.client.dropwizard.DropwizardExports; +import io.prometheus.client.exporter.PushGateway; import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore; import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore; import org.apache.jackrabbit.oak.plugins.metric.MetricStatisticsProvider; @@ -40,11 +45,15 @@ import org.apache.jackrabbit.oak.spi.whiteboard.Tracker; import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard; import org.apache.jackrabbit.oak.stats.StatisticsProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import static java.lang.management.ManagementFactory.getPlatformMBeanServer; import static java.util.Collections.emptyMap; public class NodeStoreFixtureProvider { + private static final Logger log = LoggerFactory.getLogger(NodeStoreFixtureProvider.class); + public static NodeStoreFixture create(Options options) throws Exception { return create(options, !options.getOptionBean(CommonOptions.class).isReadWrite()); } @@ -104,12 +113,53 @@ MetricStatisticsProvider statsProvider = new MetricStatisticsProvider(getPlatformMBeanServer(), executorService); closer.register(statsProvider); closer.register(() -> reportMetrics(statsProvider)); - wb.register(MetricRegistry.class, statsProvider.getRegistry(), emptyMap()); + + if (options.getCommonOpts().pushMetrics()) { + CollectorRegistry collectorRegistry = new CollectorRegistry(); + wb.register(CollectorRegistry.class, collectorRegistry, emptyMap()); + + PushMetricsArgs metricsArgs = new PushMetricsArgs(options.getCommonOpts().metricsPushArgs()); + PushGateway pg = new PushGateway(metricsArgs.getPushUri()); + new DropwizardExports(statsProvider.getRegistry()).register(collectorRegistry); + wb.register(PushGateway.class, pg, emptyMap()); + closer.register(() -> pg.pushAdd(collectorRegistry, PushGateway.class.getName(), metricsArgs.getPushMap())); + } + return statsProvider; } return StatisticsProvider.NOOP; } + /** + * Push metrics arguments + * 1. Push URI + * 2. Metadata map + * e.g. uri;key1=value1;key2=value2 + */ + private static class PushMetricsArgs { + private final String pushUri; + private final Map pushMap; + + private PushMetricsArgs(String args) { + List split = Splitter.on(";").limit(2).omitEmptyStrings().trimResults().splitToList(args); + this.pushUri = split.get(0); + if (split.size() > 1) { + this.pushMap = Splitter.on(";").omitEmptyStrings().trimResults().withKeyValueSeparator("=").split(split.get(1)); + } else { + this.pushMap = emptyMap(); + } + log.info("Map of properties pushed [{}]", pushMap); + } + + public String getPushUri() { + return pushUri; + } + + public Map getPushMap() { + return pushMap; + } + } + private static void reportMetrics(MetricStatisticsProvider statsProvider) { MetricRegistry metricRegistry = statsProvider.getRegistry(); ConsoleReporter.forRegistry(metricRegistry) Index: oak-run-commons/pom.xml IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-run-commons/pom.xml (date 1551868593000) +++ oak-run-commons/pom.xml (date 1551868935000) @@ -122,6 +122,22 @@ io.dropwizard.metrics metrics-core + + io.prometheus + simpleclient + 0.6.0 + + + io.prometheus + simpleclient_dropwizard + 0.6.0 + + + + io.prometheus + simpleclient_pushgateway + 0.6.0 + Index: oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/CommonOptions.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/CommonOptions.java (date 1551868593000) +++ oak-run-commons/src/main/java/org/apache/jackrabbit/oak/run/cli/CommonOptions.java (date 1551868620000) @@ -36,12 +36,16 @@ private final OptionSpec nonOption; private final OptionSpec metrics; private final OptionSpec segment; + private OptionSpec pushMetrics; + private OptionSet options; public CommonOptions(OptionParser parser){ help = parser.acceptsAll(asList("h", "?", "help"), "Show help").forHelp(); readWriteOption = parser.accepts("read-write", "Connect to repository in read-write mode"); metrics = parser.accepts("metrics", "Enables metrics based statistics collection"); + pushMetrics = parser.accepts("metrics-push", + "URI to push the metrics followed by optional metadata delimeted by;").withRequiredArg(); segment = parser.accepts("segment", "Use older oak-segment support"); nonOption = parser.nonOptions(DEFAULT_CONNECTION_STRING); } @@ -111,4 +115,12 @@ public Set operationNames() { return Collections.emptySet(); } + + public boolean pushMetrics() { + return options.has(pushMetrics); + } + + public String metricsPushArgs() { + return pushMetrics.value(options); + } }