]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-22479 Leveraging independent URL for Telemetry Metrics
authorMatteo Mara <matteo.mara@sonarsource.com>
Fri, 19 Jul 2024 15:45:56 +0000 (17:45 +0200)
committersonartech <sonartech@sonarsource.com>
Wed, 24 Jul 2024 20:02:49 +0000 (20:02 +0000)
server/sonar-telemetry/src/main/java/org/sonar/telemetry/TelemetryClient.java
server/sonar-telemetry/src/main/java/org/sonar/telemetry/TelemetryDaemon.java
server/sonar-telemetry/src/test/java/org/sonar/telemetry/TelemetryClientCompressionTest.java
server/sonar-telemetry/src/test/java/org/sonar/telemetry/TelemetryClientTest.java

index 92fa3599f3a81c55150a511e8954fc63667d6bee..c1a0a94ec7dd85b4b399c0f604d1f2f88ba732a2 100644 (file)
@@ -37,6 +37,7 @@ import org.sonar.api.server.ServerSide;
 
 import static org.sonar.process.ProcessProperties.Property.SONAR_TELEMETRY_COMPRESSION;
 import static org.sonar.process.ProcessProperties.Property.SONAR_TELEMETRY_URL;
+import static org.sonar.process.ProcessProperties.Property.SONAR_TELEMETRY_METRICS_URL;
 
 @ServerSide
 public class TelemetryClient implements Startable {
@@ -46,6 +47,7 @@ public class TelemetryClient implements Startable {
   private final OkHttpClient okHttpClient;
   private final Configuration config;
   private String serverUrl;
+  private String metricsServerUrl;
   private boolean compression;
 
   public TelemetryClient(OkHttpClient okHttpClient, Configuration config) {
@@ -54,7 +56,12 @@ public class TelemetryClient implements Startable {
   }
 
   void upload(String json) throws IOException {
-    Request request = buildHttpRequest(json);
+    Request request = buildHttpRequest(serverUrl, json);
+    execute(okHttpClient.newCall(request));
+  }
+
+  void uploadMetric(String json) throws IOException {
+    Request request = buildHttpRequest(metricsServerUrl, json);
     execute(okHttpClient.newCall(request));
   }
 
@@ -63,7 +70,6 @@ public class TelemetryClient implements Startable {
     request.url(serverUrl);
     RequestBody body = RequestBody.create(JSON, json);
     request.delete(body);
-
     try {
       execute(okHttpClient.newCall(request.build()));
     } catch (IOException e) {
@@ -71,7 +77,7 @@ public class TelemetryClient implements Startable {
     }
   }
 
-  private Request buildHttpRequest(String json) {
+  private Request buildHttpRequest(String serverUrl, String json) {
     Request.Builder request = new Request.Builder();
     request.addHeader("Content-Encoding", "gzip");
     request.addHeader("Content-Type", "application/json");
@@ -117,6 +123,8 @@ public class TelemetryClient implements Startable {
   public void start() {
     this.serverUrl = config.get(SONAR_TELEMETRY_URL.getKey())
       .orElseThrow(() -> new IllegalStateException(String.format("Setting '%s' must be provided.", SONAR_TELEMETRY_URL)));
+    this.metricsServerUrl = config.get(SONAR_TELEMETRY_METRICS_URL.getKey())
+      .orElseThrow(() -> new IllegalStateException(String.format("Setting '%s' must be provided.", SONAR_TELEMETRY_METRICS_URL)));
     this.compression = config.getBoolean(SONAR_TELEMETRY_COMPRESSION.getKey()).orElse(true);
   }
 
index f920ff8956a57c0b87a04b486c5e0874b55a745c..70e6471922427df99b8f2290b7da81ed796ced8a 100644 (file)
@@ -162,7 +162,7 @@ public class TelemetryDaemon extends AbstractStoppableScheduledExecutorServiceIm
     TelemetryMetricsLoader.Context context = telemetryMetricsLoader.loadData();
     for (BaseMessage message : context.getMessages()) {
       String jsonString = MessageSerializer.serialize(message);
-      telemetryClient.upload(jsonString);
+      telemetryClient.uploadMetric(jsonString);
     }
 
     try (DbSession dbSession = dbClient.openSession(false)) {
index 29121b50377492d9a33b1819d5b8c928009f15be..6ac5d708553fbee2206c405c096148206e941934 100644 (file)
@@ -33,6 +33,7 @@ import org.junit.jupiter.api.Test;
 import org.sonar.api.config.internal.MapSettings;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.process.ProcessProperties.Property.SONAR_TELEMETRY_METRICS_URL;
 import static org.sonar.process.ProcessProperties.Property.SONAR_TELEMETRY_URL;
 
 class TelemetryClientCompressionTest {
@@ -45,6 +46,7 @@ class TelemetryClientCompressionTest {
     telemetryServer.enqueue(new MockResponse().setResponseCode(200));
     MapSettings settings = new MapSettings();
     settings.setProperty(SONAR_TELEMETRY_URL.getKey(), telemetryServer.url("/").toString());
+    settings.setProperty(SONAR_TELEMETRY_METRICS_URL.getKey(), telemetryServer.url("/").toString());
     TelemetryClient underTest = new TelemetryClient(okHttpClient, settings.asConfig());
     underTest.start();
     underTest.upload("payload compressed with gzip");
index 2323ee4e0e8ba86442b108dbafd6f39d82f28336..ffb94d77fac036fc5d4bdb6e56e022f1eb37c4f4 100644 (file)
@@ -24,6 +24,7 @@ import okhttp3.MediaType;
 import okhttp3.OkHttpClient;
 import okhttp3.Request;
 import okio.Buffer;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 import org.sonar.api.config.internal.MapSettings;
@@ -33,22 +34,29 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.sonar.process.ProcessProperties.Property.SONAR_TELEMETRY_COMPRESSION;
+import static org.sonar.process.ProcessProperties.Property.SONAR_TELEMETRY_METRICS_URL;
 import static org.sonar.process.ProcessProperties.Property.SONAR_TELEMETRY_URL;
 
 class TelemetryClientTest {
 
   private static final String JSON = "{\"key\":\"value\"}";
   private static final String TELEMETRY_URL = "https://telemetry.com/url";
+  private static final String METRICS_TELEMETRY_URL = "https://telemetry.com/url/metrics";
 
   private final OkHttpClient okHttpClient = mock(OkHttpClient.class, RETURNS_DEEP_STUBS);
   private final MapSettings settings = new MapSettings();
 
   private final TelemetryClient underTest = new TelemetryClient(okHttpClient, settings.asConfig());
 
+  @BeforeEach
+  void setProperties() {
+    settings.setProperty(SONAR_TELEMETRY_URL.getKey(), TELEMETRY_URL);
+    settings.setProperty(SONAR_TELEMETRY_METRICS_URL.getKey(), METRICS_TELEMETRY_URL);
+  }
+
   @Test
   void upload() throws IOException {
     ArgumentCaptor<Request> requestCaptor = ArgumentCaptor.forClass(Request.class);
-    settings.setProperty(SONAR_TELEMETRY_URL.getKey(), TELEMETRY_URL);
     settings.setProperty(SONAR_TELEMETRY_COMPRESSION.getKey(), false);
     underTest.start();
 
@@ -64,10 +72,27 @@ class TelemetryClientTest {
     assertThat(request.url()).hasToString(TELEMETRY_URL);
   }
 
+  @Test
+  void uploadMetric() throws IOException {
+    ArgumentCaptor<Request> requestCaptor = ArgumentCaptor.forClass(Request.class);
+    settings.setProperty(SONAR_TELEMETRY_COMPRESSION.getKey(), false);
+    underTest.start();
+
+    underTest.uploadMetric(JSON);
+
+    verify(okHttpClient).newCall(requestCaptor.capture());
+    Request request = requestCaptor.getValue();
+    assertThat(request.method()).isEqualTo("POST");
+    assertThat(request.body().contentType()).isEqualTo(MediaType.parse("application/json; charset=utf-8"));
+    Buffer body = new Buffer();
+    request.body().writeTo(body);
+    assertThat(body.readUtf8()).isEqualTo(JSON);
+    assertThat(request.url()).hasToString(METRICS_TELEMETRY_URL);
+  }
+
   @Test
   void opt_out() throws IOException {
     ArgumentCaptor<Request> requestCaptor = ArgumentCaptor.forClass(Request.class);
-    settings.setProperty(SONAR_TELEMETRY_URL.getKey(), TELEMETRY_URL);
     underTest.start();
 
     underTest.optOut(JSON);