Add platform and push token presence dimensions to account creation metrics

This commit is contained in:
Jon Chambers 2024-09-06 11:56:29 -04:00 committed by Chris Eager
parent e160025cfc
commit 556eec649d
7 changed files with 36 additions and 19 deletions

View File

@ -157,7 +157,8 @@ public class RegistrationController {
registrationRequest.deviceActivationRequest().aciSignedPreKey(), registrationRequest.deviceActivationRequest().aciSignedPreKey(),
registrationRequest.deviceActivationRequest().pniSignedPreKey(), registrationRequest.deviceActivationRequest().pniSignedPreKey(),
registrationRequest.deviceActivationRequest().aciPqLastResortPreKey(), registrationRequest.deviceActivationRequest().aciPqLastResortPreKey(),
registrationRequest.deviceActivationRequest().pniPqLastResortPreKey())); registrationRequest.deviceActivationRequest().pniPqLastResortPreKey()),
userAgent);
Metrics.counter(ACCOUNT_CREATED_COUNTER_NAME, Tags.of(UserAgentTagUtil.getPlatformTag(userAgent), Metrics.counter(ACCOUNT_CREATED_COUNTER_NAME, Tags.of(UserAgentTagUtil.getPlatformTag(userAgent),
Tag.of(COUNTRY_CODE_TAG_NAME, Util.getCountryCode(number)), Tag.of(COUNTRY_CODE_TAG_NAME, Util.getCountryCode(number)),

View File

@ -15,6 +15,8 @@ import com.google.common.base.Preconditions;
import io.lettuce.core.RedisException; import io.lettuce.core.RedisException;
import io.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands; import io.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands;
import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.Tag;
import io.micrometer.core.instrument.Tags;
import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.Timer;
import java.io.IOException; import java.io.IOException;
import java.io.UncheckedIOException; import java.io.UncheckedIOException;
@ -52,6 +54,7 @@ import org.whispersystems.textsecuregcm.entities.ECSignedPreKey;
import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey; import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey;
import org.whispersystems.textsecuregcm.identity.IdentityType; import org.whispersystems.textsecuregcm.identity.IdentityType;
import org.whispersystems.textsecuregcm.identity.ServiceIdentifier; import org.whispersystems.textsecuregcm.identity.ServiceIdentifier;
import org.whispersystems.textsecuregcm.metrics.UserAgentTagUtil;
import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.push.ClientPresenceManager;
import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisCluster; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisCluster;
import org.whispersystems.textsecuregcm.redis.RedisOperation; import org.whispersystems.textsecuregcm.redis.RedisOperation;
@ -167,7 +170,8 @@ public class AccountsManager {
final List<AccountBadge> accountBadges, final List<AccountBadge> accountBadges,
final IdentityKey aciIdentityKey, final IdentityKey aciIdentityKey,
final IdentityKey pniIdentityKey, final IdentityKey pniIdentityKey,
final DeviceSpec primaryDeviceSpec) throws InterruptedException { final DeviceSpec primaryDeviceSpec,
@Nullable final String userAgent) throws InterruptedException {
final Account account = new Account(); final Account account = new Account();
@ -251,7 +255,11 @@ public class AccountsManager {
redisSet(account); redisSet(account);
Metrics.counter(CREATE_COUNTER_NAME, "type", accountCreationType).increment(); Metrics.counter(CREATE_COUNTER_NAME, Tags.of(UserAgentTagUtil.getPlatformTag(userAgent),
Tag.of("type", accountCreationType),
Tag.of("hasPushToken", String.valueOf(
primaryDeviceSpec.apnRegistrationId().isPresent() || primaryDeviceSpec.gcmRegistrationId().isPresent()))))
.increment();
accountAttributes.recoveryPassword().ifPresent(registrationRecoveryPassword -> accountAttributes.recoveryPassword().ifPresent(registrationRecoveryPassword ->
registrationRecoveryPasswordsManager.storeForCurrentNumber(account.getNumber(), registrationRecoveryPassword)); registrationRecoveryPasswordsManager.storeForCurrentNumber(account.getNumber(), registrationRecoveryPassword));

View File

@ -170,7 +170,7 @@ class RegistrationControllerTest {
final Account account = mock(Account.class); final Account account = mock(Account.class);
when(account.getPrimaryDevice()).thenReturn(mock(Device.class)); when(account.getPrimaryDevice()).thenReturn(mock(Device.class));
when(accountsManager.create(any(), any(), any(), any(), any(), any())) when(accountsManager.create(any(), any(), any(), any(), any(), any(), any()))
.thenReturn(account); .thenReturn(account);
final String json = requestJson("sessionId", new byte[0], true, registrationId.orElse(0), pniRegistrationId.orElse(0)); final String json = requestJson("sessionId", new byte[0], true, registrationId.orElse(0), pniRegistrationId.orElse(0));
@ -295,7 +295,7 @@ class RegistrationControllerTest {
final Account account = mock(Account.class); final Account account = mock(Account.class);
when(account.getPrimaryDevice()).thenReturn(mock(Device.class)); when(account.getPrimaryDevice()).thenReturn(mock(Device.class));
when(accountsManager.create(any(), any(), any(), any(), any(), any())) when(accountsManager.create(any(), any(), any(), any(), any(), any(), any()))
.thenReturn(account); .thenReturn(account);
final Invocation.Builder request = resources.getJerseyTest() final Invocation.Builder request = resources.getJerseyTest()
@ -331,7 +331,7 @@ class RegistrationControllerTest {
final Account account = mock(Account.class); final Account account = mock(Account.class);
when(account.getPrimaryDevice()).thenReturn(mock(Device.class)); when(account.getPrimaryDevice()).thenReturn(mock(Device.class));
when(accountsManager.create(any(), any(), any(), any(), any(), any())) when(accountsManager.create(any(), any(), any(), any(), any(), any(), any()))
.thenReturn(account); .thenReturn(account);
final Invocation.Builder request = resources.getJerseyTest() final Invocation.Builder request = resources.getJerseyTest()
@ -353,7 +353,7 @@ class RegistrationControllerTest {
final Account account = mock(Account.class); final Account account = mock(Account.class);
when(account.getPrimaryDevice()).thenReturn(mock(Device.class)); when(account.getPrimaryDevice()).thenReturn(mock(Device.class));
when(accountsManager.create(any(), any(), any(), any(), any(), any())) when(accountsManager.create(any(), any(), any(), any(), any(), any(), any()))
.thenReturn(account); .thenReturn(account);
final Invocation.Builder request = resources.getJerseyTest() final Invocation.Builder request = resources.getJerseyTest()
@ -397,7 +397,7 @@ class RegistrationControllerTest {
final Account createdAccount = mock(Account.class); final Account createdAccount = mock(Account.class);
when(createdAccount.getPrimaryDevice()).thenReturn(mock(Device.class)); when(createdAccount.getPrimaryDevice()).thenReturn(mock(Device.class));
when(accountsManager.create(any(), any(), any(), any(), any(), any())) when(accountsManager.create(any(), any(), any(), any(), any(), any(), any()))
.thenReturn(createdAccount); .thenReturn(createdAccount);
expectedStatus = 200; expectedStatus = 200;
@ -451,7 +451,7 @@ class RegistrationControllerTest {
final Account account = mock(Account.class); final Account account = mock(Account.class);
when(account.getPrimaryDevice()).thenReturn(mock(Device.class)); when(account.getPrimaryDevice()).thenReturn(mock(Device.class));
when(accountsManager.create(any(), any(), any(), any(), any(), any())) when(accountsManager.create(any(), any(), any(), any(), any(), any(), any()))
.thenReturn(account); .thenReturn(account);
final Invocation.Builder request = resources.getJerseyTest() final Invocation.Builder request = resources.getJerseyTest()
@ -475,7 +475,7 @@ class RegistrationControllerTest {
final Account account = mock(Account.class); final Account account = mock(Account.class);
when(account.getPrimaryDevice()).thenReturn(mock(Device.class)); when(account.getPrimaryDevice()).thenReturn(mock(Device.class));
when(accountsManager.create(any(), any(), any(), any(), any(), any())) when(accountsManager.create(any(), any(), any(), any(), any(), any(), any()))
.thenReturn(account); .thenReturn(account);
final Invocation.Builder request = resources.getJerseyTest() final Invocation.Builder request = resources.getJerseyTest()
@ -728,7 +728,7 @@ class RegistrationControllerTest {
when(a.getPrimaryDevice()).thenReturn(device); when(a.getPrimaryDevice()).thenReturn(device);
}); });
when(accountsManager.create(any(), any(), any(), any(), any(), any())) when(accountsManager.create(any(), any(), any(), any(), any(), any(), any()))
.thenReturn(account); .thenReturn(account);
final Invocation.Builder request = resources.getJerseyTest() final Invocation.Builder request = resources.getJerseyTest()
@ -746,7 +746,8 @@ class RegistrationControllerTest {
eq(Collections.emptyList()), eq(Collections.emptyList()),
eq(expectedAciIdentityKey), eq(expectedAciIdentityKey),
eq(expectedPniIdentityKey), eq(expectedPniIdentityKey),
eq(expectedDeviceSpec)); eq(expectedDeviceSpec),
any());
} }
private static boolean accountAttributesEqual(final AccountAttributes a, final AccountAttributes b) { private static boolean accountAttributesEqual(final AccountAttributes a, final AccountAttributes b) {

View File

@ -237,7 +237,8 @@ public class AccountCreationDeletionIntegrationTest {
aciSignedPreKey, aciSignedPreKey,
pniSignedPreKey, pniSignedPreKey,
aciPqLastResortPreKey, aciPqLastResortPreKey,
pniPqLastResortPreKey)); pniPqLastResortPreKey),
null);
assertExpectedStoredAccount(account, assertExpectedStoredAccount(account,
number, number,
@ -315,7 +316,8 @@ public class AccountCreationDeletionIntegrationTest {
aciSignedPreKey, aciSignedPreKey,
pniSignedPreKey, pniSignedPreKey,
aciPqLastResortPreKey, aciPqLastResortPreKey,
pniPqLastResortPreKey)); pniPqLastResortPreKey),
null);
existingAccountUuid = originalAccount.getUuid(); existingAccountUuid = originalAccount.getUuid();
} }
@ -381,7 +383,8 @@ public class AccountCreationDeletionIntegrationTest {
aciSignedPreKey, aciSignedPreKey,
pniSignedPreKey, pniSignedPreKey,
aciPqLastResortPreKey, aciPqLastResortPreKey,
pniPqLastResortPreKey)); pniPqLastResortPreKey),
null);
assertExpectedStoredAccount(reregisteredAccount, assertExpectedStoredAccount(reregisteredAccount,
number, number,
@ -464,7 +467,8 @@ public class AccountCreationDeletionIntegrationTest {
aciSignedPreKey, aciSignedPreKey,
pniSignedPreKey, pniSignedPreKey,
aciPqLastResortPreKey, aciPqLastResortPreKey,
pniPqLastResortPreKey)); pniPqLastResortPreKey),
null);
clientPublicKeysManager.setPublicKey(account, Device.PRIMARY_ID, Curve.generateKeyPair().getPublicKey()).join(); clientPublicKeysManager.setPublicKey(account, Device.PRIMARY_ID, Curve.generateKeyPair().getPublicKey()).join();

