From 5c4c00bd8846a0ad7442e33a776d693d12a3a050 Mon Sep 17 00:00:00 2001 From: Moxie Marlinspike Date: Thu, 23 Jun 2016 11:56:40 -0700 Subject: [PATCH] Track end to end message delivery time // FREEBIE --- .../controllers/MessageController.java | 3 +++ .../websocket/WebSocketConnection.java | 13 +++++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java b/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java index c71c69670..de3455768 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java +++ b/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java @@ -43,6 +43,7 @@ import org.whispersystems.textsecuregcm.storage.Device; import org.whispersystems.textsecuregcm.storage.MessagesManager; import org.whispersystems.textsecuregcm.util.Base64; import org.whispersystems.textsecuregcm.util.Util; +import org.whispersystems.textsecuregcm.websocket.WebSocketConnection; import javax.validation.Valid; import javax.ws.rs.Consumes; @@ -144,6 +145,8 @@ public class MessageController { throws IOException { try { + WebSocketConnection.messageTime.update(System.currentTimeMillis() - timestamp); + Optional message = messagesManager.delete(account.getNumber(), account.getAuthenticatedDevice().get().getId(), source, timestamp); diff --git a/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java b/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java index 668e284e4..c1ac498dd 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java +++ b/src/main/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnection.java @@ -1,5 +1,8 @@ package org.whispersystems.textsecuregcm.websocket; +import com.codahale.metrics.Histogram; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.SharedMetricRegistries; import com.google.common.base.Optional; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; @@ -9,6 +12,7 @@ import com.google.protobuf.InvalidProtocolBufferException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.dispatch.DispatchChannel; +import org.whispersystems.textsecuregcm.controllers.MessageController; import org.whispersystems.textsecuregcm.controllers.NoSuchUserException; import org.whispersystems.textsecuregcm.entities.CryptoEncodingException; import org.whispersystems.textsecuregcm.entities.EncryptedOutgoingMessage; @@ -21,6 +25,7 @@ import org.whispersystems.textsecuregcm.push.TransientPushFailureException; import org.whispersystems.textsecuregcm.storage.Account; import org.whispersystems.textsecuregcm.storage.Device; import org.whispersystems.textsecuregcm.storage.MessagesManager; +import org.whispersystems.textsecuregcm.util.Constants; import org.whispersystems.websocket.WebSocketClient; import org.whispersystems.websocket.messages.WebSocketResponseMessage; @@ -30,11 +35,15 @@ import javax.ws.rs.WebApplicationException; import java.io.IOException; import java.util.Iterator; +import static com.codahale.metrics.MetricRegistry.name; import static org.whispersystems.textsecuregcm.entities.MessageProtos.Envelope; import static org.whispersystems.textsecuregcm.storage.PubSubProtos.PubSubMessage; public class WebSocketConnection implements DispatchChannel { + 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 Logger logger = LoggerFactory.getLogger(WebSocketConnection.class); private final ReceiptSender receiptSender; @@ -103,6 +112,10 @@ public class WebSocketConnection implements DispatchChannel { public void onSuccess(@Nullable WebSocketResponseMessage response) { boolean isReceipt = message.getType() == Envelope.Type.RECEIPT; + if (isSuccessResponse(response) && !isReceipt) { + messageTime.update(System.currentTimeMillis() - message.getTimestamp()); + } + if (isSuccessResponse(response)) { if (storedMessageId.isPresent()) messagesManager.delete(account.getNumber(), storedMessageId.get()); if (!isReceipt) sendDeliveryReceiptFor(message);