diff --git a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzer.java b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzer.java index a38ee297a688217013fa696fb50fde98404bd948..75f76b2fe60fa074cf5bd90ebe62c894e8c26e61 100644 --- a/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzer.java +++ b/cat-consumer/src/main/java/com/dianping/cat/consumer/heartbeat/HeartbeatAnalyzer.java @@ -24,7 +24,8 @@ import com.dianping.cat.message.Message; import com.dianping.cat.message.Transaction; import com.dianping.cat.message.spi.AbstractMessageAnalyzer; import com.dianping.cat.message.spi.MessageTree; -import com.dianping.cat.status.model.entity.DiskSpaceInfo; +import com.dianping.cat.status.model.entity.DiskInfo; +import com.dianping.cat.status.model.entity.DiskVolumeInfo; import com.dianping.cat.status.model.entity.MemoryInfo; import com.dianping.cat.status.model.entity.MessageInfo; import com.dianping.cat.status.model.entity.StatusInfo; @@ -79,11 +80,79 @@ public class HeartbeatAnalyzer extends AbstractMessageAnalyzer return report; } + private DiskVolumeInfo getDefaultDiskVolume(DiskInfo diskInfo) { + DiskVolumeInfo root = null; + + for (DiskVolumeInfo volume : diskInfo.getDiskVolumes()) { + String id = volume.getId(); + + if (id.startsWith("/data")) { // for production + return volume; + } else if (id.equals("/")) { + root = volume; + } + } + + if (root != null) { + return root; + } else { + // return first system volume for Windows + return diskInfo.getDiskVolumes().get(0); + } + } + @Override public Set getDomains() { return m_reports.keySet(); } + private Period getHeartBeatInfo(Heartbeat heartbeat) { + String xml = (String) heartbeat.getData(); + StatusInfo info = null; + + try { + info = new com.dianping.cat.status.model.transform.DefaultXmlParser().parse(xml); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(heartbeat.getTimestamp()); + int minute = cal.get(Calendar.MINUTE); + Period period = new Period(minute); + + try { + ThreadsInfo thread = info.getThread(); + period.setThreadCount(thread.getCount()); + period.setDaemonCount(thread.getDaemonCount()); + period.setTotalStartedCount((int) thread.getTotalStartedCount()); + period.setCatThreadCount(thread.getCatThreadCount()); + period.setPigeonThreadCount(thread.getPigeonThreadCount()); + + MessageInfo catInfo = info.getMessage(); + period.setCatMessageProduced((int) catInfo.getProduced()); + period.setCatMessageOverflow((int) catInfo.getOverflowed()); + period.setCatMessageSize(catInfo.getBytes()); + + MemoryInfo memeryInfo = info.getMemory(); + DiskInfo diskInfo = info.getDisk(); + DiskVolumeInfo volumeInfo = getDefaultDiskVolume(diskInfo); + + period.setGcCount((int) info.getMemory().getGc().getCount()); + period.setHeapUsage(memeryInfo.getHeapUsage()); + period.setNoneHeapUsage(memeryInfo.getNonHeapUsage()); + period.setDiskFree(volumeInfo.getFree()); + period.setDiskUseable(volumeInfo.getUsable()); + period.setSystemLoadAverage(info.getOs().getSystemLoadAverage()); + + } catch (Exception e) { + e.printStackTrace(); + } + + return period; + } + public HeartbeatReport getReport(String domain) { HeartbeatReport report = m_reports.get(domain); @@ -143,11 +212,12 @@ public class HeartbeatAnalyzer extends AbstractMessageAnalyzer private int processHeartbeat(HeartbeatReport report, Heartbeat heartbeat, MessageTree tree) { String ip = tree.getIpAddress(); - Period period = getHeartBeatInfo(heartbeat); + if (period != null) { report.findOrCreateMachine(ip).getPeriods().add(period); } + return 1; } @@ -176,49 +246,6 @@ public class HeartbeatAnalyzer extends AbstractMessageAnalyzer loadReports(); } - private Period getHeartBeatInfo(Heartbeat heartbeat) { - String xml = (String) heartbeat.getData(); - StatusInfo info = null; - try { - info = new com.dianping.cat.status.model.transform.DefaultXmlParser().parse(xml); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - Calendar cal = Calendar.getInstance(); - cal.setTimeInMillis(heartbeat.getTimestamp()); - int minute = cal.get(Calendar.MINUTE); - - Period period = new Period(minute); - try { - ThreadsInfo thread = info.getThread(); - period.setThreadCount(thread.getCount()); - period.setDaemonCount(thread.getDaemonCount()); - period.setTotalStartedCount((int) thread.getTotalStartedCount()); - period.setCatThreadCount(thread.getCatThreadCount()); - period.setPigeonThreadCount(thread.getPigeonThreadCount()); - - MessageInfo catInfo = info.getMessage(); - period.setCatMessageProduced((int) catInfo.getProduced()); - period.setCatMessageOverflow((int) catInfo.getOverflowed()); - period.setCatMessageSize(catInfo.getBytes()); - - DiskSpaceInfo diskInfo = info.getDiskSpace(); - MemoryInfo memeryInfo = info.getMemory(); - - period.setGcCount((int)info.getMemory().getGc().getCount()); - period.setHeapUsage(memeryInfo.getHeapUsage()); - period.setNoneHeapUsage(memeryInfo.getNonHeapUsage()); - period.setDiskFree(diskInfo.getFree()); - period.setDiskUseable(diskInfo.getUsable()); - period.setSystemLoadAverage(info.getOs().getSystemLoadAverage()); - - } catch (Exception e) { - e.printStackTrace(); - } - return period; - } - private void storeMessage(MessageTree tree) { String messageId = tree.getMessageId(); String domain = tree.getDomain(); diff --git a/cat-core/src/main/java/com/dianping/cat/configuration/ServerConfigManager.java b/cat-core/src/main/java/com/dianping/cat/configuration/ServerConfigManager.java index a5b545ba3aa07bec908102150cc7c2c484392a70..e0e917198cfe12ee04c796be2dd7664f0ca09ab8 100644 --- a/cat-core/src/main/java/com/dianping/cat/configuration/ServerConfigManager.java +++ b/cat-core/src/main/java/com/dianping/cat/configuration/ServerConfigManager.java @@ -25,7 +25,7 @@ import com.site.helper.Threads.Task; public class ServerConfigManager implements LogEnabled { private ServerConfig m_config; - private List m_listeners = new ArrayList(); + private List m_listeners = new ArrayList(); private Logger m_logger; @@ -189,6 +189,12 @@ public class ServerConfigManager implements LogEnabled { } } + public void onRefresh(ServiceConfigSupport listener) { + if (!m_listeners.contains(listener)) { + m_listeners.add(listener); + } + } + private long toLong(String str, long defaultValue) { long value = 0; int len = str == null ? 0 : str.length(); @@ -212,14 +218,8 @@ public class ServerConfigManager implements LogEnabled { } } - public void onRefresh(Listener listener) { - if (!m_listeners.contains(listener)) { - m_listeners.add(listener); - } - } - - public static interface Listener { - public void onRefresh(ServerConfigManager manager); + public static interface ServerConfigKey { + public void add(String section); } static class ServerConfigReloader implements Task { @@ -231,6 +231,17 @@ public class ServerConfigManager implements LogEnabled { m_file = file; } + @Override + public String getName() { + return "ServerConfigReloader"; + } + + private boolean isActive() { + synchronized (this) { + return m_active; + } + } + @Override public void run() { while (isActive()) { @@ -246,17 +257,6 @@ public class ServerConfigManager implements LogEnabled { } } - private boolean isActive() { - synchronized (this) { - return m_active; - } - } - - @Override - public String getName() { - return "ServerConfigReloader"; - } - @Override public void shutdown() { synchronized (this) { @@ -264,4 +264,10 @@ public class ServerConfigManager implements LogEnabled { } } } + + public static interface ServiceConfigSupport { + public void buildKey(ServerConfigManager manager, ServerConfigKey key); + + public void configure(ServerConfigManager manager, boolean firstTime); + } } diff --git a/cat-core/src/main/java/com/dianping/cat/status/StatusInfoCollector.java b/cat-core/src/main/java/com/dianping/cat/status/StatusInfoCollector.java index 887feafb43a29c1cad932750b61fd8baa1242ecd..d639af4ed883631e5dc5930f39d6808a1432d08c 100644 --- a/cat-core/src/main/java/com/dianping/cat/status/StatusInfoCollector.java +++ b/cat-core/src/main/java/com/dianping/cat/status/StatusInfoCollector.java @@ -13,7 +13,8 @@ import java.util.List; import java.util.TreeMap; import com.dianping.cat.message.spi.MessageStatistics; -import com.dianping.cat.status.model.entity.DiskSpaceInfo; +import com.dianping.cat.status.model.entity.DiskInfo; +import com.dianping.cat.status.model.entity.DiskVolumeInfo; import com.dianping.cat.status.model.entity.GcInfo; import com.dianping.cat.status.model.entity.MemoryInfo; import com.dianping.cat.status.model.entity.MessageInfo; @@ -30,20 +31,22 @@ class StatusInfoCollector extends BaseVisitor { m_statistics = statistics; } - int countThreadsByPrefix(ThreadInfo[] threads, String prefix) { + int countThreadsByPrefix(ThreadInfo[] threads, String... prefixes) { int count = 0; for (ThreadInfo thread : threads) { - if (thread.getThreadName().startsWith(prefix)) { - count++; + for (String prefix : prefixes) { + if (thread.getThreadName().startsWith(prefix)) { + count++; + } } } return count; } - long getGcCount(List mxbeans) { - long count = 0; + int getGcCount(List mxbeans) { + int count = 0; for (GarbageCollectorMXBean mxbean : mxbeans) { if (mxbean.isValid()) { @@ -102,12 +105,23 @@ class StatusInfoCollector extends BaseVisitor { } @Override - public void visitDiskSpace(DiskSpaceInfo diskSpace) { - File workingDir = new File("."); + public void visitDisk(DiskInfo disk) { + File[] roots = File.listRoots(); + + for (File root: roots) { + disk.addDiskVolume(new DiskVolumeInfo(root.getAbsolutePath())); + } + + super.visitDisk(disk); + } + + @Override + public void visitDiskVolume(DiskVolumeInfo diskVolume) { + File volume = new File(diskVolume.getId()); - diskSpace.setTotal(workingDir.getTotalSpace()); - diskSpace.setFree(workingDir.getFreeSpace()); - diskSpace.setUsable(workingDir.getUsableSpace()); + diskVolume.setTotal(volume.getTotalSpace()); + diskVolume.setFree(volume.getFreeSpace()); + diskVolume.setUsable(volume.getUsableSpace()); } @Override @@ -176,7 +190,7 @@ class StatusInfoCollector extends BaseVisitor { public void visitStatus(StatusInfo status) { status.setTimestamp(new Date()); status.setOs(new OsInfo()); - status.setDiskSpace(new DiskSpaceInfo()); + status.setDisk(new DiskInfo()); status.setRuntime(new RuntimeInfo()); status.setMemory(new MemoryInfo()); status.setThread(new ThreadsInfo()); @@ -193,9 +207,10 @@ class StatusInfoCollector extends BaseVisitor { thread.setCount(bean.getThreadCount()); thread.setDaemonCount(bean.getDaemonThreadCount()); thread.setPeekCount(bean.getPeakThreadCount()); - thread.setTotalStartedCount(bean.getTotalStartedThreadCount()); + thread.setTotalStartedCount((int) bean.getTotalStartedThreadCount()); thread.setCatThreadCount(countThreadsByPrefix(threads, "Cat-")); - thread.setPigeonThreadCount(countThreadsByPrefix(threads, "Pigeon-")); + thread.setPigeonThreadCount(countThreadsByPrefix(threads, "Pigeon-", "DPSF-", "Netty-", + "Client-ResponseProcessor")); thread.setDump(getThreadDump(threads)); } } \ No newline at end of file diff --git a/cat-core/src/main/resources/META-INF/dal/model/status-codegen.xml b/cat-core/src/main/resources/META-INF/dal/model/status-codegen.xml index dc4807a79405fae828057a06a58dd7ec789d5c7c..f503b6927070ad918578ed559a14d5b99a5d593d 100644 --- a/cat-core/src/main/resources/META-INF/dal/model/status-codegen.xml +++ b/cat-core/src/main/resources/META-INF/dal/model/status-codegen.xml @@ -4,7 +4,7 @@ - + @@ -26,10 +26,14 @@ - - - - + + + + + + + + diff --git a/cat-core/src/main/resources/META-INF/dal/model/status-model.xml b/cat-core/src/main/resources/META-INF/dal/model/status-model.xml index 40f6d15bdd0c28e1364e537f1b06280ad2642d8f..0e45ab8c1554bcf3f886f38223b3ace973039f52 100644 --- a/cat-core/src/main/resources/META-INF/dal/model/status-model.xml +++ b/cat-core/src/main/resources/META-INF/dal/model/status-model.xml @@ -16,11 +16,15 @@ - - - - - + + + + + + + + + @@ -29,16 +33,16 @@ - + - - - + + + diff --git a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/FileSystemManager.java b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/FileSystemManager.java index 4ad894141bf78d21a4a0b586bfd466c00385a024..a483416312715ce4d7c84dcfeced66ed91e5c81e 100644 --- a/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/FileSystemManager.java +++ b/cat-hadoop/src/main/java/com/dianping/cat/hadoop/hdfs/FileSystemManager.java @@ -86,7 +86,8 @@ public class FileSystemManager implements Initializable { // For MAC OS X // -Djava.security.krb5.realm=OX.AC.UK // -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk - System.setProperty("java.security.krb5.realm", getValue(properties, "java.security.krb5.realm", "DIANPING.COM")); + System.setProperty("java.security.krb5.realm", + getValue(properties, "java.security.krb5.realm", "DIANPING.COM")); System.setProperty("java.security.krb5.kdc", getValue(properties, "java.security.krb5.kdc", "192.168.7.80")); UserGroupInformation.setConfiguration(config); @@ -109,11 +110,14 @@ public class FileSystemManager implements Initializable { @Override public void initialize() throws InitializationException { m_defaultBaseDir = m_configManager.getHdfsLocalBaseDir("hdfs"); - try { - m_config = getHdfsConfiguration(); - SecurityUtil.login(m_config, "dfs.cat.keytab.file", "dfs.cat.kerberos.principal"); - } catch (IOException e) { - throw new InitializationException("init FileSystemManager fail", e); + + if (!m_configManager.isLocalMode()) { + try { + m_config = getHdfsConfiguration(); + SecurityUtil.login(m_config, "dfs.cat.keytab.file", "dfs.cat.kerberos.principal"); + } catch (IOException e) { + throw new InitializationException("init FileSystemManager fail", e); + } } } }