Commit 67f4c2f3 authored by Oystein Eftevaag's avatar Oystein Eftevaag Committed by Commit Bot

Background tracing: Use the new Perfetto Consumer mojo endpoint

rather than the TracingController.

This is in preparation for being able to handle proto traces
in addition to JSON.

R=ssid@chromium.org
BUG=925151

Change-Id: I91ed3c9648587fb19a5102b869a5d5ab688e0187
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1546146
Commit-Queue: oysteine <oysteine@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Reviewed-by: default avatarssid <ssid@chromium.org>
Cr-Commit-Position: refs/heads/master@{#657413}
parent 4ece4b7d
...@@ -21,7 +21,7 @@ class BackgroundTracingTest : public testing::Test { ...@@ -21,7 +21,7 @@ class BackgroundTracingTest : public testing::Test {
BackgroundTracingTest() = default; BackgroundTracingTest() = default;
void TearDown() override { void TearDown() override {
content::BackgroundTracingManager::GetInstance()->AbortScenario(); content::BackgroundTracingManager::GetInstance()->AbortScenarioForTesting();
} }
private: private:
......
...@@ -34,7 +34,7 @@ TEST_F(BackgroundTracingMetricsProviderTest, UploadsTraceLog) { ...@@ -34,7 +34,7 @@ TEST_F(BackgroundTracingMetricsProviderTest, UploadsTraceLog) {
EXPECT_FALSE(provider.HasIndependentMetrics()); EXPECT_FALSE(provider.HasIndependentMetrics());
content::BackgroundTracingManager::GetInstance()->SetTraceToUploadForTesting( content::BackgroundTracingManager::GetInstance()->SetTraceToUploadForTesting(
kDummyTrace); std::make_unique<std::string>(kDummyTrace));
EXPECT_TRUE(provider.HasIndependentMetrics()); EXPECT_TRUE(provider.HasIndependentMetrics());
metrics::ChromeUserMetricsExtension uma_proto; metrics::ChromeUserMetricsExtension uma_proto;
...@@ -57,11 +57,11 @@ TEST_F(BackgroundTracingMetricsProviderTest, HandleMissingTrace) { ...@@ -57,11 +57,11 @@ TEST_F(BackgroundTracingMetricsProviderTest, HandleMissingTrace) {
EXPECT_FALSE(provider.HasIndependentMetrics()); EXPECT_FALSE(provider.HasIndependentMetrics());
content::BackgroundTracingManager::GetInstance()->SetTraceToUploadForTesting( content::BackgroundTracingManager::GetInstance()->SetTraceToUploadForTesting(
kDummyTrace); std::make_unique<std::string>(kDummyTrace));
EXPECT_TRUE(provider.HasIndependentMetrics()); EXPECT_TRUE(provider.HasIndependentMetrics());
content::BackgroundTracingManager::GetInstance()->SetTraceToUploadForTesting( content::BackgroundTracingManager::GetInstance()->SetTraceToUploadForTesting(
""); nullptr);
metrics::ChromeUserMetricsExtension uma_proto; metrics::ChromeUserMetricsExtension uma_proto;
uma_proto.set_client_id(100); uma_proto.set_client_id(100);
uma_proto.set_session_id(15); uma_proto.set_session_id(15);
......
...@@ -148,7 +148,7 @@ IN_PROC_BROWSER_TEST_F(ChromeTracingDelegateBrowserTest, ...@@ -148,7 +148,7 @@ IN_PROC_BROWSER_TEST_F(ChromeTracingDelegateBrowserTest,
local_state->GetInt64(prefs::kBackgroundTracingLastUpload)); local_state->GetInt64(prefs::kBackgroundTracingLastUpload));
EXPECT_FALSE(last_upload_time.is_null()); EXPECT_FALSE(last_upload_time.is_null());
content::BackgroundTracingManager::GetInstance()->AbortScenario(); content::BackgroundTracingManager::GetInstance()->AbortScenarioForTesting();
base::RunLoop wait_for_abort; base::RunLoop wait_for_abort;
content::BackgroundTracingManager::GetInstance()->WhenIdle( content::BackgroundTracingManager::GetInstance()->WhenIdle(
wait_for_abort.QuitClosure()); wait_for_abort.QuitClosure());
...@@ -188,7 +188,7 @@ IN_PROC_BROWSER_TEST_F(ChromeTracingDelegateBrowserTest, ...@@ -188,7 +188,7 @@ IN_PROC_BROWSER_TEST_F(ChromeTracingDelegateBrowserTest,
local_state->GetInt64(prefs::kBackgroundTracingLastUpload)); local_state->GetInt64(prefs::kBackgroundTracingLastUpload));
EXPECT_FALSE(last_upload_time.is_null()); EXPECT_FALSE(last_upload_time.is_null());
content::BackgroundTracingManager::GetInstance()->AbortScenario(); content::BackgroundTracingManager::GetInstance()->AbortScenarioForTesting();
base::RunLoop wait_for_abort; base::RunLoop wait_for_abort;
content::BackgroundTracingManager::GetInstance()->WhenIdle( content::BackgroundTracingManager::GetInstance()->WhenIdle(
wait_for_abort.QuitClosure()); wait_for_abort.QuitClosure());
......
...@@ -11,7 +11,9 @@ ...@@ -11,7 +11,9 @@
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "content/browser/tracing/background_tracing_config_impl.h" #include "content/browser/tracing/background_tracing_config_impl.h"
#include "content/browser/tracing/tracing_controller_impl.h"
#include "content/public/browser/background_tracing_manager.h" #include "content/public/browser/background_tracing_manager.h"
#include "services/tracing/public/mojom/perfetto_service.mojom.h"
namespace base { namespace base {
class RefCountedString; class RefCountedString;
...@@ -24,13 +26,14 @@ class BackgroundTracingConfigImpl; ...@@ -24,13 +26,14 @@ class BackgroundTracingConfigImpl;
class BackgroundTracingActiveScenario { class BackgroundTracingActiveScenario {
public: public:
enum class State { kIdle, kTracing, kFinalizing, kUploading, kAborted }; enum class State { kIdle, kTracing, kFinalizing, kUploading, kAborted };
class TracingSession;
BackgroundTracingActiveScenario( BackgroundTracingActiveScenario(
std::unique_ptr<const BackgroundTracingConfigImpl> config, std::unique_ptr<const BackgroundTracingConfigImpl> config,
bool requires_anonymized_data, bool requires_anonymized_data,
BackgroundTracingManager::ReceiveCallback receive_callback, BackgroundTracingManager::ReceiveCallback receive_callback,
base::OnceClosure on_aborted_callback); base::OnceClosure on_aborted_callback);
~BackgroundTracingActiveScenario(); virtual ~BackgroundTracingActiveScenario();
void StartTracingIfConfigNeedsIt(); void StartTracingIfConfigNeedsIt();
void AbortScenario(); void AbortScenario();
...@@ -39,6 +42,7 @@ class BackgroundTracingActiveScenario { ...@@ -39,6 +42,7 @@ class BackgroundTracingActiveScenario {
void GenerateMetadataDict(base::DictionaryValue* metadata_dict); void GenerateMetadataDict(base::DictionaryValue* metadata_dict);
State state() const { return scenario_state_; } State state() const { return scenario_state_; }
bool requires_anonymized_data() const { return requires_anonymized_data_; } bool requires_anonymized_data() const { return requires_anonymized_data_; }
base::WeakPtr<BackgroundTracingActiveScenario> GetWeakPtr();
void TriggerNamedEvent( void TriggerNamedEvent(
BackgroundTracingManager::TriggerHandle handle, BackgroundTracingManager::TriggerHandle handle,
...@@ -48,6 +52,16 @@ class BackgroundTracingActiveScenario { ...@@ -48,6 +52,16 @@ class BackgroundTracingActiveScenario {
const BackgroundTracingRule* triggered_rule, const BackgroundTracingRule* triggered_rule,
BackgroundTracingManager::StartedFinalizingCallback callback); BackgroundTracingManager::StartedFinalizingCallback callback);
// Called by LegacyTracingSession when the final trace data is ready.
void OnJSONDataComplete(std::unique_ptr<const base::DictionaryValue> metadata,
base::RefCountedString*);
// Called by the PerfettoTracingSession when the proto trace is ready.
void OnProtoDataComplete(std::unique_ptr<std::string> proto_trace);
// Called when the finalized trace data has been uploaded/transferred away
// from the background tracing system.
void OnFinalizeComplete(bool success);
// For testing // For testing
CONTENT_EXPORT void FireTimerForTesting(); CONTENT_EXPORT void FireTimerForTesting();
CONTENT_EXPORT void SetRuleTriggeredCallbackForTesting( CONTENT_EXPORT void SetRuleTriggeredCallbackForTesting(
...@@ -56,20 +70,15 @@ class BackgroundTracingActiveScenario { ...@@ -56,20 +70,15 @@ class BackgroundTracingActiveScenario {
private: private:
void StartTracing(BackgroundTracingConfigImpl::CategoryPreset, void StartTracing(BackgroundTracingConfigImpl::CategoryPreset,
base::trace_event::TraceRecordMode); base::trace_event::TraceRecordMode);
void BeginFinalizing( void BeginFinalizing(
BackgroundTracingManager::StartedFinalizingCallback callback); BackgroundTracingManager::StartedFinalizingCallback callback);
void OnTracingStopped(base::RepeatingClosure started_finalizing_closure,
std::unique_ptr<const base::DictionaryValue> metadata,
base::RefCountedString*);
void OnFinalizeComplete(bool success);
BackgroundTracingRule* GetRuleAbleToTriggerTracing( BackgroundTracingRule* GetRuleAbleToTriggerTracing(
const std::string& trigger_name); const std::string& trigger_name);
void SetState(State new_state); void SetState(State new_state);
std::unique_ptr<TracingSession> tracing_session_;
std::unique_ptr<const BackgroundTracingConfigImpl> config_; std::unique_ptr<const BackgroundTracingConfigImpl> config_;
bool requires_anonymized_data_; bool requires_anonymized_data_;
State scenario_state_; State scenario_state_;
...@@ -78,6 +87,7 @@ class BackgroundTracingActiveScenario { ...@@ -78,6 +87,7 @@ class BackgroundTracingActiveScenario {
BackgroundTracingManager::ReceiveCallback receive_callback_; BackgroundTracingManager::ReceiveCallback receive_callback_;
BackgroundTracingManager::TriggerHandle triggered_named_event_handle_; BackgroundTracingManager::TriggerHandle triggered_named_event_handle_;
base::OnceClosure on_aborted_callback_; base::OnceClosure on_aborted_callback_;
base::OnceClosure started_finalizing_closure_;
class TracingTimer; class TracingTimer;
std::unique_ptr<TracingTimer> tracing_timer_; std::unique_ptr<TracingTimer> tracing_timer_;
......
...@@ -162,18 +162,19 @@ bool BackgroundTracingManagerImpl::HasActiveScenario() { ...@@ -162,18 +162,19 @@ bool BackgroundTracingManagerImpl::HasActiveScenario() {
} }
bool BackgroundTracingManagerImpl::HasTraceToUpload() { bool BackgroundTracingManagerImpl::HasTraceToUpload() {
// TODO(oysteine): This should return the collected trace once we have the new DCHECK_CURRENTLY_ON(BrowserThread::UI);
// coordinator API to collect protos. https://crbug.com/925142. return !trace_to_upload_.empty();
// Note: This can be called on any thread and needs to be thread safe.
return !trace_to_upload_for_testing_.empty();
} }
std::string BackgroundTracingManagerImpl::GetLatestTraceToUpload() { std::string BackgroundTracingManagerImpl::GetLatestTraceToUpload() {
// TODO(oysteine): This should return the collected trace once we have the new DCHECK_CURRENTLY_ON(BrowserThread::UI);
// coordinator API to collect protos. https://crbug.com/925142.
// Note: This can be called on any thread and needs to be thread safe.
std::string ret; std::string ret;
ret.swap(trace_to_upload_for_testing_); ret.swap(trace_to_upload_);
if (active_scenario_) {
active_scenario_->OnFinalizeComplete(true);
}
return ret; return ret;
} }
...@@ -241,8 +242,18 @@ bool BackgroundTracingManagerImpl::IsTracingForTesting() { ...@@ -241,8 +242,18 @@ bool BackgroundTracingManagerImpl::IsTracingForTesting() {
} }
void BackgroundTracingManagerImpl::SetTraceToUploadForTesting( void BackgroundTracingManagerImpl::SetTraceToUploadForTesting(
base::StringPiece data) { std::unique_ptr<std::string> trace_data) {
trace_to_upload_for_testing_ = data.data(); SetTraceToUpload(std::move(trace_data));
}
void BackgroundTracingManagerImpl::SetTraceToUpload(
std::unique_ptr<std::string> trace_data) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (trace_data) {
trace_to_upload_.swap(*trace_data);
} else {
trace_to_upload_.clear();
}
} }
void BackgroundTracingManagerImpl::ValidateStartupScenario() { void BackgroundTracingManagerImpl::ValidateStartupScenario() {
...@@ -315,7 +326,6 @@ BackgroundTracingManagerImpl::RegisterTriggerType(const char* trigger_name) { ...@@ -315,7 +326,6 @@ BackgroundTracingManagerImpl::RegisterTriggerType(const char* trigger_name) {
return static_cast<TriggerHandle>(trigger_handle_ids_); return static_cast<TriggerHandle>(trigger_handle_ids_);
} }
bool BackgroundTracingManagerImpl::IsTriggerHandleValid( bool BackgroundTracingManagerImpl::IsTriggerHandleValid(
BackgroundTracingManager::TriggerHandle handle) const { BackgroundTracingManager::TriggerHandle handle) const {
return trigger_handles_.find(handle) != trigger_handles_.end(); return trigger_handles_.find(handle) != trigger_handles_.end();
...@@ -368,6 +378,10 @@ BackgroundTracingManagerImpl::GenerateMetadataDict() { ...@@ -368,6 +378,10 @@ BackgroundTracingManagerImpl::GenerateMetadataDict() {
return metadata_dict; return metadata_dict;
} }
void BackgroundTracingManagerImpl::AbortScenarioForTesting() {
AbortScenario();
}
void BackgroundTracingManagerImpl::AbortScenario() { void BackgroundTracingManagerImpl::AbortScenario() {
if (active_scenario_) { if (active_scenario_) {
active_scenario_->AbortScenario(); active_scenario_->AbortScenario();
......
...@@ -78,7 +78,7 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager { ...@@ -78,7 +78,7 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager {
bool SetActiveScenario(std::unique_ptr<BackgroundTracingConfig>, bool SetActiveScenario(std::unique_ptr<BackgroundTracingConfig>,
ReceiveCallback, ReceiveCallback,
DataFiltering data_filtering) override; DataFiltering data_filtering) override;
CONTENT_EXPORT void AbortScenario() override; void AbortScenario();
bool HasActiveScenario() override; bool HasActiveScenario() override;
// Named triggers // Named triggers
...@@ -92,6 +92,7 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager { ...@@ -92,6 +92,7 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager {
StartedFinalizingCallback callback); StartedFinalizingCallback callback);
bool HasTraceToUpload() override; bool HasTraceToUpload() override;
std::string GetLatestTraceToUpload() override; std::string GetLatestTraceToUpload() override;
void SetTraceToUpload(std::unique_ptr<std::string> trace_data);
// Add/remove EnabledStateObserver. // Add/remove EnabledStateObserver.
CONTENT_EXPORT void AddEnabledStateObserver(EnabledStateObserver* observer); CONTENT_EXPORT void AddEnabledStateObserver(EnabledStateObserver* observer);
...@@ -116,9 +117,9 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager { ...@@ -116,9 +117,9 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager {
CONTENT_EXPORT void InvalidateTriggerHandlesForTesting(); CONTENT_EXPORT void InvalidateTriggerHandlesForTesting();
CONTENT_EXPORT bool IsTracingForTesting(); CONTENT_EXPORT bool IsTracingForTesting();
void WhenIdle(IdleCallback idle_callback) override; void WhenIdle(IdleCallback idle_callback) override;
CONTENT_EXPORT void AbortScenarioForTesting() override;
CONTENT_EXPORT void SetTraceToUploadForTesting( CONTENT_EXPORT void SetTraceToUploadForTesting(
base::StringPiece data) override; std::unique_ptr<std::string> trace_data) override;
private: private:
friend class base::NoDestructor<BackgroundTracingManagerImpl>; friend class base::NoDestructor<BackgroundTracingManagerImpl>;
...@@ -147,8 +148,9 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager { ...@@ -147,8 +148,9 @@ class BackgroundTracingManagerImpl : public BackgroundTracingManager {
IdleCallback idle_callback_; IdleCallback idle_callback_;
base::RepeatingClosure tracing_enabled_callback_for_testing_; base::RepeatingClosure tracing_enabled_callback_for_testing_;
// This field contains serialized trace log proto. // This field contains serialized trace log proto.
std::string trace_to_upload_for_testing_; std::string trace_to_upload_;
DISALLOW_COPY_AND_ASSIGN(BackgroundTracingManagerImpl); DISALLOW_COPY_AND_ASSIGN(BackgroundTracingManagerImpl);
}; };
......
...@@ -102,8 +102,9 @@ class BackgroundTracingManager { ...@@ -102,8 +102,9 @@ class BackgroundTracingManager {
virtual std::string GetLatestTraceToUpload() = 0; virtual std::string GetLatestTraceToUpload() = 0;
// For tests // For tests
virtual void AbortScenario() = 0; virtual void AbortScenarioForTesting() = 0;
virtual void SetTraceToUploadForTesting(base::StringPiece data) = 0; virtual void SetTraceToUploadForTesting(
std::unique_ptr<std::string> trace_data) = 0;
protected: protected:
virtual ~BackgroundTracingManager() {} virtual ~BackgroundTracingManager() {}
......
...@@ -15,7 +15,8 @@ ...@@ -15,7 +15,8 @@
namespace tracing { namespace tracing {
perfetto::TraceConfig GetDefaultPerfettoConfig( perfetto::TraceConfig GetDefaultPerfettoConfig(
const base::trace_event::TraceConfig& chrome_config) { const base::trace_event::TraceConfig& chrome_config,
bool privacy_filtering_enabled) {
perfetto::TraceConfig perfetto_config; perfetto::TraceConfig perfetto_config;
size_t size_limit = chrome_config.GetTraceBufferSizeInKb(); size_t size_limit = chrome_config.GetTraceBufferSizeInKb();
...@@ -52,6 +53,7 @@ perfetto::TraceConfig GetDefaultPerfettoConfig( ...@@ -52,6 +53,7 @@ perfetto::TraceConfig GetDefaultPerfettoConfig(
trace_event_config->set_target_buffer(0); trace_event_config->set_target_buffer(0);
auto* chrome_proto_config = trace_event_config->mutable_chrome_config(); auto* chrome_proto_config = trace_event_config->mutable_chrome_config();
chrome_proto_config->set_trace_config(chrome_config_string); chrome_proto_config->set_trace_config(chrome_config_string);
chrome_proto_config->set_privacy_filtering_enabled(privacy_filtering_enabled);
// Capture system trace events if supported and enabled. The datasources will // Capture system trace events if supported and enabled. The datasources will
// only emit events if system tracing is enabled in |chrome_config|. // only emit events if system tracing is enabled in |chrome_config|.
...@@ -62,6 +64,8 @@ perfetto::TraceConfig GetDefaultPerfettoConfig( ...@@ -62,6 +64,8 @@ perfetto::TraceConfig GetDefaultPerfettoConfig(
system_trace_config->set_target_buffer(0); system_trace_config->set_target_buffer(0);
auto* system_chrome_config = system_trace_config->mutable_chrome_config(); auto* system_chrome_config = system_trace_config->mutable_chrome_config();
system_chrome_config->set_trace_config(chrome_config_string); system_chrome_config->set_trace_config(chrome_config_string);
system_chrome_config->set_privacy_filtering_enabled(
privacy_filtering_enabled);
#endif #endif
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
...@@ -70,6 +74,7 @@ perfetto::TraceConfig GetDefaultPerfettoConfig( ...@@ -70,6 +74,7 @@ perfetto::TraceConfig GetDefaultPerfettoConfig(
arc_trace_config->set_target_buffer(0); arc_trace_config->set_target_buffer(0);
auto* arc_chrome_config = arc_trace_config->mutable_chrome_config(); auto* arc_chrome_config = arc_trace_config->mutable_chrome_config();
arc_chrome_config->set_trace_config(chrome_config_string); arc_chrome_config->set_trace_config(chrome_config_string);
arc_chrome_config->set_privacy_filtering_enabled(privacy_filtering_enabled);
#endif #endif
// Also capture global metadata. // Also capture global metadata.
...@@ -79,7 +84,8 @@ perfetto::TraceConfig GetDefaultPerfettoConfig( ...@@ -79,7 +84,8 @@ perfetto::TraceConfig GetDefaultPerfettoConfig(
trace_metadata_config->set_target_buffer(0); trace_metadata_config->set_target_buffer(0);
auto* metadata_chrome_config = trace_metadata_config->mutable_chrome_config(); auto* metadata_chrome_config = trace_metadata_config->mutable_chrome_config();
metadata_chrome_config->set_trace_config(chrome_config_string); metadata_chrome_config->set_trace_config(chrome_config_string);
// TODO(ssid): Also set privacy_filtering_enabled here. metadata_chrome_config->set_privacy_filtering_enabled(
privacy_filtering_enabled);
return perfetto_config; return perfetto_config;
} }
......
...@@ -17,7 +17,8 @@ class TraceConfig; ...@@ -17,7 +17,8 @@ class TraceConfig;
namespace tracing { namespace tracing {
perfetto::TraceConfig COMPONENT_EXPORT(TRACING_CPP) GetDefaultPerfettoConfig( perfetto::TraceConfig COMPONENT_EXPORT(TRACING_CPP) GetDefaultPerfettoConfig(
const base::trace_event::TraceConfig& chrome_config); const base::trace_event::TraceConfig& chrome_config,
bool privacy_filtering_enabled = false);
} // namespace tracing } // namespace tracing
......
...@@ -19,6 +19,11 @@ namespace features { ...@@ -19,6 +19,11 @@ namespace features {
const base::Feature kTracingPerfettoBackend{"TracingPerfettoBackend", const base::Feature kTracingPerfettoBackend{"TracingPerfettoBackend",
base::FEATURE_ENABLED_BY_DEFAULT}; base::FEATURE_ENABLED_BY_DEFAULT};
// Causes the BackgroundTracingManager to upload proto messages via UMA,
// rather than JSON via the crash frontend.
const base::Feature kBackgroundTracingProtoOutput{
"BackgroundTracingProtoOutput", base::FEATURE_DISABLED_BY_DEFAULT};
// Runs the tracing service as an in-process browser service. // Runs the tracing service as an in-process browser service.
const base::Feature kTracingServiceInProcess { const base::Feature kTracingServiceInProcess {
"TracingServiceInProcess", "TracingServiceInProcess",
......
...@@ -21,6 +21,9 @@ extern const COMPONENT_EXPORT(TRACING_CPP) base::Feature ...@@ -21,6 +21,9 @@ extern const COMPONENT_EXPORT(TRACING_CPP) base::Feature
extern const COMPONENT_EXPORT(TRACING_CPP) base::Feature extern const COMPONENT_EXPORT(TRACING_CPP) base::Feature
kTracingServiceInProcess; kTracingServiceInProcess;
extern const COMPONENT_EXPORT(TRACING_CPP) base::Feature
kBackgroundTracingProtoOutput;
} // namespace features } // namespace features
namespace tracing { namespace tracing {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment