1 package org.kuali.common.deploy; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.List; 6 import java.util.Properties; 7 8 import org.kuali.common.util.Assert; 9 import org.kuali.common.util.FormatUtils; 10 import org.kuali.common.util.MonitorTextFileResult; 11 import org.kuali.common.util.PropertyUtils; 12 import org.kuali.common.util.secure.SecureChannel; 13 import org.slf4j.Logger; 14 import org.slf4j.LoggerFactory; 15 16 public class AppDynamicsMonitoring implements Monitoring { 17 18 private static final Logger logger = LoggerFactory.getLogger(AppDynamicsMonitoring.class); 19 20 SecureChannel channel; 21 String setEnvPropertyKey = "setenv.env.content"; 22 MachineAgent machineAgent; 23 ServerAgent serverAgent; 24 String user; 25 String group; 26 boolean enabled; 27 Properties filterProperties; 28 29 @Override 30 public void stop() { 31 long start = System.currentTimeMillis(); 32 logger.info("[appdynamics:stopping]"); 33 DeployUtils.killMatchingProcesses(channel, user, machineAgent.getStartupCommand(), "machine agent"); 34 logger.info("[appdynamics:stopped] - {}", FormatUtils.getTime(System.currentTimeMillis() - start)); 35 } 36 37 @Override 38 public void prepare() { 39 long start = System.currentTimeMillis(); 40 logger.info("[appdynamics:preparing]"); 41 List<String> dirs = Arrays.asList(machineAgent.getLogsDir(), machineAgent.getTmpDir(), serverAgent.getLogsDir()); 42 List<String> chownDirs = getChownDirs(dirs); 43 DeployUtils.delete(channel, dirs); 44 DeployUtils.mkdirs(channel, dirs); 45 DeployUtils.chown(channel, user, group, chownDirs); 46 List<Deployable> deployables = Arrays.asList(machineAgent.getController(), serverAgent.getController()); 47 DeployUtils.copyFiles(channel, deployables, filterProperties); 48 if (enabled) { 49 String value = "\n" + serverAgent.getAppServerStartupOptions(); 50 PropertyUtils.appendToOrSetProperty(filterProperties, setEnvPropertyKey, value); 51 } 52 logger.info("[appdynamics:prepared] - {}", FormatUtils.getTime(System.currentTimeMillis() - start)); 53 } 54 55 @Override 56 public void start() { 57 if (!enabled) { 58 logger.info("[appdynamics:start] - (skipped) - monitoring is not enabled"); 59 return; 60 } 61 long start = System.currentTimeMillis(); 62 logger.info("[appdynamics:starting]"); 63 startMachineAgent(channel, machineAgent); 64 logger.info("[appdynamics:started] - {}", FormatUtils.getTime(System.currentTimeMillis() - start)); 65 } 66 67 protected void startMachineAgent(SecureChannel channel, MachineAgent machineAgent) { 68 logger.info("[appdynamics:machineagent:starting]"); 69 boolean exists = channel.exists(machineAgent.getLogFile()); 70 Assert.isFalse(exists, "machine agent log file [" + machineAgent.getLogFile() + "] already exists"); 71 String command = DeployUtils.getNohupBackgroundProcess(user, machineAgent.getStartupCommand()); 72 logger.debug(command); 73 channel.executeNoWait(command); 74 String path = machineAgent.getLogFile(); 75 String token = machineAgent.getStartupToken(); 76 int intervalMillis = machineAgent.getLogFileIntervalMillis(); 77 int timeoutMillis = machineAgent.getStartupTimeoutMillis(); 78 String encoding = machineAgent.getLogFileEncoding(); 79 MonitorTextFileResult result = DeployUtils.monitorTextFile(channel, path, token, intervalMillis, timeoutMillis, encoding); 80 if (!result.isContains()) { 81 throw new IllegalStateException("Could not verify AppDynamics Machine Agent startup"); 82 } else { 83 logger.info("[appdynamics:machineagent:started]"); 84 } 85 } 86 87 protected List<String> getChownDirs(List<String> dirs) { 88 List<String> chownDirs = new ArrayList<String>(); 89 chownDirs.addAll(dirs); 90 chownDirs.add(machineAgent.getBaseDir()); 91 chownDirs.add(serverAgent.getBaseDir()); 92 return chownDirs; 93 } 94 95 public String getUser() { 96 return user; 97 } 98 99 public void setUser(String user) { 100 this.user = user; 101 } 102 103 public SecureChannel getChannel() { 104 return channel; 105 } 106 107 public void setChannel(SecureChannel channel) { 108 this.channel = channel; 109 } 110 111 public String getGroup() { 112 return group; 113 } 114 115 public void setGroup(String group) { 116 this.group = group; 117 } 118 119 public boolean isEnabled() { 120 return enabled; 121 } 122 123 public void setEnabled(boolean enabled) { 124 this.enabled = enabled; 125 } 126 127 public MachineAgent getMachineAgent() { 128 return machineAgent; 129 } 130 131 public void setMachineAgent(MachineAgent machineAgent) { 132 this.machineAgent = machineAgent; 133 } 134 135 public ServerAgent getServerAgent() { 136 return serverAgent; 137 } 138 139 public void setServerAgent(ServerAgent serverAgent) { 140 this.serverAgent = serverAgent; 141 } 142 143 public Properties getFilterProperties() { 144 return filterProperties; 145 } 146 147 public void setFilterProperties(Properties filterProperties) { 148 this.filterProperties = filterProperties; 149 } 150 151 public String getSetEnvPropertyKey() { 152 return setEnvPropertyKey; 153 } 154 155 public void setSetEnvPropertyKey(String setEnvPropertyKey) { 156 this.setEnvPropertyKey = setEnvPropertyKey; 157 } 158 159 }