You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jmeter.apache.org by pm...@apache.org on 2017/01/25 22:20:51 UTC

svn commit: r1780278 - in /jmeter/trunk: src/components/org/apache/jmeter/visualizers/backend/graphite/PickleGraphiteMetricsSender.java src/components/org/apache/jmeter/visualizers/backend/graphite/TextGraphiteMetricsSender.java xdocs/changes.xml

Author: pmouawad
Date: Wed Jan 25 22:20:51 2017
New Revision: 1780278

URL: http://svn.apache.org/viewvc?rev=1780278&view=rev
Log:
Bug 60648 GraphiteBackendListener can lose some metrics at end of test if test is very short
Bugzilla Id: 60648

Modified:
    jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/graphite/PickleGraphiteMetricsSender.java
    jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/graphite/TextGraphiteMetricsSender.java
    jmeter/trunk/xdocs/changes.xml

Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/graphite/PickleGraphiteMetricsSender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/graphite/PickleGraphiteMetricsSender.java?rev=1780278&r1=1780277&r2=1780278&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/graphite/PickleGraphiteMetricsSender.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/graphite/PickleGraphiteMetricsSender.java Wed Jan 25 22:20:51 2017
@@ -52,6 +52,8 @@ class PickleGraphiteMetricsSender extend
         
     private String prefix;
 
+    private final Object lock = new Object();
+
     // graphite expects a python-pickled list of nested tuples.
     private List<MetricTuple> metrics = new LinkedList<>();
 
@@ -91,18 +93,29 @@ class PickleGraphiteMetricsSender extend
             .append(contextName)
             .append(".")
             .append(metricName);
-        metrics.add(new MetricTuple(sb.toString(), timestamp, metricValue));
+        synchronized (lock) {
+            metrics.add(new MetricTuple(sb.toString(), timestamp, metricValue));
+        }
     }
 
     /* (non-Javadoc)
      * @see org.apache.jmeter.visualizers.backend.graphite.GraphiteMetricsSender#writeAndSendMetrics()
      */
     @Override
-    public void writeAndSendMetrics() {        
-        if (metrics.size()>0) {
+    public void writeAndSendMetrics() {    
+        List<MetricTuple> tempMetrics = null;
+        synchronized (lock) {
+            if(metrics.isEmpty()) {
+                return;
+            }
+            tempMetrics = metrics;
+            metrics = new LinkedList<>();            
+        }
+        final List<MetricTuple> copyMetrics = tempMetrics;
+        if (!copyMetrics.isEmpty()) {
             SocketOutputStream out = null;
             try {
-                String payload = convertMetricsToPickleFormat(metrics);
+                String payload = convertMetricsToPickleFormat(copyMetrics);
 
                 int length = payload.length();
                 byte[] header = ByteBuffer.allocate(4).putInt(length).array();
@@ -128,9 +141,9 @@ class PickleGraphiteMetricsSender extend
             // if there was an error, we might miss some data. for now, drop those on the floor and
             // try to keep going.
             if(LOG.isDebugEnabled()) {
-                LOG.debug("Wrote "+ metrics.size() +" metrics");
+                LOG.debug("Wrote "+ copyMetrics.size() +" metrics");
             }
-            metrics.clear();
+            copyMetrics.clear();
         }
     }
 

Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/graphite/TextGraphiteMetricsSender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/graphite/TextGraphiteMetricsSender.java?rev=1780278&r1=1780277&r2=1780278&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/graphite/TextGraphiteMetricsSender.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/graphite/TextGraphiteMetricsSender.java Wed Jan 25 22:20:51 2017
@@ -36,6 +36,8 @@ class TextGraphiteMetricsSender extends
         
     private String prefix;
 
+    private final Object lock = new Object();
+
     private List<MetricTuple> metrics = new ArrayList<>();
 
     private GenericKeyedObjectPool<SocketConnectionInfos, SocketOutputStream> socketOutputStreamPool;
@@ -74,28 +76,39 @@ class TextGraphiteMetricsSender extends
             .append(contextName)
             .append(".")
             .append(metricName);
-        metrics.add(new MetricTuple(sb.toString(), timestamp, metricValue));
+        synchronized (lock) {
+            metrics.add(new MetricTuple(sb.toString(), timestamp, metricValue));            
+        }
     }
 
     /* (non-Javadoc)
      * @see org.apache.jmeter.visualizers.backend.graphite.GraphiteMetricsSender#writeAndSendMetrics()
      */
     @Override
-    public void writeAndSendMetrics() {        
-        if (metrics.size()>0) {
+    public void writeAndSendMetrics() {
+        List<MetricTuple> tempMetrics = null;
+        synchronized (lock) {
+            if(metrics.isEmpty()) {
+                return;
+            }
+            tempMetrics = metrics;
+            metrics = new ArrayList<>(tempMetrics.size());            
+        }
+        final List<MetricTuple> copyMetrics = tempMetrics;
+        if (!copyMetrics.isEmpty()) {
             SocketOutputStream out = null;
             try {
                 out = socketOutputStreamPool.borrowObject(socketConnectionInfos);
                 // pw is not closed as it would close the underlying pooled out
                 PrintWriter pw = new PrintWriter(new OutputStreamWriter(out, CHARSET_NAME), false);
-                for (MetricTuple metric: metrics) {
+                for (MetricTuple metric: copyMetrics) {
                     pw.printf("%s %s %d%n", metric.name, metric.value, Long.valueOf(metric.timestamp));
                 }
                 pw.flush();
                 // if there was an error, we might miss some data. for now, drop those on the floor and
                 // try to keep going.
                 if(LOG.isDebugEnabled()) {
-                    LOG.debug("Wrote "+ metrics.size() +" metrics");
+                    LOG.debug("Wrote "+ copyMetrics.size() +" metrics");
                 }
                 socketOutputStreamPool.returnObject(socketConnectionInfos, out);
             } catch (Exception e) {
@@ -110,7 +123,7 @@ class TextGraphiteMetricsSender extends
                 LOG.error("Error writing to Graphite:"+e.getMessage());
             }
             // We drop metrics in all cases
-            metrics.clear();
+            copyMetrics.clear();
         }
     }
 

Modified: jmeter/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jmeter/trunk/xdocs/changes.xml?rev=1780278&r1=1780277&r2=1780278&view=diff
==============================================================================
--- jmeter/trunk/xdocs/changes.xml [utf-8] (original)
+++ jmeter/trunk/xdocs/changes.xml [utf-8] Wed Jan 25 22:20:51 2017
@@ -128,6 +128,7 @@ JMeter now requires Java 8. Ensure you u
     <li><bug>52962</bug>Allow sorting by columns for View Results in Table, Summary Report, Aggregate Report and Aggregate Graph. Based on a <pr>245</pr> by Logan Mauzaize (logan.mauzaize at gmail.com) and Maxime Chassagneux (maxime.chassagneux at gmail.com).</li>
     <li><bug>60590</bug>BackendListener : Add Influxdb BackendListenerClient implementation to JMeter. Partly based on <pr>246</pr> by Logan Mauzaize (logan.mauzaize at gmail.com) and Maxime Chassagneux (maxime.chassagneux at gmail.com).</li>
     <li><bug>60591</bug>BackendListener : Add a time boxed sampling. Based on a <pr>237</pr> by Logan Mauzaize (logan.mauzaize at gmail.com) and Maxime Chassagneux (maxime.chassagneux at gmail.com).</li>
+    <li><bug>60648</bug>GraphiteBackendListener can lose some metrics at end of test if test is very short</li>
 </ul>
 
 <h3>Timers, Assertions, Config, Pre- &amp; Post-Processors</h3>