This is an automated email from the ASF dual-hosted git repository. stoty pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/phoenix-queryserver.git
The following commit(s) were added to refs/heads/master by this push: new 8d8ad15 PHOENIX-6473 Add Hadoop JMXServlet as /jmx endpoint 8d8ad15 is described below commit 8d8ad152569f4d8825a23b20069b9052608aa9d6 Author: Andor Molnar <an...@apache.org> AuthorDate: Wed Apr 7 17:54:10 2021 +0200 PHOENIX-6473 Add Hadoop JMXServlet as /jmx endpoint --- phoenix-queryserver/pom.xml | 8 +-- .../phoenix/queryserver/QueryServerOptions.java | 1 + .../phoenix/queryserver/QueryServerProperties.java | 2 + .../server/ServerCustomizersFactory.java | 5 ++ .../JMXJsonEndpointServerCustomizer.java | 62 ++++++++++++++++++++++ .../queryserver/server/ServerCustomizersTest.java | 2 +- pom.xml | 5 ++ 7 files changed, 80 insertions(+), 5 deletions(-) diff --git a/phoenix-queryserver/pom.xml b/phoenix-queryserver/pom.xml index fd81154..d44f5ac 100644 --- a/phoenix-queryserver/pom.xml +++ b/phoenix-queryserver/pom.xml @@ -130,10 +130,6 @@ </filters> <relocations> <relocation> - <pattern>org.eclipse.jetty</pattern> - <shadedPattern>${shaded.package}.org.eclipse.jetty</shadedPattern> - </relocation> - <relocation> <pattern>javax.servlet</pattern> <shadedPattern>${shaded.package}.javax.servlet</shadedPattern> </relocation> @@ -211,6 +207,10 @@ <artifactId>jetty-security</artifactId> </dependency> <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlet</artifactId> + </dependency> + <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> diff --git a/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/QueryServerOptions.java b/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/QueryServerOptions.java index 4c7db87..95f11b3 100644 --- a/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/QueryServerOptions.java +++ b/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/QueryServerOptions.java @@ -37,6 +37,7 @@ public class QueryServerOptions { public static final boolean DEFAULT_QUERY_SERVER_CUSTOM_AUTH_ENABLED = false; public static final String DEFAULT_QUERY_SERVER_REMOTEUSEREXTRACTOR_PARAM = "doAs"; public static final boolean DEFAULT_QUERY_SERVER_DISABLE_KERBEROS_LOGIN = false; + public static final boolean DEFAULT_QUERY_SERVER_JMXJSONENDPOINT_DISABLED = false; public static final boolean DEFAULT_QUERY_SERVER_TLS_ENABLED = false; //We default to empty *store password diff --git a/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/QueryServerProperties.java b/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/QueryServerProperties.java index 35a6dec..9945da4 100644 --- a/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/QueryServerProperties.java +++ b/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/QueryServerProperties.java @@ -68,6 +68,8 @@ public class QueryServerProperties { "phoenix.queryserver.tls.truststore"; public static final String QUERY_SERVER_TLS_TRUSTSTORE_PASSWORD = "phoenix.queryserver.tls.truststore.password"; + public static final String QUERY_SERVER_JMX_JSON_ENDPOINT_DISABLED = + "phoenix.queryserver.jmxjsonendpoint.disabled"; // keys for load balancer public static final String PHOENIX_QUERY_SERVER_LOADBALANCER_ENABLED = diff --git a/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/server/ServerCustomizersFactory.java b/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/server/ServerCustomizersFactory.java index 346d3e4..7f4105d 100644 --- a/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/server/ServerCustomizersFactory.java +++ b/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/server/ServerCustomizersFactory.java @@ -28,6 +28,7 @@ import org.apache.hadoop.conf.Configuration; import org.apache.phoenix.queryserver.QueryServerOptions; import org.apache.phoenix.queryserver.QueryServerProperties; import org.apache.phoenix.queryserver.server.customizers.HostedClientJarsServerCustomizer; +import org.apache.phoenix.queryserver.server.customizers.JMXJsonEndpointServerCustomizer; import org.eclipse.jetty.server.Server; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,6 +72,10 @@ public interface ServerCustomizersFactory { LOG.warn("Empty value provided for {}, ignoring", QueryServerProperties.CLIENT_JARS_REPO_ATTRIB); } } + if (!conf.getBoolean(QueryServerProperties.QUERY_SERVER_JMX_JSON_ENDPOINT_DISABLED, + QueryServerOptions.DEFAULT_QUERY_SERVER_JMXJSONENDPOINT_DISABLED)) { + customizers.add(new JMXJsonEndpointServerCustomizer()); + } return Collections.unmodifiableList(customizers); } } diff --git a/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/server/customizers/JMXJsonEndpointServerCustomizer.java b/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/server/customizers/JMXJsonEndpointServerCustomizer.java new file mode 100644 index 0000000..88e591c --- /dev/null +++ b/phoenix-queryserver/src/main/java/org/apache/phoenix/queryserver/server/customizers/JMXJsonEndpointServerCustomizer.java @@ -0,0 +1,62 @@ +/* + * 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.phoenix.queryserver.server.customizers; + +import static org.apache.hadoop.http.HttpServer2.CONF_CONTEXT_ATTRIBUTE; + +import org.apache.calcite.avatica.server.ServerCustomizer; +import org.apache.hadoop.hbase.HBaseConfiguration; +import org.apache.hadoop.jmx.JMXJsonServlet; +import org.eclipse.jetty.server.Handler; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.handler.HandlerList; +import org.eclipse.jetty.servlet.ServletContextHandler; +import org.eclipse.jetty.servlet.ServletHolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Arrays; + +import javax.servlet.Servlet; + +public class JMXJsonEndpointServerCustomizer implements ServerCustomizer<Server> { + private static final Logger LOG = LoggerFactory.getLogger(JMXJsonEndpointServerCustomizer.class); + + @Override + public void customize(Server server) { + Handler[] handlers = server.getHandlers(); + if (handlers.length != 1) { + LOG.warn("Observed handlers on server {}", Arrays.toString(handlers)); + throw new IllegalStateException("Expected to find one handler"); + } + HandlerList list = (HandlerList) handlers[0]; + + ServletContextHandler ctx = new ServletContextHandler(); + ctx.setContextPath("/jmx"); + ctx.getServletContext().setAttribute(CONF_CONTEXT_ATTRIBUTE, HBaseConfiguration.create()); + + Servlet servlet = new JMXJsonServlet(); + ServletHolder holder = new ServletHolder(servlet); + ctx.addServlet(holder, "/"); + + Handler[] realHandlers = list.getChildHandlers(); + Handler[] newHandlers = new Handler[realHandlers.length + 1]; + newHandlers[0] = ctx; + System.arraycopy(realHandlers, 0, newHandlers, 1, realHandlers.length); + server.setHandler(new HandlerList(newHandlers)); + } +} diff --git a/phoenix-queryserver/src/test/java/org/apache/phoenix/queryserver/server/ServerCustomizersTest.java b/phoenix-queryserver/src/test/java/org/apache/phoenix/queryserver/server/ServerCustomizersTest.java index 2d25cad..e593bd1 100644 --- a/phoenix-queryserver/src/test/java/org/apache/phoenix/queryserver/server/ServerCustomizersTest.java +++ b/phoenix-queryserver/src/test/java/org/apache/phoenix/queryserver/server/ServerCustomizersTest.java @@ -51,7 +51,7 @@ public class ServerCustomizersTest { // the default factory creates an empty list of server customizers List<ServerCustomizer<Server>> customizers = queryServer.createServerCustomizers(new Configuration(), avaticaServerConfiguration); - Assert.assertEquals(0, customizers.size()); + Assert.assertEquals(1, customizers.size()); } @Test diff --git a/pom.xml b/pom.xml index 98727cd..5210728 100644 --- a/pom.xml +++ b/pom.xml @@ -497,6 +497,11 @@ <version>${jetty.version}</version> </dependency> <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-servlet</artifactId> + <version>${jetty.version}</version> + </dependency> + <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-client</artifactId> <version>${curator.version}</version>