/* * Copyright 2015 the original author or authors. * @https://github.com/scouter-project/scouter * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package scouter.util; import java.io.InputStream; import java.io.OutputStream; import java.lang.management.GarbageCollectorMXBean; import java.lang.management.ManagementFactory; import java.lang.management.OperatingSystemMXBean; import java.lang.management.RuntimeMXBean; import java.lang.management.ThreadMXBean; import java.lang.reflect.Method; import java.util.List; public class SysJMX { private static ThreadMXBean threadmx; private static OperatingSystemMXBean osmx; private static RuntimeMXBean rtmx; private static Method getSystemLoadAverage; private static Method getProcessCpuTime; private static boolean sunThreadMX = false; static { try { threadmx = ManagementFactory.getThreadMXBean(); osmx = ManagementFactory.getOperatingSystemMXBean(); rtmx = ManagementFactory.getRuntimeMXBean(); sunThreadMX = threadmx.getClass().getName().indexOf("sun") >= 0; } catch (Throwable t) { threadmx = null; osmx = null; rtmx = null; sunThreadMX=false; } try { if (osmx != null) { Class c = osmx.getClass(); getSystemLoadAverage = c.getMethod("getSystemLoadAverage"); getProcessCpuTime = c.getMethod("getProcessCpuTime"); } } catch (Throwable t) { } } public static long getCurrentThreadCPU() { if (threadmx == null) return 0; try { return threadmx.getCurrentThreadCpuTime() / 1000000L; } catch (Throwable t) { return 0; } } public static long getCurrentThreadCPUnano() { if (threadmx == null) return 0; try { return threadmx.getCurrentThreadCpuTime() ; } catch (Throwable t) { return 0; } } public static long getCurrentThreadAllocBytes() { if (sunThreadMX ==false) return 0; try { return ((com.sun.management.ThreadMXBean)threadmx).getThreadAllocatedBytes(Thread.currentThread().getId()); } catch (Throwable t) { sunThreadMX=false; return 0; } } public static long getThreadCPU(long id) { if (threadmx == null) return 0; try { return threadmx.getThreadCpuTime(id) / 1000000L; } catch (Throwable t) { return 0; } } public static long getCurrentProcGcTime() { if (threadmx == null) return 0; try { List gclist = ManagementFactory.getGarbageCollectorMXBeans(); long gctime = 0; for (int i = 0; i < gclist.size(); i++) { GarbageCollectorMXBean mxs = (GarbageCollectorMXBean) gclist.get(i); gctime += mxs.getCollectionTime(); } return gctime; } catch (Throwable t) { return 0; } } public static long[] getCurrentProcGcInfo() { long[] gc = new long[2]; if (threadmx == null) return gc; try { List gclist = ManagementFactory.getGarbageCollectorMXBeans(); for (int i = 0; i < gclist.size(); i++) { GarbageCollectorMXBean mxs = (GarbageCollectorMXBean) gclist.get(i); gc[0] += mxs.getCollectionCount(); gc[1] += mxs.getCollectionTime(); } return gc; } catch (Throwable t) { return gc; } } public static float getSystemLoad() { if (getSystemLoadAverage == null) return 0; try { Object o = getSystemLoadAverage.invoke(osmx, new Object[0]); return ((Float) o).floatValue(); } catch (Throwable t) { return 0; } } public static boolean isProcessCPU() { return getProcessCpuTime != null; } public static long getProcessCPU() { if (getProcessCpuTime == null) return 0; try { Object o = getProcessCpuTime.invoke(osmx, new Object[0]); return ((Long) o).longValue(); } catch (Throwable t) { return 0; } } public static int getProcessPID() { RuntimeMXBean o = ManagementFactory.getRuntimeMXBean(); String nm = o.getName(); int x = nm.indexOf("@"); try { if (x > 0) return Integer.parseInt(nm.substring(0, x)); } catch (Exception e) { } return -1; } private static String hostname = null; public static String getHostName() { if (hostname != null) { return hostname; } if (SystemUtil.IS_LINUX) { InputStream is = null; OutputStream os = null; InputStream es = null; try { Process process = Runtime.getRuntime().exec("hostname"); is = process.getInputStream(); os = process.getOutputStream(); es = process.getErrorStream(); byte[] isBytes = FileUtil.readAll(is); hostname = new String(isBytes); if (StringUtil.isNotEmpty(hostname)) { hostname = hostname.replaceAll("\n", ""); hostname = hostname.replaceAll("\r", ""); } return hostname; } catch (Throwable th) { th.printStackTrace(); } finally { FileUtil.close(is); FileUtil.close(os); FileUtil.close(es); } } RuntimeMXBean o = ManagementFactory.getRuntimeMXBean(); String nm = o.getName(); int x = nm.indexOf("@"); hostname = nm.substring(x + 1); return hostname; } public static String getProcessName() { return ManagementFactory.getRuntimeMXBean().getName(); } public static long getThreadCpuTime(Thread thread) { if (threadmx == null) return 0; return threadmx.getThreadCpuTime(thread.getId()) / 1000000L; } public static String getUserName() { String username = SystemUtil.USER_NAME; if (StringUtil.isNotEmpty(username)) { return username; } username = System.getenv("USERNAME"); if (StringUtil.isNotEmpty(username)) { return username; } InputStream is = null; OutputStream os = null; InputStream es = null; try { Process process = Runtime.getRuntime().exec("whoami"); is = process.getInputStream(); os = process.getOutputStream(); es = process.getErrorStream(); byte[] isBytes = FileUtil.readAll(is); username = new String(isBytes); } catch (Throwable th) { th.printStackTrace(); } finally { FileUtil.close(is); FileUtil.close(os); FileUtil.close(es); } return username; } public static String getUsingJava() { return SystemUtil.JAVA_VERSION; } }