From 82fdbe8cc250eb9f4f850b74c7da0e90a8479306 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 12 Jul 2017 12:00:41 +0200 Subject: [PATCH] DATAMONGO-1720 - Polishing. Enhance benchmark statistics with Git/working tree details. Specify byte encoding for JSON to byte encoder. Add status code check to HttpResultsWriter to verify that the results were accepted. Convert spaces to tabs in pom.xml. Original pull request: #483. --- spring-data-mongodb-benchmarks/pom.xml | 178 ++++++++++-------- .../MappingMongoConverterBenchmark.java | 2 +- .../microbenchmark/HttpResultsWriter.java | 39 +++- .../microbenchmark/MongoResultsWriter.java | 11 +- .../mongodb/microbenchmark/ResultsWriter.java | 6 +- 5 files changed, 142 insertions(+), 94 deletions(-) diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml index 53999e476..494925fb6 100644 --- a/spring-data-mongodb-benchmarks/pom.xml +++ b/spring-data-mongodb-benchmarks/pom.xml @@ -1,91 +1,111 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - 4.0.0 + 4.0.0 - - org.springframework.data - spring-data-mongodb-parent - 2.0.0.BUILD-SNAPSHOT - ../pom.xml - + + org.springframework.data + spring-data-mongodb-parent + 2.0.0.BUILD-SNAPSHOT + ../pom.xml + - spring-data-mongodb-benchmarks - jar + spring-data-mongodb-benchmarks + jar - Spring Data MongoDB - Microbenchmarks + Spring Data MongoDB - Microbenchmarks - - true - false - + + + true + - - - ${project.groupId} - spring-data-mongodb - ${project.version} - - - junit - junit - ${junit} - compile - - - org.openjdk.jmh - jmh-core - ${jmh.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - provided - - + - + + ${project.groupId} + spring-data-mongodb + ${project.version} + - - benchmarks - - false - - - + + junit + junit + ${junit} + compile + - - - - maven-jar-plugin - - - default-jar - never - - - - - maven-surefire-plugin - - ${project.build.sourceDirectory} - ${project.build.outputDirectory} - - **/AbstractMicrobenchmark.java - **/*$*.class - **/generated/*.class - - - **/*Benchmark* - - - ${project.build.directory}/reports/performance - ${project.version} - - - - - + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + provided + + + + + + + + benchmarks + + false + + + + + + + + pl.project13.maven + git-commit-id-plugin + 2.2.2 + + + + revision + + + + + + maven-jar-plugin + + + default-jar + never + + + + + maven-surefire-plugin + + ${project.build.sourceDirectory} + ${project.build.outputDirectory} + + **/AbstractMicrobenchmark.java + **/*$*.class + **/generated/*.class + + + **/*Benchmark* + + + ${project.build.directory}/reports/performance + ${project.version} + ${git.dirty} + ${git.commit.id} + ${git.branch} + + + + + diff --git a/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterBenchmark.java b/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterBenchmark.java index 0c5785da7..b51c8ccfc 100644 --- a/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterBenchmark.java +++ b/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterBenchmark.java @@ -126,7 +126,7 @@ public class MappingMongoConverterBenchmark extends AbstractMicrobenchmark { } @Benchmark // DATAMONGO-1720 - public Customer readObjectWith2tPropertiesAnd1NestedObject() { + public Customer readObjectWith2PropertiesAnd1NestedObject() { return converter.read(Customer.class, documentWith2PropertiesAnd1Nested); } diff --git a/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/HttpResultsWriter.java b/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/HttpResultsWriter.java index 06584c7c5..8c9504102 100644 --- a/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/HttpResultsWriter.java +++ b/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/HttpResultsWriter.java @@ -15,7 +15,10 @@ */ package org.springframework.data.mongodb.microbenchmark; +import lombok.SneakyThrows; + import java.io.OutputStream; +import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.nio.charset.StandardCharsets; @@ -23,6 +26,7 @@ import java.time.Duration; import java.util.Collection; import org.openjdk.jmh.results.RunResult; +import org.springframework.core.env.StandardEnvironment; import org.springframework.util.CollectionUtils; /** @@ -39,24 +43,39 @@ class HttpResultsWriter implements ResultsWriter { } @Override + @SneakyThrows public void write(Collection results) { if (CollectionUtils.isEmpty(results)) { return; } - try { + StandardEnvironment env = new StandardEnvironment(); + + String projectVersion = env.getProperty("project.version", "unknown"); + String gitBranch = env.getProperty("git.branch", "unknown"); + String gitDirty = env.getProperty("git.dirty", "no"); + String gitCommitId = env.getProperty("git.commit.id", "unknown"); + + HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); + connection.setConnectTimeout((int) Duration.ofSeconds(1).toMillis()); + connection.setReadTimeout((int) Duration.ofSeconds(1).toMillis()); + connection.setDoOutput(true); + connection.setRequestMethod("POST"); - URLConnection connection = new URL(url).openConnection(); - connection.setConnectTimeout((int) Duration.ofSeconds(1).toMillis()); - connection.setDoOutput(true); - connection.setRequestProperty("Content-Type", "application/json"); + connection.setRequestProperty("Content-Type", "application/json"); + connection.addRequestProperty("X-Project-Version", projectVersion); + connection.addRequestProperty("X-Git-Branch", gitBranch); + connection.addRequestProperty("X-Git-Dirty", gitDirty); + connection.addRequestProperty("X-Git-Commit-Id", gitCommitId); + + try (OutputStream output = connection.getOutputStream()) { + output.write(ResultsWriter.jsonifyResults(results).getBytes(StandardCharsets.UTF_8)); + } - try (OutputStream output = connection.getOutputStream()) { - output.write(ResultsWriter.jsonifyResults(results).getBytes(StandardCharsets.UTF_8)); - } - } catch (Exception e) { - throw new RuntimeException(e); + if (connection.getResponseCode() >= 400) { + throw new IllegalStateException( + String.format("Status %d %s", connection.getResponseCode(), connection.getResponseMessage())); } } } diff --git a/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/MongoResultsWriter.java b/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/MongoResultsWriter.java index 3a3ab4388..4c069a7c6 100644 --- a/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/MongoResultsWriter.java +++ b/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/MongoResultsWriter.java @@ -52,6 +52,9 @@ class MongoResultsWriter implements ResultsWriter { StandardEnvironment env = new StandardEnvironment(); String projectVersion = env.getProperty("project.version", "unknown"); + String gitBranch = env.getProperty("git.branch", "unknown"); + String gitDirty = env.getProperty("git.dirty", "no"); + String gitCommitId = env.getProperty("git.commit.id", "unknown"); MongoClientURI uri = new MongoClientURI(this.uri); MongoClient client = new MongoClient(uri); @@ -65,6 +68,9 @@ class MongoResultsWriter implements ResultsWriter { Document sink = new Document(); sink.append("_version", projectVersion); + sink.append("_branch", gitBranch); + sink.append("_commit", gitCommitId); + sink.append("_dirty", gitDirty); sink.append("_method", extractBenchmarkName(dbo.get("benchmark").toString())); sink.append("_date", now); sink.append("_snapshot", projectVersion.toLowerCase().contains("snapshot")); @@ -75,7 +81,6 @@ class MongoResultsWriter implements ResultsWriter { } client.close(); - } /** @@ -113,13 +118,13 @@ class MongoResultsWriter implements ResultsWriter { return sanitized; } - private String extractClass(String source) { + private static String extractClass(String source) { String tmp = source.substring(0, source.lastIndexOf('.')); return tmp.substring(tmp.lastIndexOf(".") + 1); } - private String extractBenchmarkName(String source) { + private static String extractBenchmarkName(String source) { return source.substring(source.lastIndexOf(".") + 1); } diff --git a/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/ResultsWriter.java b/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/ResultsWriter.java index e06896318..3aaaee665 100644 --- a/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/ResultsWriter.java +++ b/spring-data-mongodb-benchmarks/src/main/java/org/springframework/data/mongodb/microbenchmark/ResultsWriter.java @@ -15,6 +15,8 @@ */ package org.springframework.data.mongodb.microbenchmark; +import lombok.SneakyThrows; + import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.nio.charset.StandardCharsets; @@ -54,10 +56,12 @@ interface ResultsWriter { * @return json string representation of results. * @see org.openjdk.jmh.results.format.JSONResultFormat */ + @SneakyThrows static String jsonifyResults(Collection results) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ResultFormatFactory.getInstance(ResultFormatType.JSON, new PrintStream(baos)).writeOut(results); + ResultFormatFactory.getInstance(ResultFormatType.JSON, new PrintStream(baos, true, "UTF-8")).writeOut(results); + return new String(baos.toByteArray(), StandardCharsets.UTF_8); } }