From b4a8f01980705743565ae2927220f06a06283b76 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 13 May 2024 16:00:45 -0400 Subject: [PATCH] Include message timestamp in local send timings. --- .../securesms/database/LocalMetricsDatabase.kt | 2 +- .../securesms/database/model/LocalMetricsEvent.kt | 6 ++++-- .../securesms/jobs/IndividualSendJob.java | 2 +- .../securesms/jobs/PushGroupSendJob.java | 2 ++ .../thoughtcrime/securesms/util/LocalMetrics.kt | 13 +++++++++++-- .../securesms/util/SignalLocalMetrics.java | 14 +++++++++++++- 6 files changed, 32 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/LocalMetricsDatabase.kt b/app/src/main/java/org/thoughtcrime/securesms/database/LocalMetricsDatabase.kt index 437771e594..6d464aea5f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/LocalMetricsDatabase.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/LocalMetricsDatabase.kt @@ -136,7 +136,7 @@ class LocalMetricsDatabase private constructor( put(EVENT_ID, event.eventId) put(EVENT_NAME, event.eventName) put(SPLIT_NAME, split.name) - put(DURATION, event.timeunit.convert(split.duration, TimeUnit.NANOSECONDS)) + put(DURATION, event.timeUnit.convert(split.duration, TimeUnit.NANOSECONDS)) } ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/model/LocalMetricsEvent.kt b/app/src/main/java/org/thoughtcrime/securesms/database/model/LocalMetricsEvent.kt index e540cabff1..3a8552be99 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/model/LocalMetricsEvent.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/model/LocalMetricsEvent.kt @@ -10,10 +10,12 @@ data class LocalMetricsEvent( val eventId: String, val eventName: String, val splits: MutableList, - val timeunit: TimeUnit + val timeUnit: TimeUnit, + val extraLabel: String? = null ) { override fun toString(): String { - return "[$eventName] total: ${splits.sumOf { it.duration }.fractionalMillis(timeunit)} | ${splits.map { it.toString() }.joinToString(", ")}" + val extra = extraLabel?.let { "[$extraLabel]" } ?: "" + return "[$eventName]$extra total: ${splits.sumOf { it.duration }.fractionalMillis(timeUnit)} | ${splits.map { it.toString() }.joinToString(", ")}" } private fun Long.fractionalMillis(timeunit: TimeUnit): String { diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java index 5cf445bdba..c45e9c2ae2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/IndividualSendJob.java @@ -323,7 +323,7 @@ public class IndividualSendJob extends PushSendJob { SignalDatabase.messageLog().insertIfPossible(messageRecipient.getId(), message.getSentTimeMillis(), result, ContentHint.RESENDABLE, new MessageId(messageId), false); return syncAccess.isPresent(); } else { - SignalLocalMetrics.IndividualMessageSend.onDeliveryStarted(messageId); + SignalLocalMetrics.IndividualMessageSend.onDeliveryStarted(messageId, message.getSentTimeMillis()); SendMessageResult result = messageSender.sendDataMessage(address, UnidentifiedAccessUtil.getAccessFor(context, messageRecipient), ContentHint.RESENDABLE, mediaMessage, new MetricEventListener(messageId), message.isUrgent(), messageRecipient.getNeedsPniSignature()); SignalDatabase.messageLog().insertIfPossible(messageRecipient.getId(), message.getSentTimeMillis(), result, ContentHint.RESENDABLE, new MessageId(messageId), message.isUrgent()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java index 577c2f1efe..c478c57489 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PushGroupSendJob.java @@ -186,6 +186,8 @@ public final class PushGroupSendJob extends PushSendJob { Set existingNetworkFailures = new HashSet<>(message.getNetworkFailures()); Set existingIdentityMismatches = new HashSet<>(message.getIdentityKeyMismatches()); + SignalLocalMetrics.GroupMessageSend.setSentTimestamp(messageId, message.getSentTimeMillis()); + ApplicationDependencies.getJobManager().cancelAllInQueue(TypingSendJob.getQueue(threadId)); if (database.isSent(messageId)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/LocalMetrics.kt b/app/src/main/java/org/thoughtcrime/securesms/util/LocalMetrics.kt index e8aa12119e..0ac6550153 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/LocalMetrics.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/LocalMetrics.kt @@ -56,7 +56,7 @@ object LocalMetrics { eventId = id, eventName = name, splits = mutableListOf(), - timeunit = timeunit + timeUnit = timeunit ) lastSplitTimeById[id] = time } @@ -76,12 +76,21 @@ object LocalMetrics { val splitDoesNotExist: Boolean = eventsById[id]?.splits?.none { it.name == split } ?: true if (lastTime != null && splitDoesNotExist) { val event = eventsById[id] - event?.splits?.add(LocalMetricsSplit(split, time - lastTime, event.timeunit)) + event?.splits?.add(LocalMetricsSplit(split, time - lastTime, event.timeUnit)) lastSplitTimeById[id] = time } } } + fun setLabel(id: String, label: String) { + executor.execute { + val event = eventsById[id] + if (event != null) { + eventsById[id] = event.copy(extraLabel = label) + } + } + } + /** * Marks a split for an event. Updates the last time, so future splits will have duration relative to this event. * diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java b/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java index dcb88431e7..0f68b11ab7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SignalLocalMetrics.java @@ -154,8 +154,13 @@ public final class SignalLocalMetrics { split(messageId, SPLIT_JOB_ENQUEUE); } - public static void onDeliveryStarted(long messageId) { + public static void onDeliveryStarted(long messageId, long sentTimestamp) { split(messageId, SPLIT_JOB_PRE_NETWORK); + + String splitId = ID_MAP.get(messageId); + if (splitId != null) { + LocalMetrics.getInstance().setLabel(splitId, String.valueOf(sentTimestamp)); + } } public static void onMessageEncrypted(long messageId) { @@ -337,6 +342,13 @@ public final class SignalLocalMetrics { split(messageId, SPLIT_JOB_ENQUEUE); } + public static void setSentTimestamp(long messageId, long sentTimestamp) { + String splitId = ID_MAP.get(messageId); + if (splitId != null) { + LocalMetrics.getInstance().setLabel(splitId, String.valueOf(sentTimestamp)); + } + } + public static void onSenderKeyStarted(long messageId) { split(messageId, SPLIT_JOB_PRE_NETWORK); }