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 2019/10/03 18:16:35 UTC
[jmeter] branch master updated: Improved coverage for
HttpMetricsSender (#504)
This is an automated email from the ASF dual-hosted git repository.
pmouawad pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jmeter.git
The following commit(s) were added to refs/heads/master by this push:
new bd1eb9b Improved coverage for HttpMetricsSender (#504)
bd1eb9b is described below
commit bd1eb9b217e1d54107433d9a936d4f920ff7395b
Author: Graham Russell <gr...@ham1.co.uk>
AuthorDate: Thu Oct 3 19:16:28 2019 +0100
Improved coverage for HttpMetricsSender (#504)
* Comments and whitespace improvements
* Use same pattern in HttpMetricsSender#writeAndSendMetrics as Graphite.
* Call metricsSender.destroy() as part of each test
* Made HttpMetricsSenderTest better reflect required tag input
---
.../backend/influxdb/HttpMetricsSender.java | 144 ++++++++++-----------
.../backend/influxdb/HttpMetricsSenderTest.java | 9 +-
2 files changed, 75 insertions(+), 78 deletions(-)
diff --git a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSender.java b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSender.java
index 5f13876..3e5cd37 100644
--- a/src/components/src/main/java/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSender.java
+++ b/src/components/src/main/java/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSender.java
@@ -48,11 +48,22 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
- * Influxdb sender base on The Line Protocol. The Line Protocol is a text based
- * format for writing points to InfluxDB. Syntax : <measurement>[,<tag_key>=
- * <tag_value>[,<tag_key>=<tag_value>]] <field_key>=<field_value>[,<field_key>=
- * <field_value>] [<timestamp>] Each line, separated by the newline character,
- * represents a single point in InfluxDB. Line Protocol is whitespace sensitive.
+ * InfluxDB sender base on The Line Protocol.
+ * <p>
+ * The Line Protocol is a text based format for writing points to InfluxDB.
+ * Syntax:
+ * <pre>
+ * weather,location=us-midwest temperature=82 1465839830100400200
+ * | -------------------- -------------- |
+ * | | | |
+ * +-----------+--------+-+---------+-+---------+
+ * |measurement|,tag_set| |field_set| |timestamp|
+ * +-----------+--------+-+---------+-+---------+
+ * </pre>
+ * Each line, separated by the newline character, represents a single point in InfluxDB.
+ * The Line Protocol is whitespace sensitive.
+ * <p>
+ * See https://docs.influxdata.com/influxdb/v1.7/write_protocols/line_protocol_tutorial/
*
* @since 3.2
*/
@@ -67,11 +78,8 @@ class HttpMetricsSender extends AbstractInfluxdbMetricsSender {
private List<MetricTuple> metrics = new ArrayList<>();
private HttpPost httpRequest;
-
private CloseableHttpAsyncClient httpClient;
-
private URL url;
-
private String token;
private Future<HttpResponse> lastRequest;
@@ -85,10 +93,8 @@ class HttpMetricsSender extends AbstractInfluxdbMetricsSender {
* sending POST requests to the /write endpoint. Initiate the HttpClient
* client with a HttpPost request from influxdb url
*
- * @param influxdbUrl
- * example : http://localhost:8086/write?db=myd&rp=one_week
- * @param influxDBToken
- * example: my-token
+ * @param influxdbUrl example : http://localhost:8086/write?db=myd&rp=one_week
+ * @param influxDBToken example: my-token
* @see InfluxdbMetricsSender#setup(String, String)
*/
@Override
@@ -104,14 +110,14 @@ class HttpMetricsSender extends AbstractInfluxdbMetricsSender {
ConnectingIOReactor ioReactor = new DefaultConnectingIOReactor(ioReactorConfig);
// Create a connection manager with custom configuration.
- PoolingNHttpClientConnectionManager connManager = new PoolingNHttpClientConnectionManager(
- ioReactor);
+ PoolingNHttpClientConnectionManager connManager =
+ new PoolingNHttpClientConnectionManager(ioReactor);
httpClient = HttpAsyncClientBuilder.create()
.setConnectionManager(connManager)
.setMaxConnPerRoute(2)
.setMaxConnTotal(2)
- .setUserAgent("ApacheJMeter"+JMeterUtils.getJMeterVersion())
+ .setUserAgent("ApacheJMeter" + JMeterUtils.getJMeterVersion())
.disableCookieManagement()
.disableConnectionState()
.build();
@@ -122,7 +128,7 @@ class HttpMetricsSender extends AbstractInfluxdbMetricsSender {
}
/**
- * @param url {@link URL} Influxdb Url
+ * @param url {@link URL} Influxdb Url
* @param token Influxdb 2.0 authorization token
* @return {@link HttpPost}
* @throws URISyntaxException
@@ -150,73 +156,69 @@ class HttpMetricsSender extends AbstractInfluxdbMetricsSender {
}
}
- /**
- * @see org.apache.jmeter.visualizers.backend.graphite.GraphiteMetricsSender#
- * writeAndSendMetrics()
- */
@Override
public void writeAndSendMetrics() {
List<MetricTuple> copyMetrics;
synchronized (lock) {
- if(metrics.isEmpty()) {
+ if (metrics.isEmpty()) {
return;
}
copyMetrics = metrics;
metrics = new ArrayList<>(copyMetrics.size());
}
- if (!copyMetrics.isEmpty()) {
- try {
- if(httpRequest == null) {
- httpRequest = createRequest(url, token);
- }
- StringBuilder sb = new StringBuilder(copyMetrics.size()*35);
- for (MetricTuple metric : copyMetrics) {
- // Add TimeStamp in nanosecond from epoch ( default in InfluxDB )
- sb.append(metric.measurement)
+ writeAndSendMetrics(copyMetrics);
+ }
+
+ private void writeAndSendMetrics(List<MetricTuple> copyMetrics) {
+ try {
+ if (httpRequest == null) {
+ httpRequest = createRequest(url, token);
+ }
+ 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(metric.timestamp+"000000")
+ .append(metric.timestamp)
+ .append("000000")
.append("\n"); //$NON-NLS-1$
- }
-
- StringEntity entity = new StringEntity(sb.toString(), StandardCharsets.UTF_8);
+ }
- httpRequest.setEntity(entity);
- lastRequest = httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() {
- @Override
- public void completed(final HttpResponse response) {
- int code = response.getStatusLine().getStatusCode();
- /*
- * HTTP response summary 2xx: If your write request received
- * HTTP 204 No Content, it was a success! 4xx: InfluxDB
- * could not understand the request. 5xx: The system is
- * overloaded or significantly impaired.
- */
- if (MetricUtils.isSuccessCode(code)) {
- if(log.isDebugEnabled()) {
- log.debug("Success, number of metrics written: {}", copyMetrics.size());
- }
- } else {
- log.error("Error writing metrics to influxDB Url: {}, responseCode: {}, responseBody: {}", url, code, getBody(response));
+ httpRequest.setEntity(new StringEntity(sb.toString(), StandardCharsets.UTF_8));
+ lastRequest = httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() {
+ @Override
+ public void completed(final HttpResponse response) {
+ int code = response.getStatusLine().getStatusCode();
+ /*
+ * If your write request received HTTP
+ * 204 No Content: it was a success!
+ * 4xx: InfluxDB could not understand the request.
+ * 5xx: The system is overloaded or significantly impaired.
+ */
+ if (MetricUtils.isSuccessCode(code)) {
+ if (log.isDebugEnabled()) {
+ log.debug("Success, number of metrics written: {}", copyMetrics.size());
}
+ } else {
+ log.error("Error writing metrics to influxDB Url: {}, responseCode: {}, responseBody: {}", url, code, getBody(response));
}
- @Override
- public void failed(final Exception ex) {
- log.error("failed to send data to influxDB server : {}", ex.getMessage());
- }
- @Override
- public void cancelled() {
- log.warn("Request to influxDB server was cancelled");
- }
- });
- }catch (URISyntaxException ex ) {
- log.error(ex.getMessage());
- } finally {
- // We drop metrics in all cases
- copyMetrics.clear();
- }
+ }
+
+ @Override
+ public void failed(final Exception ex) {
+ log.error("failed to send data to influxDB server.", ex);
+ }
+
+ @Override
+ public void cancelled() {
+ log.warn("Request to influxDB server was cancelled");
+ }
+ });
+ } catch (URISyntaxException ex) {
+ log.error(ex.getMessage(), ex);
}
}
@@ -225,9 +227,9 @@ class HttpMetricsSender extends AbstractInfluxdbMetricsSender {
* @return String entity Body if any
*/
private static String getBody(final HttpResponse response) {
- String body= "";
+ String body = "";
try {
- if(response != null && response.getEntity() != null) {
+ if (response != null && response.getEntity() != null) {
body = EntityUtils.toString(response.getEntity());
}
} catch (Exception e) { // NOSONAR
@@ -236,10 +238,6 @@ class HttpMetricsSender extends AbstractInfluxdbMetricsSender {
return body;
}
- /**
- * @see org.apache.jmeter.visualizers.backend.graphite.GraphiteMetricsSender#
- * destroy()
- */
@Override
public void destroy() {
// Give some time to send last metrics before shutting down
@@ -249,7 +247,7 @@ class HttpMetricsSender extends AbstractInfluxdbMetricsSender {
} catch (InterruptedException | ExecutionException | TimeoutException e) {
log.error("Error waiting for last request to be send to InfluxDB", e);
}
- if(httpRequest != null) {
+ if (httpRequest != null) {
httpRequest.abort();
}
IOUtils.closeQuietly(httpClient);
diff --git a/src/components/src/test/java/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSenderTest.java b/src/components/src/test/java/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSenderTest.java
index 26e4d37..ca461ab 100644
--- a/src/components/src/test/java/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSenderTest.java
+++ b/src/components/src/test/java/org/apache/jmeter/visualizers/backend/influxdb/HttpMetricsSenderTest.java
@@ -47,9 +47,7 @@ public class HttpMetricsSenderTest {
private MappingBuilder influxRequest(CountDownLatch latch) {
return WireMock.post(API_URL)
- .willReturn(
- WireMock.aResponse().withStatus(HttpURLConnection.HTTP_NO_CONTENT)
- )
+ .willReturn(WireMock.aResponse().withStatus(HttpURLConnection.HTTP_NO_CONTENT))
.withPostServeAction("countdown", Parameters.one("latch", latch));
}
@@ -83,14 +81,15 @@ public class HttpMetricsSenderTest {
private void setupSenderAndSendMetric(String influxdbUrl, String influxDBToken) throws Exception {
HttpMetricsSender metricsSender = new HttpMetricsSender();
metricsSender.setup(influxdbUrl, influxDBToken);
- metricsSender.addMetric("measurement", "location=west", "size=10");
+ metricsSender.addMetric("measurement", ",location=west", "size=10");
metricsSender.writeAndSendMetrics();
+ metricsSender.destroy();
}
private void assertAuthHeader(WireMockServer server, StringValuePattern authHeader) {
server.verify(1, RequestPatternBuilder
.newRequestPattern(RequestMethod.POST, WireMock.urlEqualTo(API_URL))
- .withRequestBody(WireMock.matching("measurementlocation=west size=10 \\d{19}\\s*"))
+ .withRequestBody(WireMock.matching("measurement,location=west size=10 \\d{19}\\s*"))
.withHeader("Authorization", authHeader));
}
}