This is an automated email from the ASF dual-hosted git repository.
maoling pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/zookeeper.git
The following commit(s) were added to refs/heads/master by this push:
new b79abb2 ZOOKEEPER-4054: Make prometheus listen host can configure
b79abb2 is described below
commit b79abb2014db9684c00afd7d98c0a7cb69ce6c8b
Author: shoothzj <[email protected]>
AuthorDate: Mon May 17 23:10:41 2021 +0800
ZOOKEEPER-4054: Make prometheus listen host can configure
Make prometheus listen host can configure listen IP, helpful to security.
default is 0.0.0.0
Author: shoothzj <[email protected]>
Reviewers: Enrico Olivelli <[email protected]>, maoling
<[email protected]>
Closes #1574 from Shoothzj/ZOOKEEPER-4054
---
conf/zoo_sample.cfg | 1 +
.../src/main/resources/markdown/zookeeperAdmin.md | 3 +
.../prometheus/PrometheusMetricsProvider.java | 8 ++-
.../PrometheusMetricsProviderConfigTest.java | 66 ++++++++++++++++++++++
.../prometheus/PrometheusMetricsProviderTest.java | 1 +
5 files changed, 77 insertions(+), 2 deletions(-)
diff --git a/conf/zoo_sample.cfg b/conf/zoo_sample.cfg
index 24a97d7..f221675 100644
--- a/conf/zoo_sample.cfg
+++ b/conf/zoo_sample.cfg
@@ -31,6 +31,7 @@ clientPort=2181
#
# https://prometheus.io Metrics Exporter
#metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
+#metricsProvider.httpHost=0.0.0.0
#metricsProvider.httpPort=7000
#metricsProvider.exportJvmInfo=true
diff --git a/zookeeper-docs/src/main/resources/markdown/zookeeperAdmin.md
b/zookeeper-docs/src/main/resources/markdown/zookeeperAdmin.md
index e6383fd..3ec44a2 100644
--- a/zookeeper-docs/src/main/resources/markdown/zookeeperAdmin.md
+++ b/zookeeper-docs/src/main/resources/markdown/zookeeperAdmin.md
@@ -2119,6 +2119,9 @@ options are used to configure the
[AdminServer](#sc_adminserver).
Set to "org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider"
to
enable Prometheus.io exporter.
+* *metricsProvider.httpHost* :
+ **New in 3.8.0:** Prometheus.io exporter will start a Jetty server and
listen this address, default is "0.0.0.0"
+
* *metricsProvider.httpPort* :
Prometheus.io exporter will start a Jetty server and bind to this port, it
default to 7000.
Prometheus end point will be http://hostname:httPort/metrics.
diff --git
a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java
b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java
index d3628a7..a3d5d7a 100644
---
a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java
+++
b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/main/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProvider.java
@@ -23,6 +23,7 @@ import io.prometheus.client.CollectorRegistry;
import io.prometheus.client.exporter.MetricsServlet;
import io.prometheus.client.hotspot.DefaultExports;
import java.io.IOException;
+import java.net.InetSocketAddress;
import java.util.Enumeration;
import java.util.Objects;
import java.util.Properties;
@@ -63,6 +64,7 @@ public class PrometheusMetricsProvider implements
MetricsProvider {
* </p>
*/
private final CollectorRegistry collectorRegistry =
CollectorRegistry.defaultRegistry;
+ private String host = "0.0.0.0";
private int port = 7000;
private boolean exportJvmInfo = true;
private Server server;
@@ -72,6 +74,7 @@ public class PrometheusMetricsProvider implements
MetricsProvider {
@Override
public void configure(Properties configuration) throws
MetricsProviderLifeCycleException {
LOG.info("Initializing metrics, configuration: {}", configuration);
+ this.host = configuration.getProperty("httpHost", "0.0.0.0");
this.port = Integer.parseInt(configuration.getProperty("httpPort",
"7000"));
this.exportJvmInfo =
Boolean.parseBoolean(configuration.getProperty("exportJvmInfo", "true"));
}
@@ -79,11 +82,12 @@ public class PrometheusMetricsProvider implements
MetricsProvider {
@Override
public void start() throws MetricsProviderLifeCycleException {
try {
- LOG.info("Starting /metrics HTTP endpoint at port {}
exportJvmInfo: {}", port, exportJvmInfo);
+ LOG.info("Starting /metrics HTTP endpoint at host: {}, port: {},
exportJvmInfo: {}",
+ host, port, exportJvmInfo);
if (exportJvmInfo) {
DefaultExports.initialize();
}
- server = new Server(port);
+ server = new Server(new InetSocketAddress(host, port));
ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
server.setHandler(context);
diff --git
a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderConfigTest.java
b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderConfigTest.java
new file mode 100644
index 0000000..54c320d
--- /dev/null
+++
b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderConfigTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.
+ */
+
+package org.apache.zookeeper.metrics.prometheus;
+
+import io.prometheus.client.CollectorRegistry;
+import java.util.Properties;
+import org.apache.zookeeper.metrics.MetricsProviderLifeCycleException;
+import org.junit.Assert;
+import org.junit.Test;
+
+
+public class PrometheusMetricsProviderConfigTest {
+
+ @Test
+ public void testInvalidPort() {
+ Assert.assertThrows(MetricsProviderLifeCycleException.class, () -> {
+ CollectorRegistry.defaultRegistry.clear();
+ PrometheusMetricsProvider provider = new
PrometheusMetricsProvider();
+ Properties configuration = new Properties();
+ configuration.setProperty("httpPort", "65536");
+ configuration.setProperty("exportJvmInfo", "false");
+ provider.configure(configuration);
+ provider.start();
+ });
+ }
+
+ @Test
+ public void testInvalidAddr() {
+ Assert.assertThrows(MetricsProviderLifeCycleException.class, () -> {
+ CollectorRegistry.defaultRegistry.clear();
+ PrometheusMetricsProvider provider = new
PrometheusMetricsProvider();
+ Properties configuration = new Properties();
+ configuration.setProperty("httpHost", "master");
+ provider.configure(configuration);
+ provider.start();
+ });
+ }
+
+ @Test
+ public void testValidConfig() throws MetricsProviderLifeCycleException {
+ CollectorRegistry.defaultRegistry.clear();
+ PrometheusMetricsProvider provider = new PrometheusMetricsProvider();
+ Properties configuration = new Properties();
+ configuration.setProperty("httpHost", "0.0.0.0");
+ configuration.setProperty("httpPort", "0");
+ provider.configure(configuration);
+ provider.start();
+ }
+
+}
diff --git
a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderTest.java
b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderTest.java
index 720cec4..8331b05 100644
---
a/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderTest.java
+++
b/zookeeper-metrics-providers/zookeeper-prometheus-metrics/src/test/java/org/apache/zookeeper/metrics/prometheus/PrometheusMetricsProviderTest.java
@@ -56,6 +56,7 @@ public class PrometheusMetricsProviderTest {
CollectorRegistry.defaultRegistry.clear();
provider = new PrometheusMetricsProvider();
Properties configuration = new Properties();
+ configuration.setProperty("httpHost", "127.0.0.1"); // local host for
test
configuration.setProperty("httpPort", "0"); // ephemeral port
configuration.setProperty("exportJvmInfo", "false");
provider.configure(configuration);