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

sijie pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/bookkeeper.git


The following commit(s) were added to refs/heads/master by this push:
     new 0ccde17  Enable Prometheus stats provider to use custom http container
0ccde17 is described below

commit 0ccde17214168ec1f87741d1053ef66ce2344fff
Author: Enrico Olivelli <[email protected]>
AuthorDate: Mon May 7 16:46:30 2018 +0800

    Enable Prometheus stats provider to use custom http container
    
    This change enable Prometheus stats provider to:
    - use an user supplied registry
    - do not start internal Jetty server
    
    The context is to run the Bookie inside a process together with a servlet 
container (like Apache Tomcat) and use the existing web endpoint instead of 
opening another http (plain) port
    
    Author: Enrico Olivelli <[email protected]>
    
    Reviewers: Sijie Guo <[email protected]>
    
    This closes #1394 from eolivelli/prom-use-servlet
---
 .../prometheus/PrometheusMetricsProvider.java      | 47 +++++++++++++---------
 .../prometheus/TestPrometheusMetricsProvider.java  | 30 ++++++++++++++
 2 files changed, 59 insertions(+), 18 deletions(-)

diff --git 
a/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/PrometheusMetricsProvider.java
 
b/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/PrometheusMetricsProvider.java
index c3dbe2d..ee9b541 100644
--- 
a/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/PrometheusMetricsProvider.java
+++ 
b/bookkeeper-stats-providers/prometheus-metrics-provider/src/main/java/org/apache/bookkeeper/stats/prometheus/PrometheusMetricsProvider.java
@@ -59,15 +59,18 @@ public class PrometheusMetricsProvider implements 
StatsProvider {
 
     private ScheduledExecutorService executor;
 
-    private static final String PROMETHEUS_STATS_HTTP_PORT = 
"prometheusStatsHttpPort";
-    private static final int DEFAULT_PROMETHEUS_STATS_HTTP_PORT = 8000;
+    public static final String PROMETHEUS_STATS_HTTP_ENABLE = 
"prometheusStatsHttpEnable";
+    public static final boolean DEFAULT_PROMETHEUS_STATS_HTTP_ENABLE = true;
 
-    private static final String PROMETHEUS_STATS_LATENCY_ROLLOVER_SECONDS = 
"prometheusStatsLatencyRolloverSeconds";
-    private static final int DEFAULT_PROMETHEUS_STATS_LATENCY_ROLLOVER_SECONDS 
= 60;
+    public static final String PROMETHEUS_STATS_HTTP_PORT = 
"prometheusStatsHttpPort";
+    public static final int DEFAULT_PROMETHEUS_STATS_HTTP_PORT = 8000;
 
-    final CollectorRegistry registry = new CollectorRegistry();
+    public static final String PROMETHEUS_STATS_LATENCY_ROLLOVER_SECONDS = 
"prometheusStatsLatencyRolloverSeconds";
+    public static final int DEFAULT_PROMETHEUS_STATS_LATENCY_ROLLOVER_SECONDS 
= 60;
 
-    private Server server;
+    final CollectorRegistry registry;
+
+    Server server;
     private final CachingStatsProvider cachingStatsProvider;
 
     /*
@@ -78,6 +81,11 @@ public class PrometheusMetricsProvider implements 
StatsProvider {
     final ConcurrentMap<String, DataSketchesOpStatsLogger> opStats = new 
ConcurrentSkipListMap<>();
 
     public PrometheusMetricsProvider() {
+        this(new CollectorRegistry());
+    }
+
+    public PrometheusMetricsProvider(CollectorRegistry registry) {
+        this.registry = registry;
         this.cachingStatsProvider = new CachingStatsProvider(new 
StatsProvider() {
             @Override
             public void start(Configuration conf) {
@@ -98,19 +106,23 @@ public class PrometheusMetricsProvider implements 
StatsProvider {
 
     @Override
     public void start(Configuration conf) {
-        int httpPort = conf.getInt(PROMETHEUS_STATS_HTTP_PORT, 
DEFAULT_PROMETHEUS_STATS_HTTP_PORT);
-        InetSocketAddress httpEndpoint = 
InetSocketAddress.createUnresolved("0.0.0.0", httpPort);
-        this.server = new Server(httpEndpoint);
-        ServletContextHandler context = new ServletContextHandler();
-        context.setContextPath("/");
-        server.setHandler(context);
+        boolean httpEnabled = conf.getBoolean(PROMETHEUS_STATS_HTTP_ENABLE, 
DEFAULT_PROMETHEUS_STATS_HTTP_ENABLE);
+        if (httpEnabled) {
+            int httpPort = conf.getInt(PROMETHEUS_STATS_HTTP_PORT, 
DEFAULT_PROMETHEUS_STATS_HTTP_PORT);
+            InetSocketAddress httpEndpoint = 
InetSocketAddress.createUnresolved("0.0.0.0", httpPort);
+            this.server = new Server(httpEndpoint);
+            ServletContextHandler context = new ServletContextHandler();
+            context.setContextPath("/");
+            server.setHandler(context);
 
-        context.addServlet(new ServletHolder(new PrometheusServlet(this)), 
"/metrics");
+            context.addServlet(new ServletHolder(new PrometheusServlet(this)), 
"/metrics");
 
-        try {
-            server.start();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
+            try {
+                server.start();
+                log.info("Started Prometheus stats endpoint at {}", 
httpEndpoint);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
         }
 
         // Include standard JVM stats
@@ -143,7 +155,6 @@ public class PrometheusMetricsProvider implements 
StatsProvider {
             rotateLatencyCollection();
         }, 1, latencyRolloverSeconds, TimeUnit.SECONDS);
 
-        log.info("Started Prometheus stats endpoint at {}", httpEndpoint);
     }
 
     @Override
diff --git 
a/bookkeeper-stats-providers/prometheus-metrics-provider/src/test/java/org/apache/bookkeeper/stats/prometheus/TestPrometheusMetricsProvider.java
 
b/bookkeeper-stats-providers/prometheus-metrics-provider/src/test/java/org/apache/bookkeeper/stats/prometheus/TestPrometheusMetricsProvider.java
index b969970..a69ac42 100644
--- 
a/bookkeeper-stats-providers/prometheus-metrics-provider/src/test/java/org/apache/bookkeeper/stats/prometheus/TestPrometheusMetricsProvider.java
+++ 
b/bookkeeper-stats-providers/prometheus-metrics-provider/src/test/java/org/apache/bookkeeper/stats/prometheus/TestPrometheusMetricsProvider.java
@@ -17,11 +17,14 @@
 package org.apache.bookkeeper.stats.prometheus;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 
 import org.apache.bookkeeper.stats.Counter;
 import org.apache.bookkeeper.stats.OpStatsLogger;
 import org.apache.bookkeeper.stats.StatsLogger;
+import org.apache.commons.configuration.PropertiesConfiguration;
 import org.junit.Test;
 
 /**
@@ -49,6 +52,33 @@ public class TestPrometheusMetricsProvider {
     }
 
     @Test
+    public void testStartNoHttp() {
+        PropertiesConfiguration config = new PropertiesConfiguration();
+        
config.setProperty(PrometheusMetricsProvider.PROMETHEUS_STATS_HTTP_ENABLE, 
false);
+        PrometheusMetricsProvider provider = new PrometheusMetricsProvider();
+        try {
+            provider.start(config);
+            assertNull(provider.server);
+        } finally {
+            provider.stop();
+        }
+    }
+
+    @Test
+    public void testStartWithHttp() {
+        PropertiesConfiguration config = new PropertiesConfiguration();
+        
config.setProperty(PrometheusMetricsProvider.PROMETHEUS_STATS_HTTP_ENABLE, 
true);
+        
config.setProperty(PrometheusMetricsProvider.PROMETHEUS_STATS_HTTP_PORT, 0); // 
ephemeral
+        PrometheusMetricsProvider provider = new PrometheusMetricsProvider();
+        try {
+            provider.start(config);
+            assertNotNull(provider.server);
+        } finally {
+            provider.stop();
+        }
+    }
+
+    @Test
     public void testCounter() {
         LongAdderCounter counter = new LongAdderCounter();
         long value = counter.get();

-- 
To stop receiving notification emails like this one, please contact
[email protected].

Reply via email to