]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-22479 added new telemetry metric 'user_enabled'
authorlukasz-jarocki-sonarsource <lukasz.jarocki@sonarsource.com>
Wed, 10 Jul 2024 09:43:26 +0000 (11:43 +0200)
committersonartech <sonartech@sonarsource.com>
Wed, 24 Jul 2024 20:02:47 +0000 (20:02 +0000)
server/sonar-db-dao/src/main/java/org/sonar/db/Pagination.java
server/sonar-server-common/src/main/java/org/sonar/server/telemetry/package-info.java [new file with mode: 0644]
server/sonar-webserver-auth/src/it/java/org/sonar/server/telemetry/TelemetryUserEnabledProviderIT.java [new file with mode: 0644]
server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/AuthenticationModule.java
server/sonar-webserver-auth/src/main/java/org/sonar/server/telemetry/TelemetryUserEnabledProvider.java [new file with mode: 0644]
server/sonar-webserver-auth/src/main/java/org/sonar/server/telemetry/package-info.java [new file with mode: 0644]
server/sonar-webserver-auth/src/test/java/org/sonar/server/telemetry/TelemetryUserEnabledProviderTest.java [new file with mode: 0644]

index 42a4b799c240ffbcb5177710bc77e1cdad649647..0dc8a45c2752b595d38e7e087d72d8ae7f7d4f09 100644 (file)
@@ -45,6 +45,9 @@ public final class Pagination implements Pagineable {
     return FIRST;
   }
 
+  /**
+   * @param page minimum value is 1
+   */
   public static Builder forPage(int page) {
     return new Builder(page);
   }
diff --git a/server/sonar-server-common/src/main/java/org/sonar/server/telemetry/package-info.java b/server/sonar-server-common/src/main/java/org/sonar/server/telemetry/package-info.java
new file mode 100644 (file)
index 0000000..a1adc89
--- /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.server.telemetry;
+
+import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-webserver-auth/src/it/java/org/sonar/server/telemetry/TelemetryUserEnabledProviderIT.java b/server/sonar-webserver-auth/src/it/java/org/sonar/server/telemetry/TelemetryUserEnabledProviderIT.java
new file mode 100644 (file)
index 0000000..801835e
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+ * 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.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 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);
+  }
+}
index 9e83675ebd4ba0694c42191e4cdb334085993921..23a470c9872b337c84d3a5e8ce879153800a983d 100644 (file)
@@ -23,6 +23,7 @@ import org.sonar.core.platform.Module;
 import org.sonar.server.authentication.event.AuthenticationEventImpl;
 import org.sonar.server.authentication.purge.ExpiredSessionsCleaner;
 import org.sonar.server.authentication.purge.ExpiredSessionsCleanerExecutorServiceImpl;
+import org.sonar.server.telemetry.TelemetryUserEnabledProvider;
 
 public class AuthenticationModule extends Module {
   @Override
@@ -54,6 +55,7 @@ public class AuthenticationModule extends Module {
       ExpiredSessionsCleanerExecutorServiceImpl.class,
       UserLastConnectionDatesUpdaterImpl.class,
       UserRegistrarImpl.class,
-      UserSessionInitializer.class);
+      UserSessionInitializer.class,
+      TelemetryUserEnabledProvider.class);
   }
 }
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/telemetry/TelemetryUserEnabledProvider.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/telemetry/TelemetryUserEnabledProvider.java
new file mode 100644 (file)
index 0000000..adcf530
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * 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.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;
+
+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 = null;
+      do {
+        userDtos = dbClient.userDao().selectUsers(dbSession, UserQuery.builder().build(), page, pageSize);
+        for (UserDto userDto : userDtos) {
+          result.put(userDto.getUuid(), userDto.isActive());
+        }
+        page++;
+      } while (!userDtos.isEmpty());
+    }
+    return result;
+  }
+}
diff --git a/server/sonar-webserver-auth/src/main/java/org/sonar/server/telemetry/package-info.java b/server/sonar-webserver-auth/src/main/java/org/sonar/server/telemetry/package-info.java
new file mode 100644 (file)
index 0000000..a1adc89
--- /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.server.telemetry;
+
+import javax.annotation.ParametersAreNonnullByDefault;
diff --git a/server/sonar-webserver-auth/src/test/java/org/sonar/server/telemetry/TelemetryUserEnabledProviderTest.java b/server/sonar-webserver-auth/src/test/java/org/sonar/server/telemetry/TelemetryUserEnabledProviderTest.java
new file mode 100644 (file)
index 0000000..57c0a2d
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * 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.telemetry;
+
+import org.junit.jupiter.api.Test;
+import org.sonar.db.DbClient;
+
+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);
+  }
+}