#ifndef BASE_TRACE_EVENT_TRACE_CONFIG_H_
#define BASE_TRACE_EVENT_TRACE_CONFIG_H_
#include <stdint.h>
#include <memory>
#include <set>
#include <string>
#include <string_view>
#include <unordered_set>
#include <vector>
#include "base/base_export.h"
#include "base/byte_count.h"
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "base/trace_event/memory_dump_request_args.h"
#include "base/trace_event/trace_config_category_filter.h"
#include "base/values.h"
namespace base::trace_event {
class ConvertableToTraceFormat;
enum TraceRecordMode {
RECORD_UNTIL_FULL,
RECORD_CONTINUOUSLY,
RECORD_AS_MUCH_AS_POSSIBLE,
ECHO_TO_CONSOLE,
};
class BASE_EXPORT TraceConfig {
public:
using StringList = std::vector<std::string>;
struct BASE_EXPORT MemoryDumpConfig {
MemoryDumpConfig();
MemoryDumpConfig(const MemoryDumpConfig& other);
~MemoryDumpConfig();
struct Trigger {
friend bool operator==(const Trigger&, const Trigger&) = default;
uint32_t min_time_between_dumps_ms;
MemoryDumpLevelOfDetail level_of_detail;
MemoryDumpType trigger_type;
};
struct HeapProfiler {
enum { kDefaultBreakdownThresholdBytes = 1024 };
HeapProfiler();
void Clear();
friend bool operator==(const HeapProfiler&,
const HeapProfiler&) = default;
uint32_t breakdown_threshold_bytes;
};
friend bool operator==(const MemoryDumpConfig&,
const MemoryDumpConfig&) = default;
void Clear();
void Merge(const MemoryDumpConfig& config);
std::set<MemoryDumpLevelOfDetail> allowed_dump_modes;
std::vector<Trigger> triggers;
HeapProfiler heap_profiler_options;
};
class BASE_EXPORT ProcessFilterConfig {
public:
ProcessFilterConfig();
explicit ProcessFilterConfig(
const std::unordered_set<base::ProcessId>& included_process_ids);
ProcessFilterConfig(const ProcessFilterConfig&);
~ProcessFilterConfig();
bool empty() const { return included_process_ids_.empty(); }
void Clear();
void Merge(const ProcessFilterConfig&);
void InitializeFromConfigDict(const Value::Dict&);
void ToDict(Value::Dict& dict) const;
bool IsEnabled(base::ProcessId) const;
const std::unordered_set<base::ProcessId>& included_process_ids() const {
return included_process_ids_;
}
friend bool operator==(const ProcessFilterConfig&,
const ProcessFilterConfig&) = default;
private:
std::unordered_set<base::ProcessId> included_process_ids_;
};
class BASE_EXPORT EventFilterConfig {
public:
explicit EventFilterConfig(const std::string& predicate_name);
EventFilterConfig(const EventFilterConfig& tc);
~EventFilterConfig();
EventFilterConfig& operator=(const EventFilterConfig& rhs);
bool IsEquivalentTo(const EventFilterConfig& other) const;
void InitializeFromConfigDict(const Value::Dict& event_filter);
void SetCategoryFilter(const TraceConfigCategoryFilter& category_filter);
void ToDict(Value::Dict& filter_dict) const;
bool GetArgAsSet(const char* key, std::unordered_set<std::string>*) const;
bool IsCategoryGroupEnabled(std::string_view category_group_name) const;
const std::string& predicate_name() const LIFETIME_BOUND {
return predicate_name_;
}
const Value::Dict& filter_args() const LIFETIME_BOUND { return args_; }
const TraceConfigCategoryFilter& category_filter() const LIFETIME_BOUND {
return category_filter_;
}
private:
std::string predicate_name_;
TraceConfigCategoryFilter category_filter_;
Value::Dict args_;
};
typedef std::vector<EventFilterConfig> EventFilters;
static std::string TraceRecordModeToStr(TraceRecordMode record_mode);
TraceConfig();
TraceConfig(std::string_view category_filter_string,
std::string_view trace_options_string);
TraceConfig(std::string_view category_filter_string,
TraceRecordMode record_mode);
explicit TraceConfig(std::string_view config_string);
explicit TraceConfig(const Value::Dict& config);
TraceConfig(const TraceConfig& tc);
~TraceConfig();
TraceConfig& operator=(const TraceConfig& rhs);
bool IsEquivalentTo(const TraceConfig& other) const;
TraceRecordMode GetTraceRecordMode() const { return record_mode_; }
size_t GetTraceBufferSizeInEvents() const {
return trace_buffer_size_in_events_;
}
ByteCount GetTraceBufferSizeInBytes() const {
return trace_buffer_size_in_bytes_;
}
bool IsSystraceEnabled() const { return enable_systrace_; }
bool IsArgumentFilterEnabled() const { return enable_argument_filter_; }
void SetTraceRecordMode(TraceRecordMode mode) { record_mode_ = mode; }
void SetTraceBufferSizeInEvents(size_t size) {
trace_buffer_size_in_events_ = size;
}
void SetTraceBufferSizeInBytes(ByteCount bytes) {
trace_buffer_size_in_bytes_ = bytes;
}
void EnableSystrace() { enable_systrace_ = true; }
void EnableSystraceEvent(const std::string& systrace_event);
void EnableArgumentFilter() { enable_argument_filter_ = true; }
void EnableHistogram(const std::string& histogram_name);
std::string ToString() const;
std::unique_ptr<ConvertableToTraceFormat> AsConvertableToTraceFormat() const;
std::string ToCategoryFilterString() const;
std::string ToTraceOptionsString() const;
std::string ToPerfettoTrackEventConfigRaw(
bool privacy_filtering_enabled) const;
bool IsCategoryGroupEnabled(std::string_view category_group_name) const;
void Merge(const TraceConfig& config);
void Clear();
void ResetMemoryDumpConfig(const MemoryDumpConfig& memory_dump_config);
const TraceConfigCategoryFilter& category_filter() const LIFETIME_BOUND {
return category_filter_;
}
const MemoryDumpConfig& memory_dump_config() const LIFETIME_BOUND {
return memory_dump_config_;
}
const ProcessFilterConfig& process_filter_config() const LIFETIME_BOUND {
return process_filter_config_;
}
void SetProcessFilterConfig(const ProcessFilterConfig&);
const EventFilters& event_filters() const LIFETIME_BOUND {
return event_filters_;
}
void SetEventFilters(const EventFilters& filter_configs) {
event_filters_ = filter_configs;
}
bool IsEventPackageNameFilterEnabled() const {
return enable_event_package_name_filter_;
}
void SetEventPackageNameFilterEnabled(bool enabled) {
enable_event_package_name_filter_ = enabled;
}
const std::unordered_set<std::string>& systrace_events() const {
return systrace_events_;
}
const std::unordered_set<std::string>& histogram_names() const {
return histogram_names_;
}
private:
FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, TraceConfigFromValidLegacyFormat);
FRIEND_TEST_ALL_PREFIXES(TraceConfigTest,
TraceConfigFromInvalidLegacyStrings);
FRIEND_TEST_ALL_PREFIXES(TraceConfigTest, SystraceEventsSerialization);
void InitializeDefault();
void InitializeFromConfigDict(const Value::Dict& dict);
void InitializeFromConfigString(std::string_view config_string);
void InitializeFromStrings(std::string_view category_filter_string,
std::string_view trace_options_string);
void SetMemoryDumpConfigFromConfigDict(const Value::Dict& memory_dump_config);
void SetDefaultMemoryDumpConfig();
void SetHistogramNamesFromConfigList(const Value::List& histogram_names);
void SetEventFiltersFromConfigList(const Value::List& event_filters);
Value ToValue() const;
TraceRecordMode record_mode_;
size_t trace_buffer_size_in_events_ = 0;
ByteCount trace_buffer_size_in_bytes_;
bool enable_systrace_ : 1;
bool enable_argument_filter_ : 1;
TraceConfigCategoryFilter category_filter_;
MemoryDumpConfig memory_dump_config_;
ProcessFilterConfig process_filter_config_;
EventFilters event_filters_;
bool enable_event_package_name_filter_ : 1;
std::unordered_set<std::string> histogram_names_;
std::unordered_set<std::string> systrace_events_;
};
}
#endif