Skip to content

Commit bc4f1a1

Browse files
committed
Improve performance of Java 11 sender
1 parent 0192865 commit bc4f1a1

2 files changed

Lines changed: 30 additions & 17 deletions

File tree

README.md

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,18 @@ The Spring Boot Starter now requires Spring Boot 4. The `@NonNull` annotation ha
7878
Fixed a Java 8 compatibility issue in `JavaxHttpServletWrapper` where `Enumeration.asIterator()` (introduced in
7979
Java 9) was used to iterate over HTTP header names. It has been replaced with a standard `while` loop.
8080

81-
Dependency updates: Spring Boot 3.4.2 → 4.0.5, Jetty EE10 12.0.16 → 12.1.8, Jetty (javax) 10.0.24 → 10.0.26.
81+
Zero is now accepted as a valid value for numeric tracking parameters such as `idGoal`, `revenue`, and ecommerce
82+
fields, where it was previously treated as absent and omitted from requests.
83+
84+
Several performance improvements were made to `Java11Sender`: URL construction no longer uses `String.format`,
85+
the case-insensitive `User-Agent` header lookup no longer allocates a `TreeMap`, `.trim().isEmpty()` checks were
86+
replaced with the Java 11 `.isBlank()` method, and debug log statements are now guarded to avoid allocating
87+
cookie list copies when debug logging is disabled.
88+
89+
Spotless now automatically removes unused imports during the build.
90+
91+
Dependency updates: Spring Boot 3.4.2 → 4.0.5, JUnit Jupiter 5.11.4 → 6.0.3, SLF4J 2.0.16 → 2.0.17,
92+
Jetty EE10 12.0.16 → 12.1.8, Jetty (javax) 10.0.24 → 10.0.26.
8293

8394
The local testing Docker setup now uses MariaDB 12 and Matomo 5.
8495

java11/src/main/java/org/matomo/java/tracking/Java11Sender.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import java.util.Collection;
1515
import java.util.LinkedHashMap;
1616
import java.util.Map;
17-
import java.util.TreeMap;
1817
import java.util.concurrent.Callable;
1918
import java.util.concurrent.CompletableFuture;
2019
import java.util.concurrent.ExecutorService;
@@ -77,7 +76,7 @@ private HttpRequest buildHttpPostRequest(
7776
if (request.getHeaders() != null && !request.getHeaders().isEmpty()) {
7877
headers.putAll(request.getHeaders());
7978
}
80-
if (request.getHeaderUserAgent() != null && !request.getHeaderUserAgent().trim().isEmpty()) {
79+
if (request.getHeaderUserAgent() != null && !request.getHeaderUserAgent().isBlank()) {
8180
headerUserAgent = request.getHeaderUserAgent();
8281
}
8382
queries.add(queryCreator.createQuery(request, null));
@@ -131,9 +130,7 @@ private HttpRequest buildHttpGetRequest(@NonNull MatomoRequest request) {
131130
HttpRequest.newBuilder()
132131
.uri(
133132
apiEndpoint.resolve(
134-
String.format(
135-
"%s?%s",
136-
apiEndpoint.getPath(), queryCreator.createQuery(request, authToken))));
133+
apiEndpoint.getPath() + "?" + queryCreator.createQuery(request, authToken)));
137134
applyTrackerConfiguration(builder);
138135
setUserAgentHeader(builder, request.getHeaderUserAgent(), request.getHeaders());
139136
addHeaders(builder, request.getHeaders());
@@ -142,9 +139,11 @@ private HttpRequest buildHttpGetRequest(@NonNull MatomoRequest request) {
142139

143140
private <T> T send(@NonNull HttpRequest httpRequest, @NonNull Callable<T> callable) {
144141
try {
145-
log.debug("Sending request to Matomo: {}", httpRequest);
146-
log.debug("Headers: {}", httpRequest.headers());
147-
log.debug("Cookies: {}", cookieStore.getCookies());
142+
if (log.isDebugEnabled()) {
143+
log.debug("Sending request to Matomo: {}", httpRequest);
144+
log.debug("Headers: {}", httpRequest.headers());
145+
log.debug("Cookies: {}", cookieStore.getCookies());
146+
}
148147
return callable.call();
149148
} catch (Exception e) {
150149
if (trackerConfiguration.isLogFailedTracking()) {
@@ -188,15 +187,18 @@ private void setUserAgentHeader(
188187
HttpRequest.Builder builder,
189188
@Nullable String headerUserAgent,
190189
@Nullable Map<String, String> headers) {
191-
String userAgentHeader = null;
192-
if ((headerUserAgent == null || headerUserAgent.trim().isEmpty()) && headers != null) {
193-
TreeMap<String, String> caseInsensitiveMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER);
194-
caseInsensitiveMap.putAll(headers);
195-
userAgentHeader = caseInsensitiveMap.get("User-Agent");
190+
boolean noExplicitUserAgent = headerUserAgent == null || headerUserAgent.isBlank();
191+
if (!noExplicitUserAgent) {
192+
return;
193+
}
194+
if (headers != null) {
195+
for (Map.Entry<String, String> entry : headers.entrySet()) {
196+
if ("User-Agent".equalsIgnoreCase(entry.getKey()) && entry.getValue() != null && !entry.getValue().isBlank()) {
197+
return;
198+
}
199+
}
196200
}
197-
if ((userAgentHeader == null || userAgentHeader.trim().isEmpty())
198-
&& (headerUserAgent == null || headerUserAgent.trim().isEmpty())
199-
&& trackerConfiguration.getUserAgent() != null
201+
if (trackerConfiguration.getUserAgent() != null
200202
&& !trackerConfiguration.getUserAgent().isEmpty()) {
201203
builder.header("User-Agent", trackerConfiguration.getUserAgent());
202204
}

0 commit comments

Comments
 (0)