Remove deprecated counters
This commit is contained in:
parent
eedeaaecee
commit
c379a3d297
|
@ -622,7 +622,7 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
|
||||||
new DirectoryController(directoryCredentialsGenerator),
|
new DirectoryController(directoryCredentialsGenerator),
|
||||||
new DonationController(clock, zkReceiptOperations, redeemedReceiptsManager, accountsManager, config.getBadges(),
|
new DonationController(clock, zkReceiptOperations, redeemedReceiptsManager, accountsManager, config.getBadges(),
|
||||||
ReceiptCredentialPresentation::new, stripeExecutor, config.getDonationConfiguration(), config.getStripe()),
|
ReceiptCredentialPresentation::new, stripeExecutor, config.getDonationConfiguration(), config.getStripe()),
|
||||||
new MessageController(rateLimiters, messageSender, receiptSender, accountsManager, messagesManager, unsealedSenderRateLimiter, apnFallbackManager, dynamicConfigurationManager, rateLimitChallengeManager, reportMessageManager, metricsCluster, multiRecipientMessageExecutor),
|
new MessageController(rateLimiters, messageSender, receiptSender, accountsManager, messagesManager, unsealedSenderRateLimiter, apnFallbackManager, dynamicConfigurationManager, rateLimitChallengeManager, reportMessageManager, multiRecipientMessageExecutor),
|
||||||
new PaymentsController(currencyManager, paymentsCredentialsGenerator),
|
new PaymentsController(currencyManager, paymentsCredentialsGenerator),
|
||||||
new ProfileController(clock, rateLimiters, accountsManager, profilesManager, usernamesManager, dynamicConfigurationManager, profileBadgeConverter, config.getBadges(), cdnS3Client, profileCdnPolicyGenerator, profileCdnPolicySigner, config.getCdnConfiguration().getBucket(), zkProfileOperations),
|
new ProfileController(clock, rateLimiters, accountsManager, profilesManager, usernamesManager, dynamicConfigurationManager, profileBadgeConverter, config.getBadges(), cdnS3Client, profileCdnPolicyGenerator, profileCdnPolicySigner, config.getCdnConfiguration().getBucket(), zkProfileOperations),
|
||||||
new ProvisioningController(rateLimiters, provisioningManager),
|
new ProvisioningController(rateLimiters, provisioningManager),
|
||||||
|
|
|
@ -16,12 +16,10 @@ import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.protobuf.ByteString;
|
import com.google.protobuf.ByteString;
|
||||||
import io.dropwizard.auth.Auth;
|
import io.dropwizard.auth.Auth;
|
||||||
import io.dropwizard.util.DataSize;
|
import io.dropwizard.util.DataSize;
|
||||||
import io.lettuce.core.ScriptOutputType;
|
|
||||||
import io.micrometer.core.instrument.Counter;
|
import io.micrometer.core.instrument.Counter;
|
||||||
import io.micrometer.core.instrument.Metrics;
|
import io.micrometer.core.instrument.Metrics;
|
||||||
import io.micrometer.core.instrument.Tag;
|
import io.micrometer.core.instrument.Tag;
|
||||||
import io.micrometer.core.instrument.Tags;
|
import io.micrometer.core.instrument.Tags;
|
||||||
import java.io.IOException;
|
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -90,8 +88,6 @@ import org.whispersystems.textsecuregcm.push.ApnFallbackManager;
|
||||||
import org.whispersystems.textsecuregcm.push.MessageSender;
|
import org.whispersystems.textsecuregcm.push.MessageSender;
|
||||||
import org.whispersystems.textsecuregcm.push.NotPushRegisteredException;
|
import org.whispersystems.textsecuregcm.push.NotPushRegisteredException;
|
||||||
import org.whispersystems.textsecuregcm.push.ReceiptSender;
|
import org.whispersystems.textsecuregcm.push.ReceiptSender;
|
||||||
import org.whispersystems.textsecuregcm.redis.ClusterLuaScript;
|
|
||||||
import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisCluster;
|
|
||||||
import org.whispersystems.textsecuregcm.redis.RedisOperation;
|
import org.whispersystems.textsecuregcm.redis.RedisOperation;
|
||||||
import org.whispersystems.textsecuregcm.storage.Account;
|
import org.whispersystems.textsecuregcm.storage.Account;
|
||||||
import org.whispersystems.textsecuregcm.storage.AccountsManager;
|
import org.whispersystems.textsecuregcm.storage.AccountsManager;
|
||||||
|
@ -132,13 +128,9 @@ public class MessageController {
|
||||||
private final ReportMessageManager reportMessageManager;
|
private final ReportMessageManager reportMessageManager;
|
||||||
private final ExecutorService multiRecipientMessageExecutor;
|
private final ExecutorService multiRecipientMessageExecutor;
|
||||||
|
|
||||||
private final ClusterLuaScript recordInternationalUnsealedSenderMetricsScript;
|
|
||||||
|
|
||||||
private static final String LEGACY_MESSAGE_SENT_COUNTER = name(MessageController.class, "legacyMessageSent");
|
private static final String LEGACY_MESSAGE_SENT_COUNTER = name(MessageController.class, "legacyMessageSent");
|
||||||
private static final String SENT_MESSAGE_COUNTER_NAME = name(MessageController.class, "sentMessages");
|
private static final String SENT_MESSAGE_COUNTER_NAME = name(MessageController.class, "sentMessages");
|
||||||
private static final String REJECT_UNSEALED_SENDER_COUNTER_NAME = name(MessageController.class, "rejectUnsealedSenderLimit");
|
private static final String REJECT_UNSEALED_SENDER_COUNTER_NAME = name(MessageController.class, "rejectUnsealedSenderLimit");
|
||||||
private static final String INTERNATIONAL_UNSEALED_SENDER_COUNTER_NAME = name(MessageController.class, "internationalUnsealedSender");
|
|
||||||
private static final String UNSEALED_SENDER_WITHOUT_PUSH_TOKEN_COUNTER_NAME = name(MessageController.class, "unsealedSenderWithoutPushToken");
|
|
||||||
private static final String CONTENT_SIZE_DISTRIBUTION_NAME = name(MessageController.class, "messageContentSize");
|
private static final String CONTENT_SIZE_DISTRIBUTION_NAME = name(MessageController.class, "messageContentSize");
|
||||||
private static final String OUTGOING_MESSAGE_LIST_SIZE_BYTES_DISTRIBUTION_NAME = name(MessageController.class, "outgoingMessageListSizeBytes");
|
private static final String OUTGOING_MESSAGE_LIST_SIZE_BYTES_DISTRIBUTION_NAME = name(MessageController.class, "outgoingMessageListSizeBytes");
|
||||||
|
|
||||||
|
@ -159,7 +151,6 @@ public class MessageController {
|
||||||
DynamicConfigurationManager dynamicConfigurationManager,
|
DynamicConfigurationManager dynamicConfigurationManager,
|
||||||
RateLimitChallengeManager rateLimitChallengeManager,
|
RateLimitChallengeManager rateLimitChallengeManager,
|
||||||
ReportMessageManager reportMessageManager,
|
ReportMessageManager reportMessageManager,
|
||||||
FaultTolerantRedisCluster metricsCluster,
|
|
||||||
@Nonnull ExecutorService multiRecipientMessageExecutor) {
|
@Nonnull ExecutorService multiRecipientMessageExecutor) {
|
||||||
this.rateLimiters = rateLimiters;
|
this.rateLimiters = rateLimiters;
|
||||||
this.messageSender = messageSender;
|
this.messageSender = messageSender;
|
||||||
|
@ -172,13 +163,6 @@ public class MessageController {
|
||||||
this.rateLimitChallengeManager = rateLimitChallengeManager;
|
this.rateLimitChallengeManager = rateLimitChallengeManager;
|
||||||
this.reportMessageManager = reportMessageManager;
|
this.reportMessageManager = reportMessageManager;
|
||||||
this.multiRecipientMessageExecutor = Objects.requireNonNull(multiRecipientMessageExecutor);
|
this.multiRecipientMessageExecutor = Objects.requireNonNull(multiRecipientMessageExecutor);
|
||||||
|
|
||||||
try {
|
|
||||||
recordInternationalUnsealedSenderMetricsScript = ClusterLuaScript.fromResource(metricsCluster, "lua/record_international_unsealed_sender_metrics.lua", ScriptOutputType.MULTI);
|
|
||||||
} catch (IOException e) {
|
|
||||||
// This should never happen for a script included in our own resource bundle
|
|
||||||
throw new AssertionError("Failed to load script", e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Timed
|
@Timed
|
||||||
|
@ -198,19 +182,6 @@ public class MessageController {
|
||||||
throw new WebApplicationException(Response.Status.UNAUTHORIZED);
|
throw new WebApplicationException(Response.Status.UNAUTHORIZED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (source.isPresent() && !source.get().getAccount().getUuid().equals(destinationUuid)) {
|
|
||||||
assert source.get().getAccount().getMasterDevice().isPresent();
|
|
||||||
|
|
||||||
final Device masterDevice = source.get().getAccount().getMasterDevice().get();
|
|
||||||
final String senderCountryCode = Util.getCountryCode(source.get().getAccount().getNumber());
|
|
||||||
|
|
||||||
if (StringUtils.isAllBlank(masterDevice.getApnId(), masterDevice.getVoipApnId(), masterDevice.getGcmId())
|
|
||||||
|| masterDevice.getUninstalledFeedbackTimestamp() > 0) {
|
|
||||||
Metrics.counter(UNSEALED_SENDER_WITHOUT_PUSH_TOKEN_COUNTER_NAME, SENDER_COUNTRY_TAG_NAME, senderCountryCode)
|
|
||||||
.increment();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final String senderType;
|
final String senderType;
|
||||||
|
|
||||||
if (source.isPresent() && !source.get().getAccount().getUuid().equals(destinationUuid)) {
|
if (source.isPresent() && !source.get().getAccount().getUuid().equals(destinationUuid)) {
|
||||||
|
@ -283,8 +254,6 @@ public class MessageController {
|
||||||
final Device masterDevice = source.get().getAccount().getMasterDevice().get();
|
final Device masterDevice = source.get().getAccount().getMasterDevice().get();
|
||||||
|
|
||||||
if (!senderCountryCode.equals(destinationCountryCode)) {
|
if (!senderCountryCode.equals(destinationCountryCode)) {
|
||||||
recordInternationalUnsealedSenderMetrics(forwardedFor, senderCountryCode, destination.get().getNumber());
|
|
||||||
|
|
||||||
if (StringUtils.isAllBlank(masterDevice.getApnId(), masterDevice.getVoipApnId(), masterDevice.getGcmId()) || masterDevice.getUninstalledFeedbackTimestamp() > 0) {
|
if (StringUtils.isAllBlank(masterDevice.getApnId(), masterDevice.getVoipApnId(), masterDevice.getGcmId()) || masterDevice.getUninstalledFeedbackTimestamp() > 0) {
|
||||||
if (dynamicConfigurationManager.getConfiguration().getMessageRateConfiguration().getRateLimitedCountryCodes().contains(senderCountryCode)) {
|
if (dynamicConfigurationManager.getConfiguration().getMessageRateConfiguration().getRateLimitedCountryCodes().contains(senderCountryCode)) {
|
||||||
|
|
||||||
|
@ -706,28 +675,4 @@ public class MessageController {
|
||||||
return Optional.empty();
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
void recordInternationalUnsealedSenderMetrics(final String forwardedFor, final String senderCountryCode, final String destinationNumber) {
|
|
||||||
ForwardedIpUtil.getMostRecentProxy(forwardedFor).ifPresent(senderIp -> {
|
|
||||||
final String destinationSetKey = getDestinationSetKey(senderIp);
|
|
||||||
final String messageCountKey = getMessageCountKey(senderIp);
|
|
||||||
|
|
||||||
recordInternationalUnsealedSenderMetricsScript.execute(
|
|
||||||
List.of(destinationSetKey, messageCountKey),
|
|
||||||
List.of(destinationNumber));
|
|
||||||
});
|
|
||||||
|
|
||||||
Metrics.counter(INTERNATIONAL_UNSEALED_SENDER_COUNTER_NAME, SENDER_COUNTRY_TAG_NAME, senderCountryCode).increment();
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
static String getDestinationSetKey(final String senderIp) {
|
|
||||||
return "international_unsealed_sender_destinations::{" + senderIp + "}";
|
|
||||||
}
|
|
||||||
|
|
||||||
@VisibleForTesting
|
|
||||||
static String getMessageCountKey(final String senderIp) {
|
|
||||||
return "international_unsealed_sender_message_count::{" + senderIp + "}";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
local destinationSetKey = KEYS[1]
|
|
||||||
local messageCountKey = KEYS[2]
|
|
||||||
|
|
||||||
local destination = ARGV[1]
|
|
||||||
|
|
||||||
redis.call("PFADD", destinationSetKey, destination)
|
|
||||||
local distinctDestinationCount = redis.call("PFCOUNT", destinationSetKey)
|
|
||||||
|
|
||||||
if redis.call("TTL", destinationSetKey) < 0 then
|
|
||||||
redis.call("EXPIRE", destinationSetKey, 86400)
|
|
||||||
end
|
|
||||||
|
|
||||||
local messageCount = redis.call("INCR", messageCountKey)
|
|
||||||
|
|
||||||
if messageCount == 1 then
|
|
||||||
redis.call("EXPIRE", messageCountKey, 86400)
|
|
||||||
end
|
|
||||||
|
|
||||||
return { distinctDestinationCount, messageCount }
|
|
|
@ -1,65 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright 2021 Signal Messenger, LLC
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.whispersystems.textsecuregcm.controllers;
|
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
|
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.whispersystems.textsecuregcm.limits.RateLimitChallengeManager;
|
|
||||||
import org.whispersystems.textsecuregcm.limits.RateLimiters;
|
|
||||||
import org.whispersystems.textsecuregcm.limits.UnsealedSenderRateLimiter;
|
|
||||||
import org.whispersystems.textsecuregcm.push.ApnFallbackManager;
|
|
||||||
import org.whispersystems.textsecuregcm.push.MessageSender;
|
|
||||||
import org.whispersystems.textsecuregcm.push.ReceiptSender;
|
|
||||||
import org.whispersystems.textsecuregcm.redis.AbstractRedisClusterTest;
|
|
||||||
import org.whispersystems.textsecuregcm.storage.AccountsManager;
|
|
||||||
import org.whispersystems.textsecuregcm.storage.DynamicConfigurationManager;
|
|
||||||
import org.whispersystems.textsecuregcm.storage.MessagesManager;
|
|
||||||
import org.whispersystems.textsecuregcm.storage.ReportMessageManager;
|
|
||||||
|
|
||||||
public class MessageControllerMetricsTest extends AbstractRedisClusterTest {
|
|
||||||
|
|
||||||
private MessageController messageController;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void setUp() throws Exception {
|
|
||||||
super.setUp();
|
|
||||||
|
|
||||||
messageController = new MessageController(
|
|
||||||
mock(RateLimiters.class),
|
|
||||||
mock(MessageSender.class),
|
|
||||||
mock(ReceiptSender.class),
|
|
||||||
mock(AccountsManager.class),
|
|
||||||
mock(MessagesManager.class),
|
|
||||||
mock(UnsealedSenderRateLimiter.class),
|
|
||||||
mock(ApnFallbackManager.class),
|
|
||||||
mock(DynamicConfigurationManager.class),
|
|
||||||
mock(RateLimitChallengeManager.class),
|
|
||||||
mock(ReportMessageManager.class),
|
|
||||||
getRedisCluster(),
|
|
||||||
mock(ExecutorService.class));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testRecordInternationalUnsealedSenderMetrics() {
|
|
||||||
final String senderIp = "127.0.0.1";
|
|
||||||
|
|
||||||
messageController.recordInternationalUnsealedSenderMetrics(senderIp, "84", "+18005551234");
|
|
||||||
messageController.recordInternationalUnsealedSenderMetrics(senderIp, "84", "+18005551234");
|
|
||||||
|
|
||||||
getRedisCluster().useCluster(connection -> {
|
|
||||||
assertEquals(1, (long)connection.sync().pfcount(MessageController.getDestinationSetKey(senderIp)));
|
|
||||||
assertEquals(2, Long.parseLong(connection.sync().get(MessageController.getMessageCountKey(senderIp)), 10));
|
|
||||||
|
|
||||||
assertTrue(connection.sync().ttl(MessageController.getDestinationSetKey(senderIp)) >= 0);
|
|
||||||
assertTrue(connection.sync().ttl(MessageController.getMessageCountKey(senderIp)) >= 0);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -130,7 +130,6 @@ class MessageControllerTest {
|
||||||
private static final DynamicConfigurationManager dynamicConfigurationManager = mock(DynamicConfigurationManager.class);
|
private static final DynamicConfigurationManager dynamicConfigurationManager = mock(DynamicConfigurationManager.class);
|
||||||
private static final RateLimitChallengeManager rateLimitChallengeManager = mock(RateLimitChallengeManager.class);
|
private static final RateLimitChallengeManager rateLimitChallengeManager = mock(RateLimitChallengeManager.class);
|
||||||
private static final ReportMessageManager reportMessageManager = mock(ReportMessageManager.class);
|
private static final ReportMessageManager reportMessageManager = mock(ReportMessageManager.class);
|
||||||
private static final FaultTolerantRedisCluster metricsCluster = RedisClusterHelper.buildMockRedisCluster(redisCommands);
|
|
||||||
private static final ExecutorService multiRecipientMessageExecutor = mock(ExecutorService.class);
|
private static final ExecutorService multiRecipientMessageExecutor = mock(ExecutorService.class);
|
||||||
|
|
||||||
private final ObjectMapper mapper = new ObjectMapper();
|
private final ObjectMapper mapper = new ObjectMapper();
|
||||||
|
@ -144,7 +143,7 @@ class MessageControllerTest {
|
||||||
.setTestContainerFactory(new GrizzlyWebTestContainerFactory())
|
.setTestContainerFactory(new GrizzlyWebTestContainerFactory())
|
||||||
.addResource(new MessageController(rateLimiters, messageSender, receiptSender, accountsManager,
|
.addResource(new MessageController(rateLimiters, messageSender, receiptSender, accountsManager,
|
||||||
messagesManager, unsealedSenderRateLimiter, apnFallbackManager, dynamicConfigurationManager,
|
messagesManager, unsealedSenderRateLimiter, apnFallbackManager, dynamicConfigurationManager,
|
||||||
rateLimitChallengeManager, reportMessageManager, metricsCluster, multiRecipientMessageExecutor))
|
rateLimitChallengeManager, reportMessageManager, multiRecipientMessageExecutor))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
|
@ -198,8 +197,7 @@ class MessageControllerTest {
|
||||||
apnFallbackManager,
|
apnFallbackManager,
|
||||||
dynamicConfigurationManager,
|
dynamicConfigurationManager,
|
||||||
rateLimitChallengeManager,
|
rateLimitChallengeManager,
|
||||||
reportMessageManager,
|
reportMessageManager
|
||||||
metricsCluster
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue