azkaban-aplcache

Adding pid to /status API (#1322) Adding Process ID to status

8/15/2017 6:08:19 PM

Details

diff --git a/azkaban-common/src/main/java/azkaban/Constants.java b/azkaban-common/src/main/java/azkaban/Constants.java
index 7aba594..246e65a 100644
--- a/azkaban-common/src/main/java/azkaban/Constants.java
+++ b/azkaban-common/src/main/java/azkaban/Constants.java
@@ -54,6 +54,7 @@ public class Constants {
 
   public static class ConfigurationKeys {
     // These properties are configurable through azkaban.properties
+    public static final String AZKABAN_PID_FILENAME = "azkaban.pid.filename";
 
     // Defines a list of external links, each referred to as a topic
     public static final String AZKABAN_SERVER_EXTERNAL_TOPICS = "azkaban.server.external.topics";
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/Status.java b/azkaban-web-server/src/main/java/azkaban/webapp/Status.java
index c2ffeed..a0e5769 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/Status.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/Status.java
@@ -29,18 +29,21 @@ import java.util.Map;
 public class Status {
 
   private final String version;
+  private final String pid;
   private final String installationPath;
   private final long usedMemory, xmx;
   private final boolean isDatabaseUp;
   private final Map<Integer, Executor> executorStatusMap;
 
   Status(final String version,
+      final String pid,
       final String installationPath,
       final long usedMemory,
       final long xmx,
       final boolean isDatabaseUp,
       final Map<Integer, Executor> executorStatusMap) {
     this.version = version;
+    this.pid = pid;
     this.installationPath = installationPath;
     this.usedMemory = usedMemory;
     this.xmx = xmx;
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/StatusService.java b/azkaban-web-server/src/main/java/azkaban/webapp/StatusService.java
index 8472fb9..b44d029 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/StatusService.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/StatusService.java
@@ -19,14 +19,18 @@ package azkaban.webapp;
 
 import static azkaban.webapp.servlet.AbstractAzkabanServlet.jarVersion;
 
+import azkaban.Constants.ConfigurationKeys;
 import azkaban.db.DatabaseOperator;
 import azkaban.executor.Executor;
 import azkaban.executor.ExecutorLoader;
 import azkaban.executor.ExecutorManagerException;
+import azkaban.utils.Props;
+import com.google.common.io.Files;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import java.io.File;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.sql.SQLException;
 import java.util.HashMap;
 import java.util.List;
@@ -40,14 +44,16 @@ public class StatusService {
   private static final Logger log = LoggerFactory.getLogger(StatusService.class);
   private static final File PACKAGE_JAR = new File(
       StatusService.class.getProtectionDomain().getCodeSource().getLocation().getPath());
-
   private final ExecutorLoader executorLoader;
   private final DatabaseOperator dbOperator;
+  private final String pidFilename;
 
   @Inject
-  public StatusService(final ExecutorLoader executorLoader, final DatabaseOperator dbOperator) {
+  public StatusService(final Props props, final ExecutorLoader executorLoader,
+      final DatabaseOperator dbOperator) {
     this.executorLoader = executorLoader;
     this.dbOperator = dbOperator;
+    this.pidFilename = props.getString(ConfigurationKeys.AZKABAN_PID_FILENAME, "currentpid");
   }
 
   private static String getInstallationPath() {
@@ -66,6 +72,7 @@ public class StatusService {
 
     // Build the status object
     return new Status(version,
+        getPid(),
         getInstallationPath(),
         usedMemory,
         runtime.maxMemory(),
@@ -73,6 +80,18 @@ public class StatusService {
         getActiveExecutors());
   }
 
+  private String getPid() {
+    final File libDir = PACKAGE_JAR.getParentFile();
+    final File installDir = libDir.getParentFile();
+    final File pidFile = new File(installDir, this.pidFilename);
+    try {
+      return Files.readFirstLine(pidFile, StandardCharsets.UTF_8).trim();
+    } catch (final IOException e) {
+      log.error("Unable to obtain PID", e);
+      return "unknown";
+    }
+  }
+
   private Map<Integer, Executor> getActiveExecutors() {
     final Map<Integer, Executor> executorMap = new HashMap<>();
     try {