乐趣区

聊聊Elasticsearch的ProcessProbe

本文主要研究一下 Elasticsearch 的 ProcessProbe

ProcessProbe

elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/process/ProcessProbe.java

public class ProcessProbe {private static final OperatingSystemMXBean osMxBean = ManagementFactory.getOperatingSystemMXBean();

    private static final Method getMaxFileDescriptorCountField;
    private static final Method getOpenFileDescriptorCountField;
    private static final Method getProcessCpuLoad;
    private static final Method getProcessCpuTime;
    private static final Method getCommittedVirtualMemorySize;

    static {getMaxFileDescriptorCountField = getUnixMethod("getMaxFileDescriptorCount");
        getOpenFileDescriptorCountField = getUnixMethod("getOpenFileDescriptorCount");
        getProcessCpuLoad = getMethod("getProcessCpuLoad");
        getProcessCpuTime = getMethod("getProcessCpuTime");
        getCommittedVirtualMemorySize = getMethod("getCommittedVirtualMemorySize");
    }

    private static class ProcessProbeHolder {private static final ProcessProbe INSTANCE = new ProcessProbe();
    }

    public static ProcessProbe getInstance() {return ProcessProbeHolder.INSTANCE;}

    private ProcessProbe() {}

    /**
     * Returns the maximum number of file descriptors allowed on the system, or -1 if not supported.
     */
    public long getMaxFileDescriptorCount() {if (getMaxFileDescriptorCountField == null) {return -1;}
        try {return (Long) getMaxFileDescriptorCountField.invoke(osMxBean);
        } catch (Exception t) {return -1;}
    }

    /**
     * Returns the number of opened file descriptors associated with the current process, or -1 if not supported.
     */
    public long getOpenFileDescriptorCount() {if (getOpenFileDescriptorCountField == null) {return -1;}
        try {return (Long) getOpenFileDescriptorCountField.invoke(osMxBean);
        } catch (Exception t) {return -1;}
    }

    /**
     * Returns the process CPU usage in percent
     */
    public short getProcessCpuPercent() {return Probes.getLoadAndScaleToPercent(getProcessCpuLoad, osMxBean);
    }

    /**
     * Returns the CPU time (in milliseconds) used by the process on which the Java virtual machine is running, or -1 if not supported.
     */
    public long getProcessCpuTotalTime() {if (getProcessCpuTime != null) {
            try {long time = (long) getProcessCpuTime.invoke(osMxBean);
                if (time >= 0) {return (time / 1_000_000L);
                }
            } catch (Exception t) {return -1;}
        }
        return -1;
    }

    /**
     * Returns the size (in bytes) of virtual memory that is guaranteed to be available to the running process
     */
    public long getTotalVirtualMemorySize() {if (getCommittedVirtualMemorySize != null) {
            try {long virtual = (long) getCommittedVirtualMemorySize.invoke(osMxBean);
                if (virtual >= 0) {return virtual;}
            } catch (Exception t) {return -1;}
        }
        return -1;
    }

    public ProcessInfo processInfo(long refreshInterval) {return new ProcessInfo(jvmInfo().pid(), BootstrapInfo.isMemoryLocked(), refreshInterval);
    }

    public ProcessStats processStats() {ProcessStats.Cpu cpu = new ProcessStats.Cpu(getProcessCpuPercent(), getProcessCpuTotalTime());
        ProcessStats.Mem mem = new ProcessStats.Mem(getTotalVirtualMemorySize());
        return new ProcessStats(System.currentTimeMillis(), getOpenFileDescriptorCount(), getMaxFileDescriptorCount(), cpu, mem);
    }

    /**
     * Returns a given method of the OperatingSystemMXBean,
     * or null if the method is not found or unavailable.
     */
    private static Method getMethod(String methodName) {
        try {return Class.forName("com.sun.management.OperatingSystemMXBean").getMethod(methodName);
        } catch (Exception t) {
            // not available
            return null;
        }
    }

    /**
     * Returns a given method of the UnixOperatingSystemMXBean,
     * or null if the method is not found or unavailable.
     */
    private static Method getUnixMethod(String methodName) {
        try {return Class.forName("com.sun.management.UnixOperatingSystemMXBean").getMethod(methodName);
        } catch (Exception t) {
            // not available
            return null;
        }
    }
}
  • ProcessProbe 使用 static 代码块反射获取了 getMaxFileDescriptorCountField、getOpenFileDescriptorCountField、getProcessCpuLoad、getProcessCpuTime、getCommittedVirtualMemorySize 这几个 method
  • getMaxFileDescriptorCountField、getOpenFileDescriptorCountField 使用 getUnixMethod 方法,从 com.sun.management.UnixOperatingSystemMXBean 获取
  • getProcessCpuLoad、getProcessCpuTime、getCommittedVirtualMemorySize 使用 getMethod 方法,从 com.sun.management.OperatingSystemMXBean 获取
  • getMaxFileDescriptorCount、getOpenFileDescriptorCount、getProcessCpuTotalTime、getTotalVirtualMemorySize 方法首先都判断对应的 method 是否为 null,如果为 null 则返回 -1,否则则反射获取对应的值,出现异常的话,返回 -1
  • processStats 方法返回 ProcessStats,它由 ProcessStats.Cpu、ProcessStats.Mem、getOpenFileDescriptorCount()、getMaxFileDescriptorCount() 构成

小结

  • ProcessProbe 使用 static 代码块反射获取了 getMaxFileDescriptorCountField、getOpenFileDescriptorCountField、getProcessCpuLoad、getProcessCpuTime、getCommittedVirtualMemorySize 这几个 method
  • getMaxFileDescriptorCount、getOpenFileDescriptorCount、getProcessCpuTotalTime、getTotalVirtualMemorySize 方法首先都判断对应的 method 是否为 null,如果为 null 则返回 -1,否则则反射获取对应的值,出现异常的话,返回 -1
  • processStats 方法返回 ProcessStats,它由 ProcessStats.Cpu、ProcessStats.Mem、getOpenFileDescriptorCount()、getMaxFileDescriptorCount() 构成

doc

  • ProcessProbe
退出移动版