Break message-latency into high/low priority.
This commit is contained in:
parent
7ac479b78a
commit
14f3fb5a94
3 changed files with 11 additions and 9 deletions
|
@ -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)
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue