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:01:03 UTC

svn commit: r1780273 - in /jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb: HttpMetricsSender.java InfluxdbBackendListenerClient.java InfluxdbMetricsSender.java

Author: pmouawad
Date: Wed Jan 25 22:01:03 2017
New Revision: 1780273

URL: http://svn.apache.org/viewvc?rev=1780273&view=rev
Log:
Bug 60590 BackendListener : Add Influxdb BackendListenerClient implementation to JMeter. 
Fix corruption of ArrayList due to Multi-thread access
Fix timestamp which was computed too late
Bugzilla Id: 60590

Modified:
    jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSender.java
    jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/InfluxdbBackendListenerClient.java
    jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/InfluxdbMetricsSender.java

Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSender.java?rev=1780273&r1=1780272&r2=1780273&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSender.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSender.java Wed Jan 25 22:01:03 2017
@@ -56,6 +56,8 @@ import org.apache.log.Logger;
 class HttpMetricsSender extends AbstractInfluxdbMetricsSender {
     private static final Logger LOG = LoggingManager.getLoggerForClass();
 
+    private final Object lock = new Object();
+
     private List<MetricTuple> metrics = new ArrayList<>();
 
     private HttpPost httpRequest;
@@ -130,7 +132,9 @@ class HttpMetricsSender extends Abstract
 
     @Override
     public void addMetric(String mesurement, String tag, String field) {
-        metrics.add(new MetricTuple(mesurement, tag, field));
+        synchronized (lock) {
+            metrics.add(new MetricTuple(mesurement, tag, field, System.currentTimeMillis()));            
+        }
     }
 
     /**
@@ -139,22 +143,26 @@ class HttpMetricsSender extends Abstract
      */
     @Override
     public void writeAndSendMetrics() {
-        if (!metrics.isEmpty()) {
+        List<MetricTuple> tempMetrics = null;
+        synchronized (lock) {
+            tempMetrics = metrics;
+            metrics = new ArrayList<>();            
+        }
+        final List<MetricTuple> copyMetrics = tempMetrics;
+        if (!copyMetrics.isEmpty()) {
             try {
-               
                 if(httpRequest == null) {
                     httpRequest = createRequest(url);
                 }
-                StringBuilder sb = new StringBuilder(metrics.size()*35);
-                String timestamp = System.currentTimeMillis()  + "000000";
-                for (MetricTuple metric : metrics) {
+                StringBuilder sb = new StringBuilder(copyMetrics.size()*35);
+                for (MetricTuple metric : copyMetrics) {
                     // Add TimeStamp in nanosecond from epoch ( default in InfluxDB )
                     sb.append(metric.measurement)
                         .append(metric.tag)
                         .append(" ") //$NON-NLS-1$
                         .append(metric.field)
                         .append(" ")
-                        .append(timestamp) 
+                        .append(metric.timestamp+"000000") 
                         .append("\n"); //$NON-NLS-1$
                 }
 
@@ -174,7 +182,7 @@ class HttpMetricsSender extends Abstract
                         switch (code) {
                         case 204:
                             if(LOG.isDebugEnabled()) {
-                                LOG.debug("Success, number of metrics written : " + metrics.size());
+                                LOG.debug("Success, number of metrics written : " + copyMetrics.size());
                             }
                             break;
                         default:
@@ -199,7 +207,7 @@ class HttpMetricsSender extends Abstract
         }
 
         // We drop metrics in all cases
-        metrics.clear();
+        copyMetrics.clear();
     }
 
     /**
@@ -209,6 +217,7 @@ class HttpMetricsSender extends Abstract
     @Override
     public void destroy() {
         // Give some time to send last metrics before shutting down
+        LOG.info("Destroying ");
         try {
             lastRequest.get(5, TimeUnit.SECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {

Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/InfluxdbBackendListenerClient.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/InfluxdbBackendListenerClient.java?rev=1780273&r1=1780272&r2=1780273&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/InfluxdbBackendListenerClient.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/InfluxdbBackendListenerClient.java Wed Jan 25 22:01:03 2017
@@ -347,6 +347,7 @@ public class InfluxdbBackendListenerClie
 
         
         // Send last set of data before ending
+        LOGGER.info("Sending last metrics");
         sendMetrics();
 
         influxdbMetricsManager.destroy();

Modified: jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/InfluxdbMetricsSender.java
URL: http://svn.apache.org/viewvc/jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/InfluxdbMetricsSender.java?rev=1780273&r1=1780272&r2=1780273&view=diff
==============================================================================
--- jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/InfluxdbMetricsSender.java (original)
+++ jmeter/trunk/src/components/org/apache/jmeter/visualizers/backend/influxdb/InfluxdbMetricsSender.java Wed Jan 25 22:01:03 2017
@@ -33,11 +33,12 @@ interface InfluxdbMetricsSender {
         String measurement;
         String tag;
         String field;
-
-        MetricTuple(String measurement, String tag, String field) {
+        long timestamp;
+        MetricTuple(String measurement, String tag, String field, long timestamp) {
             this.measurement = measurement;
             this.tag = tag;
             this.field = field;
+            this.timestamp = timestamp;
         }
     }