package com.sohu.cache.util; import java.io.File; import java.security.CodeSource; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.sohu.cache.server.data.OS; /** * nmon文件存储工厂 */ public class NMONFileFactory { private static final Logger logger = LoggerFactory.getLogger(NMONFileFactory.class); public static final String NMON_PATH = "/nmon"; public static final String NMON_DIR_PATH = "nmon.dir"; public static final String FILE = "file"; //nmon文件存储 key为OSType_ProcessorArchitecture_DistributionType private static final Map<String, File> nmonFileMap = new HashMap<String, File>(); static { init(); } /** * 初始化nmon文件 */ private static void init() { try { String path = System.getProperty(NMON_DIR_PATH); if(path == null) { String classpath = null; try { CodeSource codeSource = NMONFileFactory.class.getProtectionDomain().getCodeSource(); classpath = codeSource.getLocation().getPath(); if(classpath.startsWith(FILE)) { //like that: file:/opt/app/cachecloud/cachecloud-web-1.0-SNAPSHOT.war!/WEB-INF/classes!/ classpath = classpath.substring(FILE.length()+1); } if(new File(classpath).isDirectory()) { path = classpath+"../.."+NMON_PATH; } else { //like that: /opt/app/cachecloud/cachecloud-web-1.0-SNAPSHOT.war!/WEB-INF/classes!/ String[] tmp = classpath.split("!/", 2); path = tmp[0].substring(0, tmp[0].lastIndexOf("/"))+NMON_PATH; } } catch (Exception e) { logger.error(classpath, e); } } File nmonDir = new File(path); if(!nmonDir.exists()) { logger.error("{} path not exist", nmonDir.getAbsolutePath()); return; } //获取操作系统目录 File[] osDirs = nmonDir.listFiles(); if(osDirs == null) { logger.error("{} not contains OS folders", nmonDir.getAbsolutePath()); return; } for(File osDir : osDirs) { //获取处理器架构目录 File[] archFiles = osDir.listFiles(); if(archFiles == null) { logger.info("{} not contains architecture folders", osDir.getName()); continue; } for(File archDir : archFiles) { //获取nmon文件目录 File[] nmonFiles = archDir.listFiles(); if(nmonFiles == null) { logger.info("{} not contains nomon files", archDir.getName()); continue; } for(File nmonFile : nmonFiles) { nmonFileMap.put(osDir.getName() + "_" + archDir.getName() + "_" + nmonFile.getName() , nmonFile); } logger.info("init {} {} nmon file size="+nmonFiles.length, osDir.getName(), archDir.getName()); } } logger.info("init {} finished, os size={}", nmonDir.getAbsolutePath(), osDirs.length); } catch (Exception e) { logger.error("init nmon factory", e); } } /** * 根据OS信息获取对应版本的NMON文件 * @param os * @return File */ public static File getNMONFile(OS os) { String key = os.getOsType().getValue() + "_" + os.getProcessorArchitecture().getValue() + "_" + os.getDistributionType().getNmonName() + os.getDistributionVersion().getValue(); return nmonFileMap.get(key); } }