001: /*
002: * <copyright>
003: *
004: * Copyright 2002-2007 BBNT Solutions, LLC
005: * under sponsorship of the Defense Advanced Research Projects
006: * Agency (DARPA).
007: *
008: * You can redistribute this software and/or modify it under the
009: * terms of the Cougaar Open Source License as published on the
010: * Cougaar Open Source Website (www.cougaar.org).
011: *
012: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
013: * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
014: * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
015: * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
016: * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
017: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
018: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
019: * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
020: * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
021: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
022: * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
023: *
024: * </copyright>
025: */
026:
027: package org.cougaar.qos.qrs.sysstat;
028:
029: import java.util.ArrayList;
030: import java.util.HashMap;
031: import java.util.List;
032: import java.util.Map;
033:
034: import org.cougaar.qos.qrs.CorbaUtils;
035: import org.cougaar.qos.qrs.DataInterpreter;
036: import org.cougaar.qos.qrs.DataValue;
037: import org.cougaar.qos.qrs.Logging;
038: import org.cougaar.qos.qrs.RSSUtils;
039: import org.cougaar.qos.qrs.SimpleQueueingDataFeed;
040: import org.cougaar.util.log.Logger;
041:
042: /**
043: * Supply syststat data directly to an existing DataFeed. This has nothing to do
044: * with TypedEventChannels at all but it shares the systat code...
045: */
046: public class DirectSysStatSupplier {
047: // "Jips" is no longer a default
048: static final String[] DefaultKinds = { "Memory", "CPU",
049: "LoadAverage", "Sockets", "CPUCount" };
050:
051: private final List<SysStatHandler> handlers;
052: private Task task;
053: private final SimpleQueueingDataFeed feed;
054: private final Interpreter interpreter = new Interpreter();
055: private final Map<String, DataValue> map = new HashMap<String, DataValue>();
056:
057: private static class Interpreter implements
058: DataInterpreter<DataValue> {
059: public double getCredibility(DataValue x) {
060: return x.getCredibility();
061: }
062:
063: public DataValue getDataValue(DataValue x) {
064: return x;
065: }
066: }
067:
068: public DirectSysStatSupplier(String kinds[],
069: SimpleQueueingDataFeed feed) {
070: this .feed = feed;
071:
072: String host = CorbaUtils.hostaddr();
073: if (kinds == null) {
074: kinds = DefaultKinds;
075: }
076: handlers = new ArrayList<SysStatHandler>();
077: for (String element : kinds) {
078: try {
079: handlers.add(SysStatHandler
080: .getHandler(element, host, 0));
081: } catch (SysStatHandler.NoSysStatHandler err) {
082: Logger logger = Logging
083: .getLogger(DirectSysStatSupplier.class);
084: logger.warn(err.getMessage());
085: }
086: }
087: }
088:
089: public void addProcessSuppliers(int pid) {
090: String host = CorbaUtils.hostaddr();
091:
092: synchronized (handlers) {
093: try {
094: handlers.add(SysStatHandler.getHandler("ProcessStats",
095: host, pid));
096: } catch (SysStatHandler.NoSysStatHandler err) {
097: Logger logger = Logging
098: .getLogger(DirectSysStatSupplier.class);
099: logger.warn(err.getMessage());
100: }
101: }
102: }
103:
104: private class Task implements Runnable {
105: public void run() {
106: map.clear();
107: Logger logger = Logging
108: .getLogger(DirectSysStatSupplier.class);
109: synchronized (handlers) {
110: for (SysStatHandler handler : handlers) {
111: if (handler == null) {
112: continue;
113: }
114: try {
115: handler.getData(map);
116: } catch (RuntimeException e) {
117: logger.warn("Handler " + handler + " failed "
118: + e.getMessage());
119: }
120: }
121: }
122:
123: for (Map.Entry<String, DataValue> entry : map.entrySet()) {
124: String key = entry.getKey();
125: DataValue value = entry.getValue();
126: if (logger.isInfoEnabled()) {
127: logger.info(key + "=" + value);
128: }
129: feed.newData(key, value, interpreter);
130: }
131: }
132: }
133:
134: public synchronized void schedule(int interval) {
135: if (task != null) {
136: return;
137: }
138: task = new Task();
139: RSSUtils.schedule(task, 0, interval);
140: }
141:
142: }
|