#ifndef BASE_TRACE_EVENT_TRACE_LOG_H_
#define BASE_TRACE_EVENT_TRACE_LOG_H_
#include <stddef.h>
#include <stdint.h>
#include <map>
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>
#include "base/base_export.h"
#include "base/functional/callback.h"
#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/no_destructor.h"
#include "base/threading/platform_thread.h"
#include "base/time/time_override.h"
#include "base/trace_event/builtin_categories.h"
#include "base/trace_event/trace_config.h"
#include "base/trace_event/trace_event_impl.h"
#include "build/build_config.h"
#include "third_party/perfetto/include/perfetto/tracing/core/trace_config.h"
namespace perfetto {
namespace trace_processor {
class TraceProcessorStorage;
}
}
namespace base {
class RefCountedString;
namespace trace_event {
class JsonStringOutputWriter;
class BASE_EXPORT TraceLog : public perfetto::TrackEventSessionObserver {
public:
static TraceLog* GetInstance();
TraceLog(const TraceLog&) = delete;
TraceLog& operator=(const TraceLog&) = delete;
void SetEnabled(const TraceConfig& trace_config);
void SetEnabled(const TraceConfig& trace_config,
const perfetto::TraceConfig& perfetto_config);
void SetDisabled();
bool IsEnabled() {
AutoLock lock(track_event_lock_);
return active_track_event_sessions_ > 0;
}
class BASE_EXPORT EnabledStateObserver {
public:
virtual ~EnabledStateObserver() = default;
virtual void OnTraceLogEnabled() = 0;
virtual void OnTraceLogDisabled() = 0;
};
void AddEnabledStateObserver(EnabledStateObserver* listener);
void RemoveEnabledStateObserver(EnabledStateObserver* listener);
void AddOwnedEnabledStateObserver(
std::unique_ptr<EnabledStateObserver> listener);
bool HasEnabledStateObserver(EnabledStateObserver* listener) const;
class BASE_EXPORT AsyncEnabledStateObserver {
public:
virtual ~AsyncEnabledStateObserver() = default;
virtual void OnTraceLogEnabled() = 0;
virtual void OnTraceLogDisabled() = 0;
};
void AddAsyncEnabledStateObserver(
WeakPtr<AsyncEnabledStateObserver> listener);
void RemoveAsyncEnabledStateObserver(AsyncEnabledStateObserver* listener);
bool HasAsyncEnabledStateObserver(AsyncEnabledStateObserver* listener) const;
void SetArgumentFilterPredicate(
const ArgumentFilterPredicate& argument_filter_predicate);
ArgumentFilterPredicate GetArgumentFilterPredicate() const;
void SetMetadataFilterPredicate(
const MetadataFilterPredicate& metadata_filter_predicate);
MetadataFilterPredicate GetMetadataFilterPredicate() const;
using OutputCallback =
base::RepeatingCallback<void(const scoped_refptr<base::RefCountedString>&,
bool has_more_events)>;
void Flush(const OutputCallback& cb, bool use_worker_thread = false);
void CancelTracing(const OutputCallback& cb);
ProcessId process_id() const { return process_id_; }
static void ResetForTesting();
void SetProcessID(ProcessId process_id);
size_t GetObserverCountForTest() const;
struct TrackEventSession {
uint32_t internal_instance_index;
perfetto::DataSourceConfig config;
perfetto::BackendType backend_type = perfetto::kUnspecifiedBackend;
};
std::vector<TrackEventSession> GetTrackEventSessions() const;
void SetEnabledImpl(const TraceConfig& trace_config,
const perfetto::TraceConfig& perfetto_config);
void OnSetup(const perfetto::DataSourceBase::SetupArgs&) override;
void OnStart(const perfetto::DataSourceBase::StartArgs&) override;
void OnStop(const perfetto::DataSourceBase::StopArgs&) override;
private:
friend class base::NoDestructor<TraceLog>;
struct RegisteredAsyncObserver;
TraceLog();
~TraceLog() override;
void SetDisabledWhileLocked() EXCLUSIVE_LOCKS_REQUIRED(lock_);
void FlushInternal(const OutputCallback& cb,
bool use_worker_thread,
bool discard_events);
void OnTraceData(const char* data, size_t size, bool has_more);
mutable Lock lock_;
mutable Lock observers_lock_;
bool dispatching_to_observers_ = false;
std::vector<raw_ptr<EnabledStateObserver, VectorExperimental>>
enabled_state_observers_ GUARDED_BY(observers_lock_);
std::map<AsyncEnabledStateObserver*, RegisteredAsyncObserver> async_observers_
GUARDED_BY(observers_lock_);
std::vector<std::unique_ptr<EnabledStateObserver>>
owned_enabled_state_observer_copy_ GUARDED_BY(observers_lock_);
ProcessId process_id_;
ArgumentFilterPredicate argument_filter_predicate_;
MetadataFilterPredicate metadata_filter_predicate_;
std::unique_ptr<perfetto::TracingSession> tracing_session_;
perfetto::TraceConfig perfetto_config_;
std::vector<TrackEventSession> track_event_sessions_
GUARDED_BY(track_event_lock_);
int active_track_event_sessions_ = 0;
mutable Lock track_event_lock_;
#if BUILDFLAG(USE_PERFETTO_TRACE_PROCESSOR)
std::unique_ptr<perfetto::trace_processor::TraceProcessorStorage>
trace_processor_;
std::unique_ptr<JsonStringOutputWriter> json_output_writer_;
OutputCallback proto_output_callback_;
#endif
};
}
}
#endif