perfetto: add ability to override upload limit flag on debuggable builds
This allows for us to override the failsafe which limits how much data
we can upload per day on userdebug builds.
Bug: 80129651
Change-Id: Ie683801bbb64ee2017a13a3e39e1969c4cb08b24
diff --git a/Android.bp b/Android.bp
index 501bc8e..47c381f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -248,6 +248,11 @@
local_include_dirs: [
"include",
],
+ product_variables: {
+ debuggable: {
+ cflags: ["-DPERFETTO_BUILD_WITH_ANDROID_USERDEBUG"],
+ },
+ },
}
// GN target: //:perfetto_integrationtests
diff --git a/include/perfetto/base/build_config.h b/include/perfetto/base/build_config.h
index 64cb4a9..e083415 100644
--- a/include/perfetto/base/build_config.h
+++ b/include/perfetto/base/build_config.h
@@ -76,4 +76,10 @@
#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_START_DAEMONS() 0
#endif
+#if defined(PERFETTO_BUILD_WITH_ANDROID_USERDEBUG)
+#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_ANDROID_USERDEBUG_BUILD() 1
+#else
+#define PERFETTO_BUILDFLAG_DEFINE_PERFETTO_ANDROID_USERDEBUG_BUILD() 0
+#endif
+
#endif // INCLUDE_PERFETTO_BASE_BUILD_CONFIG_H_
diff --git a/include/perfetto/tracing/core/trace_config.h b/include/perfetto/tracing/core/trace_config.h
index 2097906..d94b72a 100644
--- a/include/perfetto/tracing/core/trace_config.h
+++ b/include/perfetto/tracing/core/trace_config.h
@@ -52,6 +52,7 @@
class TestConfig;
class TraceConfig_ProducerConfig;
class TraceConfig_StatsdMetadata;
+class TraceConfig_GuardrailOverrides;
} // namespace protos
} // namespace perfetto
@@ -203,6 +204,34 @@
std::string unknown_fields_;
};
+ class PERFETTO_EXPORT GuardrailOverrides {
+ public:
+ GuardrailOverrides();
+ ~GuardrailOverrides();
+ GuardrailOverrides(GuardrailOverrides&&) noexcept;
+ GuardrailOverrides& operator=(GuardrailOverrides&&);
+ GuardrailOverrides(const GuardrailOverrides&);
+ GuardrailOverrides& operator=(const GuardrailOverrides&);
+
+ // Conversion methods from/to the corresponding protobuf types.
+ void FromProto(const perfetto::protos::TraceConfig_GuardrailOverrides&);
+ void ToProto(perfetto::protos::TraceConfig_GuardrailOverrides*) const;
+
+ uint64_t max_upload_per_day_bytes() const {
+ return max_upload_per_day_bytes_;
+ }
+ void set_max_upload_per_day_bytes(uint64_t value) {
+ max_upload_per_day_bytes_ = value;
+ }
+
+ private:
+ uint64_t max_upload_per_day_bytes_ = {};
+
+ // Allows to preserve unknown protobuf fields for compatibility
+ // with future versions of .proto files.
+ std::string unknown_fields_;
+ };
+
TraceConfig();
~TraceConfig();
TraceConfig(TraceConfig&&) noexcept;
@@ -264,6 +293,13 @@
uint64_t max_file_size_bytes() const { return max_file_size_bytes_; }
void set_max_file_size_bytes(uint64_t value) { max_file_size_bytes_ = value; }
+ const GuardrailOverrides& guardrail_overrides() const {
+ return guardrail_overrides_;
+ }
+ GuardrailOverrides* mutable_guardrail_overrides() {
+ return &guardrail_overrides_;
+ }
+
private:
std::vector<BufferConfig> buffers_;
std::vector<DataSource> data_sources_;
@@ -275,6 +311,7 @@
bool write_into_file_ = {};
uint32_t file_write_period_ms_ = {};
uint64_t max_file_size_bytes_ = {};
+ GuardrailOverrides guardrail_overrides_ = {};
// Allows to preserve unknown protobuf fields for compatibility
// with future versions of .proto files.
diff --git a/protos/perfetto/config/perfetto_config.proto b/protos/perfetto/config/perfetto_config.proto
index c9654b3..a1d318e 100644
--- a/protos/perfetto/config/perfetto_config.proto
+++ b/protos/perfetto/config/perfetto_config.proto
@@ -191,7 +191,7 @@
// It contains the general config for the logging buffer(s) and the configs for
// all the data source being enabled.
//
-// Next id: 11.
+// Next id: 12.
message TraceConfig {
message BufferConfig {
optional uint32 size_kb = 1;
@@ -287,6 +287,16 @@
// have been written into the file. Tracing is disabled when this limit is
// reached, even if |duration_ms| has not been reached yet.
optional uint64 max_file_size_bytes = 10;
+
+ // Contains flags which override the default values of the guardrails inside
+ // Perfetto. These values are only affect userdebug builds.
+ message GuardrailOverrides {
+ // Override the default limit (in bytes) for uploading data to server within
+ // a 24 hour period.
+ optional uint64 max_upload_per_day_bytes = 1;
+ }
+
+ optional GuardrailOverrides guardrail_overrides = 11;
}
// End of protos/perfetto/config/trace_config.proto
diff --git a/protos/perfetto/config/trace_config.proto b/protos/perfetto/config/trace_config.proto
index f0ba85a..11ce8d2 100644
--- a/protos/perfetto/config/trace_config.proto
+++ b/protos/perfetto/config/trace_config.proto
@@ -29,7 +29,7 @@
// It contains the general config for the logging buffer(s) and the configs for
// all the data source being enabled.
//
-// Next id: 11.
+// Next id: 12.
message TraceConfig {
message BufferConfig {
optional uint32 size_kb = 1;
@@ -125,4 +125,14 @@
// have been written into the file. Tracing is disabled when this limit is
// reached, even if |duration_ms| has not been reached yet.
optional uint64 max_file_size_bytes = 10;
+
+ // Contains flags which override the default values of the guardrails inside
+ // Perfetto. These values are only affect userdebug builds.
+ message GuardrailOverrides {
+ // Override the default limit (in bytes) for uploading data to server within
+ // a 24 hour period.
+ optional uint64 max_upload_per_day_bytes = 1;
+ }
+
+ optional GuardrailOverrides guardrail_overrides = 11;
}
diff --git a/src/perfetto_cmd/perfetto_cmd.cc b/src/perfetto_cmd/perfetto_cmd.cc
index d3a5a17..6bf37a7 100644
--- a/src/perfetto_cmd/perfetto_cmd.cc
+++ b/src/perfetto_cmd/perfetto_cmd.cc
@@ -227,6 +227,10 @@
args.is_dropbox = !dropbox_tag_.empty();
args.current_time = base::GetWallTimeS();
args.ignore_guardrails = ignore_guardrails;
+#if PERFETTO_BUILDFLAG(PERFETTO_ANDROID_USERDEBUG_BUILD)
+ args.max_upload_bytes_override =
+ trace_config_->guardrail_overrides().max_upload_per_day_bytes();
+#endif
if (!limiter.ShouldTrace(args))
return 1;
diff --git a/src/perfetto_cmd/rate_limiter.cc b/src/perfetto_cmd/rate_limiter.cc
index f4df2fc..1e2ef4f 100644
--- a/src/perfetto_cmd/rate_limiter.cc
+++ b/src/perfetto_cmd/rate_limiter.cc
@@ -96,7 +96,10 @@
// If we've uploaded more than 10mb in the last 24 hours we shouldn't trace
// now.
- if (state_.total_bytes_uploaded() > kMaxUploadInBytes) {
+ uint64_t max_upload_guardrail = args.max_upload_bytes_override > 0
+ ? args.max_upload_bytes_override
+ : kMaxUploadInBytes;
+ if (state_.total_bytes_uploaded() > max_upload_guardrail) {
PERFETTO_ELOG("Guardrail: Uploaded >10mb DropBox in the last 24h.");
if (!args.ignore_guardrails)
return false;
diff --git a/src/perfetto_cmd/rate_limiter.h b/src/perfetto_cmd/rate_limiter.h
index c163357..0d89b7d 100644
--- a/src/perfetto_cmd/rate_limiter.h
+++ b/src/perfetto_cmd/rate_limiter.h
@@ -28,6 +28,7 @@
bool is_dropbox = false;
bool ignore_guardrails = false;
base::TimeSeconds current_time = base::TimeSeconds(0);
+ uint64_t max_upload_bytes_override = 0;
};
RateLimiter();
diff --git a/src/perfetto_cmd/rate_limiter_unittest.cc b/src/perfetto_cmd/rate_limiter_unittest.cc
index 17ac97c..753e0e6 100644
--- a/src/perfetto_cmd/rate_limiter_unittest.cc
+++ b/src/perfetto_cmd/rate_limiter_unittest.cc
@@ -277,6 +277,22 @@
ASSERT_FALSE(limiter.ShouldTrace(args));
}
+TEST(RateLimiterTest, DropBox_TooMuch_Override) {
+ StrictMock<MockRateLimiter> limiter;
+ RateLimiter::Args args;
+
+ PerfettoCmdState input{};
+ input.set_total_bytes_uploaded(10 * 1024 * 1024 + 1);
+ ASSERT_TRUE(limiter.SaveStateConcrete(input));
+
+ args.is_dropbox = true;
+ args.current_time = base::TimeSeconds(60 * 60);
+ args.max_upload_bytes_override = 10 * 1024 * 1024 + 2;
+
+ EXPECT_CALL(limiter, LoadState(_));
+ ASSERT_TRUE(limiter.ShouldTrace(args));
+}
+
TEST(RateLimiterTest, DropBox_TooMuchWasUploaded) {
StrictMock<MockRateLimiter> limiter;
RateLimiter::Args args;
diff --git a/src/tracing/core/trace_config.cc b/src/tracing/core/trace_config.cc
index f3bfca5..b4d0081 100644
--- a/src/tracing/core/trace_config.cc
+++ b/src/tracing/core/trace_config.cc
@@ -90,6 +90,8 @@
"size mismatch");
max_file_size_bytes_ =
static_cast<decltype(max_file_size_bytes_)>(proto.max_file_size_bytes());
+
+ guardrail_overrides_.FromProto(proto.guardrail_overrides());
unknown_fields_ = proto.unknown_fields();
}
@@ -148,6 +150,8 @@
proto->set_max_file_size_bytes(
static_cast<decltype(proto->max_file_size_bytes())>(
max_file_size_bytes_));
+
+ guardrail_overrides_.ToProto(proto->mutable_guardrail_overrides());
*(proto->mutable_unknown_fields()) = unknown_fields_;
}
@@ -336,4 +340,38 @@
*(proto->mutable_unknown_fields()) = unknown_fields_;
}
+TraceConfig::GuardrailOverrides::GuardrailOverrides() = default;
+TraceConfig::GuardrailOverrides::~GuardrailOverrides() = default;
+TraceConfig::GuardrailOverrides::GuardrailOverrides(
+ const TraceConfig::GuardrailOverrides&) = default;
+TraceConfig::GuardrailOverrides& TraceConfig::GuardrailOverrides::operator=(
+ const TraceConfig::GuardrailOverrides&) = default;
+TraceConfig::GuardrailOverrides::GuardrailOverrides(
+ TraceConfig::GuardrailOverrides&&) noexcept = default;
+TraceConfig::GuardrailOverrides& TraceConfig::GuardrailOverrides::operator=(
+ TraceConfig::GuardrailOverrides&&) = default;
+
+void TraceConfig::GuardrailOverrides::FromProto(
+ const perfetto::protos::TraceConfig_GuardrailOverrides& proto) {
+ static_assert(sizeof(max_upload_per_day_bytes_) ==
+ sizeof(proto.max_upload_per_day_bytes()),
+ "size mismatch");
+ max_upload_per_day_bytes_ = static_cast<decltype(max_upload_per_day_bytes_)>(
+ proto.max_upload_per_day_bytes());
+ unknown_fields_ = proto.unknown_fields();
+}
+
+void TraceConfig::GuardrailOverrides::ToProto(
+ perfetto::protos::TraceConfig_GuardrailOverrides* proto) const {
+ proto->Clear();
+
+ static_assert(sizeof(max_upload_per_day_bytes_) ==
+ sizeof(proto->max_upload_per_day_bytes()),
+ "size mismatch");
+ proto->set_max_upload_per_day_bytes(
+ static_cast<decltype(proto->max_upload_per_day_bytes())>(
+ max_upload_per_day_bytes_));
+ *(proto->mutable_unknown_fields()) = unknown_fields_;
+}
+
} // namespace perfetto
diff --git a/tools/gen_android_bp b/tools/gen_android_bp
index d887501..a17cf16 100755
--- a/tools/gen_android_bp
+++ b/tools/gen_android_bp
@@ -176,6 +176,7 @@
self.defaults = []
self.cflags = set()
self.local_include_dirs = []
+ self.user_debug_flag = False
def to_string(self, output):
if self.comment:
@@ -196,11 +197,18 @@
self._output_field(output, 'defaults')
self._output_field(output, 'cflags')
self._output_field(output, 'local_include_dirs')
- if any(name in library_not_in_pdk for name in self.shared_libs):
+
+ disable_pdk = any(name in library_not_in_pdk for name in self.shared_libs)
+ if self.user_debug_flag or disable_pdk:
output.append(' product_variables: {')
- output.append(' pdk: {')
- output.append(' enabled: false,')
- output.append(' },')
+ if disable_pdk:
+ output.append(' pdk: {')
+ output.append(' enabled: false,')
+ output.append(' },')
+ if self.user_debug_flag:
+ output.append(' debuggable: {')
+ output.append(' cflags: ["-DPERFETTO_BUILD_WITH_ANDROID_USERDEBUG"],')
+ output.append(' },')
output.append(' },')
output.append('}')
output.append('')
@@ -562,6 +570,7 @@
'-fvisibility=hidden',
'-Oz',
]
+ defaults.user_debug_flag = True
blueprint.add_module(defaults)
for target in targets: