admin管理员组文章数量:1332313
java监测服务器信息(cpu,内存,运行时间等),springboot监控服务器信息
目录
- 1.添加工程依赖
- 2. 依赖工具类
- 3. 使用
- PS:工具类代码
- model
- Cpu.java
- Jvm.java
- Mem.java
- Sys.java
- SysFile.java
- utils
- Arith.java
- Convert.java
- DateUtils.java
- EscapeUtil.java
- HtmlFilter.java
- IpUtils.java
- StrFormatter.java
- ServerStringUtils.java
- ServerInfo.java
1.添加工程依赖
<!-- 父工程中-->
<properties><oshi.version>5.8.2</oshi.version>
</properties><!-- 获取系统信息 -->
<dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId><version>${oshi.version}</version>
</dependency><!-- 子工程中--><!-- 获取系统信息 -->
<dependency><groupId>com.github.oshi</groupId><artifactId>oshi-core</artifactId>
</dependency>
2. 依赖工具类
代码在最后边。(或者直接下载:下载地址)
目录结构展示:
- domain- ServerInfo.java- model- Cpu.java- Jvm.java- Mem.java- Sys.java- SysFile.java- utils- Arith.java- Convert.java- DateUtils.java- EscapeUtil.java- HTMLFilter.java- IpUtils.java- StrFormatter.java- ServerStringUtils.java
3. 使用
@PostMapping("cc")public Result cc() throws Exception {ServerInfo info = new ServerInfo();info.copyInfo();return new Result(info);}
PS:工具类代码
model
Cpu.java
package com.sq.common.domain.model;import com.sq.common.domain.utils.Arith;
/*** CPU相关信息*/
public class Cpu {/*** 核心数*/private int cpuNum;/*** CPU总的使用率*/private double total;/*** CPU系统使用率*/private double sys;/*** CPU用户使用率*/private double used;/*** CPU当前等待率*/private double wait;/*** CPU当前空闲率*/private double free;public int getCpuNum() { return cpuNum; }public void setCpuNum(int cpuNum) { this.cpuNum = cpuNum; }public double getTotal() { return Arith.round(Arith.mul(total, 100), 2); }public void setTotal(double total) { this.total = total; }public double getSys() { return Arith.round(Arith.mul(sys / total, 100), 2); }public void setSys(double sys) { this.sys = sys; }public double getUsed() { return Arith.round(Arith.mul(used / total, 100), 2); }public void setUsed(double used) { this.used = used; }public double getWait() { return Arith.round(Arith.mul(wait / total, 100), 2); }public void setWait(double wait) { this.wait = wait; }public double getFree() { return Arith.round(Arith.mul(free / total, 100), 2); }public void setFree(double free) { this.free = free; }
}
Jvm.java
package com.sq.common.domain.model;import com.sq.common.domain.utils.Arith;
import com.sq.common.domain.utils.DateUtils;import java.lang.management.ManagementFactory;/*** JVM相关信息*/
public class Jvm {/*** 当前JVM占用的内存总数(M)*/private double total;/*** JVM最大可用内存总数(M)*/private double max;/*** JVM空闲内存(M)*/private double free;/*** JDK版本*/private String version;/*** JDK路径*/private String home;public double getTotal() { return Arith.div(total, (1024 * 1024), 2); }public void setTotal(double total) { this.total = total; }public double getMax() { return Arith.div(max, (1024 * 1024), 2); }public void setMax(double max) { this.max = max; }public double getFree() { return Arith.div(free, (1024 * 1024), 2); }public void setFree(double free) { this.free = free; }public double getUsed() { return Arith.div(total - free, (1024 * 1024), 2); }public double getUsage() { return Arith.mul(Arith.div(total - free, total, 4), 100); }/*** 获取JDK名称*/public String getName() { return ManagementFactory.getRuntimeMXBean().getVmName(); }public String getVersion() {return version;}public void setVersion(String version) { this.version = version; }public String getHome() { return home; }public void setHome(String home) { this.home = home; }/*** JDK启动时间*/public String getStartTime() { return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, DateUtils.getServerStartDate()); }/*** JDK运行时间*/public String getRunTime() { return DateUtils.getDatePoor(DateUtils.getNowDate(), DateUtils.getServerStartDate()); }
}
Mem.java
package com.sq.common.domain.model;import com.sq.common.domain.utils.Arith;/*** 內存相关信息*/
public class Mem {/*** 内存总量*/private double total;/*** 已用内存*/private double used;/*** 剩余内存*/private double free;public double getTotal() { return Arith.div(total, (1024 * 1024 * 1024), 2); }public void setTotal(long total) { this.total = total; }public double getUsed() { return Arith.div(used, (1024 * 1024 * 1024), 2); }public void setUsed(long used) { this.used = used; }public double getFree() { return Arith.div(free, (1024 * 1024 * 1024), 2); }public void setFree(long free) { this.free = free; }public double getUsage() { return Arith.mul(Arith.div(used, total, 4), 100); }
}
Sys.java
package com.sq.common.domain.model;/*** 系统相关信息*/
public class Sys {/*** 服务器名称*/private String computerName;/*** 服务器Ip*/private String computerIp;/*** 项目路径*/private String userDir;/*** 操作系统*/private String osName;/*** 系统架构*/private String osArch;public String getComputerName() { return computerName; }public void setComputerName(String computerName) { this.computerName = computerName; }public String getComputerIp() { return computerIp; }public void setComputerIp(String computerIp) { this.computerIp = computerIp; }public String getUserDir() { return userDir; }public void setUserDir(String userDir) { this.userDir = userDir; }public String getOsName() { return osName; }public void setOsName(String osName) { this.osName = osName; }public String getOsArch() { return osArch; }public void setOsArch(String osArch) { this.osArch = osArch; }
}
SysFile.java
package com.sq.common.domain.model;/*** 系统文件相关信息*/
public class SysFile {/*** 盘符路径*/private String dirName;/*** 盘符类型*/private String sysTypeName;/*** 文件类型*/private String typeName;/*** 总大小*/private String total;/*** 剩余大小*/private String free;/*** 已经使用量*/private String used;/*** 资源的使用率*/private double usage;public String getDirName() { return dirName; }public void setDirName(String dirName) { this.dirName = dirName; }public String getSysTypeName() { return sysTypeName; }public void setSysTypeName(String sysTypeName) { this.sysTypeName = sysTypeName; }public String getTypeName() { return typeName; }public void setTypeName(String typeName) { this.typeName = typeName; }public String getTotal() { return total; }public void setTotal(String total) { this.total = total; }public String getFree() { return free; }public void setFree(String free) { this.free = free; }public String getUsed() { return used; }public void setUsed(String used) { this.used = used; }public double getUsage() { return usage; }public void setUsage(double usage) { this.usage = usage; }
}
utils
Arith.java
package com.sq.common.domain.utils;import java.math.BigDecimal;
import java.math.RoundingMode;/*** 精确的浮点数运算*/
public class Arith {/*** 默认除法运算精度*/private static final int DEF_DIV_SCALE = 10;/*** 这个类不能实例化*/private Arith() {}/*** 提供精确的加法运算。** @param v1 被加数* @param v2 加数* @return 两个参数的和*/public static double add(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.add(b2).doubleValue();}/*** 提供精确的减法运算。** @param v1 被减数* @param v2 减数* @return 两个参数的差*/public static double sub(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.subtract(b2).doubleValue();}/*** 提供精确的乘法运算。** @param v1 被乘数* @param v2 乘数* @return 两个参数的积*/public static double mul(double v1, double v2) {BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.multiply(b2).doubleValue();}/*** 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到* 小数点以后10位,以后的数字四舍五入。** @param v1 被除数* @param v2 除数* @return 两个参数的商*/public static double div(double v1, double v2) {return div(v1, v2, DEF_DIV_SCALE);}/*** 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指* 定精度,以后的数字四舍五入。** @param v1 被除数* @param v2 除数* @param scale 表示表示需要精确到小数点以后几位。* @return 两个参数的商*/public static double div(double v1, double v2, int scale) {if (scale < 0) {throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));if (b1.compareTo(BigDecimal.ZERO) == 0) {return BigDecimal.ZERO.doubleValue();}return b1.divide(b2, scale, RoundingMode.HALF_UP).doubleValue();}/*** 提供精确的小数位四舍五入处理。** @param v 需要四舍五入的数字* @param scale 小数点后保留几位* @return 四舍五入后的结果*/public static double round(double v, int scale) {if (scale < 0) {throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b = new BigDecimal(Double.toString(v));BigDecimal one = BigDecimal.ONE;return b.divide(one, scale, RoundingMode.HALF_UP).doubleValue();}
}
Convert.java
package com.sq.common.domain.utils;import org.apache.commons.lang3.ArrayUtils;import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;/*** 类型转换器*/
public class Convert {/*** 将对象转为字符串<br>*/public static String utf8Str(Object obj) {return str(obj, StandardCharsets.UTF_8);}/*** 将对象转为字符串<br>*/public static String str(Object obj, Charset charset) {if (null == obj) {return null;}if (obj instanceof String) {return (String) obj;} else if (obj instanceof byte[]) {return str((byte[]) obj, charset);} else if (obj instanceof Byte[]) {byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj);return str(bytes, charset);} else if (obj instanceof ByteBuffer) {return str((ByteBuffer) obj, charset);}return obj.toString();}/*** 解码字节码*/public static String str(byte[] data, Charset charset) {if (data == null) {return null;}if (null == charset) {return new String(data);}return new String(data, charset);}/*** 将编码的byteBuffer数据转换为字符串*/public static String str(ByteBuffer data, Charset charset) {if (null == charset) {charset = Charset.defaultCharset();}return charset.decode(data).toString();}}
DateUtils.java
package com.sq.common.domain.utils;import java.lang.management.ManagementFactory;
import java.text.SimpleDateFormat;
import java.util.Date;/*** 时间工具类*/
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {public static String YYYY_MM_DD = "yyyy-MM-dd";public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";/*** 获取当前Date型日期*/public static Date getNowDate() {return new Date();}/*** 获取当前日期, 默认格式为yyyy-MM-dd*/public static String getDate() {return dateTimeNow(YYYY_MM_DD);}public static final String getTime() {return dateTimeNow(YYYY_MM_DD_HH_MM_SS);}public static final String dateTimeNow(final String format) {return parseDateToStr(format, new Date());}public static final String parseDateToStr(final String format, final Date date) {return new SimpleDateFormat(format).format(date);}/*** 获取服务器启动时间*/public static Date getServerStartDate() {long time = ManagementFactory.getRuntimeMXBean().getStartTime();return new Date(time);}/*** 计算两个时间差*/public static String getDatePoor(Date endDate, Date nowDate) {long nd = 1000 * 24 * 60 * 60;long nh = 1000 * 60 * 60;long nm = 1000 * 60;// long ns = 1000;// 获得两个时间的毫秒时间差异long diff = endDate.getTime() - nowDate.getTime();// 计算差多少天long day = diff / nd;// 计算差多少小时long hour = diff % nd / nh;// 计算差多少分钟long min = diff % nd % nh / nm;// 计算差多少秒//输出结果// long sec = diff % nd % nh % nm / ns;return day + "天" + hour + "小时" + min + "分钟";}
}
EscapeUtil.java
package com.sq.common.domain.utils;/*** 转义和反转义工具类*/
public class EscapeUtil {private static final char[][] TEXT = new char[64][];static {for (int i = 0; i < 64; i++) {TEXT[i] = new char[]{(char) i};}// special HTML charactersTEXT['\''] = "'".toCharArray(); // 单引号TEXT['"'] = """.toCharArray(); // 双引号TEXT['&'] = "&".toCharArray(); // &符TEXT['<'] = "<".toCharArray(); // 小于号TEXT['>'] = ">".toCharArray(); // 大于号}/*** 转义文本中的HTML字符为安全的字符** @param text 被转义的文本* @return 转义后的文本*/public static String escape(String text) {return encode(text);}/*** 还原被转义的HTML特殊字符** @param content 包含转义符的HTML内容* @return 转换后的字符串*/public static String unescape(String content) {return decode(content);}/*** 清除所有HTML标签,但是不删除标签内的内容** @param content 文本* @return 清除标签后的文本*/public static String clean(String content) {return new HTMLFilter().filter(content);}/*** Escape编码** @param text 被编码的文本* @return 编码后的字符*/private static String encode(String text) {if (ServerStringUtils.isEmpty(text)) {return ServerStringUtils.EMPTY;}final StringBuilder tmp = new StringBuilder(text.length() * 6);char c;for (int i = 0; i < text.length(); i++) {c = text.charAt(i);if (c < 256) {tmp.append("%");if (c < 16) {tmp.append("0");}tmp.append(Integer.toString(c, 16));} else {tmp.append("%u");if (c <= 0xfff) {// issue#I49JU8@Giteetmp.append("0");}tmp.append(Integer.toString(c, 16));}}return tmp.toString();}/*** Escape解码** @param content 被转义的内容* @return 解码后的字符串*/public static String decode(String content) {if (ServerStringUtils.isEmpty(content)) {return content;}StringBuilder tmp = new StringBuilder(content.length());int lastPos = 0, pos = 0;char ch;while (lastPos < content.length()) {pos = content.indexOf("%", lastPos);if (pos == lastPos) {if (content.charAt(pos + 1) == 'u') {ch = (char) Integer.parseInt(content.substring(pos + 2, pos + 6), 16);tmp.append(ch);lastPos = pos + 6;} else {ch = (char) Integer.parseInt(content.substring(pos + 1, pos + 3), 16);tmp.append(ch);lastPos = pos + 3;}} else {if (pos == -1) {tmp.append(content.substring(lastPos));lastPos = content.length();} else {tmp.append(content.substring(lastPos, pos));lastPos = pos;}}}return tmp.toString();}
}
HtmlFilter.java
package com.sq.common.domain.utils;import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** HTML过滤器,用于去除XSS漏洞隐患。*/
public final class HTMLFilter {/*** regex flag union representing /si modifiers in php**/private static final int REGEX_FLAGS_SI = Pattern.CASE_INSENSITIVE | Pattern.DOTALL;private static final Pattern P_COMMENTS = Pattern.compile("<!--(.*?)-->", Pattern.DOTALL);private static final Pattern P_COMMENT = Pattern.compile("^!--(.*)--$", REGEX_FLAGS_SI);private static final Pattern P_TAGS = Pattern.compile("<(.*?)>", Pattern.DOTALL);private static final Pattern P_END_TAG = Pattern.compile("^/([a-z0-9]+)", REGEX_FLAGS_SI);private static final Pattern P_START_TAG = Pattern.compile("^([a-z0-9]+)(.*?)(/?)$", REGEX_FLAGS_SI);private static final Pattern P_QUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)=([\"'])(.*?)\\2", REGEX_FLAGS_SI);private static final Pattern P_UNQUOTED_ATTRIBUTES = Pattern.compile("([a-z0-9]+)(=)([^\"\\s']+)", REGEX_FLAGS_SI);private static final Pattern P_PROTOCOL = Pattern.compile("^([^:]+):", REGEX_FLAGS_SI);private static final Pattern P_ENTITY = Pattern.compile("&#(\\d+);?");private static final Pattern P_ENTITY_UNICODE = Pattern.compile("&#x([0-9a-f]+);?");private static final Pattern P_ENCODE = Pattern.compile("%([0-9a-f]{2});?");private static final Pattern P_VALID_ENTITIES = Pattern.compile("&([^&;]*)(?=(;|&|$))");private static final Pattern P_VALID_QUOTES = Pattern.compile("(>|^)([^<]+?)(<|$)", Pattern.DOTALL);private static final Pattern P_END_ARROW = Pattern.compile("^>");private static final Pattern P_BODY_TO_END = Pattern.compile("<([^>]*?)(?=<|$)");private static final Pattern P_XML_CONTENT = Pattern.compile("(^|>)([^<]*?)(?=>)");private static final Pattern P_STRAY_LEFT_ARROW = Pattern.compile("<([^>]*?)(?=<|$)");private static final Pattern P_STRAY_RIGHT_ARROW = Pattern.compile("(^|>)([^<]*?)(?=>)");private static final Pattern P_AMP = Pattern.compile("&");private static final Pattern P_QUOTE = Pattern.compile("\"");private static final Pattern P_LEFT_ARROW = Pattern.compile("<");private static final Pattern P_RIGHT_ARROW = Pattern.compile(">");private static final Pattern P_BOTH_ARROWS = Pattern.compile("<>");private static final ConcurrentMap<String, Pattern> P_REMOVE_PAIR_BLANKS = new ConcurrentHashMap<>();private static final ConcurrentMap<String, Pattern> P_REMOVE_SELF_BLANKS = new ConcurrentHashMap<>();/*** set of allowed html elements, along with allowed attributes for each element**/private final Map<String, List<String>> vAllowed;/*** counts of open tags for each (allowable) html element**/private final Map<String, Integer> vTagCounts = new HashMap<>();/*** html elements which must always be self-closing (e.g. "<img />")**/private final String[] vSelfClosingTags;/*** html elements which must always have separate opening and closing tags (e.g. "<b></b>")**/private final String[] vNeedClosingTags;/*** set of disallowed html elements**/private final String[] vDisallowed;/*** attributes which should be checked for valid protocols**/private final String[] vProtocolAtts;/*** allowed protocols**/private final String[] vAllowedProtocols;/*** tags which should be removed if they contain no content (e.g. "<b></b>" or "<b />")**/private final String[] vRemoveBlanks;/*** entities allowed within html markup**/private final String[] vAllowedEntities;/*** flag determining whether comments are allowed in input String.*/private final boolean stripComment;private final boolean encodeQuotes;/*** flag determining whether to try to make tags when presented with "unbalanced" angle brackets (e.g. "<b text </b>"* becomes "<b> text </b>"). If set to false, unbalanced angle brackets will be html escaped.*/private final boolean alwaysMakeTags;/*** Default constructor.*/public HTMLFilter() {vAllowed = new HashMap<>();final ArrayList<String> a_atts = new ArrayList<>();a_atts.add("href");a_atts.add("target");vAllowed.put("a", a_atts);final ArrayList<String> img_atts = new ArrayList<>();img_atts.add("src");img_atts.add("width");img_atts.add("height");img_atts.add("alt");vAllowed.put("img", img_atts);final ArrayList<String> no_atts = new ArrayList<>();vAllowed.put("b", no_atts);vAllowed.put("strong", no_atts);vAllowed.put("i", no_atts);vAllowed.put("em", no_atts);vSelfClosingTags = new String[]{"img"};vNeedClosingTags = new String[]{"a", "b", "strong", "i", "em"};vDisallowed = new String[]{};vAllowedProtocols = new String[]{"http", "mailto", "https"}; // no ftp.vProtocolAtts = new String[]{"src", "href"};vRemoveBlanks = new String[]{"a", "b", "strong", "i", "em"};vAllowedEntities = new String[]{"amp", "gt", "lt", "quot"};stripComment = true;encodeQuotes = true;alwaysMakeTags = false;}private void reset() {vTagCounts.clear();}public static String chr(final int decimal) {return String.valueOf((char) decimal);}public static String htmlSpecialChars(final String s) {String result = s;result = regexReplace(P_AMP, "&", result);result = regexReplace(P_QUOTE, """, result);result = regexReplace(P_LEFT_ARROW, "<", result);result = regexReplace(P_RIGHT_ARROW, ">", result);return result;}public String filter(final String input) {reset();String s = input;s = escapeComments(s);s = balanceHTML(s);s = checkTags(s);s = processRemoveBlanks(s);// s = validateEntities(s);return s;}private String escapeComments(final String s) {final Matcher m = P_COMMENTS.matcher(s);final StringBuffer buf = new StringBuffer();if (m.find()) {final String match = m.group(1); // (.*?)m.appendReplacement(buf, Matcher.quoteReplacement("<!--" + htmlSpecialChars(match) + "-->"));}m.appendTail(buf);return buf.toString();}private String balanceHTML(String s) {if (alwaysMakeTags) {s = regexReplace(P_END_ARROW, "", s);// 不追加结束标签s = regexReplace(P_BODY_TO_END, "<$1>", s);s = regexReplace(P_XML_CONTENT, "$1<$2", s);} else {s = regexReplace(P_STRAY_LEFT_ARROW, "<$1", s);s = regexReplace(P_STRAY_RIGHT_ARROW, "$1$2><", s);s = regexReplace(P_BOTH_ARROWS, "", s);}return s;}private String checkTags(String s) {Matcher m = P_TAGS.matcher(s);final StringBuffer buf = new StringBuffer();while (m.find()) {String replaceStr = m.group(1);replaceStr = processTag(replaceStr);m.appendReplacement(buf, Matcher.quoteReplacement(replaceStr));}m.appendTail(buf);final StringBuilder sBuilder = new StringBuilder(buf.toString());for (String key : vTagCounts.keySet()) {for (int ii = 0; ii < vTagCounts.get(key); ii++) {sBuilder.append("</").append(key).append(">");}}s = sBuilder.toString();return s;}private String processRemoveBlanks(final String s) {String result = s;for (String tag : vRemoveBlanks) {if (!P_REMOVE_PAIR_BLANKS.containsKey(tag)) {P_REMOVE_PAIR_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?></" + tag + ">"));}result = regexReplace(P_REMOVE_PAIR_BLANKS.get(tag), "", result);if (!P_REMOVE_SELF_BLANKS.containsKey(tag)) {P_REMOVE_SELF_BLANKS.putIfAbsent(tag, Pattern.compile("<" + tag + "(\\s[^>]*)?/>"));}result = regexReplace(P_REMOVE_SELF_BLANKS.get(tag), "", result);}return result;}private static String regexReplace(final Pattern regex_pattern, final String replacement, final String s) {Matcher m = regex_pattern.matcher(s);return m.replaceAll(replacement);}private String processTag(final String s) {// ending tagsMatcher m = P_END_TAG.matcher(s);if (m.find()) {final String name = m.group(1).toLowerCase();if (allowed(name)) {if (!inArray(name, vSelfClosingTags)) {if (vTagCounts.containsKey(name)) {vTagCounts.put(name, vTagCounts.get(name) - 1);return "</" + name + ">";}}}}m = P_START_TAG.matcher(s);if (m.find()) {final String name = m.group(1).toLowerCase();final String body = m.group(2);String ending = m.group(3);if (allowed(name)) {final StringBuilder params = new StringBuilder();final Matcher m2 = P_QUOTED_ATTRIBUTES.matcher(body);final Matcher m3 = P_UNQUOTED_ATTRIBUTES.matcher(body);final List<String> paramNames = new ArrayList<>();final List<String> paramValues = new ArrayList<>();while (m2.find()) {paramNames.add(m2.group(1)); // ([a-z0-9]+)paramValues.add(m2.group(3)); // (.*?)}while (m3.find()) {paramNames.add(m3.group(1)); // ([a-z0-9]+)paramValues.add(m3.group(3)); // ([^\"\\s']+)}String paramName, paramValue;for (int ii = 0; ii < paramNames.size(); ii++) {paramName = paramNames.get(ii).toLowerCase();paramValue = paramValues.get(ii);if (allowedAttribute(name, paramName)) {if (inArray(paramName, vProtocolAtts)) {paramValue = processParamProtocol(paramValue);}params.append(' ').append(paramName).append("=\\\"").append(paramValue).append("\"");}}if (inArray(name, vSelfClosingTags)) {ending = " /";}if (inArray(name, vNeedClosingTags)) {ending = "";}if (ending == null || ending.length() < 1) {if (vTagCounts.containsKey(name)) {vTagCounts.put(name, vTagCounts.get(name) + 1);} else {vTagCounts.put(name, 1);}} else {ending = " /";}return "<" + name + params + ending + ">";} else {return "";}}m = P_COMMENT.matcher(s);if (!stripComment && m.find()) {return "<" + m.group() + ">";}return "";}private String processParamProtocol(String s) {s = decodeEntities(s);final Matcher m = P_PROTOCOL.matcher(s);if (m.find()) {final String protocol = m.group(1);if (!inArray(protocol, vAllowedProtocols)) {s = "#" + s.substring(protocol.length() + 1);if (s.startsWith("#//")) {s = "#" + s.substring(3);}}}return s;}private String decodeEntities(String s) {StringBuffer buf = new StringBuffer();Matcher m = P_ENTITY.matcher(s);while (m.find()) {final String match = m.group(1);final int decimal = Integer.decode(match).intValue();m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));}m.appendTail(buf);s = buf.toString();buf = new StringBuffer();m = P_ENTITY_UNICODE.matcher(s);while (m.find()) {final String match = m.group(1);final int decimal = Integer.valueOf(match, 16).intValue();m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));}m.appendTail(buf);s = buf.toString();buf = new StringBuffer();m = P_ENCODE.matcher(s);while (m.find()) {final String match = m.group(1);final int decimal = Integer.valueOf(match, 16).intValue();m.appendReplacement(buf, Matcher.quoteReplacement(chr(decimal)));}m.appendTail(buf);s = buf.toString();s = validateEntities(s);return s;}private String validateEntities(final String s) {StringBuffer buf = new StringBuffer();// validate entities throughout the stringMatcher m = P_VALID_ENTITIES.matcher(s);while (m.find()) {final String one = m.group(1); // ([^&;]*)final String two = m.group(2); // (?=(;|&|$))m.appendReplacement(buf, Matcher.quoteReplacement(checkEntity(one, two)));}m.appendTail(buf);return encodeQuotes(buf.toString());}private String encodeQuotes(final String s) {if (encodeQuotes) {StringBuffer buf = new StringBuffer();Matcher m = P_VALID_QUOTES.matcher(s);while (m.find()) {final String one = m.group(1); // (>|^)final String two = m.group(2); // ([^<]+?)final String three = m.group(3); // (<|$)// 不替换双引号为",防止json格式无效 regexReplace(P_QUOTE, """, two)m.appendReplacement(buf, Matcher.quoteReplacement(one + two + three));}m.appendTail(buf);return buf.toString();} else {return s;}}private String checkEntity(final String preamble, final String term) {return ";".equals(term) && isValidEntity(preamble) ? '&' + preamble : "&" + preamble;}private boolean isValidEntity(final String entity) {return inArray(entity, vAllowedEntities);}private static boolean inArray(final String s, final String[] array) {for (String item : array) {if (item != null && item.equals(s)) {return true;}}return false;}private boolean allowed(final String name) {return (vAllowed.isEmpty() || vAllowed.containsKey(name)) && !inArray(name, vDisallowed);}private boolean allowedAttribute(final String name, final String paramName) {return allowed(name) && (vAllowed.isEmpty() || vAllowed.get(name).contains(paramName));}
}
IpUtils.java
package com.sq.common.domain.utils;import java.net.InetAddress;
import java.net.UnknownHostException;/*** 获取IP方法*/
public class IpUtils {public static String getHostIp() {try {return InetAddress.getLocalHost().getHostAddress();} catch (UnknownHostException e) {}return "127.0.0.1";}public static String getHostName() {try {return InetAddress.getLocalHost().getHostName();} catch (UnknownHostException e) {}return "未知";}
}
StrFormatter.java
package com.sq.common.domain.utils;import java.util.Collection;
import java.util.Map;/*** 字符串工具类*/
public class ServerStringUtils extends org.apache.commons.lang3.StringUtils {/*** 空字符串*/private static final String NULLSTR = "";/*** * 判断一个Collection是否为空, 包含List,Set,Queue*/public static boolean isEmpty(Collection<?> coll) {return isNull(coll) || coll.isEmpty();}/*** * 判断一个对象数组是否为空*/public static boolean isEmpty(Object[] objects) {return isNull(objects) || (objects.length == 0);}/*** * 判断一个Map是否为空*/public static boolean isEmpty(Map<?, ?> map) {return isNull(map) || map.isEmpty();}/*** * 判断一个字符串是否为空串*/public static boolean isEmpty(String str) {return isNull(str) || NULLSTR.equals(str.trim());}/*** * 判断一个对象是否为空*/public static boolean isNull(Object object) {return object == null;}/*** 截取字符串*/public static String substring(final String str, int start) {if (str == null) {return NULLSTR;}if (start < 0) {start = str.length() + start;}if (start < 0) {start = 0;}if (start > str.length()) {return NULLSTR;}return str.substring(start);}/*** 截取字符串*/public static String substring(final String str, int start, int end) {if (str == null) {return NULLSTR;}if (end < 0) {end = str.length() + end;}if (start < 0) {start = str.length() + start;}if (end > str.length()) {end = str.length();}if (start > end) {return NULLSTR;}if (start < 0) {start = 0;}if (end < 0) {end = 0;}return str.substring(start, end);}}
ServerStringUtils.java
package com.sq.common.domain.utils;/*** 字符串格式化*/
public class StrFormatter {public static final String EMPTY_JSON = "{}";public static final char C_BACKSLASH = '\\';public static final char C_DELIM_START = '{';public static final char C_DELIM_END = '}';/*** 格式化字符串<br>* 此方法只是简单将占位符 {} 按照顺序替换为参数<br>* 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>* 例:<br>* 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>* 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>* 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>** @param strPattern 字符串模板* @param argArray 参数列表* @return 结果*/public static String format(final String strPattern, final Object... argArray) {if (ServerStringUtils.isEmpty(strPattern) || ServerStringUtils.isEmpty(argArray)) {return strPattern;}final int strPatternLength = strPattern.length();// 初始化定义好的长度以获得更好的性能StringBuilder sbuf = new StringBuilder(strPatternLength + 50);int handledPosition = 0;int delimIndex;// 占位符所在位置for (int argIndex = 0; argIndex < argArray.length; argIndex++) {delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);if (delimIndex == -1) {if (handledPosition == 0) {return strPattern;} else { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果sbuf.append(strPattern, handledPosition, strPatternLength);return sbuf.toString();}} else {if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) {if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) {// 转义符之前还有一个转义符,占位符依旧有效sbuf.append(strPattern, handledPosition, delimIndex - 1);sbuf.append(Convert.utf8Str(argArray[argIndex]));handledPosition = delimIndex + 2;} else {// 占位符被转义argIndex--;sbuf.append(strPattern, handledPosition, delimIndex - 1);sbuf.append(C_DELIM_START);handledPosition = delimIndex + 1;}} else {// 正常占位符sbuf.append(strPattern, handledPosition, delimIndex);sbuf.append(Convert.utf8Str(argArray[argIndex]));handledPosition = delimIndex + 2;}}}// 加入最后一个占位符后所有的字符sbuf.append(strPattern, handledPosition, strPattern.length());return sbuf.toString();}
}
ServerInfo.java
package com.sq.common.domain;import com.sq.common.domain.model.*;
import com.sq.common.domain.utils.Arith;
import com.sq.common.domain.utils.IpUtils;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.CentralProcessor.TickType;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.software.os.FileSystem;
import oshi.software.os.OSFileStore;
import oshi.software.os.OperatingSystem;
import oshi.util.Util;import java.net.UnknownHostException;
import java.util.LinkedList;
import java.util.List;
import java.util.Properties;/*** 服务器相关信息*/
public class ServerInfo {private static final int OSHI_WAIT_SECOND = 1000;/*** CPU相关信息*/private Cpu cpu = new Cpu();/*** 內存相关信息*/private Mem mem = new Mem();/*** JVM相关信息*/private Jvm jvm = new Jvm();/*** 服务器相关信息*/private Sys sys = new Sys();/*** 磁盘相关信息*/private List<SysFile> sysFiles = new LinkedList<SysFile>();public Cpu getCpu() {return cpu;}public void setCpu(Cpu cpu) {this.cpu = cpu;}public Mem getMem() {return mem;}public void setMem(Mem mem) {this.mem = mem;}public Jvm getJvm() {return jvm;}public void setJvm(Jvm jvm) {this.jvm = jvm;}public Sys getSys() {return sys;}public void setSys(Sys sys) {this.sys = sys;}public List<SysFile> getSysFiles() {return sysFiles;}public void setSysFiles(List<SysFile> sysFiles) {this.sysFiles = sysFiles;}public void copyInfo() throws Exception {SystemInfo si = new SystemInfo();HardwareAbstractionLayer hal = si.getHardware();setCpuInfo(hal.getProcessor());setMemInfo(hal.getMemory());setSysInfo();setJvmInfo();setSysFiles(si.getOperatingSystem());}/*** 设置CPU信息*/private void setCpuInfo(CentralProcessor processor) {// CPU信息long[] prevTicks = processor.getSystemCpuLoadTicks();Util.sleep(OSHI_WAIT_SECOND);long[] ticks = processor.getSystemCpuLoadTicks();long nice = ticks[TickType.NICE.getIndex()] - prevTicks[TickType.NICE.getIndex()];long irq = ticks[TickType.IRQ.getIndex()] - prevTicks[TickType.IRQ.getIndex()];long softirq = ticks[TickType.SOFTIRQ.getIndex()] - prevTicks[TickType.SOFTIRQ.getIndex()];long steal = ticks[TickType.STEAL.getIndex()] - prevTicks[TickType.STEAL.getIndex()];long cSys = ticks[TickType.SYSTEM.getIndex()] - prevTicks[TickType.SYSTEM.getIndex()];long user = ticks[TickType.USER.getIndex()] - prevTicks[TickType.USER.getIndex()];long iowait = ticks[TickType.IOWAIT.getIndex()] - prevTicks[TickType.IOWAIT.getIndex()];long idle = ticks[TickType.IDLE.getIndex()] - prevTicks[TickType.IDLE.getIndex()];long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;cpu.setCpuNum(processor.getLogicalProcessorCount());cpu.setTotal(totalCpu);cpu.setSys(cSys);cpu.setUsed(user);cpu.setWait(iowait);cpu.setFree(idle);}/*** 设置内存信息*/private void setMemInfo(GlobalMemory memory) {mem.setTotal(memory.getTotal());mem.setUsed(memory.getTotal() - memory.getAvailable());mem.setFree(memory.getAvailable());}/*** 设置服务器信息*/private void setSysInfo() {Properties props = System.getProperties();sys.setComputerName(IpUtils.getHostName());sys.setComputerIp(IpUtils.getHostIp());sys.setOsName(props.getProperty("os.name"));sys.setOsArch(props.getProperty("os.arch"));sys.setUserDir(props.getProperty("user.dir"));}/*** 设置Java虚拟机*/private void setJvmInfo() throws UnknownHostException {Properties props = System.getProperties();jvm.setTotal(Runtime.getRuntime().totalMemory());jvm.setMax(Runtime.getRuntime().maxMemory());jvm.setFree(Runtime.getRuntime().freeMemory());jvm.setVersion(props.getProperty("java.version"));jvm.setHome(props.getProperty("java.home"));}/*** 设置磁盘信息*/private void setSysFiles(OperatingSystem os) {FileSystem fileSystem = os.getFileSystem();List<OSFileStore> fsArray = fileSystem.getFileStores();for (OSFileStore fs : fsArray) {long free = fs.getUsableSpace();long total = fs.getTotalSpace();long used = total - free;SysFile sysFile = new SysFile();sysFile.setDirName(fs.getMount());sysFile.setSysTypeName(fs.getType());sysFile.setTypeName(fs.getName());sysFile.setTotal(convertFileSize(total));sysFile.setFree(convertFileSize(free));sysFile.setUsed(convertFileSize(used));sysFile.setUsage(Arith.mul(Arith.div(used, total, 4), 100));sysFiles.add(sysFile);}}/*** 字节转换** @param size 字节大小* @return 转换后值*/public String convertFileSize(long size) {long kb = 1024;long mb = kb * 1024;long gb = mb * 1024;if (size >= gb) {return String.format("%.1f GB", (float) size / gb);} else if (size >= mb) {float f = (float) size / mb;return String.format(f > 100 ? "%.0f MB" : "%.1f MB", f);} else if (size >= kb) {float f = (float) size / kb;return String.format(f > 100 ? "%.0f KB" : "%.1f KB", f);} else {return String.format("%d B", size);}}
}
本文标签: java监测服务器信息(cpu内存运行时间等),springboot监控服务器信息
版权声明:本文标题:java监测服务器信息(cpu,内存,运行时间等),springboot监控服务器信息 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1686511963a4203.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论