You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by jo...@apache.org on 2018/12/29 03:26:43 UTC

[zeppelin] branch master updated: [ZEPPELIN-3422] Add JMX Support (#3272)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new ee2b527  [ZEPPELIN-3422] Add JMX Support (#3272)
ee2b527 is described below

commit ee2b52768a6c2defb31d44783c347f0e2de65ddb
Author: Jongyoul Lee <jo...@gmail.com>
AuthorDate: Sat Dec 29 12:26:35 2018 +0900

    [ZEPPELIN-3422] Add JMX Support (#3272)
    
    * Revise jmx features with Jetty's way
---
 bin/common.cmd                                     |  8 ---
 bin/common.sh                                      | 12 -----
 conf/zeppelin-env.cmd.template                     |  2 +-
 conf/zeppelin-env.sh.template                      |  2 +-
 zeppelin-server/pom.xml                            |  7 +++
 .../org/apache/zeppelin/server/ZeppelinServer.java | 58 ++++++++++++++++++++--
 .../org/apache/zeppelin/socket/NotebookServer.java | 11 ++--
 .../zeppelin/socket/NotebookServerMBean.java       | 26 ----------
 .../interpreter/InterpreterSettingManager.java     |  9 ++--
 .../InterpreterSettingManagerMBean.java            | 24 ---------
 10 files changed, 74 insertions(+), 85 deletions(-)

diff --git a/bin/common.cmd b/bin/common.cmd
index 21657c1..13f33e5 100644
--- a/bin/common.cmd
+++ b/bin/common.cmd
@@ -71,14 +71,6 @@ if not defined ZEPPELIN_JAVA_OPTS (
     set ZEPPELIN_JAVA_OPTS=%ZEPPELIN_JAVA_OPTS% -Dfile.encoding=%ZEPPELIN_ENCODING% %ZEPPELIN_MEM%
 )
 
-if defined ZEPPELIN_JMX_ENABLE (
-  if not defined ZEPPELIN_JMX_PORT (
-    set ZEPPELIN_JMX_PORT="9996"
-  }
-  set JMX_JAVA_OPTS=" -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=${ZEPPELIN_JMX_PORT} -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
-  set ZEPPELIN_JAVA_OPTS=%JMX_JAVA_OPTS% %ZEPPELIN_JAVA_OPTS
-)
-
 if not defined JAVA_OPTS (
     set JAVA_OPTS=%ZEPPELIN_JAVA_OPTS%
 ) else (
diff --git a/bin/common.sh b/bin/common.sh
index c56fbd4..6447ec8 100644
--- a/bin/common.sh
+++ b/bin/common.sh
@@ -121,18 +121,6 @@ JAVA_OPTS+=" ${ZEPPELIN_JAVA_OPTS} -Dfile.encoding=${ZEPPELIN_ENCODING} ${ZEPPEL
 JAVA_OPTS+=" -Dlog4j.configuration=file://${ZEPPELIN_CONF_DIR}/log4j.properties"
 export JAVA_OPTS
 
-if [[ x"${ZEPPELIN_JMX_ENABLE}" == x"true" ]]; then
-  if [[ -z "${ZEPPELIN_JMX_PORT}" ]]; then
-    ZEPPELIN_JMX_PORT="9996"
-  fi
-  JMX_JAVA_OPTS+=" -Dcom.sun.management.jmxremote"
-  JMX_JAVA_OPTS+=" -Dcom.sun.management.jmxremote.port=${ZEPPELIN_JMX_PORT}"
-  JMX_JAVA_OPTS+=" -Dcom.sun.management.jmxremote.authenticate=false"
-  JMX_JAVA_OPTS+=" -Dcom.sun.management.jmxremote.ssl=false"
-  JAVA_OPTS="${JMX_JAVA_OPTS} ${JAVA_OPTS}"
-fi
-export JAVA_OPTS
-
 JAVA_INTP_OPTS="${ZEPPELIN_INTP_JAVA_OPTS} -Dfile.encoding=${ZEPPELIN_ENCODING}"
 if [[ -z "${ZEPPELIN_SPARK_YARN_CLUSTER}" ]]; then
     JAVA_INTP_OPTS+=" -Dlog4j.configuration=file://${ZEPPELIN_CONF_DIR}/log4j.properties"
diff --git a/conf/zeppelin-env.cmd.template b/conf/zeppelin-env.cmd.template
index e69f23b..83b5ee7 100644
--- a/conf/zeppelin-env.cmd.template
+++ b/conf/zeppelin-env.cmd.template
@@ -23,7 +23,7 @@ REM set ZEPPELIN_MEM            		REM Zeppelin jvm mem options Default -Xms1024m
 REM set ZEPPELIN_INTP_MEM       		REM zeppelin interpreter process jvm mem options. Default -Xmx1024m -Xms1024m -XX:MaxPermSize=512m
 REM set ZEPPELIN_INTP_JAVA_OPTS 		REM zeppelin interpreter process jvm options.
 REM set ZEPPELIN_JMX_ENABLE     		REM Enable JMX feature by defining it like "true"
-REM set ZEPPELIN_JMX_PORT       		REM Port number which JMX uses. Default: "9996"
+REM set ZEPPELIN_JMX_PORT       		REM Port number which JMX uses. If not set, JMX won't be enabled
 
 REM set ZEPPELIN_LOG_DIR        		REM Where log files are stored.  PWD by default.
 REM set ZEPPELIN_PID_DIR        		REM The pid files are stored. /tmp by default.
diff --git a/conf/zeppelin-env.sh.template b/conf/zeppelin-env.sh.template
index 5aab0e0..74941b9 100644
--- a/conf/zeppelin-env.sh.template
+++ b/conf/zeppelin-env.sh.template
@@ -24,7 +24,7 @@
 # export ZEPPELIN_INTP_JAVA_OPTS 		# zeppelin interpreter process jvm options.
 # export ZEPPELIN_SSL_PORT       		# ssl port (used when ssl environment variable is set to true)
 # export ZEPPELIN_JMX_ENABLE    		# Enable JMX feature by defining "true"
-# export ZEPPELIN_JMX_PORT      		# Port number which JMX uses. Default: "9996"
+# export ZEPPELIN_JMX_PORT      		# Port number which JMX uses. If not set, JMX won't be enabled
 
 # export ZEPPELIN_LOG_DIR        		# Where log files are stored.  PWD by default.
 # export ZEPPELIN_PID_DIR        		# The pid files are stored. ${ZEPPELIN_HOME}/run by default.
diff --git a/zeppelin-server/pom.xml b/zeppelin-server/pom.xml
index b8da356..75f0af6 100644
--- a/zeppelin-server/pom.xml
+++ b/zeppelin-server/pom.xml
@@ -227,6 +227,13 @@
       <artifactId>jetty-webapp</artifactId>
       <version>${jetty.version}</version>
     </dependency>
+
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-jmx</artifactId>
+      <version>${jetty.version}</version>
+    </dependency>
+
     <dependency>
       <groupId>org.eclipse.jetty.websocket</groupId>
       <artifactId>websocket-server</artifactId>
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java
index c7f13a6..f924fbd 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java
@@ -18,9 +18,13 @@ package org.apache.zeppelin.server;
 
 import java.io.File;
 import java.io.IOException;
+import java.lang.management.ManagementFactory;
 import java.util.EnumSet;
+import java.util.Objects;
+import java.util.stream.Stream;
 import javax.inject.Inject;
 import javax.inject.Singleton;
+import javax.management.remote.JMXServiceURL;
 import javax.servlet.DispatcherType;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
@@ -57,6 +61,8 @@ import org.apache.zeppelin.service.ShiroSecurityService;
 import org.apache.zeppelin.socket.NotebookServer;
 import org.apache.zeppelin.user.Credentials;
 import org.eclipse.jetty.http.HttpVersion;
+import org.eclipse.jetty.jmx.ConnectorServer;
+import org.eclipse.jetty.jmx.MBeanContainer;
 import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.SecureRequestCustomizer;
@@ -177,6 +183,51 @@ public class ZeppelinServer extends ResourceConfig {
     // Notebook server
     setupNotebookServer(webApp, conf, sharedServiceLocator);
 
+    // JMX Enable
+    Stream.of("ZEPPELIN_JMX_ENABLE")
+        .map(System::getenv)
+        .map(Boolean::parseBoolean)
+        .filter(Boolean::booleanValue)
+        .map(jmxEnabled -> "ZEPPELIN_JMX_PORT")
+        .map(System::getenv)
+        .map(
+            portString -> {
+              try {
+                return Integer.parseInt(portString);
+              } catch (Exception e) {
+                return null;
+              }
+            })
+        .filter(Objects::nonNull)
+        .forEach(
+            port -> {
+              try {
+                MBeanContainer mbeanContainer =
+                    new MBeanContainer(ManagementFactory.getPlatformMBeanServer());
+                jettyWebServer.addEventListener(mbeanContainer);
+                jettyWebServer.addBean(mbeanContainer);
+
+                JMXServiceURL jmxURL =
+                    new JMXServiceURL(
+                        String.format(
+                            "service:jmx:rmi://0.0.0.0:%d/jndi/rmi://0.0.0.0:%d/jmxrmi",
+                            port, port));
+                ConnectorServer jmxServer =
+                    new ConnectorServer(jmxURL, "org.eclipse.jetty.jmx:name=rmiconnectorserver");
+                jettyWebServer.addBean(jmxServer);
+
+                // Add JMX Beans
+                // TODO(jl): Need to investigate more about injection and jmx
+                jettyWebServer.addBean(
+                    sharedServiceLocator.getService(InterpreterSettingManager.class));
+                jettyWebServer.addBean(sharedServiceLocator.getService(NotebookServer.class));
+
+                LOG.info("JMX Enabled with port: {}", port);
+              } catch (Exception e) {
+                LOG.warn("Error while setting JMX", e);
+              }
+            });
+
     LOG.info("Starting zeppelin server");
     try {
       jettyWebServer.start(); // Instantiates ZeppelinServer
@@ -197,10 +248,7 @@ public class ZeppelinServer extends ResourceConfig {
                   try {
                     jettyWebServer.stop();
                     if (!conf.isRecoveryEnabled()) {
-                      sharedServiceLocator
-                          .getService(Notebook.class)
-                          .getInterpreterSettingManager()
-                          .close();
+                      sharedServiceLocator.getService(InterpreterSettingManager.class).close();
                     }
                     sharedServiceLocator.getService(Notebook.class).close();
                     Thread.sleep(3000);
@@ -223,7 +271,7 @@ public class ZeppelinServer extends ResourceConfig {
 
     jettyWebServer.join();
     if (!conf.isRecoveryEnabled()) {
-      sharedServiceLocator.getService(Notebook.class).getInterpreterSettingManager().close();
+      sharedServiceLocator.getService(InterpreterSettingManager.class).close();
     }
   }
 
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
index 40c7461..e83f26f 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
@@ -80,6 +80,9 @@ import org.apache.zeppelin.user.AuthenticationInfo;
 import org.apache.zeppelin.utils.CorsUtils;
 import org.apache.zeppelin.utils.InterpreterBindingUtils;
 import org.apache.zeppelin.utils.TestUtils;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
+import org.eclipse.jetty.util.annotation.ManagedOperation;
 import org.eclipse.jetty.websocket.servlet.WebSocketServlet;
 import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory;
 import org.glassfish.hk2.api.ServiceLocator;
@@ -90,14 +93,14 @@ import org.slf4j.LoggerFactory;
  * Zeppelin websocket service. This class used setter injection because all servlet should have
  * no-parameter constructor
  */
+@ManagedObject
 public class NotebookServer extends WebSocketServlet
     implements NotebookSocketListener,
         AngularObjectRegistryListener,
         RemoteInterpreterProcessListener,
         ApplicationEventListener,
         ParagraphJobListener,
-        NoteEventListener,
-        NotebookServerMBean {
+        NoteEventListener {
 
   /**
    * Job manager service type.
@@ -1843,12 +1846,12 @@ public class NotebookServer extends WebSocketServlet
         });
   }
 
-  @Override
+  @ManagedAttribute
   public Set<String> getConnectedUsers() {
     return connectionManager.getConnectedUsers();
   }
 
-  @Override
+  @ManagedOperation
   public void sendMessage(String message) {
     Message m = new Message(OP.NOTICE);
     m.data.put("notice", message);
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServerMBean.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServerMBean.java
deleted file mode 100644
index f94af89..0000000
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServerMBean.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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.zeppelin.socket;
-
-import java.util.Set;
-
-public interface NotebookServerMBean {
-  Set<String> getConnectedUsers();
-
-  void sendMessage(String message);
-}
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java
index d4468ff..708fcb7 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java
@@ -54,6 +54,8 @@ import org.apache.zeppelin.scheduler.Job;
 import org.apache.zeppelin.user.AuthenticationInfo;
 import org.apache.zeppelin.util.ReflectionUtils;
 import org.apache.zeppelin.storage.ConfigStorage;
+import org.eclipse.jetty.util.annotation.ManagedAttribute;
+import org.eclipse.jetty.util.annotation.ManagedObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.sonatype.aether.repository.Proxy;
@@ -77,7 +79,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -88,8 +89,8 @@ import java.util.stream.Collectors;
  * (load/create/update/remove/get)
  * TODO(zjffdu) We could move it into another separated component.
  */
-public class InterpreterSettingManager implements InterpreterSettingManagerMBean,
-    NoteEventListener {
+@ManagedObject("interpreterSettingManager")
+public class InterpreterSettingManager implements NoteEventListener {
 
   private static final Logger LOGGER = LoggerFactory.getLogger(InterpreterSettingManager.class);
   private static final Map<String, Object> DEFAULT_EDITOR = ImmutableMap.of(
@@ -870,7 +871,7 @@ public class InterpreterSettingManager implements InterpreterSettingManagerMBean
     }
   }
 
-  @Override
+  @ManagedAttribute
   public Set<String> getRunningInterpreters() {
     Set<String> runningInterpreters = Sets.newHashSet();
     for (Map.Entry<String, InterpreterSetting> entry : interpreterSettings.entrySet()) {
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManagerMBean.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManagerMBean.java
deleted file mode 100644
index 3cc3b08..0000000
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManagerMBean.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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.zeppelin.interpreter;
-
-import java.util.Set;
-
-public interface InterpreterSettingManagerMBean {
-  Set<String> getRunningInterpreters();
-}