LISTSERV mailing list manager LISTSERV 16.5

Help for HPS-SVN Archives


HPS-SVN Archives

HPS-SVN Archives


HPS-SVN@LISTSERV.SLAC.STANFORD.EDU


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

HPS-SVN Home

HPS-SVN Home

HPS-SVN  March 2015

HPS-SVN March 2015

Subject:

r2466 - in /java/trunk/monitoring-util/src/main/java/org/hps/monitoring: plotting/MonitoringPlotFactory.java plotting/StripChartBuilder.java subsys/SystemStatistics.java subsys/SystemStatisticsImpl.java subsys/et/EtSystemStripCharts.java

From:

[log in to unmask]

Reply-To:

Notification of commits to the hps svn repository <[log in to unmask]>

Date:

Mon, 16 Mar 2015 21:43:01 -0000

Content-Type:

text/plain

Parts/Attachments:

Parts/Attachments

text/plain (632 lines)

Author: [log in to unmask]
Date: Mon Mar 16 14:42:56 2015
New Revision: 2466

Log:
Cleanup ET system strip chart code.

Modified:
    java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/MonitoringPlotFactory.java
    java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartBuilder.java
    java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatistics.java
    java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatisticsImpl.java
    java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemStripCharts.java

Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/MonitoringPlotFactory.java
 =============================================================================
--- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/MonitoringPlotFactory.java	(original)
+++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/MonitoringPlotFactory.java	Mon Mar 16 14:42:56 2015
@@ -164,7 +164,7 @@
             RegularTimePeriod timeBase,
             ValueProvider valueProvider,
             long rangeView) {
-        StripChartUpdater updater = StripChartBuilder.createStripChart(
+        StripChartUpdater updater = StripChartBuilder.createDynamicTimeSeriesChart(
                 name, 
                 rangeLabel, 
                 seriesCount, 
@@ -216,6 +216,17 @@
         return stripChart;
     }       
     
+    public JFreeChart createTimeSeriesChart(
+            String title, 
+            String yAxisLabel, 
+            int seriesCount,
+            String[] datasetNames,
+            double rangeSize) {
+        JFreeChart chart = StripChartBuilder.createTimeSeriesChart(title, yAxisLabel, seriesCount, datasetNames, rangeSize);
+        addChart(chart);
+        return chart;
+    }
+    
     /**
      * Get the global registry of plotters.
      * @return The global plotter registry.

Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartBuilder.java
 =============================================================================
--- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartBuilder.java	(original)
+++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartBuilder.java	Mon Mar 16 14:42:56 2015
@@ -26,12 +26,12 @@
      * @param valueProvider The interface for providing values.
      * @return The StripChartUpdater for the chart.
      */
-    static StripChartUpdater createStripChart(
+    static StripChartUpdater createDynamicTimeSeriesChart(
             String name, 
             int seriesCount, 
             RegularTimePeriod timeBase,
             ValueProvider valueProvider) {
-        return createStripChart(name, "Values", seriesCount, null, 9999, timeBase, valueProvider, 10000L);
+        return createDynamicTimeSeriesChart(name, "Values", seriesCount, null, 9999, timeBase, valueProvider, 10000L);
     }
     
     /**
@@ -47,7 +47,7 @@
      * @param rangeView The view in the domain axis around the current data point (milliseconds).
      * @return The StripChartUpdater for the chart.
      */
-    static StripChartUpdater createStripChart(
+    static StripChartUpdater createDynamicTimeSeriesChart(
             String name, 
             String rangeLabel,
             int seriesCount, 
@@ -99,7 +99,7 @@
      * @param maxCount The maximum count of items in the single data set series.
      * @return The chart that was created.
      */
-    public static JFreeChart createTimeSeriesChart(
+    static JFreeChart createTimeSeriesChart(
             String title, 
             String yAxisLabel, 
             int maxAge, 
@@ -149,7 +149,7 @@
      * @param rangeSize The range of values to show for auto-ranging in domain axis (in milliseconds).
      * @return The chart that was created.
      */
-    public static JFreeChart createTimeSeriesChart(
+    static JFreeChart createTimeSeriesChart(
             String title, 
             String yAxisLabel, 
             int seriesCount,

Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatistics.java
 =============================================================================
--- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatistics.java	(original)
+++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatistics.java	Mon Mar 16 14:42:56 2015
@@ -11,13 +11,20 @@
      * Set the desired timer tick length in millis.
      * @param tickLengthMillis The desired tick length in millis.
      */
-    void setTickLengthMillis(long tickLengthMillis);
+    void setNominalTickLengthMillis(long tickLengthMillis);
 
     /**
-     * Get the nominal length of one tick in millis. Actual ticks lengths may vary slightly.
+     * Get the nominal length of one tick in millis.
+     *  Actual tick lengths lengths may vary slightly.
      * @return The nominal tick length in millis.
      */
-    long getTickLengthMillis();
+    long getNominalTickLengthMillis();
+    
+    /**
+     * Get the end of the tick in Unix time (milliseconds since the epoch).
+     * @return The tick end in Unix time.
+     */
+    long getTickEndTimeMillis();
 
     /**
      * Start the timer thread for accumulating statistics.
@@ -40,7 +47,7 @@
      * Get the number of millis since the session started.
      * @return The number of millis since session start.
      */
-    long getTotalElapsedMillis();
+    long getElapsedMillis();
 
     /**
      * Get the Unix start time of the session.
@@ -105,6 +112,13 @@
      * @return The data rate in [bytes/second].
      */
     public double getBytesPerSecond();
+    
+    /**
+     * Get the immediate data rate which is the amount of data in megabytes received in the current tick
+     * over the time elapsed in the tick.
+     * @return The data rate in [bytes/second].
+     */
+    public double getMegabytesPerSecond();
 
     /**
      * Get the number of milliseconds since the last tick.
@@ -123,10 +137,10 @@
      * @param ps The PrintStream for display.
      */
     void printTick(PrintStream ps);
-
+    
     /**
-     * Add subtask which will execute right before a new tick.
-     * @param subtask The subtask to execute.
+     * 
+     * @param listener
      */
-    //void addSubTask(TimerTask subtask);
+    void addSystemStatisticsListener(SystemStatisticsListener listener);   
 }

Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatisticsImpl.java
 =============================================================================
--- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatisticsImpl.java	(original)
+++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatisticsImpl.java	Mon Mar 16 14:42:56 2015
@@ -2,6 +2,8 @@
 
 import java.io.PrintStream;
 import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Timer;
 import java.util.TimerTask;
 
@@ -12,21 +14,28 @@
  */
 public class SystemStatisticsImpl implements SystemStatistics {
 
-    long tickLengthMillis = 1000; // default is 1 second tick
-    long totalElapsedMillis;
+    long nominalTickLengthMillis = 1000; // default is 1 second tick
+    long tickStartTimeMillis;
+    long tickEndTimeMillis;    
+
+    long eventsInTick;
+    long bytesInTick;
+    
+    long elapsedMillis;
     long startTimeMillis;
     long stopTimeMillis;
-    long eventsSinceTick;
-    long bytesSinceTick;
+    
     long totalEvents;
     long totalBytes;
-    long tickStartMillis;
+
     static final long Kb = 1 * 1024;
     static final long Mb = Kb * 1024;
     static final double milliToSecond = 0.001;
     static final DecimalFormat decimalFormat = new DecimalFormat("#.####");
     Timer timer;
     
+    List<SystemStatisticsListener> listeners = new ArrayList<SystemStatisticsListener>();
+    
     @Override
     public void update(int size) {
         addEvent();
@@ -35,18 +44,18 @@
     }
 
     @Override
-    public void setTickLengthMillis(long tickLengthMillis) {
-        this.tickLengthMillis = tickLengthMillis;
-    }
-
-    @Override
-    public long getTickLengthMillis() {
-        return tickLengthMillis;
-    }
-
-    @Override
-    public long getTotalElapsedMillis() {
-        return totalElapsedMillis;
+    public void setNominalTickLengthMillis(long tickLengthMillis) {
+        this.nominalTickLengthMillis = tickLengthMillis;
+    }
+
+    @Override
+    public long getNominalTickLengthMillis() {
+        return nominalTickLengthMillis;
+    }
+
+    @Override
+    public long getElapsedMillis() {
+        return System.currentTimeMillis() - startTimeMillis;
     }
 
     @Override
@@ -61,7 +70,12 @@
     
     @Override
     public long getTickElapsedMillis() {
-        return System.currentTimeMillis() - tickStartMillis;
+        return System.currentTimeMillis() - tickStartTimeMillis;
+    }
+    
+    @Override
+    public long getTickEndTimeMillis() {
+        return tickEndTimeMillis;
     }
 
     /**
@@ -70,7 +84,7 @@
     
     @Override
     public long getEventsReceived() {
-        return eventsSinceTick;
+        return eventsInTick;
     }
      
     @Override
@@ -80,8 +94,8 @@
     
     @Override
     public double getEventsPerSecond() {
-        if (eventsSinceTick > 0 && getTickElapsedMillis() > 0) {
-            return (double) eventsSinceTick / millisToSeconds(getTickElapsedMillis());
+        if (eventsInTick > 0 && getTickElapsedMillis() > 0) {
+            return (double) eventsInTick / millisToSeconds(getTickElapsedMillis());
         } else {
             return 0.;
         }
@@ -90,7 +104,7 @@
     @Override
     public double getAverageEventsPerSecond() {
         try {
-            return Double.parseDouble(decimalFormat.format(totalEvents / millisToSeconds(getTotalElapsedMillis())));
+            return Double.parseDouble(decimalFormat.format(totalEvents / millisToSeconds(getElapsedMillis())));
         } catch (NumberFormatException e) {
             return 0;
         }
@@ -102,7 +116,7 @@
     
     @Override
     public long getBytesReceived() {
-        return bytesSinceTick;
+        return bytesInTick;
     }
     
     @Override
@@ -113,7 +127,7 @@
     @Override
     public double getAverageMegabytesPerSecond() {
         try {
-            return Double.parseDouble(decimalFormat.format(bytesToMb(totalBytes) / millisToSeconds(getTotalElapsedMillis())));
+            return Double.parseDouble(decimalFormat.format(bytesToMb(totalBytes) / millisToSeconds(getElapsedMillis())));
         } catch (NumberFormatException e) {
             return Double.NaN;
         }
@@ -121,28 +135,59 @@
    
     @Override
     public double getBytesPerSecond() {
-        if (bytesSinceTick > 0 && getTickElapsedMillis() > 0)
-            return (double) bytesSinceTick / millisToSeconds(getTickElapsedMillis());
+        if (bytesInTick > 0 && getTickElapsedMillis() > 0)
+            return (double) bytesInTick / millisToSeconds(getTickElapsedMillis());
         else
             return 0.;
     }
-
+    
+    @Override
+    public double getMegabytesPerSecond() {
+        double bytes = getBytesPerSecond();
+        if (bytes > 0) {
+            return bytesToMb(bytes);
+        } else {
+            return 0;
+        }
+    }
+    
     @Override
     public void start() {
 
         // Set session start time variables.
         long currentTimeMillis = System.currentTimeMillis();
         startTimeMillis = currentTimeMillis;
-        tickStartMillis = currentTimeMillis;
-
+        tickStartTimeMillis = currentTimeMillis;
+        
+        // Notify listeners of start.
+        for (SystemStatisticsListener listener : listeners) {
+            listener.started(this);
+        }
+        
         // Start timer task which executes at the nominal tick length to calculate statistics periodically.
         TimerTask task = new TimerTask() {
             public void run() {
+                
+                // End the current tick.
+                endTick();
+               
+                // Start the new tick.
                 nextTick();
             }
         };
         timer = new Timer();
-        timer.schedule(task, 0, tickLengthMillis);
+        timer.schedule(task, 0, nominalTickLengthMillis);
+    }
+    
+    void endTick() {
+ 
+        // Set absolute end time of current tick.
+        this.tickEndTimeMillis = System.currentTimeMillis();
+        
+        // Activate listeners.
+        for (SystemStatisticsListener listener : listeners) {
+            listener.endTick(this);
+        }
     }
 
     @Override
@@ -155,12 +200,21 @@
 
         // Set stop time.
         stopTimeMillis = System.currentTimeMillis();
-    }
-
+        
+        // Notify listeners of stop.
+        for (SystemStatisticsListener listener : listeners) {
+            listener.stopped(this);
+        }
+    }
+    
+    public void addSystemStatisticsListener(SystemStatisticsListener listener) {
+        listeners.add(listener);
+    }    
+    
     @Override
     public void printSession(PrintStream ps) {
         ps.println("session statistics ...");
-        ps.println("  timeElapsedMillis = " + this.getTotalElapsedMillis());
+        ps.println("  timeElapsedMillis = " + this.getElapsedMillis());
         ps.println("  cumulativeEvents = " + this.getTotalEvents());
         ps.println("  averageEventsPerSecond = " + this.getAverageEventsPerSecond());
         ps.println("  averageMegaBytesPerSecond = " + this.getAverageMegabytesPerSecond());
@@ -176,37 +230,42 @@
     }
    
     void addEvent() {
-        eventsSinceTick += 1;
+        eventsInTick += 1;
         totalEvents += 1;
     }
 
     void addData(int size) {
-        bytesSinceTick += size;
+        bytesInTick += size;
         totalBytes += size;
     }
 
     void updateElapsedTime() {
-        totalElapsedMillis = System.currentTimeMillis() - startTimeMillis;
+        elapsedMillis = System.currentTimeMillis() - startTimeMillis;
     }
 
     // Bytes to megabytes to 2 decimal places.
     static final double bytesToMb(long size) {
         return Double.parseDouble(decimalFormat.format((double) size / Mb));
     }
+    
+    // Bytes to megabytes to 2 decimal places.
+    static final double bytesToMb(double size) {
+        return Double.parseDouble(decimalFormat.format(size / Mb));
+    }
 
     static final double millisToSeconds(long millis) {
         return ((double) millis) / 1000.;
     }
 
     synchronized void nextTick() {
-        eventsSinceTick = 0;
-        bytesSinceTick = 0;
-        tickStartMillis = System.currentTimeMillis();
+        eventsInTick = 0;
+        bytesInTick = 0;
+        tickStartTimeMillis = System.currentTimeMillis();
     }
     
     public abstract class SystemStatisticsProvider implements ValueProvider {
     }
-    
+
     public class AverageEventsPerSecondProvider extends SystemStatisticsProvider {
 
         @Override

Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemStripCharts.java
 =============================================================================
--- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemStripCharts.java	(original)
+++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemStripCharts.java	Mon Mar 16 14:42:56 2015
@@ -1,27 +1,53 @@
+/**
+ * 
+ */
 package org.hps.monitoring.subsys.et;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import org.hps.monitoring.plotting.MonitoringPlotFactory;
-import org.hps.monitoring.plotting.StripChartUpdater;
+import org.hps.monitoring.subsys.SystemStatistics;
 import org.hps.monitoring.subsys.SystemStatisticsImpl;
+import org.hps.monitoring.subsys.SystemStatisticsListener;
 import org.hps.record.et.EtEventProcessor;
+import org.jfree.chart.JFreeChart;
 import org.jfree.data.time.Second;
+import org.jfree.data.time.TimeSeriesCollection;
 import org.jlab.coda.et.EtEvent;
 import org.lcsim.util.aida.AIDA;
 
 /**
- * A basic set of strip charts for monitoring the ET system.
+ * This will show a series of strip charts from ET system performance statistics
+ * such as event and data rates.
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
  */
-public final class EtSystemStripCharts extends EtEventProcessor {
+public class EtSystemStripCharts extends EtEventProcessor implements SystemStatisticsListener {
 
+    // The system statistics.
     SystemStatisticsImpl stats = new SystemStatisticsImpl();
-    MonitoringPlotFactory plotFactory = (MonitoringPlotFactory) AIDA.defaultInstance().analysisFactory().createPlotterFactory("ET System Monitoring");
-    List<StripChartUpdater> updaters = new ArrayList<StripChartUpdater>();
     
-    public EtSystemStripCharts() {
-        stats.setTickLengthMillis(1000);
+    // Plotting API.
+    MonitoringPlotFactory plotFactory = 
+            (MonitoringPlotFactory) AIDA.defaultInstance().analysisFactory().createPlotterFactory("ET System Monitoring");
+    
+    // List of charts.
+    List<JFreeChart> charts = new ArrayList<JFreeChart>();
+    
+    // Range size in milliseconds.
+    static final double RANGE_SIZE = 200000;
+    
+    // Chart collection indices.
+    static final int DATA_RATE_COLLECTION_INDEX = 0;    
+    static final int TOTAL_DATA_COLLECTION_INDEX = 1;    
+    static final int EVENT_RATE_COLLECTION_INDEX = 2;
+    static final int TOTAL_EVENTS_COLLECTION_INDEX = 3;
+        
+    public EtSystemStripCharts() {          
+        // Set 2 seconds between statistics updates.
+        stats.setNominalTickLengthMillis(1000);
     }
     
     /**
@@ -29,57 +55,37 @@
      */
     @Override
     public void startJob() {
-
-        // Create the ET system strip charts.
-        createStripCharts();
+        
+        System.out.println("EtSystemStripChartsNew.startJob");
+   
+        // Register this class as a listener to activate update at end of statistics clock tick.
+        stats.addSystemStatisticsListener(this);
 
         // Start systems statistics task.
         stats.start();
     }
 
     /**
-     * 
+     * Create the strip charts for plotting the basic ET system statistics.
      */
     private void createStripCharts() {
-        updaters.add(plotFactory.createStripChart(
-                "Data Rate", 
-                "MB / second", 
-                1, 
-                new String[] { "Data" }, 
-                999, 
-                new Second(), 
-                stats.new MegabytesPerSecondProvider(), 
-                200000L));
+        
+        System.out.println("EtSystemStripChartsNew.createStripCharts");
 
-        updaters.add(plotFactory.createStripChart(
-                "Total Data", 
-                "Megabytes", 
-                1, 
-                new String[] { "Data" },
-                999,
-                new Second(), 
-                stats.new TotalMegabytesProvider(), 
-                200000L));
+        // Data rate in megabytes per second.
+        // TODO: Add to same chart the average MB / second.
+        charts.add(plotFactory.createTimeSeriesChart("Data Rate", "MB / second", 1, null, RANGE_SIZE));
+                
+        // Total megabytes received.
+        charts.add(plotFactory.createTimeSeriesChart("Total Data", "Megabytes", 1, null, RANGE_SIZE));
         
-        updaters.add(plotFactory.createStripChart(
-                "Event Rate", 
-                "Events / s", 
-                1, 
-                new String[] { "Data" }, 
-                999, 
-                new Second(), 
-                stats.new EventsPerSecondProvider(), 
-                200000L));
+        // Event rate in hertz.
+        // TODO: Add to same chart the average event rate.
+        charts.add(plotFactory.createTimeSeriesChart("Event Rate", "Hz", 1, null, RANGE_SIZE));
         
-        updaters.add(plotFactory.createStripChart(
-                "Total Events", 
-                "Number of Events", 
-                1, 
-                new String[] { "Data" }, 
-                999, 
-                new Second(), 
-                stats.new TotalEventsProvider(), 
-                200000L));
+        // Total number of events received.
+        charts.add(plotFactory.createTimeSeriesChart("Total Events", "Number of Events", 1, null, RANGE_SIZE));
+              
     }
 
     @Override
@@ -88,13 +94,39 @@
     }
 
     public void endJob() {
-
-        // Stop the strip chart updaters.
-        for (StripChartUpdater updater : updaters) {
-            updater.stop();
-        }
-        
         // Stop system statistics task.
         stats.stop();
     }
-}
+    
+    TimeSeriesCollection getTimeSeriesCollection(int chartIndex) {
+        return (TimeSeriesCollection) charts.get(chartIndex).getXYPlot().getDataset();
+    }
+
+    /**
+     * Hook for updating the charts at end of statistics clock tick.
+     * @param stats The statistics with the system information.
+     */
+    @Override
+    public void endTick(SystemStatistics stats) {
+        
+        Date now = new Date(stats.getTickEndTimeMillis());
+                
+        getTimeSeriesCollection(DATA_RATE_COLLECTION_INDEX).getSeries(0).addOrUpdate(
+                new Second(now), stats.getBytesPerSecond() / 1000000);
+        getTimeSeriesCollection(TOTAL_DATA_COLLECTION_INDEX).getSeries(0).addOrUpdate(
+                new Second(now), stats.getTotalMegabytes());
+        getTimeSeriesCollection(EVENT_RATE_COLLECTION_INDEX).getSeries(0).addOrUpdate(
+                new Second(now), stats.getEventsPerSecond());
+        getTimeSeriesCollection(TOTAL_EVENTS_COLLECTION_INDEX).getSeries(0).addOrUpdate(
+                new Second(now), stats.getTotalEvents());
+    }
+     
+    @Override
+    public void started(SystemStatistics stats) {
+        createStripCharts();
+    }
+   
+    @Override
+    public void stopped(SystemStatistics stats) {
+    }
+}

Top of Message | Previous Page | Permalink

Advanced Options


Options

Log In

Log In

Get Password

Get Password


Search Archives

Search Archives


Subscribe or Unsubscribe

Subscribe or Unsubscribe


Archives

November 2017
August 2017
July 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013

ATOM RSS1 RSS2



LISTSERV.SLAC.STANFORD.EDU

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager

Privacy Notice, Security Notice and Terms of Use