aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLalit Maganti <lalitm@google.com>2018-05-23 14:41:43 +0100
committerPrimiano Tucci <primiano@google.com>2018-05-23 22:03:33 +0000
commit41844eda55fdb325430d622e65dc6ff16c6a61c1 (patch)
tree1ce7df621a9aefcc5b72dd925956866d462162b9
parent870dd82f0a1190b1890ca3e592f68bc5bbece627 (diff)
downloadperfetto-41844eda55fdb325430d622e65dc6ff16c6a61c1.tar.gz
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 Test: unittests Change-Id: Ie683801bbb64ee2017a13a3e39e1969c4cb08b24 Merged-In: Ie683801bbb64ee2017a13a3e39e1969c4cb08b24
-rw-r--r--Android.bp5
-rw-r--r--include/perfetto/base/build_config.h6
-rw-r--r--include/perfetto/tracing/core/trace_config.h37
-rw-r--r--protos/perfetto/config/perfetto_config.proto10
-rw-r--r--protos/perfetto/config/trace_config.proto10
-rw-r--r--src/perfetto_cmd/perfetto_cmd.cc4
-rw-r--r--src/perfetto_cmd/rate_limiter.cc5
-rw-r--r--src/perfetto_cmd/rate_limiter.h1
-rw-r--r--src/perfetto_cmd/rate_limiter_unittest.cc16
-rw-r--r--src/tracing/core/trace_config.cc38
-rwxr-xr-xtools/gen_android_bp17
11 files changed, 144 insertions, 5 deletions
diff --git a/Android.bp b/Android.bp
index 34b35eba0..93919262f 100644
--- a/Android.bp
+++ b/Android.bp
@@ -240,6 +240,11 @@ cc_defaults {
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 de4a43691..5f1c31dc3 100644
--- a/include/perfetto/base/build_config.h
+++ b/include/perfetto/base/build_config.h
@@ -58,4 +58,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 2097906ec..d94b72aec 100644
--- a/include/perfetto/tracing/core/trace_config.h
+++ b/include/perfetto/tracing/core/trace_config.h
@@ -52,6 +52,7 @@ class ProcessStatsConfig;
class TestConfig;
class TraceConfig_ProducerConfig;
class TraceConfig_StatsdMetadata;
+class TraceConfig_GuardrailOverrides;
} // namespace protos
} // namespace perfetto
@@ -203,6 +204,34 @@ class PERFETTO_EXPORT TraceConfig {
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 @@ class PERFETTO_EXPORT TraceConfig {
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 @@ class PERFETTO_EXPORT TraceConfig {
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 48202b8a7..f75fccb05 100644
--- a/protos/perfetto/config/perfetto_config.proto
+++ b/protos/perfetto/config/perfetto_config.proto
@@ -287,6 +287,16 @@ message TraceConfig {
// 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 36a02bbec..94223374f 100644
--- a/protos/perfetto/config/trace_config.proto
+++ b/protos/perfetto/config/trace_config.proto
@@ -125,4 +125,14 @@ message TraceConfig {
// 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 20e922864..9614642c9 100644
--- a/src/perfetto_cmd/perfetto_cmd.cc
+++ b/src/perfetto_cmd/perfetto_cmd.cc
@@ -230,6 +230,10 @@ int PerfettoCmd::Main(int argc, char** argv) {
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 f4df2fca1..1e2ef4f1e 100644
--- a/src/perfetto_cmd/rate_limiter.cc
+++ b/src/perfetto_cmd/rate_limiter.cc
@@ -96,7 +96,10 @@ bool RateLimiter::ShouldTrace(const Args& args) {
// 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 c1633572a..0d89b7da6 100644
--- a/src/perfetto_cmd/rate_limiter.h
+++ b/src/perfetto_cmd/rate_limiter.h
@@ -28,6 +28,7 @@ class RateLimiter {
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 17ac97c1a..753e0e678 100644
--- a/src/perfetto_cmd/rate_limiter_unittest.cc
+++ b/src/perfetto_cmd/rate_limiter_unittest.cc
@@ -277,6 +277,22 @@ TEST(RateLimiterTest, DropBox_TooMuch) {
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 f3bfca5cb..b4d008177 100644
--- a/src/tracing/core/trace_config.cc
+++ b/src/tracing/core/trace_config.cc
@@ -90,6 +90,8 @@ void TraceConfig::FromProto(const perfetto::protos::TraceConfig& proto) {
"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 @@ void TraceConfig::ToProto(perfetto::protos::TraceConfig* proto) const {
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 @@ void TraceConfig::StatsdMetadata::ToProto(
*(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 f71e00183..d48c91cca 100755
--- a/tools/gen_android_bp
+++ b/tools/gen_android_bp
@@ -176,6 +176,7 @@ class Module(object):
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 @@ class Module(object):
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('')
@@ -561,6 +569,7 @@ def create_blueprint_for_targets(desc, targets):
'-fvisibility=hidden',
'-Oz',
]
+ defaults.user_debug_flag = True
blueprint.add_module(defaults)
for target in targets: