diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java index 6bc508f7a..14baaa43f 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java @@ -29,8 +29,8 @@ import org.whispersystems.textsecuregcm.entities.StaleDevices; import org.whispersystems.textsecuregcm.limits.RateLimiters; import org.whispersystems.textsecuregcm.metrics.UserAgentTagUtil; import org.whispersystems.textsecuregcm.push.ApnFallbackManager; -import org.whispersystems.textsecuregcm.push.NotPushRegisteredException; import org.whispersystems.textsecuregcm.push.MessageSender; +import org.whispersystems.textsecuregcm.push.NotPushRegisteredException; import org.whispersystems.textsecuregcm.push.ReceiptSender; import org.whispersystems.textsecuregcm.redis.RedisOperation; import org.whispersystems.textsecuregcm.storage.Account; @@ -41,7 +41,6 @@ import org.whispersystems.textsecuregcm.util.Base64; import org.whispersystems.textsecuregcm.util.Constants; import org.whispersystems.textsecuregcm.util.Util; import org.whispersystems.textsecuregcm.util.ua.UnrecognizedUserAgentException; -import org.whispersystems.textsecuregcm.util.ua.UserAgent; import org.whispersystems.textsecuregcm.util.ua.UserAgentUtil; import org.whispersystems.textsecuregcm.websocket.WebSocketConnection; @@ -58,7 +57,6 @@ import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.IOException; -import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -245,8 +243,7 @@ public class MessageController { @PathParam("timestamp") long timestamp) { try { - WebSocketConnection.messageTime.update(System.currentTimeMillis() - timestamp); - + WebSocketConnection.recordMessageDeliveryDuration(timestamp, account.getAuthenticatedDevice().get()); Optional message = messagesManager.delete(account.getNumber(), account.getUuid(), account.getAuthenticatedDevice().get().getId(), @@ -272,11 +269,13 @@ public class MessageController { account.getAuthenticatedDevice().get().getId(), uuid); - message.ifPresent(outgoingMessageEntity -> WebSocketConnection.messageTime.update(System.currentTimeMillis() - outgoingMessageEntity.getTimestamp())); - - if (message.isPresent() && !Util.isEmpty(message.get().getSource()) && message.get().getType() != Envelope.Type.RECEIPT_VALUE) { - receiptSender.sendReceipt(account, message.get().getSource(), message.get().getTimestamp()); + if (message.isPresent()) { + WebSocketConnection.recordMessageDeliveryDuration(message.get().getTimestamp(), account.getAuthenticatedDevice().get()); + if (!Util.isEmpty(message.get().getSource()) && message.get().getType() != Envelope.Type.RECEIPT_VALUE) { + receiptSender.sendReceipt(account, message.get().getSource(), message.get().getTimestamp()); + } } + } catch (NoSuchUserException e) { logger.warn("Sending delivery receipt", e); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java index d5fbcc8f7..1f0368d22 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java @@ -53,7 +53,8 @@ import static org.whispersystems.textsecuregcm.entities.MessageProtos.Envelope; public class WebSocketConnection implements MessageAvailabilityListener, DisplacedPresenceListener { private static final MetricRegistry metricRegistry = SharedMetricRegistries.getOrCreate(Constants.METRICS_NAME); - public static final Histogram messageTime = metricRegistry.histogram(name(MessageController.class, "message_delivery_duration")); + private static final Histogram messageTime = metricRegistry.histogram(name(MessageController.class, "message_delivery_duration")); + private static final Histogram primaryDeviceMessageTime = metricRegistry.histogram(name(MessageController.class, "primary_device_message_delivery_duration")); private static final Meter sendMessageMeter = metricRegistry.meter(name(WebSocketConnection.class, "send_message")); private static final Meter messageAvailableMeter = metricRegistry.meter(name(WebSocketConnection.class, "messagesAvailable")); private static final Meter ephemeralMessageAvailableMeter = metricRegistry.meter(name(WebSocketConnection.class, "ephemeralMessagesAvailable")); @@ -145,7 +146,7 @@ public class WebSocketConnection implements MessageAvailabilityListener, Displac } if (message.getType() != Envelope.Type.RECEIPT) { - messageTime.update(System.currentTimeMillis() - message.getTimestamp()); + recordMessageDeliveryDuration(message.getTimestamp(), device); sendDeliveryReceiptFor(message); } } else { @@ -164,6 +165,14 @@ public class WebSocketConnection implements MessageAvailabilityListener, Displac } } + public static void recordMessageDeliveryDuration(long timestamp, Device messageDestinationDevice) { + final long messageDeliveryDuration = System.currentTimeMillis() - timestamp; + messageTime.update(messageDeliveryDuration); + if (messageDestinationDevice.isMaster()) { + primaryDeviceMessageTime.update(messageDeliveryDuration); + } + } + private void sendDeliveryReceiptFor(Envelope message) { if (!message.hasSource()) return;