View File

@ -165,7 +165,8 @@ class AccountsManagerConcurrentModificationIntegrationTest {
KeysHelper.signedECPreKey(1, aciKeyPair), KeysHelper.signedECPreKey(1, aciKeyPair),
KeysHelper.signedECPreKey(2, pniKeyPair), KeysHelper.signedECPreKey(2, pniKeyPair),
KeysHelper.signedKEMPreKey(3, aciKeyPair), KeysHelper.signedKEMPreKey(3, aciKeyPair),
KeysHelper.signedKEMPreKey(4, pniKeyPair))), KeysHelper.signedKEMPreKey(4, pniKeyPair)),
null),
a -> { a -> {
a.setUnidentifiedAccessKey(new byte[UnidentifiedAccessUtil.UNIDENTIFIED_ACCESS_KEY_LENGTH]); a.setUnidentifiedAccessKey(new byte[UnidentifiedAccessUtil.UNIDENTIFIED_ACCESS_KEY_LENGTH]);
a.removeDevice(Device.PRIMARY_ID); a.removeDevice(Device.PRIMARY_ID);

View File

@ -1556,6 +1556,7 @@ class AccountsManagerTest {
KeysHelper.signedECPreKey(1, aciKeyPair), KeysHelper.signedECPreKey(1, aciKeyPair),
KeysHelper.signedECPreKey(2, pniKeyPair), KeysHelper.signedECPreKey(2, pniKeyPair),
KeysHelper.signedKEMPreKey(3, aciKeyPair), KeysHelper.signedKEMPreKey(3, aciKeyPair),
KeysHelper.signedKEMPreKey(4, pniKeyPair))); KeysHelper.signedKEMPreKey(4, pniKeyPair)),
null);
} }
} }

View File

@ -210,6 +210,7 @@ public class AccountsHelper {
KeysHelper.signedECPreKey(1, aciKeyPair), KeysHelper.signedECPreKey(1, aciKeyPair),
KeysHelper.signedECPreKey(2, pniKeyPair), KeysHelper.signedECPreKey(2, pniKeyPair),
KeysHelper.signedKEMPreKey(3, aciKeyPair), KeysHelper.signedKEMPreKey(3, aciKeyPair),
KeysHelper.signedKEMPreKey(4, pniKeyPair))); KeysHelper.signedKEMPreKey(4, pniKeyPair)),
null);
} }
} }