001 package org.kuali.common.deploy;
002
003 import java.util.ArrayList;
004 import java.util.Arrays;
005 import java.util.List;
006 import java.util.Properties;
007
008 import org.kuali.common.util.Assert;
009 import org.kuali.common.util.FormatUtils;
010 import org.kuali.common.util.MonitorTextFileResult;
011 import org.kuali.common.util.PropertyUtils;
012 import org.kuali.common.util.secure.SecureChannel;
013 import org.slf4j.Logger;
014 import org.slf4j.LoggerFactory;
015
016 public class AppDynamicsMonitoring implements Monitoring {
017
018 private static final Logger logger = LoggerFactory.getLogger(AppDynamicsMonitoring.class);
019
020 SecureChannel channel;
021 String setEnvPropertyKey = "setenv.env.content";
022 MachineAgent machineAgent;
023 ServerAgent serverAgent;
024 String user;
025 String group;
026 boolean enabled;
027 Properties filterProperties;
028
029 @Override
030 public void stop() {
031 long start = System.currentTimeMillis();
032 logger.info("[appdynamics:stopping]");
033 DeployUtils.killMatchingProcesses(channel, user, machineAgent.getStartupCommand(), "machine agent");
034 logger.info("[appdynamics:stopped] - {}", FormatUtils.getTime(System.currentTimeMillis() - start));
035 }
036
037 @Override
038 public void prepare() {
039 long start = System.currentTimeMillis();
040 logger.info("[appdynamics:preparing]");
041 List<String> dirs = Arrays.asList(machineAgent.getLogsDir(), machineAgent.getTmpDir(), serverAgent.getLogsDir());
042 List<String> chownDirs = getChownDirs(dirs);
043 DeployUtils.delete(channel, dirs);
044 DeployUtils.mkdirs(channel, dirs);
045 DeployUtils.chown(channel, user, group, chownDirs);
046 List<Deployable> deployables = Arrays.asList(machineAgent.getController(), serverAgent.getController());
047 DeployUtils.copyFiles(channel, deployables, filterProperties);
048 if (enabled) {
049 String value = "\n" + serverAgent.getAppServerStartupOptions();
050 PropertyUtils.appendToOrSetProperty(filterProperties, setEnvPropertyKey, value);
051 }
052 logger.info("[appdynamics:prepared] - {}", FormatUtils.getTime(System.currentTimeMillis() - start));
053 }
054
055 @Override
056 public void start() {
057 if (!enabled) {
058 logger.info("[appdynamics:start] - (skipped) - monitoring is not enabled");
059 return;
060 }
061 long start = System.currentTimeMillis();
062 logger.info("[appdynamics:starting]");
063 startMachineAgent(channel, machineAgent);
064 logger.info("[appdynamics:started] - {}", FormatUtils.getTime(System.currentTimeMillis() - start));
065 }
066
067 protected void startMachineAgent(SecureChannel channel, MachineAgent machineAgent) {
068 logger.info("[appdynamics:machineagent:starting]");
069 boolean exists = channel.exists(machineAgent.getLogFile());
070 Assert.isFalse(exists, "machine agent log file [" + machineAgent.getLogFile() + "] already exists");
071 String command = DeployUtils.getNohupBackgroundProcess(user, machineAgent.getStartupCommand());
072 logger.debug(command);
073 channel.executeNoWait(command);
074 String path = machineAgent.getLogFile();
075 String token = machineAgent.getStartupToken();
076 int intervalMillis = machineAgent.getLogFileIntervalMillis();
077 int timeoutMillis = machineAgent.getStartupTimeoutMillis();
078 String encoding = machineAgent.getLogFileEncoding();
079 MonitorTextFileResult result = DeployUtils.monitorTextFile(channel, path, token, intervalMillis, timeoutMillis, encoding);
080 if (!result.isContains()) {
081 throw new IllegalStateException("Could not verify AppDynamics Machine Agent startup");
082 } else {
083 logger.info("[appdynamics:machineagent:started]");
084 }
085 }
086
087 protected List<String> getChownDirs(List<String> dirs) {
088 List<String> chownDirs = new ArrayList<String>();
089 chownDirs.addAll(dirs);
090 chownDirs.add(machineAgent.getBaseDir());
091 chownDirs.add(serverAgent.getBaseDir());
092 return chownDirs;
093 }
094
095 public String getUser() {
096 return user;
097 }
098
099 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 }