MetricsBlasterPlugin.java :  » Science » Cougaar12_4 » org » cougaar » core » qos » metrics » Java Open Source

Java Open Source » Science » Cougaar12_4 
Cougaar12_4 » org » cougaar » core » qos » metrics » MetricsBlasterPlugin.java
/*
 * <copyright>
 *  
 *  Copyright 1997-2004 BBNT Solutions, LLC
 *  under sponsorship of the Defense Advanced Research Projects
 *  Agency (DARPA).
 * 
 *  You can redistribute this software and/or modify it under the
 *  terms of the Cougaar Open Source License as published on the
 *  Cougaar Open Source Website (www.cougaar.org).
 * 
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *  
 * </copyright>
 */

package org.cougaar.core.qos.metrics;

import java.util.Observable;
import java.util.Observer;

import org.cougaar.core.component.ServiceBroker;
import org.cougaar.core.service.ThreadService;
import org.cougaar.core.thread.Schedulable;

/**
 * This test Plugin publishes data into the MetricsUpdateService at
 * high rates and subscribes to formulas using that data.  The
 * arguments are <code>key</code> (the publish key) and
 * <code>path</code> (the subscription path).
 */
public class MetricsBlasterPlugin
    extends org.cougaar.core.plugin.ParameterizedPlugin
    implements Observer
{
    
    private MetricsUpdateService update;
    private MetricsService svc;
    private ThreadService tsvc;

    private String key,path;
  
    private long callbackCount =0;
    private long blastCount=0;
    private long lastCallbackDelay=0;
    private long lastPrintTime=0;

    private int restCount = 0;
    private Schedulable blastTask;
    private Schedulable restTask;
  

    private void dumpCounters(long now) {
  if (1000 <  (now - lastPrintTime)){
      System.out.println("blast count=" +blastCount+
             " callback count=" +callbackCount+
             " Last delay=" +lastCallbackDelay);
      lastPrintTime=now;
  }
    }

    public void execute() {
    }

    public void setupSubscriptions() {
    }


    public void load() {
  super.load();

  ServiceBroker sb = getServiceBroker();
  update = (MetricsUpdateService)
      sb.getService(this, MetricsUpdateService.class, null);
  svc = (MetricsService)
      sb.getService(this, MetricsService.class, null);
  tsvc = (ThreadService)
      sb.getService(this, ThreadService.class, null);

  path = getParameter("path");
  if (path != null) {
      svc.subscribeToValue(path, this);
      System.out.println("Subscribed to " +path);


      key = getParameter("key");
      if (key !=null) {
    System.out.println("Blasting to " +key);
    Blast blast = new Blast();
    blastTask = tsvc.getThread(this, blast, "Blaster");
    blastTask.schedule(10000);
      }

  }
    }


    public void update(Observable o, Object arg) {
  callbackCount++;
  long now = System.currentTimeMillis();
  long value = ((Metric) arg).longValue();
  lastCallbackDelay = now - value;
    }

    private class Blast implements Runnable {
  public void run() {
      System.out.println("Starting Blaster");
      long startTime =  System.currentTimeMillis();
      long startBlast = blastCount;
      long startCallback = callbackCount;

      long now = startTime;
      // Blast for 5 seconds and then stop
      while (5000 > (now-startTime)) {
    now =  System.currentTimeMillis();
    Metric m = new MetricImpl(new Long(now),
            0.3,
            "", "MetricsTestAspect");
    update.updateValue(key, m);
    blastCount++;
    dumpCounters(now);
      }
      float deltaBlasts = (blastCount-startBlast);
      float deltaCallback = (callbackCount-startCallback);
      long deltaTime = now - startTime;
      float blastRate = deltaBlasts/deltaTime;
      float callbackRate = deltaCallback/deltaTime;
      float callbackPercent = deltaBlasts > 0 ? 
    (100*deltaCallback)/deltaBlasts :
    0.0f;
      System.out.println("Stopped Blaster:" +
             "blasts/millisec =" +  blastRate +
             "callback/millisec =" +  callbackRate +
             " Callback % =" + callbackPercent);

      restCount = 0;
      Rest rest = new Rest();
      restTask = tsvc.getThread(this, rest, "Rest");
      restTask.schedule(0, 1000);
  }
    }

    private class Rest implements Runnable {
  public void run() {
      dumpCounters(System.currentTimeMillis());
      if (restCount++ == 10) {
    restTask.cancelTimer();
    blastTask.start();
      }
  }
    }


}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.