Skip to content

Commit 486da83

Browse files
authored
Clarify the log statements so that it differentiates between sampling and rate limited. (#3012)
1 parent a014466 commit 486da83

File tree

4 files changed

+216
-187
lines changed

4 files changed

+216
-187
lines changed

firebase-perf/src/main/java/com/google/firebase/perf/transport/RateLimiter.java

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,9 @@
2929
import com.google.firebase.perf.util.Rate;
3030
import com.google.firebase.perf.util.Timer;
3131
import com.google.firebase.perf.util.Utils;
32-
import com.google.firebase.perf.v1.NetworkRequestMetric;
3332
import com.google.firebase.perf.v1.PerfMetric;
3433
import com.google.firebase.perf.v1.PerfSession;
3534
import com.google.firebase.perf.v1.SessionVerbosity;
36-
import com.google.firebase.perf.v1.TraceMetric;
3735
import java.util.List;
3836
import java.util.Random;
3937

@@ -107,46 +105,47 @@ private boolean isDeviceAllowedToSendNetworkEvents() {
107105
}
108106

109107
/**
110-
* Check if we should log the {@link PerfMetric} to transport.
111-
*
112-
* <p>Cases in which we don't log a {@link PerfMetric} to transport:
113-
*
114-
* <ul>
115-
* <li>It is a {@link TraceMetric}, the {@link PerfSession} is not verbose and trace metrics are
116-
* sampled.
117-
* <li>It is a {@link NetworkRequestMetric}, the {@link PerfSession} is not verbose and network
118-
* requests are sampled.
119-
* <li>The number of metrics being sent exceeds what the rate limiter allows.
120-
* </ul>
108+
* Check if the {@link PerfMetric} should be rate limited.
121109
*
122110
* @param metric {@link PerfMetric} object.
123-
* @return true if allowed, false if not allowed.
111+
* @return true if event is rated limited, false if event is not rate limited.
124112
*/
125-
boolean check(PerfMetric metric) {
126-
if (metric.hasTraceMetric()
127-
&& !isDeviceAllowedToSendTraces()
128-
&& !hasVerboseSessions(metric.getTraceMetric().getPerfSessionsList())) {
113+
boolean isEventRateLimited(PerfMetric metric) {
114+
if (!isRateLimitApplicable(metric)) {
115+
// Apply rate limiting on this metric.
129116
return false;
130117
}
131118

132-
if (metric.hasNetworkRequestMetric()
133-
&& !isDeviceAllowedToSendNetworkEvents()
134-
&& !hasVerboseSessions(metric.getNetworkRequestMetric().getPerfSessionsList())) {
135-
return false;
119+
if (metric.hasNetworkRequestMetric()) {
120+
return !networkLimiter.check(metric);
121+
} else if (metric.hasTraceMetric()) {
122+
return !traceLimiter.check(metric);
123+
} else {
124+
// Should not reach here
125+
return true;
136126
}
127+
}
137128

138-
if (!isRateLimited(metric)) {
139-
// Do not apply rate limiting on this metric.
140-
return true;
129+
/**
130+
* Check if the {@link PerfMetric} should be sampled. A {@link PerfMetric} is considered sampled
131+
* if the device isn't allowed to send the event type and it is not part of a verbose session.
132+
*
133+
* @param metric {@link PerfMetric} object.
134+
* @return true if allowed, false if not allowed.
135+
*/
136+
boolean isEventSampled(PerfMetric metric) {
137+
if (metric.hasTraceMetric()
138+
&& !(isDeviceAllowedToSendTraces()
139+
|| hasVerboseSessions(metric.getTraceMetric().getPerfSessionsList()))) {
140+
return false;
141141
}
142142

143-
if (metric.hasNetworkRequestMetric()) {
144-
return networkLimiter.check(metric);
145-
} else if (metric.hasTraceMetric()) {
146-
return traceLimiter.check(metric);
147-
} else {
143+
if (metric.hasNetworkRequestMetric()
144+
&& !(isDeviceAllowedToSendNetworkEvents()
145+
|| hasVerboseSessions(metric.getNetworkRequestMetric().getPerfSessionsList()))) {
148146
return false;
149147
}
148+
return true;
150149
}
151150

152151
/**
@@ -174,7 +173,7 @@ private boolean hasVerboseSessions(List<PerfSession> perfSessions) {
174173
* @param metric {@link PerfMetric} object.
175174
* @return true if applying rate limiting. false if not.
176175
*/
177-
boolean isRateLimited(@NonNull PerfMetric metric) {
176+
boolean isRateLimitApplicable(@NonNull PerfMetric metric) {
178177
if (metric.hasTraceMetric()
179178
&& (metric
180179
.getTraceMetric()

firebase-perf/src/main/java/com/google/firebase/perf/transport/TransportManager.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,8 @@ private boolean isAllowedToCache(PerfMetricOrBuilder perfMetricOrBuilder) {
407407
}
408408

409409
logger.debug(
410-
"%s is not allowed to cache. Cache exhausted the limit (availableTracesForCaching: %d, availableNetworkRequestsForCaching: %d, availableGaugesForCaching: %d).",
410+
"%s is not allowed to cache. Cache exhausted the limit (availableTracesForCaching: %d,"
411+
+ " availableNetworkRequestsForCaching: %d, availableGaugesForCaching: %d).",
411412
getLogcatMsg(perfMetricOrBuilder),
412413
availableTracesForCaching,
413414
availableNetworkRequestsForCaching,
@@ -441,16 +442,15 @@ private boolean isAllowedToDispatch(PerfMetric perfMetric) {
441442
return false;
442443
}
443444

444-
if (!rateLimiter.check(perfMetric)) {
445+
if (!rateLimiter.isEventSampled(perfMetric)) {
445446
incrementDropCount(perfMetric);
447+
logger.info("Event dropped due to device sampling - %s", getLogcatMsg(perfMetric));
448+
return false;
449+
}
446450

447-
if (perfMetric.hasTraceMetric()) {
448-
logger.info("Rate Limited - %s", getLogcatMsg(perfMetric.getTraceMetric()));
449-
450-
} else if (perfMetric.hasNetworkRequestMetric()) {
451-
logger.info("Rate Limited - %s", getLogcatMsg(perfMetric.getNetworkRequestMetric()));
452-
}
453-
451+
if (rateLimiter.isEventRateLimited(perfMetric)) {
452+
incrementDropCount(perfMetric);
453+
logger.info("Rate limited (per device) - %s", getLogcatMsg(perfMetric));
454454
return false;
455455
}
456456

0 commit comments

Comments
 (0)