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) val result = MessageDecryptor.decrypt(context, bufferedProtocolStore, envelope, serverDeliveredTimestamp)
localReceiveMetric.onEnvelopeDecrypted() localReceiveMetric.onEnvelopeDecrypted()
SignalLocalMetrics.MessageLatency.onMessageReceived(envelope.serverTimestamp, serverDeliveredTimestamp) SignalLocalMetrics.MessageLatency.onMessageReceived(envelope.serverTimestamp, serverDeliveredTimestamp, envelope.urgent)
when (result) { when (result) {
is MessageDecryptor.Result.Success -> { is MessageDecryptor.Result.Success -> {
val job = PushProcessMessageJobV2.processOrDefer(messageContentProcessor, result, localReceiveMetric) 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 { 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") Log.d(TAG, "insufficient data for message latency")
return false return false
} }
val eventCount = metrics.count { it.name == SignalLocalMetrics.MessageLatency.NAME } val eventCount = metrics.count { it.name == SignalLocalMetrics.MessageLatency.NAME_HIGH }
if (eventCount < messageThreshold) { if (eventCount < messageThreshold) {
Log.d(TAG, "not enough messages for message latency") Log.d(TAG, "not enough messages for message latency")
return false return false
} }
val db = LocalMetricsDatabase.getInstance(ApplicationDependencies.getApplication()) 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 val longMessageLatency = averageLatency > durationThreshold
if (longMessageLatency) { if (longMessageLatency) {

View file

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