]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-22479 Create telemetry-core module
authorAlain Kermis <alain.kermis@sonarsource.com>
Wed, 17 Jul 2024 12:48:57 +0000 (14:48 +0200)
committersonartech <sonartech@sonarsource.com>
Wed, 24 Jul 2024 20:02:48 +0000 (20:02 +0000)
56 files changed:
server/sonar-telemetry-core/build.gradle [new file with mode: 0644]
server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/Dimension.java [new file with mode: 0644]
server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/Granularity.java [new file with mode: 0644]
server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/TelemetryDataProvider.java [new file with mode: 0644]
server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/TelemetryDataType.java [new file with mode: 0644]
server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/package-info.java [new file with mode: 0644]
server/sonar-telemetry-core/src/test/java/org/sonar/telemetry/core/DimensionTest.java [new file with mode: 0644]
server/sonar-telemetry-core/src/test/java/org/sonar/telemetry/core/GranularityTest.java [new file with mode: 0644]
server/sonar-telemetry-core/src/test/java/org/sonar/telemetry/core/TelemetryDataTypeTest.java [new file with mode: 0644]
server/sonar-telemetry/build.gradle
server/sonar-telemetry/src/it/java/org/sonar/telemetry/metrics/TelemetryMetricsLoaderIT.java
server/sonar-telemetry/src/it/java/org/sonar/telemetry/project/ProjectCppAutoconfigTelemetryProviderIT.java [deleted file]
server/sonar-telemetry/src/it/java/org/sonar/telemetry/user/TelemetryUserEnabledProviderIT.java [deleted file]
server/sonar-telemetry/src/main/java/org/sonar/telemetry/Dimension.java [deleted file]
server/sonar-telemetry/src/main/java/org/sonar/telemetry/Granularity.java [deleted file]
server/sonar-telemetry/src/main/java/org/sonar/telemetry/TelemetryDataProvider.java [deleted file]
server/sonar-telemetry/src/main/java/org/sonar/telemetry/TelemetryDataType.java [deleted file]
server/sonar-telemetry/src/main/java/org/sonar/telemetry/metrics/TelemetryMetricsLoader.java
server/sonar-telemetry/src/main/java/org/sonar/telemetry/metrics/TelemetryMetricsMapper.java
server/sonar-telemetry/src/main/java/org/sonar/telemetry/metrics/schema/BaseMessage.java
server/sonar-telemetry/src/main/java/org/sonar/telemetry/metrics/schema/InstallationMetric.java
server/sonar-telemetry/src/main/java/org/sonar/telemetry/metrics/schema/LanguageMetric.java
server/sonar-telemetry/src/main/java/org/sonar/telemetry/metrics/schema/Metric.java
server/sonar-telemetry/src/main/java/org/sonar/telemetry/metrics/schema/ProjectMetric.java
server/sonar-telemetry/src/main/java/org/sonar/telemetry/metrics/schema/UserMetric.java
server/sonar-telemetry/src/main/java/org/sonar/telemetry/metrics/util/SentMetricsStorage.java
server/sonar-telemetry/src/main/java/org/sonar/telemetry/project/ProjectCppAutoconfigTelemetryProvider.java [deleted file]
server/sonar-telemetry/src/main/java/org/sonar/telemetry/project/package-info.java [deleted file]
server/sonar-telemetry/src/main/java/org/sonar/telemetry/user/TelemetryUserEnabledProvider.java [deleted file]
server/sonar-telemetry/src/main/java/org/sonar/telemetry/user/package-info.java [deleted file]
server/sonar-telemetry/src/test/java/org/sonar/telemetry/DimensionTest.java [deleted file]
server/sonar-telemetry/src/test/java/org/sonar/telemetry/GranularityTest.java [deleted file]
server/sonar-telemetry/src/test/java/org/sonar/telemetry/TelemetryDataTypeTest.java [deleted file]
server/sonar-telemetry/src/test/java/org/sonar/telemetry/metrics/TelemetryMetricsMapperTest.java
server/sonar-telemetry/src/test/java/org/sonar/telemetry/metrics/TestTelemetryBean.java
server/sonar-telemetry/src/test/java/org/sonar/telemetry/metrics/schema/BaseMessageTest.java
server/sonar-telemetry/src/test/java/org/sonar/telemetry/metrics/schema/InstallationMetricTest.java
server/sonar-telemetry/src/test/java/org/sonar/telemetry/metrics/schema/LanguageMetricTest.java
server/sonar-telemetry/src/test/java/org/sonar/telemetry/metrics/schema/ProjectMetricTest.java
server/sonar-telemetry/src/test/java/org/sonar/telemetry/metrics/schema/UserMetricTest.java
server/sonar-telemetry/src/test/java/org/sonar/telemetry/metrics/util/MessageSerializerTest.java
server/sonar-telemetry/src/test/java/org/sonar/telemetry/metrics/util/SentMetricsStorageTest.java
server/sonar-telemetry/src/test/java/org/sonar/telemetry/project/ProjectCppAutoconfigTelemetryProviderTest.java [deleted file]
server/sonar-telemetry/src/test/java/org/sonar/telemetry/user/TelemetryUserEnabledProviderTest.java [deleted file]
server/sonar-webserver/src/it/java/org/sonar/server/platform/telemetry/ProjectCppAutoconfigTelemetryProviderIT.java [new file with mode: 0644]
server/sonar-webserver/src/it/java/org/sonar/server/platform/telemetry/TelemetryUserEnabledProviderIT.java [new file with mode: 0644]
server/sonar-webserver/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java
server/sonar-webserver/src/main/java/org/sonar/server/platform/telemetry/ProjectCppAutoconfigTelemetryProvider.java [new file with mode: 0644]
server/sonar-webserver/src/main/java/org/sonar/server/platform/telemetry/TelemetryNclocProvider.java
server/sonar-webserver/src/main/java/org/sonar/server/platform/telemetry/TelemetryUserEnabledProvider.java [new file with mode: 0644]
server/sonar-webserver/src/main/java/org/sonar/server/platform/telemetry/TelemetryVersionProvider.java
server/sonar-webserver/src/test/java/org/sonar/server/platform/telemetry/ProjectCppAutoconfigTelemetryProviderTest.java [new file with mode: 0644]
server/sonar-webserver/src/test/java/org/sonar/server/platform/telemetry/TelemetryNclocProviderTest.java
server/sonar-webserver/src/test/java/org/sonar/server/platform/telemetry/TelemetryUserEnabledProviderTest.java [new file with mode: 0644]
server/sonar-webserver/src/test/java/org/sonar/server/platform/telemetry/TelemetryVersionProviderTest.java
settings.gradle

diff --git a/server/sonar-telemetry-core/build.gradle b/server/sonar-telemetry-core/build.gradle
new file mode 100644 (file)
index 0000000..010d750
--- /dev/null
@@ -0,0 +1,24 @@
+description = 'Module providing the core classes and interfaces for telemetry metrics in SonarQube.'
+
+sonar {
+    properties {
+        property 'sonar.projectName', "${projectTitle} :: Server :: Telemetry Core"
+    }
+}
+
+dependencies {
+    compileOnlyApi 'com.github.spotbugs:spotbugs-annotations'
+
+    implementation 'com.fasterxml.jackson.core:jackson-databind'
+
+    testImplementation(platform("org.junit:junit-bom:5.9.1"))
+    testImplementation 'org.assertj:assertj-core'
+    testImplementation 'org.junit.jupiter:junit-jupiter-api'
+    testImplementation 'org.junit.jupiter:junit-jupiter-params'
+
+    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
+}
+
+tasks.test {
+    useJUnitPlatform()
+}
\ No newline at end of file
diff --git a/server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/Dimension.java b/server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/Dimension.java
new file mode 100644 (file)
index 0000000..96f9ce5
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.telemetry.core;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Represents the dimension of the data provided by a {@link TelemetryDataProvider}.
+ * {@link Dimension#PROJECT}, {@link Dimension#LANGUAGE} and {@link Dimension#USER} should not provide aggregated data.
+ * For aggregated data (i.e. average number of lines of code per project), use #INSTALLATION.
+ */
+public enum Dimension {
+  INSTALLATION("installation"),
+  USER("user"),
+  PROJECT("project"),
+  LANGUAGE("language");
+
+  private final String value;
+
+  Dimension(String value) {
+    this.value = value;
+  }
+
+  @JsonValue
+  public String getValue() {
+    return value;
+  }
+
+  public static Dimension fromValue(String value) {
+    for (Dimension dimension : Dimension.values()) {
+      if (dimension.value.equalsIgnoreCase(value)) {
+        return dimension;
+      }
+    }
+    throw new IllegalArgumentException("Unknown dimension value: " + value);
+  }
+}
diff --git a/server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/Granularity.java b/server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/Granularity.java
new file mode 100644 (file)
index 0000000..be5cd22
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.telemetry.core;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Represent the granularity of the data provided by a {@link TelemetryDataProvider}. This both defines the time period between to pushes to
+ * telemetry server for a given metric and the time period that the data represents.
+ * Modifying this enum needs to be discussed beforehand with Data Platform team.
+ */
+public enum Granularity {
+  DAILY("daily"),
+  WEEKLY("weekly"),
+  MONTHLY("monthly");
+
+  private final String value;
+
+  Granularity(String value) {
+    this.value = value;
+  }
+
+  @JsonValue
+  public String getValue() {
+    return value;
+  }
+}
diff --git a/server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/TelemetryDataProvider.java b/server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/TelemetryDataProvider.java
new file mode 100644 (file)
index 0000000..a464014
--- /dev/null
@@ -0,0 +1,78 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.telemetry.core;
+
+import java.util.Map;
+
+/**
+ * This interface is used to provide data to the telemetry system. The telemetry system will call the methods of this interface to get the
+ * data that will be sent to the telemetry server.
+ * If you want to add new metric to the telemetry system, you need to create a new implementation of this interface and register it in the
+ * Spring context as a bean.
+ *
+ * @param <T> type of the value provided by this instance. Should be either {@link Boolean}, {@link String},
+ * {@link Integer} or {@link Float}.
+ */
+public interface TelemetryDataProvider<T> {
+
+  /**
+   * @return the key of the metric that will be used to store the value of the data provided by this instance. The combination of
+   * metric key and dimension needs to be universally unique. The metric key needs to be written in snake_case.
+   */
+  String getMetricKey();
+
+  /**
+   * @return the dimension ("category") of the data provided by this instance. The combination of metric key and dimension needs to be
+   * universally unique.
+   */
+  Dimension getDimension();
+
+  /**
+   * @return returns the granularity of this telemetry metric.
+   * @see Granularity
+   */
+  Granularity getGranularity();
+
+  /**
+   * @return the type of the data provided by this instance.
+   */
+  TelemetryDataType getType();
+
+  /**
+   * The implementation of this method might often need to make a call to a database.
+   * For each metric either this method or {@link TelemetryDataProvider#getUuidValues()} should be implemented and used. Not both at once.
+   *
+   * @return the value of the data provided by this instance.
+   */
+  default T getValue() {
+    throw new IllegalStateException("Not implemented");
+  }
+
+  /**
+   * The implementation of this method might often need to make a call to a database.
+   * Similiar as {@link TelemetryDataProvider#getValue()} this method returns values of the metric. Some of the metrics
+   * associate a UUID with a value. This method is used to return all the values associated with the UUIDs.
+   *
+   * @return map of UUIDs and their values.
+   */
+  default Map<String, T> getUuidValues() {
+    throw new IllegalStateException("Not implemented");
+  }
+}
diff --git a/server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/TelemetryDataType.java b/server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/TelemetryDataType.java
new file mode 100644 (file)
index 0000000..5f096d0
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.telemetry.core;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Represents the type of the data provided by a {@link TelemetryDataProvider}.
+ * Modifying this enum needs to be discussed beforehand with Data Platform team.
+ */
+public enum TelemetryDataType {
+  BOOLEAN("boolean"),
+  STRING("string"),
+  INTEGER("integer"),
+  FLOAT("float");
+
+  private final String value;
+
+  TelemetryDataType(String value) {
+    this.value = value;
+  }
+
+  @JsonValue
+  public String getValue() {
+    return value;
+  }
+}
diff --git a/server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/package-info.java b/server/sonar-telemetry-core/src/main/java/org/sonar/telemetry/core/package-info.java
new file mode 100644 (file)
index 0000000..1b57306
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+@ParametersAreNonnullByDefault
+package org.sonar.telemetry.core;
+
+import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-telemetry-core/src/test/java/org/sonar/telemetry/core/DimensionTest.java b/server/sonar-telemetry-core/src/test/java/org/sonar/telemetry/core/DimensionTest.java
new file mode 100644 (file)
index 0000000..6c2c74b
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.telemetry.core;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+class DimensionTest {
+  @Test
+  void getValue() {
+    assertEquals("installation", Dimension.INSTALLATION.getValue());
+    assertEquals("user", Dimension.USER.getValue());
+    assertEquals("project", Dimension.PROJECT.getValue());
+    assertEquals("language", Dimension.LANGUAGE.getValue());
+  }
+
+  @Test
+  void fromValue() {
+    assertEquals(Dimension.INSTALLATION, Dimension.fromValue("installation"));
+    assertEquals(Dimension.USER, Dimension.fromValue("user"));
+    assertEquals(Dimension.PROJECT, Dimension.fromValue("project"));
+    assertEquals(Dimension.LANGUAGE, Dimension.fromValue("language"));
+
+    assertEquals(Dimension.INSTALLATION, Dimension.fromValue("INSTALLATION"));
+    assertEquals(Dimension.USER, Dimension.fromValue("USER"));
+    assertEquals(Dimension.PROJECT, Dimension.fromValue("PROJECT"));
+    assertEquals(Dimension.LANGUAGE, Dimension.fromValue("LANGUAGE"));
+  }
+
+  @Test
+  void fromValue_whenInvalid() {
+    Exception exception = assertThrows(IllegalArgumentException.class, () -> {
+      Dimension.fromValue("invalid");
+    });
+    assertEquals("Unknown dimension value: invalid", exception.getMessage());
+  }
+}
diff --git a/server/sonar-telemetry-core/src/test/java/org/sonar/telemetry/core/GranularityTest.java b/server/sonar-telemetry-core/src/test/java/org/sonar/telemetry/core/GranularityTest.java
new file mode 100644 (file)
index 0000000..a4b01e9
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.telemetry.core;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class GranularityTest {
+
+  @Test
+  void getValue() {
+    assertEquals("daily", Granularity.DAILY.getValue());
+    assertEquals("weekly", Granularity.WEEKLY.getValue());
+    assertEquals("monthly", Granularity.MONTHLY.getValue());
+  }
+
+}
diff --git a/server/sonar-telemetry-core/src/test/java/org/sonar/telemetry/core/TelemetryDataTypeTest.java b/server/sonar-telemetry-core/src/test/java/org/sonar/telemetry/core/TelemetryDataTypeTest.java
new file mode 100644 (file)
index 0000000..4749a85
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.telemetry.core;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class TelemetryDataTypeTest {
+  @Test
+  void getValue() {
+    assertEquals("integer", TelemetryDataType.INTEGER.getValue());
+    assertEquals("string", TelemetryDataType.STRING.getValue());
+    assertEquals("boolean", TelemetryDataType.BOOLEAN.getValue());
+    assertEquals("float", TelemetryDataType.FLOAT.getValue());
+  }
+
+}
index 4ab6545420742de781ded818bdce5501a2d135f4..273895ca6db129ab19314c010ec1486565d7d5bb 100644 (file)
@@ -7,6 +7,14 @@ sonar {
 }
 
 dependencies {
+    api project(':server:sonar-telemetry-core')
+
+    implementation project(':server:sonar-process')
+    implementation project(':server:sonar-server-common')
+    implementation project(':server:sonar-webserver-core')
+    implementation project(':server:sonar-webserver-webapi')
+    implementation project(':sonar-core')
+
     testImplementation(platform("org.junit:junit-bom:5.9.1"))
     testImplementation 'com.squareup.okhttp3:mockwebserver'
     testImplementation 'com.tngtech.java:junit-dataprovider'
@@ -18,12 +26,6 @@ dependencies {
     testImplementation project(':sonar-testing-harness')
     testImplementation testFixtures(project(':server:sonar-server-common'))
 
-    api project(':server:sonar-process')
-    api project(':server:sonar-server-common')
-    api project(':server:sonar-webserver-core')
-    api project(':server:sonar-webserver-webapi')
-    api project(':sonar-core')
-
     testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
 }
 
index 91743dc5fb05466953adc6d2d92a82cb3cfe2b94..f264fc8c107dd35bfe254627cf0fe8f7e56d9a29 100644 (file)
@@ -25,9 +25,9 @@ import org.junit.jupiter.api.Test;
 import org.sonar.api.impl.utils.TestSystem2;
 import org.sonar.core.util.UuidFactory;
 import org.sonar.db.DbTester;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.TelemetryDataProvider;
 import org.sonar.telemetry.FakeServer;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.TelemetryDataProvider;
 import org.sonar.telemetry.metrics.schema.BaseMessage;
 
 import static org.assertj.core.api.Assertions.assertThat;
diff --git a/server/sonar-telemetry/src/it/java/org/sonar/telemetry/project/ProjectCppAutoconfigTelemetryProviderIT.java b/server/sonar-telemetry/src/it/java/org/sonar/telemetry/project/ProjectCppAutoconfigTelemetryProviderIT.java
deleted file mode 100644 (file)
index 1b9e7e2..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry.project;
-
-import java.util.Map;
-import java.util.function.Consumer;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbTester;
-import org.sonar.db.component.ComponentDto;
-import org.sonar.db.component.ProjectData;
-import org.sonar.db.measure.LiveMeasureDto;
-import org.sonar.db.metric.MetricDto;
-import org.sonar.db.project.ProjectDto;
-import org.sonar.telemetry.project.ProjectCppAutoconfigTelemetryProvider;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.sonar.api.measures.CoreMetrics.NCLOC_LANGUAGE_DISTRIBUTION_KEY;
-import static org.sonar.api.measures.Metric.ValueType.STRING;
-
-class ProjectCppAutoconfigTelemetryProviderIT {
-
-  private final System2 system2 = new AlwaysIncreasingSystem2(1000L);
-
-  @RegisterExtension
-  public final DbTester db = DbTester.create(system2);
-
-  ProjectCppAutoconfigTelemetryProvider underTest = new ProjectCppAutoconfigTelemetryProvider(db.getDbClient());
-
-  @Test
-  void getUuidValues_whenNoProjects_returnEmptyList() {
-    assertThat(underTest.getUuidValues()).isEmpty();
-  }
-
-  @Test
-  void getUuidValues_whenNoCppAndCProjects_returnEmptyMap() {
-    Consumer<MetricDto> configureMetric = metric -> metric
-      .setValueType(STRING.name())
-      .setKey(NCLOC_LANGUAGE_DISTRIBUTION_KEY);
-
-    MetricDto metric = db.measures().insertMetric(configureMetric);
-
-    ProjectData project1 = db.components().insertPrivateProject();
-    ProjectData project2 = db.components().insertPrivateProject();
-
-    insertLiveMeasure("java", metric).accept(project1);
-    insertLiveMeasure("cobol", metric).accept(project2);
-
-
-    assertThat(underTest.getUuidValues()).isEmpty();
-  }
-
-  @Test
-  void getUuidValues_when1CppAnd1CProject_returnMapWithSize2AndAutoconfigByDefault() {
-    Consumer<MetricDto> configureMetric = metric -> metric
-      .setValueType(STRING.name())
-      .setKey(NCLOC_LANGUAGE_DISTRIBUTION_KEY);
-
-    MetricDto metric = db.measures().insertMetric(configureMetric);
-
-    ProjectData project1 = db.components().insertPrivateProject();
-    ProjectData project2 = db.components().insertPrivateProject();
-    ProjectData project3 = db.components().insertPrivateProject();
-    ProjectData project4 = db.components().insertPrivateProject();
-
-    insertLiveMeasure("c", metric).accept(project1);
-    insertLiveMeasure("cpp", metric).accept(project2);
-    insertLiveMeasure("java", metric).accept(project3);
-    insertLiveMeasure("cobol", metric).accept(project4);
-
-    Map<String, String> actualResult = underTest.getUuidValues();
-
-    assertThat(actualResult).hasSize(2);
-    assertThat(actualResult).containsExactlyInAnyOrderEntriesOf(Map.of(project1.getProjectDto().getUuid(), "AUTOCONFIG",
-      project2.getProjectDto().getUuid(), "AUTOCONFIG"));
-  }
-
-  @Test
-  void getUuidValues_whenCAndCppProjectsWithDifferentConfig_returnMapWithSize2AndNotAutoconfig() {
-    Consumer<MetricDto> configureMetric = metric -> metric
-      .setValueType(STRING.name())
-      .setKey(NCLOC_LANGUAGE_DISTRIBUTION_KEY);
-
-    MetricDto metric = db.measures().insertMetric(configureMetric);
-
-    ProjectData project1 = db.components().insertPrivateProject();
-    ProjectData project2 = db.components().insertPrivateProject();
-    ProjectData project3 = db.components().insertPrivateProject();
-    ProjectData project4 = db.components().insertPrivateProject();
-
-    insertLiveMeasure("c", metric).accept(project1);
-    insertLiveMeasure("cpp", metric).accept(project2);
-    insertLiveMeasure("java", metric).accept(project3);
-    insertLiveMeasure("cobol", metric).accept(project4);
-
-    db.properties().insertProperty("sonar.cfamily.build-wrapper-output", "anyvalue", project1.getProjectDto().getUuid());
-    db.properties().insertProperty("sonar.cfamily.compile-commands", "anyvalue", project2.getProjectDto().getUuid());
-
-    Map<String, String> actualResult = underTest.getUuidValues();
-
-    assertThat(actualResult).hasSize(2);
-    assertThat(actualResult).containsExactlyInAnyOrderEntriesOf(Map.of(project1.getProjectDto().getUuid(), "BW_DEPRECATED",
-      project2.getProjectDto().getUuid(), "COMPDB"));
-  }
-
-  private Consumer<LiveMeasureDto> configureLiveMeasure(String language, MetricDto metric, ProjectDto project, ComponentDto componentDto) {
-    return liveMeasure -> liveMeasure
-      .setMetricUuid(metric.getUuid())
-      .setComponentUuid(componentDto.uuid())
-      .setProjectUuid(project.getUuid())
-      .setData(language + "=" + 100);
-  }
-
-  private Consumer<ProjectData> insertLiveMeasure(String language, MetricDto metric) {
-    return projectData -> db.measures().insertLiveMeasure(projectData.getMainBranchComponent(), metric,
-      configureLiveMeasure(language, metric, projectData.getProjectDto(), projectData.getMainBranchComponent()));
-  }
-}
diff --git a/server/sonar-telemetry/src/it/java/org/sonar/telemetry/user/TelemetryUserEnabledProviderIT.java b/server/sonar-telemetry/src/it/java/org/sonar/telemetry/user/TelemetryUserEnabledProviderIT.java
deleted file mode 100644 (file)
index aa8c502..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry.user;
-
-import java.util.Map;
-import org.junit.Rule;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
-import org.sonar.api.utils.System2;
-import org.sonar.db.DbTester;
-import org.sonar.db.user.UserDto;
-import org.sonar.server.util.DigestUtil;
-
-import static org.assertj.core.api.Assertions.assertThat;
-
-class TelemetryUserEnabledProviderIT {
-
-  private final System2 system2 = new AlwaysIncreasingSystem2();
-
-  @Rule
-  public final DbTester db = DbTester.create(system2);
-
-
-  private final TelemetryUserEnabledProvider underTest = new TelemetryUserEnabledProvider(db.getDbClient());
-
-  @BeforeEach
-  public void beforeEach() {
-    db.executeUpdateSql("delete from users");
-  }
-
-  @Test
-  void getUuidValues_whenNoUsersInDatabase_shouldReturnEmptyMap() {
-    Map<String, Boolean> uuidValues = underTest.getUuidValues();
-
-    assertThat(uuidValues).isEmpty();
-  }
-
-  @Test
-  void getUuidValues_whenSomeUsersActive_shouldReturnBothBooleanValues() {
-    db.users().insertUser(user -> user.setUuid("uuid1").setActive(true));
-    db.users().insertUser(user -> user.setUuid("uuid1").setActive(false));
-    db.getSession().commit();
-
-    Map<String, Boolean> uuidValues = underTest.getUuidValues();
-
-    assertThat(uuidValues).hasSize(2);
-    assertThat(uuidValues.values().stream().filter(Boolean::booleanValue)).hasSize(1);
-    assertThat(uuidValues.values().stream().filter(b -> !b)).hasSize(1);
-  }
-
-  @Test
-  void getUuidValues_when10ActiveUsers_shouldReturn10BooleanValues() {
-    for (int i = 0; i < 10; i++) {
-      db.users().insertUser(user -> user.setActive(true));
-    }
-    db.getSession().commit();
-
-    Map<String, Boolean> uuidValues = underTest.getUuidValues();
-
-    assertThat(uuidValues).hasSize(10);
-    assertThat(uuidValues.values().stream().filter(Boolean::booleanValue)).hasSize(10);
-  }
-
-  @Test
-  void getUuidValues_shouldAnonymizeUserUuids() {
-    UserDto userDto1 = db.users().insertUser();
-    UserDto userDto2 = db.users().insertUser();
-    db.getSession().commit();
-
-    Map<String, Boolean> uuidValues = underTest.getUuidValues();
-
-    String anonymizedUser1 = DigestUtil.sha3_224Hex(userDto1.getUuid());
-    String anonymizedUser2 = DigestUtil.sha3_224Hex(userDto2.getUuid());
-    assertThat(uuidValues.keySet()).containsExactlyInAnyOrder(anonymizedUser1, anonymizedUser2);
-  }
-
-}
diff --git a/server/sonar-telemetry/src/main/java/org/sonar/telemetry/Dimension.java b/server/sonar-telemetry/src/main/java/org/sonar/telemetry/Dimension.java
deleted file mode 100644 (file)
index b30efed..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry;
-
-import com.fasterxml.jackson.annotation.JsonValue;
-
-/**
- * Represents the dimension of the data provided by a {@link TelemetryDataProvider}.
- * {@link Dimension#PROJECT}, {@link Dimension#LANGUAGE} and {@link Dimension#USER} should not provide aggregated data.
- * For aggregated data (i.e. average number of lines of code per project), use #INSTALLATION.
- */
-public enum Dimension {
-  INSTALLATION("installation"),
-  USER("user"),
-  PROJECT("project"),
-  LANGUAGE("language");
-
-  private final String value;
-
-  Dimension(String value) {
-    this.value = value;
-  }
-
-  @JsonValue
-  public String getValue() {
-    return value;
-  }
-
-  public static Dimension fromValue(String value) {
-    for (Dimension dimension : Dimension.values()) {
-      if (dimension.value.equalsIgnoreCase(value)) {
-        return dimension;
-      }
-    }
-    throw new IllegalArgumentException("Unknown dimension value: " + value);
-  }
-}
diff --git a/server/sonar-telemetry/src/main/java/org/sonar/telemetry/Granularity.java b/server/sonar-telemetry/src/main/java/org/sonar/telemetry/Granularity.java
deleted file mode 100644 (file)
index 7c35086..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry;
-
-import com.fasterxml.jackson.annotation.JsonValue;
-
-/**
- * Represent the granularity of the data provided by a {@link TelemetryDataProvider}. This both defines the time period between to pushes to
- * telemetry server for a given metric and the time period that the data represents.
- * Modifying this enum needs to be discussed beforehand with Data Platform team.
- */
-public enum Granularity {
-  DAILY("daily"),
-  WEEKLY("weekly"),
-  MONTHLY("monthly");
-
-  private final String value;
-
-  Granularity(String value) {
-    this.value = value;
-  }
-
-  @JsonValue
-  public String getValue() {
-    return value;
-  }
-}
diff --git a/server/sonar-telemetry/src/main/java/org/sonar/telemetry/TelemetryDataProvider.java b/server/sonar-telemetry/src/main/java/org/sonar/telemetry/TelemetryDataProvider.java
deleted file mode 100644 (file)
index fb0f7f8..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry;
-
-import java.util.Map;
-
-/**
- * This interface is used to provide data to the telemetry system. The telemetry system will call the methods of this interface to get the
- * data that will be sent to the telemetry server.
- * If you want to add new metric to the telemetry system, you need to create a new implementation of this interface and register it in the
- * Spring context as a bean.
- *
- * @param <T> type of the value provided by this instance. Should be either {@link Boolean}, {@link String},
- * {@link Integer} or {@link Float}.
- */
-public interface TelemetryDataProvider<T> {
-
-  /**
-   * @return the key of the metric that will be used to store the value of the data provided by this instance. The combination of
-   * metric key and dimension needs to be universally unique. The metric key needs to be written in snake_case.
-   */
-  String getMetricKey();
-
-  /**
-   * @return the dimension ("category") of the data provided by this instance. The combination of metric key and dimension needs to be
-   * universally unique.
-   */
-  Dimension getDimension();
-
-  /**
-   * @return returns the granularity of this telemetry metric.
-   * @see Granularity
-   */
-  Granularity getGranularity();
-
-  /**
-   * @return the type of the data provided by this instance.
-   */
-  TelemetryDataType getType();
-
-  /**
-   * The implementation of this method might often need to make a call to a database.
-   * For each metric either this method or {@link TelemetryDataProvider#getUuidValues()} should be implemented and used. Not both at once.
-   *
-   * @return the value of the data provided by this instance.
-   */
-  default T getValue() {
-    throw new IllegalStateException("Not implemented");
-  }
-
-  /**
-   * The implementation of this method might often need to make a call to a database.
-   * Similiar as {@link TelemetryDataProvider#getValue()} this method returns values of the metric. Some of the metrics
-   * associate a UUID with a value. This method is used to return all the values associated with the UUIDs.
-   *
-   * @return map of UUIDs and their values.
-   */
-  default Map<String, T> getUuidValues() {
-    throw new IllegalStateException("Not implemented");
-  }
-}
diff --git a/server/sonar-telemetry/src/main/java/org/sonar/telemetry/TelemetryDataType.java b/server/sonar-telemetry/src/main/java/org/sonar/telemetry/TelemetryDataType.java
deleted file mode 100644 (file)
index a59bd03..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry;
-
-import com.fasterxml.jackson.annotation.JsonValue;
-
-/**
- * Represents the type of the data provided by a {@link TelemetryDataProvider}.
- * Modifying this enum needs to be discussed beforehand with Data Platform team.
- */
-public enum TelemetryDataType {
-  BOOLEAN("boolean"),
-  STRING("string"),
-  INTEGER("integer"),
-  FLOAT("float");
-
-  private final String value;
-
-  TelemetryDataType(String value) {
-    this.value = value;
-  }
-
-  @JsonValue
-  public String getValue() {
-    return value;
-  }
-}
index e7cf201a73a43e61b5ceac5662323f5bd43c3859..5cb2e69e24281e9301873928c5b05a391cb43891 100644 (file)
@@ -32,8 +32,8 @@ import org.sonar.core.util.UuidFactory;
 import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.telemetry.TelemetryMetricsSentDto;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.TelemetryDataProvider;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.TelemetryDataProvider;
 import org.sonar.telemetry.metrics.schema.BaseMessage;
 import org.sonar.telemetry.metrics.schema.Metric;
 import org.sonar.telemetry.metrics.util.SentMetricsStorage;
index 645798bf721c834e560a5fb4557bcf13c359e935..f6ff629effb61f7889f17ee6b17f02281e512bed 100644 (file)
@@ -22,7 +22,7 @@ package org.sonar.telemetry.metrics;
 import java.util.Collections;
 import java.util.Set;
 import java.util.stream.Collectors;
-import org.sonar.telemetry.TelemetryDataProvider;
+import org.sonar.telemetry.core.TelemetryDataProvider;
 import org.sonar.telemetry.metrics.schema.InstallationMetric;
 import org.sonar.telemetry.metrics.schema.LanguageMetric;
 import org.sonar.telemetry.metrics.schema.Metric;
index 2bbbbf2753f3897f643b50f8cbdb14e5e08c78fb..2c4ad2b725d9a54cd54584bf5cee9903486d2066 100644 (file)
@@ -22,7 +22,7 @@ package org.sonar.telemetry.metrics.schema;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.Objects;
 import java.util.Set;
-import org.sonar.telemetry.Dimension;
+import org.sonar.telemetry.core.Dimension;
 
 public class BaseMessage {
   @JsonProperty("message_uuid")
index 0c3eea43c090de0634a31412cc0c1a2388fc032a..0f0a2abc0fea45a6e710d1536644a6fbb3996c5f 100644 (file)
@@ -19,8 +19,8 @@
  */
 package org.sonar.telemetry.metrics.schema;
 
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 public class InstallationMetric extends Metric {
 
index 766dcf9cbe60c673ce131eec513b4d18e2c03e7d..236c31d7d3882aeb18fc2da4f2cccefd58ad6c54 100644 (file)
@@ -20,8 +20,8 @@
 package org.sonar.telemetry.metrics.schema;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 public class LanguageMetric extends Metric {
 
index efdf43d0dd7db917a400b161bf1ec342daa2d658..ad5c17f51940ef7fb000fbc1452360b0b19a59bc 100644 (file)
@@ -20,8 +20,8 @@
 package org.sonar.telemetry.metrics.schema;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 public abstract class Metric {
   @JsonProperty("key")
index 421d2e79ca627057c7a48dc20336f6bcf29f7e23..fc9ff8e4cd41815d65e75da41b56a43c90004968 100644 (file)
@@ -20,8 +20,8 @@
 package org.sonar.telemetry.metrics.schema;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 public class ProjectMetric extends Metric {
 
index a9ff05657dfdb2967d4961a284f34cb4c0b5e017..2af08ca023ed86757989259fde96dc4c4a19a1e6 100644 (file)
@@ -20,8 +20,8 @@
 package org.sonar.telemetry.metrics.schema;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 public class UserMetric extends Metric {
 
index 36ab85505b13b54a7e70e3a9d24b0696cd5e0ef8..3f8b7c73cc6aeab0f198249997992342f130de74 100644 (file)
@@ -29,8 +29,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import org.sonar.db.telemetry.TelemetryMetricsSentDto;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
 
 public class SentMetricsStorage {
   private final Map<Dimension, Map<String, TelemetryMetricsSentDto>> dimensionMetricKeyMap = new EnumMap<>(Dimension.class);
diff --git a/server/sonar-telemetry/src/main/java/org/sonar/telemetry/project/ProjectCppAutoconfigTelemetryProvider.java b/server/sonar-telemetry/src/main/java/org/sonar/telemetry/project/ProjectCppAutoconfigTelemetryProvider.java
deleted file mode 100644 (file)
index caa0b90..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry.project;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
-import org.sonar.db.project.ProjectDto;
-import org.sonar.db.property.PropertyDto;
-import org.sonar.db.property.PropertyQuery;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
-import org.sonar.telemetry.TelemetryDataProvider;
-
-public class ProjectCppAutoconfigTelemetryProvider implements TelemetryDataProvider<String> {
-
-  private final DbClient dbClient;
-
-  public ProjectCppAutoconfigTelemetryProvider(DbClient dbClient) {
-    this.dbClient = dbClient;
-  }
-
-  @Override
-  public String getMetricKey() {
-    return "project_cpp_config_type";
-  }
-
-  @Override
-  public Dimension getDimension() {
-    return Dimension.PROJECT;
-  }
-
-  @Override
-  public Granularity getGranularity() {
-    return Granularity.WEEKLY;
-  }
-
-  @Override
-  public TelemetryDataType getType() {
-    return TelemetryDataType.STRING;
-  }
-
-  @Override
-  public Map<String, String> getUuidValues() {
-    Map<String, String> cppConfigTypePerProjectUuid = new HashMap<>();
-    try (DbSession dbSession = dbClient.openSession(true)) {
-      //TODO in the feature ideally languages should be defined in the codebase as enums, using strings is error-prone
-      List<ProjectDto> cppProjects = dbClient.projectDao().selectProjectsByLanguage(dbSession, Set.of("cpp", "c"));
-      for (ProjectDto cppProject : cppProjects) {
-        CppConfigType cppConfigType = getCppConfigType(cppProject, dbSession);
-        cppConfigTypePerProjectUuid.put(cppProject.getUuid(), cppConfigType.name());
-      }
-    }
-    return cppConfigTypePerProjectUuid;
-  }
-
-  private CppConfigType getCppConfigType(ProjectDto project, DbSession dbSession) {
-    List<PropertyDto> propertyDtos = dbClient.propertiesDao().selectByQuery(PropertyQuery
-      .builder()
-      .setEntityUuid(project.getUuid())
-      .build(), dbSession);
-    for (PropertyDto propertyDto : propertyDtos) {
-      if (propertyDto.getKey().equals("sonar.cfamily.build-wrapper-output")) {
-        return CppConfigType.BW_DEPRECATED;
-      }
-      if (propertyDto.getKey().equals("sonar.cfamily.compile-commands")) {
-        return CppConfigType.COMPDB;
-      }
-    }
-    return CppConfigType.AUTOCONFIG;
-  }
-
-  enum CppConfigType {
-    BW_DEPRECATED, COMPDB, AUTOCONFIG
-  }
-}
diff --git a/server/sonar-telemetry/src/main/java/org/sonar/telemetry/project/package-info.java b/server/sonar-telemetry/src/main/java/org/sonar/telemetry/project/package-info.java
deleted file mode 100644 (file)
index 3d6bbd2..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.telemetry.project;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-telemetry/src/main/java/org/sonar/telemetry/user/TelemetryUserEnabledProvider.java b/server/sonar-telemetry/src/main/java/org/sonar/telemetry/user/TelemetryUserEnabledProvider.java
deleted file mode 100644 (file)
index fb7358e..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry.user;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import org.sonar.db.DbClient;
-import org.sonar.db.DbSession;
-import org.sonar.db.user.UserDto;
-import org.sonar.db.user.UserQuery;
-import org.sonar.server.util.DigestUtil;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataProvider;
-import org.sonar.telemetry.TelemetryDataType;
-
-public class TelemetryUserEnabledProvider implements TelemetryDataProvider<Boolean> {
-
-  private final DbClient dbClient;
-
-  public TelemetryUserEnabledProvider(DbClient dbClient) {
-    this.dbClient = dbClient;
-  }
-
-  @Override
-  public String getMetricKey() {
-    return "user_enabled";
-  }
-
-  @Override
-  public Dimension getDimension() {
-    return Dimension.USER;
-  }
-
-  @Override
-  public Granularity getGranularity() {
-    return Granularity.DAILY;
-  }
-
-  @Override
-  public TelemetryDataType getType() {
-    return TelemetryDataType.BOOLEAN;
-  }
-
-  @Override
-  public Map<String, Boolean> getUuidValues() {
-    Map<String, Boolean> result = new HashMap<>();
-    int pageSize = 1000;
-    int page = 1;
-    try (DbSession dbSession = dbClient.openSession(false)) {
-      List<UserDto> userDtos;
-      do {
-        userDtos = dbClient.userDao().selectUsers(dbSession, UserQuery.builder().build(), page, pageSize);
-        for (UserDto userDto : userDtos) {
-          String anonymizedUuid = DigestUtil.sha3_224Hex(userDto.getUuid());
-          result.put(anonymizedUuid, userDto.isActive());
-        }
-        page++;
-      } while (!userDtos.isEmpty());
-    }
-    return result;
-  }
-}
diff --git a/server/sonar-telemetry/src/main/java/org/sonar/telemetry/user/package-info.java b/server/sonar-telemetry/src/main/java/org/sonar/telemetry/user/package-info.java
deleted file mode 100644 (file)
index a8fd2a2..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-@ParametersAreNonnullByDefault
-package org.sonar.telemetry.user;
-
-import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-telemetry/src/test/java/org/sonar/telemetry/DimensionTest.java b/server/sonar-telemetry/src/test/java/org/sonar/telemetry/DimensionTest.java
deleted file mode 100644 (file)
index 6c30ec7..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry;
-
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-class DimensionTest {
-  @Test
-  void getValue() {
-    assertEquals("installation", Dimension.INSTALLATION.getValue());
-    assertEquals("user", Dimension.USER.getValue());
-    assertEquals("project", Dimension.PROJECT.getValue());
-    assertEquals("language", Dimension.LANGUAGE.getValue());
-  }
-
-  @Test
-  void fromValue() {
-    assertEquals(Dimension.INSTALLATION, Dimension.fromValue("installation"));
-    assertEquals(Dimension.USER, Dimension.fromValue("user"));
-    assertEquals(Dimension.PROJECT, Dimension.fromValue("project"));
-    assertEquals(Dimension.LANGUAGE, Dimension.fromValue("language"));
-
-    assertEquals(Dimension.INSTALLATION, Dimension.fromValue("INSTALLATION"));
-    assertEquals(Dimension.USER, Dimension.fromValue("USER"));
-    assertEquals(Dimension.PROJECT, Dimension.fromValue("PROJECT"));
-    assertEquals(Dimension.LANGUAGE, Dimension.fromValue("LANGUAGE"));
-  }
-
-  @Test
-  void fromValue_whenInvalid() {
-    Exception exception = assertThrows(IllegalArgumentException.class, () -> {
-      Dimension.fromValue("invalid");
-    });
-    assertEquals("Unknown dimension value: invalid", exception.getMessage());
-  }
-}
diff --git a/server/sonar-telemetry/src/test/java/org/sonar/telemetry/GranularityTest.java b/server/sonar-telemetry/src/test/java/org/sonar/telemetry/GranularityTest.java
deleted file mode 100644 (file)
index dc3946d..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry;
-
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-class GranularityTest {
-
-  @Test
-  void getValue() {
-    assertEquals("daily", Granularity.DAILY.getValue());
-    assertEquals("weekly", Granularity.WEEKLY.getValue());
-    assertEquals("monthly", Granularity.MONTHLY.getValue());
-  }
-
-}
diff --git a/server/sonar-telemetry/src/test/java/org/sonar/telemetry/TelemetryDataTypeTest.java b/server/sonar-telemetry/src/test/java/org/sonar/telemetry/TelemetryDataTypeTest.java
deleted file mode 100644 (file)
index 7d3a3cc..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry;
-
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-class TelemetryDataTypeTest {
-  @Test
-  void getValue() {
-    assertEquals("integer", TelemetryDataType.INTEGER.getValue());
-    assertEquals("string", TelemetryDataType.STRING.getValue());
-    assertEquals("boolean", TelemetryDataType.BOOLEAN.getValue());
-    assertEquals("float", TelemetryDataType.FLOAT.getValue());
-  }
-
-}
index 276948bd3600301ab248ed5c1be2860e64082e56..a4ef44b09c3d9038fa74d8e1f7ec53cf8758891d 100644 (file)
@@ -24,10 +24,10 @@ import java.util.List;
 import java.util.Set;
 import org.assertj.core.groups.Tuple;
 import org.junit.jupiter.api.Test;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataProvider;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataProvider;
+import org.sonar.telemetry.core.TelemetryDataType;
 import org.sonar.telemetry.metrics.schema.InstallationMetric;
 import org.sonar.telemetry.metrics.schema.LanguageMetric;
 import org.sonar.telemetry.metrics.schema.Metric;
index 876f6b025c11fedcaff249e43da79bdb78e00152..e19824e84b0c59e194e2e1fe28c859427ed5c8df 100644 (file)
 package org.sonar.telemetry.metrics;
 
 import java.util.Map;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataProvider;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataProvider;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 public class TestTelemetryBean implements TelemetryDataProvider<String> {
 
index dd50af1b46a890a216776fee129a52bcdf129fa9..e702018f37e8ad433accb7b40227d7d88e3a50b7 100644 (file)
@@ -27,9 +27,9 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.tuple;
index 2a1215626e3b6ff11dd801231d3abca4d006a664..43408b7a2ba8c06a9d2fea7479e508457251d164 100644 (file)
@@ -20,8 +20,8 @@
 package org.sonar.telemetry.metrics.schema;
 
 import org.junit.jupiter.api.Test;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
index 61c72956255ca527e672f1fbf6e579dc59e97a3e..832ec3d8f03db3fe98b364b414f4f3ca0aebc2e7 100644 (file)
@@ -20,8 +20,8 @@
 package org.sonar.telemetry.metrics.schema;
 
 import org.junit.jupiter.api.Test;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
index cbcdb2c8180652e75aa843c95e7ad62103592c4b..7eb23fcfcf1c5718c9eba13aba8a3efd7934b802 100644 (file)
@@ -20,8 +20,8 @@
 package org.sonar.telemetry.metrics.schema;
 
 import org.junit.jupiter.api.Test;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
index 2f171714b8ed3c6bfe52d842b87ee1ec97c99fe1..04466d0909ff8254a5a589166ff05fbc23f781b9 100644 (file)
@@ -20,8 +20,8 @@
 package org.sonar.telemetry.metrics.schema;
 
 import org.junit.jupiter.api.Test;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
index 098bb2dc82f3fee585d22834e4c33ade71527846..57aa2e858e05fc418222c66376995cefa8ff5453 100644 (file)
@@ -25,9 +25,9 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 import org.sonar.telemetry.metrics.schema.BaseMessage;
 import org.sonar.telemetry.metrics.schema.InstallationMetric;
 import org.sonar.telemetry.metrics.schema.LanguageMetric;
index 8bced4154525f38a11f462605ee4cef7468e64ad..ad2cf915d8b1a8d9d4364100d5f15ac8b2b87d57 100644 (file)
@@ -28,8 +28,8 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.sonar.db.telemetry.TelemetryMetricsSentDto;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
 
 public class SentMetricsStorageTest {
 
diff --git a/server/sonar-telemetry/src/test/java/org/sonar/telemetry/project/ProjectCppAutoconfigTelemetryProviderTest.java b/server/sonar-telemetry/src/test/java/org/sonar/telemetry/project/ProjectCppAutoconfigTelemetryProviderTest.java
deleted file mode 100644 (file)
index ccbf1bc..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry.project;
-
-import org.junit.jupiter.api.Test;
-import org.sonar.db.DbClient;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.Mockito.mock;
-
-class ProjectCppAutoconfigTelemetryProviderTest {
-
-  @Test
-  void testGetters() {
-     ProjectCppAutoconfigTelemetryProvider provider = new ProjectCppAutoconfigTelemetryProvider(mock(DbClient.class));
-
-     assertEquals("project_cpp_config_type", provider.getMetricKey());
-     assertEquals(Dimension.PROJECT, provider.getDimension());
-     assertEquals(Granularity.WEEKLY, provider.getGranularity());
-     assertEquals(TelemetryDataType.STRING, provider.getType());
-  }
-}
diff --git a/server/sonar-telemetry/src/test/java/org/sonar/telemetry/user/TelemetryUserEnabledProviderTest.java b/server/sonar-telemetry/src/test/java/org/sonar/telemetry/user/TelemetryUserEnabledProviderTest.java
deleted file mode 100644 (file)
index 0320658..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * SonarQube
- * Copyright (C) 2009-2024 SonarSource SA
- * mailto:info AT sonarsource DOT com
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 3 of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- */
-package org.sonar.telemetry.user;
-
-import org.junit.jupiter.api.Test;
-import org.sonar.db.DbClient;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.mock;
-
-class TelemetryUserEnabledProviderTest {
-
-  private final DbClient dbClient = mock(DbClient.class);
-
-  private final TelemetryUserEnabledProvider underTest = new TelemetryUserEnabledProvider(dbClient);
-
-  @Test
-  void testGetters() {
-    assertThat(underTest.getDimension()).isEqualTo(Dimension.USER);
-    assertThat(underTest.getGranularity()).isEqualTo(Granularity.DAILY);
-    assertThat(underTest.getMetricKey()).isEqualTo("user_enabled");
-    assertThat(underTest.getType()).isEqualTo(TelemetryDataType.BOOLEAN);
-  }
-}
diff --git a/server/sonar-webserver/src/it/java/org/sonar/server/platform/telemetry/ProjectCppAutoconfigTelemetryProviderIT.java b/server/sonar-webserver/src/it/java/org/sonar/server/platform/telemetry/ProjectCppAutoconfigTelemetryProviderIT.java
new file mode 100644 (file)
index 0000000..ee6c1f5
--- /dev/null
@@ -0,0 +1,136 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.platform.telemetry;
+
+import java.util.Map;
+import java.util.function.Consumer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
+import org.sonar.api.utils.System2;
+import org.sonar.db.DbTester;
+import org.sonar.db.component.ComponentDto;
+import org.sonar.db.component.ProjectData;
+import org.sonar.db.measure.LiveMeasureDto;
+import org.sonar.db.metric.MetricDto;
+import org.sonar.db.project.ProjectDto;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.sonar.api.measures.CoreMetrics.NCLOC_LANGUAGE_DISTRIBUTION_KEY;
+import static org.sonar.api.measures.Metric.ValueType.STRING;
+
+class ProjectCppAutoconfigTelemetryProviderIT {
+
+  private final System2 system2 = new AlwaysIncreasingSystem2(1000L);
+
+  @RegisterExtension
+  public final DbTester db = DbTester.create(system2);
+
+  ProjectCppAutoconfigTelemetryProvider underTest = new ProjectCppAutoconfigTelemetryProvider(db.getDbClient());
+
+  @Test
+  void getUuidValues_whenNoProjects_returnEmptyList() {
+    assertThat(underTest.getUuidValues()).isEmpty();
+  }
+
+  @Test
+  void getUuidValues_whenNoCppAndCProjects_returnEmptyMap() {
+    Consumer<MetricDto> configureMetric = metric -> metric
+      .setValueType(STRING.name())
+      .setKey(NCLOC_LANGUAGE_DISTRIBUTION_KEY);
+
+    MetricDto metric = db.measures().insertMetric(configureMetric);
+
+    ProjectData project1 = db.components().insertPrivateProject();
+    ProjectData project2 = db.components().insertPrivateProject();
+
+    insertLiveMeasure("java", metric).accept(project1);
+    insertLiveMeasure("cobol", metric).accept(project2);
+
+
+    assertThat(underTest.getUuidValues()).isEmpty();
+  }
+
+  @Test
+  void getUuidValues_when1CppAnd1CProject_returnMapWithSize2AndAutoconfigByDefault() {
+    Consumer<MetricDto> configureMetric = metric -> metric
+      .setValueType(STRING.name())
+      .setKey(NCLOC_LANGUAGE_DISTRIBUTION_KEY);
+
+    MetricDto metric = db.measures().insertMetric(configureMetric);
+
+    ProjectData project1 = db.components().insertPrivateProject();
+    ProjectData project2 = db.components().insertPrivateProject();
+    ProjectData project3 = db.components().insertPrivateProject();
+    ProjectData project4 = db.components().insertPrivateProject();
+
+    insertLiveMeasure("c", metric).accept(project1);
+    insertLiveMeasure("cpp", metric).accept(project2);
+    insertLiveMeasure("java", metric).accept(project3);
+    insertLiveMeasure("cobol", metric).accept(project4);
+
+    Map<String, String> actualResult = underTest.getUuidValues();
+
+    assertThat(actualResult).hasSize(2);
+    assertThat(actualResult).containsExactlyInAnyOrderEntriesOf(Map.of(project1.getProjectDto().getUuid(), "AUTOCONFIG",
+      project2.getProjectDto().getUuid(), "AUTOCONFIG"));
+  }
+
+  @Test
+  void getUuidValues_whenCAndCppProjectsWithDifferentConfig_returnMapWithSize2AndNotAutoconfig() {
+    Consumer<MetricDto> configureMetric = metric -> metric
+      .setValueType(STRING.name())
+      .setKey(NCLOC_LANGUAGE_DISTRIBUTION_KEY);
+
+    MetricDto metric = db.measures().insertMetric(configureMetric);
+
+    ProjectData project1 = db.components().insertPrivateProject();
+    ProjectData project2 = db.components().insertPrivateProject();
+    ProjectData project3 = db.components().insertPrivateProject();
+    ProjectData project4 = db.components().insertPrivateProject();
+
+    insertLiveMeasure("c", metric).accept(project1);
+    insertLiveMeasure("cpp", metric).accept(project2);
+    insertLiveMeasure("java", metric).accept(project3);
+    insertLiveMeasure("cobol", metric).accept(project4);
+
+    db.properties().insertProperty("sonar.cfamily.build-wrapper-output", "anyvalue", project1.getProjectDto().getUuid());
+    db.properties().insertProperty("sonar.cfamily.compile-commands", "anyvalue", project2.getProjectDto().getUuid());
+
+    Map<String, String> actualResult = underTest.getUuidValues();
+
+    assertThat(actualResult).hasSize(2);
+    assertThat(actualResult).containsExactlyInAnyOrderEntriesOf(Map.of(project1.getProjectDto().getUuid(), "BW_DEPRECATED",
+      project2.getProjectDto().getUuid(), "COMPDB"));
+  }
+
+  private Consumer<LiveMeasureDto> configureLiveMeasure(String language, MetricDto metric, ProjectDto project, ComponentDto componentDto) {
+    return liveMeasure -> liveMeasure
+      .setMetricUuid(metric.getUuid())
+      .setComponentUuid(componentDto.uuid())
+      .setProjectUuid(project.getUuid())
+      .setData(language + "=" + 100);
+  }
+
+  private Consumer<ProjectData> insertLiveMeasure(String language, MetricDto metric) {
+    return projectData -> db.measures().insertLiveMeasure(projectData.getMainBranchComponent(), metric,
+      configureLiveMeasure(language, metric, projectData.getProjectDto(), projectData.getMainBranchComponent()));
+  }
+}
diff --git a/server/sonar-webserver/src/it/java/org/sonar/server/platform/telemetry/TelemetryUserEnabledProviderIT.java b/server/sonar-webserver/src/it/java/org/sonar/server/platform/telemetry/TelemetryUserEnabledProviderIT.java
new file mode 100644 (file)
index 0000000..f0466da
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.platform.telemetry;
+
+import java.util.Map;
+import org.junit.Rule;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.sonar.api.impl.utils.AlwaysIncreasingSystem2;
+import org.sonar.api.utils.System2;
+import org.sonar.db.DbTester;
+import org.sonar.db.user.UserDto;
+import org.sonar.server.util.DigestUtil;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class TelemetryUserEnabledProviderIT {
+
+  private final System2 system2 = new AlwaysIncreasingSystem2();
+
+  @Rule
+  public final DbTester db = DbTester.create(system2);
+
+
+  private final TelemetryUserEnabledProvider underTest = new TelemetryUserEnabledProvider(db.getDbClient());
+
+  @BeforeEach
+  public void beforeEach() {
+    db.executeUpdateSql("delete from users");
+  }
+
+  @Test
+  void getUuidValues_whenNoUsersInDatabase_shouldReturnEmptyMap() {
+    Map<String, Boolean> uuidValues = underTest.getUuidValues();
+
+    assertThat(uuidValues).isEmpty();
+  }
+
+  @Test
+  void getUuidValues_whenSomeUsersActive_shouldReturnBothBooleanValues() {
+    db.users().insertUser(user -> user.setUuid("uuid1").setActive(true));
+    db.users().insertUser(user -> user.setUuid("uuid1").setActive(false));
+    db.getSession().commit();
+
+    Map<String, Boolean> uuidValues = underTest.getUuidValues();
+
+    assertThat(uuidValues).hasSize(2);
+    assertThat(uuidValues.values().stream().filter(Boolean::booleanValue)).hasSize(1);
+    assertThat(uuidValues.values().stream().filter(b -> !b)).hasSize(1);
+  }
+
+  @Test
+  void getUuidValues_when10ActiveUsers_shouldReturn10BooleanValues() {
+    for (int i = 0; i < 10; i++) {
+      db.users().insertUser(user -> user.setActive(true));
+    }
+    db.getSession().commit();
+
+    Map<String, Boolean> uuidValues = underTest.getUuidValues();
+
+    assertThat(uuidValues).hasSize(10);
+    assertThat(uuidValues.values().stream().filter(Boolean::booleanValue)).hasSize(10);
+  }
+
+  @Test
+  void getUuidValues_shouldAnonymizeUserUuids() {
+    UserDto userDto1 = db.users().insertUser();
+    UserDto userDto2 = db.users().insertUser();
+    db.getSession().commit();
+
+    Map<String, Boolean> uuidValues = underTest.getUuidValues();
+
+    String anonymizedUser1 = DigestUtil.sha3_224Hex(userDto1.getUuid());
+    String anonymizedUser2 = DigestUtil.sha3_224Hex(userDto2.getUuid());
+    assertThat(uuidValues.keySet()).containsExactlyInAnyOrder(anonymizedUser1, anonymizedUser2);
+  }
+
+}
index aa63a07edd163a46c60a4f352a6ca9ee4a113edf..da7ff01ea802d40be05716913ae98882f755f514 100644 (file)
@@ -184,7 +184,9 @@ import org.sonar.server.platform.PersistentSettings;
 import org.sonar.server.platform.SystemInfoWriterModule;
 import org.sonar.server.platform.WebCoreExtensionsInstaller;
 import org.sonar.server.platform.db.CheckAnyonePermissionsAtStartup;
+import org.sonar.server.platform.telemetry.ProjectCppAutoconfigTelemetryProvider;
 import org.sonar.server.platform.telemetry.TelemetryNclocProvider;
+import org.sonar.server.platform.telemetry.TelemetryUserEnabledProvider;
 import org.sonar.server.platform.telemetry.TelemetryVersionProvider;
 import org.sonar.server.platform.web.ActionDeprecationLoggerInterceptor;
 import org.sonar.server.platform.web.SonarLintConnectionFilter;
@@ -290,8 +292,6 @@ import org.sonar.telemetry.legacy.QualityProfileDataProvider;
 import org.sonar.telemetry.legacy.TelemetryDataJsonWriter;
 import org.sonar.telemetry.legacy.TelemetryDataLoaderImpl;
 import org.sonar.telemetry.metrics.TelemetryMetricsLoader;
-import org.sonar.telemetry.project.ProjectCppAutoconfigTelemetryProvider;
-import org.sonar.telemetry.user.TelemetryUserEnabledProvider;
 
 import static org.sonar.core.extension.CoreExtensionsInstaller.noAdditionalSideFilter;
 import static org.sonar.core.extension.PlatformLevelPredicates.hasPlatformLevel4OrNone;
diff --git a/server/sonar-webserver/src/main/java/org/sonar/server/platform/telemetry/ProjectCppAutoconfigTelemetryProvider.java b/server/sonar-webserver/src/main/java/org/sonar/server/platform/telemetry/ProjectCppAutoconfigTelemetryProvider.java
new file mode 100644 (file)
index 0000000..6473c12
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.platform.telemetry;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
+import org.sonar.db.project.ProjectDto;
+import org.sonar.db.property.PropertyDto;
+import org.sonar.db.property.PropertyQuery;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataProvider;
+import org.sonar.telemetry.core.TelemetryDataType;
+
+public class ProjectCppAutoconfigTelemetryProvider implements TelemetryDataProvider<String> {
+
+  private final DbClient dbClient;
+
+  public ProjectCppAutoconfigTelemetryProvider(DbClient dbClient) {
+    this.dbClient = dbClient;
+  }
+
+  @Override
+  public String getMetricKey() {
+    return "project_cpp_config_type";
+  }
+
+  @Override
+  public Dimension getDimension() {
+    return Dimension.PROJECT;
+  }
+
+  @Override
+  public Granularity getGranularity() {
+    return Granularity.WEEKLY;
+  }
+
+  @Override
+  public TelemetryDataType getType() {
+    return TelemetryDataType.STRING;
+  }
+
+  @Override
+  public Map<String, String> getUuidValues() {
+    Map<String, String> cppConfigTypePerProjectUuid = new HashMap<>();
+    try (DbSession dbSession = dbClient.openSession(true)) {
+      //TODO in the feature ideally languages should be defined in the codebase as enums, using strings is error-prone
+      List<ProjectDto> cppProjects = dbClient.projectDao().selectProjectsByLanguage(dbSession, Set.of("cpp", "c"));
+      for (ProjectDto cppProject : cppProjects) {
+        CppConfigType cppConfigType = getCppConfigType(cppProject, dbSession);
+        cppConfigTypePerProjectUuid.put(cppProject.getUuid(), cppConfigType.name());
+      }
+    }
+    return cppConfigTypePerProjectUuid;
+  }
+
+  private CppConfigType getCppConfigType(ProjectDto project, DbSession dbSession) {
+    List<PropertyDto> propertyDtos = dbClient.propertiesDao().selectByQuery(PropertyQuery
+      .builder()
+      .setEntityUuid(project.getUuid())
+      .build(), dbSession);
+    for (PropertyDto propertyDto : propertyDtos) {
+      if (propertyDto.getKey().equals("sonar.cfamily.build-wrapper-output")) {
+        return CppConfigType.BW_DEPRECATED;
+      }
+      if (propertyDto.getKey().equals("sonar.cfamily.compile-commands")) {
+        return CppConfigType.COMPDB;
+      }
+    }
+    return CppConfigType.AUTOCONFIG;
+  }
+
+  enum CppConfigType {
+    BW_DEPRECATED, COMPDB, AUTOCONFIG
+  }
+}
index 5e3fa11b544a4bcc4f0e92abf51158882929cf16..81f683cb96a8ecf8ee2176d2c3f95aa7a8303666 100644 (file)
@@ -27,10 +27,10 @@ import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.measure.ProjectLocDistributionDto;
 import org.sonar.db.metric.MetricDto;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataProvider;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataProvider;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 import static java.util.Arrays.asList;
 import static java.util.stream.Collectors.toMap;
diff --git a/server/sonar-webserver/src/main/java/org/sonar/server/platform/telemetry/TelemetryUserEnabledProvider.java b/server/sonar-webserver/src/main/java/org/sonar/server/platform/telemetry/TelemetryUserEnabledProvider.java
new file mode 100644 (file)
index 0000000..fa3aff0
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.platform.telemetry;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.sonar.db.DbClient;
+import org.sonar.db.DbSession;
+import org.sonar.db.user.UserDto;
+import org.sonar.db.user.UserQuery;
+import org.sonar.server.util.DigestUtil;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataProvider;
+import org.sonar.telemetry.core.TelemetryDataType;
+
+public class TelemetryUserEnabledProvider implements TelemetryDataProvider<Boolean> {
+
+  private final DbClient dbClient;
+
+  public TelemetryUserEnabledProvider(DbClient dbClient) {
+    this.dbClient = dbClient;
+  }
+
+  @Override
+  public String getMetricKey() {
+    return "user_enabled";
+  }
+
+  @Override
+  public Dimension getDimension() {
+    return Dimension.USER;
+  }
+
+  @Override
+  public Granularity getGranularity() {
+    return Granularity.DAILY;
+  }
+
+  @Override
+  public TelemetryDataType getType() {
+    return TelemetryDataType.BOOLEAN;
+  }
+
+  @Override
+  public Map<String, Boolean> getUuidValues() {
+    Map<String, Boolean> result = new HashMap<>();
+    int pageSize = 1000;
+    int page = 1;
+    try (DbSession dbSession = dbClient.openSession(false)) {
+      List<UserDto> userDtos;
+      do {
+        userDtos = dbClient.userDao().selectUsers(dbSession, UserQuery.builder().build(), page, pageSize);
+        for (UserDto userDto : userDtos) {
+          String anonymizedUuid = DigestUtil.sha3_224Hex(userDto.getUuid());
+          result.put(anonymizedUuid, userDto.isActive());
+        }
+        page++;
+      } while (!userDtos.isEmpty());
+    }
+    return result;
+  }
+}
index d76962b7cea59d99196316b83e1fb81196eb7bcc..850190948bafda9b3ed82086aa8015440f6a7218 100644 (file)
 package org.sonar.server.platform.telemetry;
 
 import org.sonar.api.platform.Server;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataProvider;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataProvider;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 public class TelemetryVersionProvider implements TelemetryDataProvider<String> {
 
diff --git a/server/sonar-webserver/src/test/java/org/sonar/server/platform/telemetry/ProjectCppAutoconfigTelemetryProviderTest.java b/server/sonar-webserver/src/test/java/org/sonar/server/platform/telemetry/ProjectCppAutoconfigTelemetryProviderTest.java
new file mode 100644 (file)
index 0000000..295d03b
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.platform.telemetry;
+
+import org.junit.jupiter.api.Test;
+import org.sonar.db.DbClient;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.mock;
+
+class ProjectCppAutoconfigTelemetryProviderTest {
+
+  @Test
+  void testGetters() {
+     ProjectCppAutoconfigTelemetryProvider provider = new ProjectCppAutoconfigTelemetryProvider(mock(DbClient.class));
+
+     assertEquals("project_cpp_config_type", provider.getMetricKey());
+     assertEquals(Dimension.PROJECT, provider.getDimension());
+     assertEquals(Granularity.WEEKLY, provider.getGranularity());
+     assertEquals(TelemetryDataType.STRING, provider.getType());
+  }
+}
index 7c9752a8088b91ff40d2d7d02c6bff9e30b6eb69..6bfd81a6e91b38e65a295e405ac117209f4db762 100644 (file)
@@ -26,8 +26,8 @@ import org.sonar.db.DbClient;
 import org.sonar.db.DbSession;
 import org.sonar.db.measure.ProjectLocDistributionDto;
 import org.sonar.db.metric.MetricDto;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
 
 import static java.util.Arrays.asList;
 import static org.assertj.core.api.Assertions.assertThat;
diff --git a/server/sonar-webserver/src/test/java/org/sonar/server/platform/telemetry/TelemetryUserEnabledProviderTest.java b/server/sonar-webserver/src/test/java/org/sonar/server/platform/telemetry/TelemetryUserEnabledProviderTest.java
new file mode 100644 (file)
index 0000000..d8b2e91
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * SonarQube
+ * Copyright (C) 2009-2024 SonarSource SA
+ * mailto:info AT sonarsource DOT com
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+package org.sonar.server.platform.telemetry;
+
+import org.junit.jupiter.api.Test;
+import org.sonar.db.DbClient;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+
+class TelemetryUserEnabledProviderTest {
+
+  private final DbClient dbClient = mock(DbClient.class);
+
+  private final TelemetryUserEnabledProvider underTest = new TelemetryUserEnabledProvider(dbClient);
+
+  @Test
+  void testGetters() {
+    assertThat(underTest.getDimension()).isEqualTo(Dimension.USER);
+    assertThat(underTest.getGranularity()).isEqualTo(Granularity.DAILY);
+    assertThat(underTest.getMetricKey()).isEqualTo("user_enabled");
+    assertThat(underTest.getType()).isEqualTo(TelemetryDataType.BOOLEAN);
+  }
+}
index d5ea987eb6dda0badf20a6cfe4c2952793143b23..1a14d52bbf32f7f76a57ee03dcb2ed027088d5d8 100644 (file)
@@ -21,9 +21,9 @@ package org.sonar.server.platform.telemetry;
 
 import org.junit.jupiter.api.Test;
 import org.sonar.api.platform.Server;
-import org.sonar.telemetry.Dimension;
-import org.sonar.telemetry.Granularity;
-import org.sonar.telemetry.TelemetryDataType;
+import org.sonar.telemetry.core.Dimension;
+import org.sonar.telemetry.core.Granularity;
+import org.sonar.telemetry.core.TelemetryDataType;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
index b2a54bb371660aede102a2ab1fb3fb62f8cb780d..6221bc05bc2ca7c1a48309a1c71f0dd828e22213 100644 (file)
@@ -45,6 +45,7 @@ include 'server:sonar-main'
 include 'server:sonar-process'
 include 'server:sonar-server-common'
 include 'server:sonar-telemetry'
+include 'server:sonar-telemetry-core'
 include 'server:sonar-web'
 include 'server:sonar-web:design-system'
 include 'server:sonar-webserver'