001: package org.cougaar.core.qos.profile;
002:
003: import java.lang.reflect.*;
004: import java.io.*;
005: import java.text.*;
006: import java.util.*;
007: import java.util.regex.*;
008: import org.cougaar.core.agent.*;
009: import org.cougaar.core.component.*;
010: import org.cougaar.core.mts.*;
011: import org.cougaar.core.node.*;
012: import org.cougaar.core.qos.metrics.*;
013: import org.cougaar.core.service.*;
014: import org.cougaar.core.service.wp.*;
015: import org.cougaar.core.thread.*;
016: import org.cougaar.core.wp.resolver.*;
017: import org.cougaar.util.*;
018:
019: /**
020: * This component profiles the message traffic (message count and
021: * byte count) of each local agents to any target.
022: * <p>
023: * I.e. FROM (a specific local agent) TO (any remote target)
024: * <p>
025: * For example, the messaging for AgentA would look like:<pre>
026: * tl_AgentA - #count, bytes
027: * tl_AgentA - 15802, 20273716
028: * </pre>
029: *
030: * @see ProfilerCoordinator required coordinator component
031: */
032: public class LocalTraffic extends ProfilerBase {
033: private static final String[] FIELDS = new String[] { "count",
034: "bytes", };
035: private static final String HEADER = toHeader(FIELDS);
036: private static final String ALIGN = "0, 0";
037: private final Map logs = new HashMap();
038:
039: public AgentStatusService as;
040: public Object mtrs;
041:
042: public void load() {
043: super .load();
044: findServiceLater("as",
045: "org.cougaar.core.mts.AgentStatusService");
046: findServiceLater("mtrs",
047: "org.cougaar.mts.base.MessageTransportRegistryService");
048: }
049:
050: public void run() {
051: logTraffic();
052: }
053:
054: private void logTraffic() {
055: for (Iterator iter = getLocalSenders(); iter.hasNext();) {
056: MessageAddress t = (MessageAddress) iter.next();
057: AgentStatusService.AgentState state = as
058: .getLocalAgentState(t);
059: if (state != null) {
060: getLog(t).shout(
061: state.deliveredCount + ", "
062: + state.deliveredBytes);
063: }
064: }
065: }
066:
067: private LoggingService getLog(MessageAddress addr) {
068: LoggingService log;
069: synchronized (logs) {
070: log = (LoggingService) logs.get(addr);
071: if (log == null) {
072: String as = addr.getAddress().replace('.', '_');
073: String key = "tl_" + as;
074: log = (LoggingService) sb.getService(
075: "org.cougaar.core.qos.profile.local_traffic."
076: + key, LoggingService.class, null);
077: logs.put(addr, log);
078: if (header) {
079: log.shout(HEADER);
080: }
081: if (align) {
082: for (int i = 0, n = getRunCount(); i < n; i++) {
083: log.shout("0, 0");
084: }
085: }
086: }
087: }
088: return log;
089: }
090:
091: private Iterator getLocalSenders() {
092: try {
093: Class cl = Class
094: .forName("org.cougaar.mts.base.MessageTransportRegistryService");
095: Method m = cl.getMethod("findLocalMulticastReceivers",
096: new Class[] { MulticastMessageAddress.class });
097: final MulticastMessageAddress mma = MulticastMessageAddress
098: .getMulticastMessageAddress("dummy");
099: return (Iterator) m.invoke(mtrs, new Object[] { mma });
100: } catch (Exception e) {
101: System.err.println("findLocalMulticastReceivers failed: "
102: + e);
103: return Collections.EMPTY_SET.iterator();
104: }
105: }
106: }
|