Break message-latency into high/low priority.

This commit is contained in:
Greyson Parrelli 2023-08-07 14:43:24 -04:00 committed by Alex Hart
parent 7ac479b78a
commit 14f3fb5a94
3 changed files with 11 additions and 9 deletions

View file

@ -299,7 +299,7 @@ class IncomingMessageObserver(private val context: Application) {
val result = MessageDecryptor.decrypt(context, bufferedProtocolStore, envelope, serverDeliveredTimestamp)
localReceiveMetric.onEnvelopeDecrypted()
SignalLocalMetrics.MessageLatency.onMessageReceived(envelope.serverTimestamp, serverDeliveredTimestamp)
SignalLocalMetrics.MessageLatency.onMessageReceived(envelope.serverTimestamp, serverDeliveredTimestamp, envelope.urgent)
when (result) {
is MessageDecryptor.Result.Success -> {
val job = PushProcessMessageJobV2.processOrDefer(messageContentProcessor, result, localReceiveMetric)

View file

@ -73,17 +73,17 @@ object SlowNotificationHeuristics {
}
private fun hasLongMessageLatency(metrics: List<LocalMetricsDatabase.EventMetrics>, minimumEventAgeMs: Long, percentage: Int, messageThreshold: Int, durationThreshold: Long): Boolean {
if (!haveEnoughData(SignalLocalMetrics.MessageLatency.NAME, minimumEventAgeMs)) {
if (!haveEnoughData(SignalLocalMetrics.MessageLatency.NAME_HIGH, minimumEventAgeMs)) {
Log.d(TAG, "insufficient data for message latency")
return false
}
val eventCount = metrics.count { it.name == SignalLocalMetrics.MessageLatency.NAME }
val eventCount = metrics.count { it.name == SignalLocalMetrics.MessageLatency.NAME_HIGH }
if (eventCount < messageThreshold) {
Log.d(TAG, "not enough messages for message latency")
return false
}
val db = LocalMetricsDatabase.getInstance(ApplicationDependencies.getApplication())
val averageLatency = db.eventPercent(SignalLocalMetrics.MessageLatency.NAME, percentage.coerceAtMost(100).coerceAtLeast(0))
val averageLatency = db.eventPercent(SignalLocalMetrics.MessageLatency.NAME_HIGH, percentage.coerceAtMost(100).coerceAtLeast(0))
val longMessageLatency = averageLatency > durationThreshold
if (longMessageLatency) {

View file

@ -204,15 +204,17 @@ public final class SignalLocalMetrics {
}
public static final class MessageLatency {
public static final String NAME = "message-latency";
public static final String NAME_HIGH = "message-latency-high-priority";
public static final String NAME_LOW = "message-latency-low-priority";
private static final String SPLIT_LATENCY = "latency";
public static void onMessageReceived(long serverReceiveTimestamp, long serverDeliverTimestamp) {
long latency = serverDeliverTimestamp - serverReceiveTimestamp;
public static void onMessageReceived(long serverReceiveTimestamp, long serverDeliverTimestamp, boolean highPriority) {
String name = highPriority ? NAME_HIGH : NAME_LOW;
long latency = serverDeliverTimestamp - serverReceiveTimestamp;
String id = NAME + System.currentTimeMillis();
LocalMetrics.getInstance().start(id, NAME);
String id = name + System.currentTimeMillis();
LocalMetrics.getInstance().start(id, name);
LocalMetrics.getInstance().splitWithDuration(id, SPLIT_LATENCY, latency);
LocalMetrics.getInstance().end(id);
}