最近部门在做Tomcat服务器监控,数据采集的工作交到了我这个实习生的头上。
通过tomcat manager采集数据首先要配置tomcat角色,这个不多说了,配置文件改下就可以了。
关于数据采集,大部分数据可以通过“http://localhost:8080/manager/status?XML=true”这个请求到xml数据,之后再解析xml数据就可以获取到需要的数据。
还有一小部分是“Servlet”的相关信息,这个是无法通过上面的请求获取的,可以通过下面这个请求获取:
http://localhost:8080/manager/jmxproxy?qry=*%3Aj2eeType%3DServlet%2C*
但是这个请求获取的是纯文本,所以就需要自己解析数据。于是就花时间写了个解析Tomcat 中Servlet相关信息的程序。
主要代码结构:
getconnectUtil.java(用来进行登录):
package util;import sun.misc.BASE64Encoder;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;public class getConnectUtil {public String login(String Servleturl,String username,String password) throws IOException {//查询服务器信息urlString result=null;String line=null;URL url=new URL(Servleturl);URLConnection cOnn=url.openConnection();String UserNameAndPassWord=username+":"+password;String encodedPassword=new BASE64Encoder().encode(UserNameAndPassWord.getBytes());conn.setRequestProperty("Authorization", "Basic " + encodedPassword);InputStream is=conn.getInputStream();BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(is));while((line=bufferedReader.readLine())!=null){result+=line+"\n";}return result;}}
ServletDataSplitUtil.java(进行截取字段):
package util;import model.ServletInfoModel;import java.io.IOException;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class ServletDataSplitUtil {private static ArrayList
}
KeyAndValueUtil.java(主要用来判断字段的,都是if语句,单独拿出来好看一点,当然这里也可以用枚举类):
package util;import model.ServletInfoModel;public class KeyAndValueUtil {public void keyandvalue(String key, String value, ServletInfoModel servletInfoModel){if ("modelerType".equals(key)){servletInfoModel.setModelerType(value);}else if ("maxTime".equals(key)){servletInfoModel.setMaxTime(Double.parseDouble(value));}else if ("requestCount".equals(key)){servletInfoModel.setRequestCount(Integer.parseInt(value));}else if ("stateManageable".equals(key)){servletInfoModel.setStateManageable(Boolean.parseBoolean(value));}else if ("servletClass".equals(key)){servletInfoModel.setServletClass(value);}else if ("countAllocated".equals(key)){servletInfoModel.setCountAllocated(Integer.parseInt(value));}else if ("available".equals(key)){servletInfoModel.setAvailable(Integer.parseInt(value));}else if ("backgroundProcessorDelay".equals(key)){servletInfoModel.setBackgroundProcessorDelay(Integer.parseInt(value));}else if ("processingTime".equals(key)){servletInfoModel.setProcessingTime(Double.parseDouble(value));}else if ("loadOnStartup".equals(key)){servletInfoModel.setLoadOnStartup(Integer.parseInt(value));}else if ("singleThreadModel".equals(key)){servletInfoModel.setSingleThreadModel(value);}else if ("loadTime".equals(key)){servletInfoModel.setLoadTime(Double.parseDouble(value));}else if ("stateName".equals(key)){servletInfoModel.setStateName(value);}else if ("minTime".equals(key)){servletInfoModel.setMinTime(value);}else if ("classLoadTime".equals(key)){servletInfoModel.setClassLoadTime(value);}else if ("asyncSupported".equals(key)){servletInfoModel.setAsyncSupported(Boolean.parseBoolean(value));}else if ("objectName".equals(key)){servletInfoModel.setObjectName(value);}else if ("maxInstances".equals(key)){servletInfoModel.setMaxInstances(Integer.parseInt(value));}else if ("errorCount".equals(key)){servletInfoModel.setErrorCount(Integer.parseInt(value));}}
}
ServletInfoModel.java(所有属性、Getter And Setter ):
package model;public class ServletInfoModel {private String WebApplicationName;//web应用名private String ServletName;//Servlet名称private String modelerType;//private double maxTime;//private int requestCount;//private boolean stateManageable;//private String servletClass;//private int countAllocated;//private int available;//private int backgroundProcessorDelay;//private double processingTime;//private int loadOnStartup;//private String singleThreadModel;//private double loadTime;//private String stateName;//private String minTime;//private String classLoadTime;//private Boolean asyncSupported;//private String objectName;//private int maxInstances;//private int errorCount;//public String getWebApplicationName() {return WebApplicationName;}public void setWebApplicationName(String webApplicationName) {WebApplicatiOnName= webApplicationName;}public String getServletName() {return ServletName;}public void setServletName(String servletName) {ServletName = servletName;}public String getModelerType() {return modelerType;}public void setModelerType(String modelerType) {this.modelerType = modelerType;}public double getMaxTime() {return maxTime;}public void setMaxTime(double maxTime) {this.maxTime = maxTime;}public int getRequestCount() {return requestCount;}public void setRequestCount(int requestCount) {this.requestCount = requestCount;}public boolean isStateManageable() {return stateManageable;}public void setStateManageable(boolean stateManageable) {this.stateManageable = stateManageable;}public String getServletClass() {return servletClass;}public void setServletClass(String servletClass) {this.servletClass = servletClass;}public int getCountAllocated() {return countAllocated;}public void setCountAllocated(int countAllocated) {this.countAllocated = countAllocated;}public int getAvailable() {return available;}public void setAvailable(int available) {this.available = available;}public int getBackgroundProcessorDelay() {return backgroundProcessorDelay;}public void setBackgroundProcessorDelay(int backgroundProcessorDelay) {this.backgroundProcessorDelay = backgroundProcessorDelay;}public double getProcessingTime() {return processingTime;}public void setProcessingTime(double processingTime) {this.processingTime = processingTime;}public int getLoadOnStartup() {return loadOnStartup;}public void setLoadOnStartup(int loadOnStartup) {this.loadOnStartup= loadOnStartup;}public String getSingleThreadModel() {return singleThreadModel;}public void setSingleThreadModel(String singleThreadModel) {this.singleThreadModel = singleThreadModel;}public double getLoadTime() {return loadTime;}public void setLoadTime(double loadTime) {this.loadTime = loadTime;}public String getStateName() {return stateName;}public void setStateName(String stateName) {this.stateName = stateName;}public String getMinTime() {return minTime;}public void setMinTime(String minTime) {this.minTime = minTime;}public String getClassLoadTime() {return classLoadTime;}public void setClassLoadTime(String classLoadTime) {this.classLoadTime = classLoadTime;}public Boolean getAsyncSupported() {return asyncSupported;}public void setAsyncSupported(Boolean asyncSupported) {this.asyncSupported = asyncSupported;}public String getObjectName() {return objectName;}public void setObjectName(String objectName) {this.objectName = objectName;}public int getMaxInstances() {return maxInstances;}public void setMaxInstances(int maxInstances) {this.maxInstances = maxInstances;}public int getErrorCount() {return errorCount;}public void setErrorCount(int errorCount) {this.errorCount = errorCount;}@Overridepublic String toString() {return "ServletInfoModel{" +"WebApplicatiOnName='" + WebApplicationName + '\'' +", ServletName='" + ServletName + '\'' +", modelerType='" + modelerType + '\'' +", maxTime=" + maxTime +", requestCount=" + requestCount +", stateManageable=" + stateManageable +", servletClass='" + servletClass + '\'' +", countAllocated=" + countAllocated +", available=" + available +", backgroundProcessorDelay=" + backgroundProcessorDelay +", processingTime=" + processingTime +", loadOnStartup=" + loadOnStartup +", singleThreadModel=" + singleThreadModel +", loadTime=" + loadTime +", stateName='" + stateName + '\'' +", minTime='" + minTime + '\'' +", classLoadTime='" + classLoadTime + '\'' +", asyncSupported=" + asyncSupported +", objectName='" + objectName + '\'' +", maxInstances=" + maxInstances +", errorCount=" + errorCount +'}';}
}
test.java(测试类):
package main;import model.ServletInfoModel;
import util.ServletDataSplitUtil;import java.io.IOException;
import java.util.ArrayList;public class test {public static void main(String args[]) throws IOException {ArrayList
}
代码写的不怎么规范,但是思路应该是对的,就是比较麻烦。
如果有大牛有其它的方式通过Tomcat Manager采集数据,欢迎指教!