xref: /aosp_15_r20/external/cronet/base/trace_event/trace_config.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2015 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/trace_config.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <stddef.h>
8*6777b538SAndroid Build Coastguard Worker 
9*6777b538SAndroid Build Coastguard Worker #include <algorithm>
10*6777b538SAndroid Build Coastguard Worker #include <optional>
11*6777b538SAndroid Build Coastguard Worker #include <string_view>
12*6777b538SAndroid Build Coastguard Worker #include <utility>
13*6777b538SAndroid Build Coastguard Worker 
14*6777b538SAndroid Build Coastguard Worker #include "base/containers/contains.h"
15*6777b538SAndroid Build Coastguard Worker #include "base/json/json_reader.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/json/json_writer.h"
17*6777b538SAndroid Build Coastguard Worker #include "base/logging.h"
18*6777b538SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
19*6777b538SAndroid Build Coastguard Worker #include "base/notreached.h"
20*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_split.h"
21*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/memory_dump_manager.h"
22*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/memory_dump_request_args.h"
23*6777b538SAndroid Build Coastguard Worker #include "base/trace_event/trace_event.h"
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
26*6777b538SAndroid Build Coastguard Worker #include "third_party/perfetto/protos/perfetto/config/track_event/track_event_config.gen.h"  // nogncheck
27*6777b538SAndroid Build Coastguard Worker #endif
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker namespace base::trace_event {
30*6777b538SAndroid Build Coastguard Worker 
31*6777b538SAndroid Build Coastguard Worker namespace {
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker // String options that can be used to initialize TraceOptions.
34*6777b538SAndroid Build Coastguard Worker const char kRecordUntilFull[] = "record-until-full";
35*6777b538SAndroid Build Coastguard Worker const char kRecordContinuously[] = "record-continuously";
36*6777b538SAndroid Build Coastguard Worker const char kRecordAsMuchAsPossible[] = "record-as-much-as-possible";
37*6777b538SAndroid Build Coastguard Worker const char kTraceToConsole[] = "trace-to-console";
38*6777b538SAndroid Build Coastguard Worker const char kEnableSystrace[] = "enable-systrace";
39*6777b538SAndroid Build Coastguard Worker constexpr int kEnableSystraceLength = sizeof(kEnableSystrace) - 1;
40*6777b538SAndroid Build Coastguard Worker 
41*6777b538SAndroid Build Coastguard Worker const char kEnableArgumentFilter[] = "enable-argument-filter";
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker // String parameters that can be used to parse the trace config string.
44*6777b538SAndroid Build Coastguard Worker const char kRecordModeParam[] = "record_mode";
45*6777b538SAndroid Build Coastguard Worker const char kTraceBufferSizeInEvents[] = "trace_buffer_size_in_events";
46*6777b538SAndroid Build Coastguard Worker const char kTraceBufferSizeInKb[] = "trace_buffer_size_in_kb";
47*6777b538SAndroid Build Coastguard Worker const char kEnableSystraceParam[] = "enable_systrace";
48*6777b538SAndroid Build Coastguard Worker const char kSystraceEventsParam[] = "enable_systrace_events";
49*6777b538SAndroid Build Coastguard Worker const char kEnableArgumentFilterParam[] = "enable_argument_filter";
50*6777b538SAndroid Build Coastguard Worker const char kEnableEventPackageNameFilterParam[] = "enable_package_name_filter";
51*6777b538SAndroid Build Coastguard Worker 
52*6777b538SAndroid Build Coastguard Worker // String parameters that is used to parse memory dump config in trace config
53*6777b538SAndroid Build Coastguard Worker // string.
54*6777b538SAndroid Build Coastguard Worker const char kMemoryDumpConfigParam[] = "memory_dump_config";
55*6777b538SAndroid Build Coastguard Worker const char kAllowedDumpModesParam[] = "allowed_dump_modes";
56*6777b538SAndroid Build Coastguard Worker const char kTriggersParam[] = "triggers";
57*6777b538SAndroid Build Coastguard Worker const char kTriggerModeParam[] = "mode";
58*6777b538SAndroid Build Coastguard Worker const char kMinTimeBetweenDumps[] = "min_time_between_dumps_ms";
59*6777b538SAndroid Build Coastguard Worker const char kTriggerTypeParam[] = "type";
60*6777b538SAndroid Build Coastguard Worker const char kPeriodicIntervalLegacyParam[] = "periodic_interval_ms";
61*6777b538SAndroid Build Coastguard Worker const char kHeapProfilerOptions[] = "heap_profiler_options";
62*6777b538SAndroid Build Coastguard Worker const char kBreakdownThresholdBytes[] = "breakdown_threshold_bytes";
63*6777b538SAndroid Build Coastguard Worker 
64*6777b538SAndroid Build Coastguard Worker // String parameters used to parse category event filters.
65*6777b538SAndroid Build Coastguard Worker const char kEventFiltersParam[] = "event_filters";
66*6777b538SAndroid Build Coastguard Worker const char kFilterPredicateParam[] = "filter_predicate";
67*6777b538SAndroid Build Coastguard Worker const char kFilterArgsParam[] = "filter_args";
68*6777b538SAndroid Build Coastguard Worker 
69*6777b538SAndroid Build Coastguard Worker // String parameter used to parse process filter.
70*6777b538SAndroid Build Coastguard Worker const char kIncludedProcessesParam[] = "included_process_ids";
71*6777b538SAndroid Build Coastguard Worker 
72*6777b538SAndroid Build Coastguard Worker const char kHistogramNamesParam[] = "histogram_names";
73*6777b538SAndroid Build Coastguard Worker 
74*6777b538SAndroid Build Coastguard Worker class ConvertableTraceConfigToTraceFormat
75*6777b538SAndroid Build Coastguard Worker     : public base::trace_event::ConvertableToTraceFormat {
76*6777b538SAndroid Build Coastguard Worker  public:
ConvertableTraceConfigToTraceFormat(const TraceConfig & trace_config)77*6777b538SAndroid Build Coastguard Worker   explicit ConvertableTraceConfigToTraceFormat(const TraceConfig& trace_config)
78*6777b538SAndroid Build Coastguard Worker       : trace_config_(trace_config) {}
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker   ~ConvertableTraceConfigToTraceFormat() override = default;
81*6777b538SAndroid Build Coastguard Worker 
AppendAsTraceFormat(std::string * out) const82*6777b538SAndroid Build Coastguard Worker   void AppendAsTraceFormat(std::string* out) const override {
83*6777b538SAndroid Build Coastguard Worker     out->append(trace_config_.ToString());
84*6777b538SAndroid Build Coastguard Worker   }
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker  private:
87*6777b538SAndroid Build Coastguard Worker   const TraceConfig trace_config_;
88*6777b538SAndroid Build Coastguard Worker };
89*6777b538SAndroid Build Coastguard Worker 
GetDefaultAllowedMemoryDumpModes()90*6777b538SAndroid Build Coastguard Worker std::set<MemoryDumpLevelOfDetail> GetDefaultAllowedMemoryDumpModes() {
91*6777b538SAndroid Build Coastguard Worker   std::set<MemoryDumpLevelOfDetail> all_modes;
92*6777b538SAndroid Build Coastguard Worker   for (uint32_t mode = static_cast<uint32_t>(MemoryDumpLevelOfDetail::kFirst);
93*6777b538SAndroid Build Coastguard Worker        mode <= static_cast<uint32_t>(MemoryDumpLevelOfDetail::kLast); mode++) {
94*6777b538SAndroid Build Coastguard Worker     all_modes.insert(static_cast<MemoryDumpLevelOfDetail>(mode));
95*6777b538SAndroid Build Coastguard Worker   }
96*6777b538SAndroid Build Coastguard Worker   return all_modes;
97*6777b538SAndroid Build Coastguard Worker }
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker }  // namespace
100*6777b538SAndroid Build Coastguard Worker 
HeapProfiler()101*6777b538SAndroid Build Coastguard Worker TraceConfig::MemoryDumpConfig::HeapProfiler::HeapProfiler()
102*6777b538SAndroid Build Coastguard Worker     : breakdown_threshold_bytes(kDefaultBreakdownThresholdBytes) {}
103*6777b538SAndroid Build Coastguard Worker 
Clear()104*6777b538SAndroid Build Coastguard Worker void TraceConfig::MemoryDumpConfig::HeapProfiler::Clear() {
105*6777b538SAndroid Build Coastguard Worker   breakdown_threshold_bytes = kDefaultBreakdownThresholdBytes;
106*6777b538SAndroid Build Coastguard Worker }
107*6777b538SAndroid Build Coastguard Worker 
ResetMemoryDumpConfig(const TraceConfig::MemoryDumpConfig & memory_dump_config)108*6777b538SAndroid Build Coastguard Worker void TraceConfig::ResetMemoryDumpConfig(
109*6777b538SAndroid Build Coastguard Worker     const TraceConfig::MemoryDumpConfig& memory_dump_config) {
110*6777b538SAndroid Build Coastguard Worker   memory_dump_config_.Clear();
111*6777b538SAndroid Build Coastguard Worker   memory_dump_config_ = memory_dump_config;
112*6777b538SAndroid Build Coastguard Worker }
113*6777b538SAndroid Build Coastguard Worker 
114*6777b538SAndroid Build Coastguard Worker TraceConfig::MemoryDumpConfig::MemoryDumpConfig() = default;
115*6777b538SAndroid Build Coastguard Worker 
116*6777b538SAndroid Build Coastguard Worker TraceConfig::MemoryDumpConfig::MemoryDumpConfig(
117*6777b538SAndroid Build Coastguard Worker     const MemoryDumpConfig& other) = default;
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker TraceConfig::MemoryDumpConfig::~MemoryDumpConfig() = default;
120*6777b538SAndroid Build Coastguard Worker 
Clear()121*6777b538SAndroid Build Coastguard Worker void TraceConfig::MemoryDumpConfig::Clear() {
122*6777b538SAndroid Build Coastguard Worker   allowed_dump_modes.clear();
123*6777b538SAndroid Build Coastguard Worker   triggers.clear();
124*6777b538SAndroid Build Coastguard Worker   heap_profiler_options.Clear();
125*6777b538SAndroid Build Coastguard Worker }
126*6777b538SAndroid Build Coastguard Worker 
Merge(const TraceConfig::MemoryDumpConfig & config)127*6777b538SAndroid Build Coastguard Worker void TraceConfig::MemoryDumpConfig::Merge(
128*6777b538SAndroid Build Coastguard Worker     const TraceConfig::MemoryDumpConfig& config) {
129*6777b538SAndroid Build Coastguard Worker   triggers.insert(triggers.end(), config.triggers.begin(),
130*6777b538SAndroid Build Coastguard Worker                   config.triggers.end());
131*6777b538SAndroid Build Coastguard Worker   allowed_dump_modes.insert(config.allowed_dump_modes.begin(),
132*6777b538SAndroid Build Coastguard Worker                             config.allowed_dump_modes.end());
133*6777b538SAndroid Build Coastguard Worker   heap_profiler_options.breakdown_threshold_bytes =
134*6777b538SAndroid Build Coastguard Worker       std::min(heap_profiler_options.breakdown_threshold_bytes,
135*6777b538SAndroid Build Coastguard Worker                config.heap_profiler_options.breakdown_threshold_bytes);
136*6777b538SAndroid Build Coastguard Worker }
137*6777b538SAndroid Build Coastguard Worker 
138*6777b538SAndroid Build Coastguard Worker TraceConfig::ProcessFilterConfig::ProcessFilterConfig() = default;
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker TraceConfig::ProcessFilterConfig::ProcessFilterConfig(
141*6777b538SAndroid Build Coastguard Worker     const ProcessFilterConfig& other) = default;
142*6777b538SAndroid Build Coastguard Worker 
ProcessFilterConfig(const std::unordered_set<base::ProcessId> & included_process_ids)143*6777b538SAndroid Build Coastguard Worker TraceConfig::ProcessFilterConfig::ProcessFilterConfig(
144*6777b538SAndroid Build Coastguard Worker     const std::unordered_set<base::ProcessId>& included_process_ids)
145*6777b538SAndroid Build Coastguard Worker     : included_process_ids_(included_process_ids) {}
146*6777b538SAndroid Build Coastguard Worker 
147*6777b538SAndroid Build Coastguard Worker TraceConfig::ProcessFilterConfig::~ProcessFilterConfig() = default;
148*6777b538SAndroid Build Coastguard Worker 
Clear()149*6777b538SAndroid Build Coastguard Worker void TraceConfig::ProcessFilterConfig::Clear() {
150*6777b538SAndroid Build Coastguard Worker   included_process_ids_.clear();
151*6777b538SAndroid Build Coastguard Worker }
152*6777b538SAndroid Build Coastguard Worker 
Merge(const ProcessFilterConfig & config)153*6777b538SAndroid Build Coastguard Worker void TraceConfig::ProcessFilterConfig::Merge(
154*6777b538SAndroid Build Coastguard Worker     const ProcessFilterConfig& config) {
155*6777b538SAndroid Build Coastguard Worker   included_process_ids_.insert(config.included_process_ids_.begin(),
156*6777b538SAndroid Build Coastguard Worker                                config.included_process_ids_.end());
157*6777b538SAndroid Build Coastguard Worker }
158*6777b538SAndroid Build Coastguard Worker 
InitializeFromConfigDict(const Value::Dict & dict)159*6777b538SAndroid Build Coastguard Worker void TraceConfig::ProcessFilterConfig::InitializeFromConfigDict(
160*6777b538SAndroid Build Coastguard Worker     const Value::Dict& dict) {
161*6777b538SAndroid Build Coastguard Worker   included_process_ids_.clear();
162*6777b538SAndroid Build Coastguard Worker   const Value::List* value = dict.FindList(kIncludedProcessesParam);
163*6777b538SAndroid Build Coastguard Worker   if (!value)
164*6777b538SAndroid Build Coastguard Worker     return;
165*6777b538SAndroid Build Coastguard Worker   for (auto& pid_value : *value) {
166*6777b538SAndroid Build Coastguard Worker     if (pid_value.is_int()) {
167*6777b538SAndroid Build Coastguard Worker       included_process_ids_.insert(
168*6777b538SAndroid Build Coastguard Worker           static_cast<base::ProcessId>(pid_value.GetInt()));
169*6777b538SAndroid Build Coastguard Worker     }
170*6777b538SAndroid Build Coastguard Worker   }
171*6777b538SAndroid Build Coastguard Worker }
172*6777b538SAndroid Build Coastguard Worker 
ToDict(Value::Dict & dict) const173*6777b538SAndroid Build Coastguard Worker void TraceConfig::ProcessFilterConfig::ToDict(Value::Dict& dict) const {
174*6777b538SAndroid Build Coastguard Worker   if (included_process_ids_.empty())
175*6777b538SAndroid Build Coastguard Worker     return;
176*6777b538SAndroid Build Coastguard Worker   base::Value::List list;
177*6777b538SAndroid Build Coastguard Worker   std::set<base::ProcessId> ordered_set(included_process_ids_.begin(),
178*6777b538SAndroid Build Coastguard Worker                                         included_process_ids_.end());
179*6777b538SAndroid Build Coastguard Worker   for (auto process_id : ordered_set)
180*6777b538SAndroid Build Coastguard Worker     list.Append(static_cast<int>(process_id));
181*6777b538SAndroid Build Coastguard Worker   dict.Set(kIncludedProcessesParam, std::move(list));
182*6777b538SAndroid Build Coastguard Worker }
183*6777b538SAndroid Build Coastguard Worker 
IsEnabled(base::ProcessId process_id) const184*6777b538SAndroid Build Coastguard Worker bool TraceConfig::ProcessFilterConfig::IsEnabled(
185*6777b538SAndroid Build Coastguard Worker     base::ProcessId process_id) const {
186*6777b538SAndroid Build Coastguard Worker   return included_process_ids_.empty() ||
187*6777b538SAndroid Build Coastguard Worker          included_process_ids_.count(process_id);
188*6777b538SAndroid Build Coastguard Worker }
189*6777b538SAndroid Build Coastguard Worker 
EventFilterConfig(const std::string & predicate_name)190*6777b538SAndroid Build Coastguard Worker TraceConfig::EventFilterConfig::EventFilterConfig(
191*6777b538SAndroid Build Coastguard Worker     const std::string& predicate_name)
192*6777b538SAndroid Build Coastguard Worker     : predicate_name_(predicate_name) {}
193*6777b538SAndroid Build Coastguard Worker 
194*6777b538SAndroid Build Coastguard Worker TraceConfig::EventFilterConfig::~EventFilterConfig() = default;
195*6777b538SAndroid Build Coastguard Worker 
EventFilterConfig(const EventFilterConfig & tc)196*6777b538SAndroid Build Coastguard Worker TraceConfig::EventFilterConfig::EventFilterConfig(const EventFilterConfig& tc) {
197*6777b538SAndroid Build Coastguard Worker   *this = tc;
198*6777b538SAndroid Build Coastguard Worker }
199*6777b538SAndroid Build Coastguard Worker 
operator =(const TraceConfig::EventFilterConfig & rhs)200*6777b538SAndroid Build Coastguard Worker TraceConfig::EventFilterConfig& TraceConfig::EventFilterConfig::operator=(
201*6777b538SAndroid Build Coastguard Worker     const TraceConfig::EventFilterConfig& rhs) {
202*6777b538SAndroid Build Coastguard Worker   if (this == &rhs)
203*6777b538SAndroid Build Coastguard Worker     return *this;
204*6777b538SAndroid Build Coastguard Worker 
205*6777b538SAndroid Build Coastguard Worker   predicate_name_ = rhs.predicate_name_;
206*6777b538SAndroid Build Coastguard Worker   category_filter_ = rhs.category_filter_;
207*6777b538SAndroid Build Coastguard Worker 
208*6777b538SAndroid Build Coastguard Worker   args_ = rhs.args_.Clone();
209*6777b538SAndroid Build Coastguard Worker 
210*6777b538SAndroid Build Coastguard Worker   return *this;
211*6777b538SAndroid Build Coastguard Worker }
212*6777b538SAndroid Build Coastguard Worker 
IsEquivalentTo(const EventFilterConfig & other) const213*6777b538SAndroid Build Coastguard Worker bool TraceConfig::EventFilterConfig::IsEquivalentTo(
214*6777b538SAndroid Build Coastguard Worker     const EventFilterConfig& other) const {
215*6777b538SAndroid Build Coastguard Worker   return predicate_name_ == other.predicate_name_ &&
216*6777b538SAndroid Build Coastguard Worker          category_filter_.IsEquivalentTo(category_filter_) &&
217*6777b538SAndroid Build Coastguard Worker          args_ == other.args_;
218*6777b538SAndroid Build Coastguard Worker }
219*6777b538SAndroid Build Coastguard Worker 
InitializeFromConfigDict(const Value::Dict & event_filter)220*6777b538SAndroid Build Coastguard Worker void TraceConfig::EventFilterConfig::InitializeFromConfigDict(
221*6777b538SAndroid Build Coastguard Worker     const Value::Dict& event_filter) {
222*6777b538SAndroid Build Coastguard Worker   category_filter_.InitializeFromConfigDict(event_filter);
223*6777b538SAndroid Build Coastguard Worker 
224*6777b538SAndroid Build Coastguard Worker   const Value::Dict* args_dict = event_filter.FindDict(kFilterArgsParam);
225*6777b538SAndroid Build Coastguard Worker   if (args_dict)
226*6777b538SAndroid Build Coastguard Worker     args_ = args_dict->Clone();
227*6777b538SAndroid Build Coastguard Worker }
228*6777b538SAndroid Build Coastguard Worker 
SetCategoryFilter(const TraceConfigCategoryFilter & category_filter)229*6777b538SAndroid Build Coastguard Worker void TraceConfig::EventFilterConfig::SetCategoryFilter(
230*6777b538SAndroid Build Coastguard Worker     const TraceConfigCategoryFilter& category_filter) {
231*6777b538SAndroid Build Coastguard Worker   category_filter_ = category_filter;
232*6777b538SAndroid Build Coastguard Worker }
233*6777b538SAndroid Build Coastguard Worker 
ToDict(Value::Dict & filter_dict) const234*6777b538SAndroid Build Coastguard Worker void TraceConfig::EventFilterConfig::ToDict(Value::Dict& filter_dict) const {
235*6777b538SAndroid Build Coastguard Worker   filter_dict.Set(kFilterPredicateParam, predicate_name());
236*6777b538SAndroid Build Coastguard Worker 
237*6777b538SAndroid Build Coastguard Worker   category_filter_.ToDict(filter_dict);
238*6777b538SAndroid Build Coastguard Worker 
239*6777b538SAndroid Build Coastguard Worker   if (!args_.empty()) {
240*6777b538SAndroid Build Coastguard Worker     filter_dict.Set(kFilterArgsParam, args_.Clone());
241*6777b538SAndroid Build Coastguard Worker   }
242*6777b538SAndroid Build Coastguard Worker }
243*6777b538SAndroid Build Coastguard Worker 
GetArgAsSet(const char * key,std::unordered_set<std::string> * out_set) const244*6777b538SAndroid Build Coastguard Worker bool TraceConfig::EventFilterConfig::GetArgAsSet(
245*6777b538SAndroid Build Coastguard Worker     const char* key,
246*6777b538SAndroid Build Coastguard Worker     std::unordered_set<std::string>* out_set) const {
247*6777b538SAndroid Build Coastguard Worker   const Value::List* list = args_.FindList(key);
248*6777b538SAndroid Build Coastguard Worker   if (!list)
249*6777b538SAndroid Build Coastguard Worker     return false;
250*6777b538SAndroid Build Coastguard Worker   for (const Value& item : *list) {
251*6777b538SAndroid Build Coastguard Worker     if (item.is_string())
252*6777b538SAndroid Build Coastguard Worker       out_set->insert(item.GetString());
253*6777b538SAndroid Build Coastguard Worker   }
254*6777b538SAndroid Build Coastguard Worker   return true;
255*6777b538SAndroid Build Coastguard Worker }
256*6777b538SAndroid Build Coastguard Worker 
IsCategoryGroupEnabled(std::string_view category_group_name) const257*6777b538SAndroid Build Coastguard Worker bool TraceConfig::EventFilterConfig::IsCategoryGroupEnabled(
258*6777b538SAndroid Build Coastguard Worker     std::string_view category_group_name) const {
259*6777b538SAndroid Build Coastguard Worker   return category_filter_.IsCategoryGroupEnabled(category_group_name);
260*6777b538SAndroid Build Coastguard Worker }
261*6777b538SAndroid Build Coastguard Worker 
262*6777b538SAndroid Build Coastguard Worker // static
TraceRecordModeToStr(TraceRecordMode record_mode)263*6777b538SAndroid Build Coastguard Worker std::string TraceConfig::TraceRecordModeToStr(TraceRecordMode record_mode) {
264*6777b538SAndroid Build Coastguard Worker   switch (record_mode) {
265*6777b538SAndroid Build Coastguard Worker     case RECORD_UNTIL_FULL:
266*6777b538SAndroid Build Coastguard Worker       return kRecordUntilFull;
267*6777b538SAndroid Build Coastguard Worker     case RECORD_CONTINUOUSLY:
268*6777b538SAndroid Build Coastguard Worker       return kRecordContinuously;
269*6777b538SAndroid Build Coastguard Worker     case RECORD_AS_MUCH_AS_POSSIBLE:
270*6777b538SAndroid Build Coastguard Worker       return kRecordAsMuchAsPossible;
271*6777b538SAndroid Build Coastguard Worker     case ECHO_TO_CONSOLE:
272*6777b538SAndroid Build Coastguard Worker       return kTraceToConsole;
273*6777b538SAndroid Build Coastguard Worker   }
274*6777b538SAndroid Build Coastguard Worker   return kRecordUntilFull;
275*6777b538SAndroid Build Coastguard Worker }
276*6777b538SAndroid Build Coastguard Worker 
TraceConfig()277*6777b538SAndroid Build Coastguard Worker TraceConfig::TraceConfig() {
278*6777b538SAndroid Build Coastguard Worker   InitializeDefault();
279*6777b538SAndroid Build Coastguard Worker }
280*6777b538SAndroid Build Coastguard Worker 
TraceConfig(std::string_view category_filter_string,std::string_view trace_options_string)281*6777b538SAndroid Build Coastguard Worker TraceConfig::TraceConfig(std::string_view category_filter_string,
282*6777b538SAndroid Build Coastguard Worker                          std::string_view trace_options_string) {
283*6777b538SAndroid Build Coastguard Worker   InitializeFromStrings(category_filter_string, trace_options_string);
284*6777b538SAndroid Build Coastguard Worker }
285*6777b538SAndroid Build Coastguard Worker 
TraceConfig(std::string_view category_filter_string,TraceRecordMode record_mode)286*6777b538SAndroid Build Coastguard Worker TraceConfig::TraceConfig(std::string_view category_filter_string,
287*6777b538SAndroid Build Coastguard Worker                          TraceRecordMode record_mode) {
288*6777b538SAndroid Build Coastguard Worker   InitializeFromStrings(category_filter_string,
289*6777b538SAndroid Build Coastguard Worker                         TraceConfig::TraceRecordModeToStr(record_mode));
290*6777b538SAndroid Build Coastguard Worker }
291*6777b538SAndroid Build Coastguard Worker 
TraceConfig(const Value::Dict & config)292*6777b538SAndroid Build Coastguard Worker TraceConfig::TraceConfig(const Value::Dict& config) {
293*6777b538SAndroid Build Coastguard Worker   InitializeFromConfigDict(config);
294*6777b538SAndroid Build Coastguard Worker }
295*6777b538SAndroid Build Coastguard Worker 
TraceConfig(std::string_view config_string)296*6777b538SAndroid Build Coastguard Worker TraceConfig::TraceConfig(std::string_view config_string) {
297*6777b538SAndroid Build Coastguard Worker   if (!config_string.empty())
298*6777b538SAndroid Build Coastguard Worker     InitializeFromConfigString(config_string);
299*6777b538SAndroid Build Coastguard Worker   else
300*6777b538SAndroid Build Coastguard Worker     InitializeDefault();
301*6777b538SAndroid Build Coastguard Worker }
302*6777b538SAndroid Build Coastguard Worker 
303*6777b538SAndroid Build Coastguard Worker TraceConfig::TraceConfig(const TraceConfig& tc) = default;
304*6777b538SAndroid Build Coastguard Worker 
305*6777b538SAndroid Build Coastguard Worker TraceConfig::~TraceConfig() = default;
306*6777b538SAndroid Build Coastguard Worker 
operator =(const TraceConfig & rhs)307*6777b538SAndroid Build Coastguard Worker TraceConfig& TraceConfig::operator=(const TraceConfig& rhs) {
308*6777b538SAndroid Build Coastguard Worker   if (this == &rhs)
309*6777b538SAndroid Build Coastguard Worker     return *this;
310*6777b538SAndroid Build Coastguard Worker 
311*6777b538SAndroid Build Coastguard Worker   record_mode_ = rhs.record_mode_;
312*6777b538SAndroid Build Coastguard Worker   trace_buffer_size_in_events_ = rhs.trace_buffer_size_in_events_;
313*6777b538SAndroid Build Coastguard Worker   trace_buffer_size_in_kb_ = rhs.trace_buffer_size_in_kb_;
314*6777b538SAndroid Build Coastguard Worker   enable_systrace_ = rhs.enable_systrace_;
315*6777b538SAndroid Build Coastguard Worker   enable_argument_filter_ = rhs.enable_argument_filter_;
316*6777b538SAndroid Build Coastguard Worker   category_filter_ = rhs.category_filter_;
317*6777b538SAndroid Build Coastguard Worker   process_filter_config_ = rhs.process_filter_config_;
318*6777b538SAndroid Build Coastguard Worker   enable_event_package_name_filter_ = rhs.enable_event_package_name_filter_;
319*6777b538SAndroid Build Coastguard Worker   memory_dump_config_ = rhs.memory_dump_config_;
320*6777b538SAndroid Build Coastguard Worker   event_filters_ = rhs.event_filters_;
321*6777b538SAndroid Build Coastguard Worker   histogram_names_ = rhs.histogram_names_;
322*6777b538SAndroid Build Coastguard Worker   systrace_events_ = rhs.systrace_events_;
323*6777b538SAndroid Build Coastguard Worker   return *this;
324*6777b538SAndroid Build Coastguard Worker }
325*6777b538SAndroid Build Coastguard Worker 
IsEquivalentTo(const TraceConfig & other) const326*6777b538SAndroid Build Coastguard Worker bool TraceConfig::IsEquivalentTo(const TraceConfig& other) const {
327*6777b538SAndroid Build Coastguard Worker   if (enable_systrace_ != other.enable_systrace_ ||
328*6777b538SAndroid Build Coastguard Worker       enable_argument_filter_ != other.enable_argument_filter_ ||
329*6777b538SAndroid Build Coastguard Worker       enable_event_package_name_filter_ !=
330*6777b538SAndroid Build Coastguard Worker           other.enable_event_package_name_filter_ ||
331*6777b538SAndroid Build Coastguard Worker       histogram_names_ != other.histogram_names_ ||
332*6777b538SAndroid Build Coastguard Worker       systrace_events_ != other.systrace_events_ ||
333*6777b538SAndroid Build Coastguard Worker       process_filter_config_ != other.process_filter_config_ ||
334*6777b538SAndroid Build Coastguard Worker       memory_dump_config_ != other.memory_dump_config_ ||
335*6777b538SAndroid Build Coastguard Worker       !category_filter_.IsEquivalentTo(other.category_filter_)) {
336*6777b538SAndroid Build Coastguard Worker     return false;
337*6777b538SAndroid Build Coastguard Worker   }
338*6777b538SAndroid Build Coastguard Worker 
339*6777b538SAndroid Build Coastguard Worker   if (event_filters_.size() != other.event_filters_.size()) {
340*6777b538SAndroid Build Coastguard Worker     return false;
341*6777b538SAndroid Build Coastguard Worker   }
342*6777b538SAndroid Build Coastguard Worker   for (const auto& filter : event_filters_) {
343*6777b538SAndroid Build Coastguard Worker     bool equivalent_found = false;
344*6777b538SAndroid Build Coastguard Worker     for (const auto& other_filter : other.event_filters_) {
345*6777b538SAndroid Build Coastguard Worker       if (other_filter.IsEquivalentTo(filter)) {
346*6777b538SAndroid Build Coastguard Worker         equivalent_found = true;
347*6777b538SAndroid Build Coastguard Worker         break;
348*6777b538SAndroid Build Coastguard Worker       }
349*6777b538SAndroid Build Coastguard Worker     }
350*6777b538SAndroid Build Coastguard Worker     if (!equivalent_found) {
351*6777b538SAndroid Build Coastguard Worker       return false;
352*6777b538SAndroid Build Coastguard Worker     }
353*6777b538SAndroid Build Coastguard Worker   }
354*6777b538SAndroid Build Coastguard Worker 
355*6777b538SAndroid Build Coastguard Worker   return true;
356*6777b538SAndroid Build Coastguard Worker }
357*6777b538SAndroid Build Coastguard Worker 
ToString() const358*6777b538SAndroid Build Coastguard Worker std::string TraceConfig::ToString() const {
359*6777b538SAndroid Build Coastguard Worker   Value dict = ToValue();
360*6777b538SAndroid Build Coastguard Worker   std::string json;
361*6777b538SAndroid Build Coastguard Worker   JSONWriter::Write(dict, &json);
362*6777b538SAndroid Build Coastguard Worker   return json;
363*6777b538SAndroid Build Coastguard Worker }
364*6777b538SAndroid Build Coastguard Worker 
365*6777b538SAndroid Build Coastguard Worker std::unique_ptr<ConvertableToTraceFormat>
AsConvertableToTraceFormat() const366*6777b538SAndroid Build Coastguard Worker TraceConfig::AsConvertableToTraceFormat() const {
367*6777b538SAndroid Build Coastguard Worker   return std::make_unique<ConvertableTraceConfigToTraceFormat>(*this);
368*6777b538SAndroid Build Coastguard Worker }
369*6777b538SAndroid Build Coastguard Worker 
ToCategoryFilterString() const370*6777b538SAndroid Build Coastguard Worker std::string TraceConfig::ToCategoryFilterString() const {
371*6777b538SAndroid Build Coastguard Worker   return category_filter_.ToFilterString();
372*6777b538SAndroid Build Coastguard Worker }
373*6777b538SAndroid Build Coastguard Worker 
IsCategoryGroupEnabled(std::string_view category_group_name) const374*6777b538SAndroid Build Coastguard Worker bool TraceConfig::IsCategoryGroupEnabled(
375*6777b538SAndroid Build Coastguard Worker     std::string_view category_group_name) const {
376*6777b538SAndroid Build Coastguard Worker   // TraceLog should call this method only as part of enabling/disabling
377*6777b538SAndroid Build Coastguard Worker   // categories.
378*6777b538SAndroid Build Coastguard Worker   return category_filter_.IsCategoryGroupEnabled(category_group_name);
379*6777b538SAndroid Build Coastguard Worker }
380*6777b538SAndroid Build Coastguard Worker 
Merge(const TraceConfig & config)381*6777b538SAndroid Build Coastguard Worker void TraceConfig::Merge(const TraceConfig& config) {
382*6777b538SAndroid Build Coastguard Worker   if (record_mode_ != config.record_mode_ ||
383*6777b538SAndroid Build Coastguard Worker       enable_systrace_ != config.enable_systrace_ ||
384*6777b538SAndroid Build Coastguard Worker       enable_argument_filter_ != config.enable_argument_filter_ ||
385*6777b538SAndroid Build Coastguard Worker       enable_event_package_name_filter_ !=
386*6777b538SAndroid Build Coastguard Worker           config.enable_event_package_name_filter_) {
387*6777b538SAndroid Build Coastguard Worker     DLOG(ERROR) << "Attempting to merge trace config with a different "
388*6777b538SAndroid Build Coastguard Worker                 << "set of options.";
389*6777b538SAndroid Build Coastguard Worker   }
390*6777b538SAndroid Build Coastguard Worker   DCHECK_EQ(trace_buffer_size_in_events_, config.trace_buffer_size_in_events_)
391*6777b538SAndroid Build Coastguard Worker       << "Cannot change trace buffer size";
392*6777b538SAndroid Build Coastguard Worker 
393*6777b538SAndroid Build Coastguard Worker   category_filter_.Merge(config.category_filter_);
394*6777b538SAndroid Build Coastguard Worker   memory_dump_config_.Merge(config.memory_dump_config_);
395*6777b538SAndroid Build Coastguard Worker   process_filter_config_.Merge(config.process_filter_config_);
396*6777b538SAndroid Build Coastguard Worker 
397*6777b538SAndroid Build Coastguard Worker   event_filters_.insert(event_filters_.end(), config.event_filters().begin(),
398*6777b538SAndroid Build Coastguard Worker                         config.event_filters().end());
399*6777b538SAndroid Build Coastguard Worker   histogram_names_.insert(config.histogram_names().begin(),
400*6777b538SAndroid Build Coastguard Worker                           config.histogram_names().end());
401*6777b538SAndroid Build Coastguard Worker }
402*6777b538SAndroid Build Coastguard Worker 
Clear()403*6777b538SAndroid Build Coastguard Worker void TraceConfig::Clear() {
404*6777b538SAndroid Build Coastguard Worker   record_mode_ = RECORD_UNTIL_FULL;
405*6777b538SAndroid Build Coastguard Worker   trace_buffer_size_in_events_ = 0;
406*6777b538SAndroid Build Coastguard Worker   trace_buffer_size_in_kb_ = 0;
407*6777b538SAndroid Build Coastguard Worker   enable_systrace_ = false;
408*6777b538SAndroid Build Coastguard Worker   enable_argument_filter_ = false;
409*6777b538SAndroid Build Coastguard Worker   enable_event_package_name_filter_ = false;
410*6777b538SAndroid Build Coastguard Worker   category_filter_.Clear();
411*6777b538SAndroid Build Coastguard Worker   memory_dump_config_.Clear();
412*6777b538SAndroid Build Coastguard Worker   process_filter_config_.Clear();
413*6777b538SAndroid Build Coastguard Worker   event_filters_.clear();
414*6777b538SAndroid Build Coastguard Worker   histogram_names_.clear();
415*6777b538SAndroid Build Coastguard Worker   systrace_events_.clear();
416*6777b538SAndroid Build Coastguard Worker }
417*6777b538SAndroid Build Coastguard Worker 
InitializeDefault()418*6777b538SAndroid Build Coastguard Worker void TraceConfig::InitializeDefault() {
419*6777b538SAndroid Build Coastguard Worker   record_mode_ = RECORD_UNTIL_FULL;
420*6777b538SAndroid Build Coastguard Worker   trace_buffer_size_in_events_ = 0;
421*6777b538SAndroid Build Coastguard Worker   trace_buffer_size_in_kb_ = 0;
422*6777b538SAndroid Build Coastguard Worker   enable_systrace_ = false;
423*6777b538SAndroid Build Coastguard Worker   enable_argument_filter_ = false;
424*6777b538SAndroid Build Coastguard Worker   enable_event_package_name_filter_ = false;
425*6777b538SAndroid Build Coastguard Worker }
426*6777b538SAndroid Build Coastguard Worker 
InitializeFromConfigDict(const Value::Dict & dict)427*6777b538SAndroid Build Coastguard Worker void TraceConfig::InitializeFromConfigDict(const Value::Dict& dict) {
428*6777b538SAndroid Build Coastguard Worker   record_mode_ = RECORD_UNTIL_FULL;
429*6777b538SAndroid Build Coastguard Worker   const std::string* record_mode = dict.FindString(kRecordModeParam);
430*6777b538SAndroid Build Coastguard Worker   if (record_mode) {
431*6777b538SAndroid Build Coastguard Worker     if (*record_mode == kRecordUntilFull) {
432*6777b538SAndroid Build Coastguard Worker       record_mode_ = RECORD_UNTIL_FULL;
433*6777b538SAndroid Build Coastguard Worker     } else if (*record_mode == kRecordContinuously) {
434*6777b538SAndroid Build Coastguard Worker       record_mode_ = RECORD_CONTINUOUSLY;
435*6777b538SAndroid Build Coastguard Worker     } else if (*record_mode == kTraceToConsole) {
436*6777b538SAndroid Build Coastguard Worker       record_mode_ = ECHO_TO_CONSOLE;
437*6777b538SAndroid Build Coastguard Worker     } else if (*record_mode == kRecordAsMuchAsPossible) {
438*6777b538SAndroid Build Coastguard Worker       record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE;
439*6777b538SAndroid Build Coastguard Worker     }
440*6777b538SAndroid Build Coastguard Worker   }
441*6777b538SAndroid Build Coastguard Worker   trace_buffer_size_in_events_ = base::saturated_cast<size_t>(
442*6777b538SAndroid Build Coastguard Worker       dict.FindInt(kTraceBufferSizeInEvents).value_or(0));
443*6777b538SAndroid Build Coastguard Worker   trace_buffer_size_in_kb_ = base::saturated_cast<size_t>(
444*6777b538SAndroid Build Coastguard Worker       dict.FindInt(kTraceBufferSizeInKb).value_or(0));
445*6777b538SAndroid Build Coastguard Worker 
446*6777b538SAndroid Build Coastguard Worker   enable_systrace_ = dict.FindBool(kEnableSystraceParam).value_or(false);
447*6777b538SAndroid Build Coastguard Worker   enable_argument_filter_ =
448*6777b538SAndroid Build Coastguard Worker       dict.FindBool(kEnableArgumentFilterParam).value_or(false);
449*6777b538SAndroid Build Coastguard Worker   enable_event_package_name_filter_ =
450*6777b538SAndroid Build Coastguard Worker       dict.FindBool(kEnableEventPackageNameFilterParam).value_or(false);
451*6777b538SAndroid Build Coastguard Worker 
452*6777b538SAndroid Build Coastguard Worker   category_filter_.InitializeFromConfigDict(dict);
453*6777b538SAndroid Build Coastguard Worker   process_filter_config_.InitializeFromConfigDict(dict);
454*6777b538SAndroid Build Coastguard Worker 
455*6777b538SAndroid Build Coastguard Worker   const Value::List* category_event_filters = dict.FindList(kEventFiltersParam);
456*6777b538SAndroid Build Coastguard Worker   if (category_event_filters)
457*6777b538SAndroid Build Coastguard Worker     SetEventFiltersFromConfigList(*category_event_filters);
458*6777b538SAndroid Build Coastguard Worker   const Value::List* histogram_names = dict.FindList(kHistogramNamesParam);
459*6777b538SAndroid Build Coastguard Worker   if (histogram_names)
460*6777b538SAndroid Build Coastguard Worker     SetHistogramNamesFromConfigList(*histogram_names);
461*6777b538SAndroid Build Coastguard Worker 
462*6777b538SAndroid Build Coastguard Worker   if (category_filter_.IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
463*6777b538SAndroid Build Coastguard Worker     // If dump triggers not set, the client is using the legacy with just
464*6777b538SAndroid Build Coastguard Worker     // category enabled. So, use the default periodic dump config.
465*6777b538SAndroid Build Coastguard Worker     const Value::Dict* memory_dump_config =
466*6777b538SAndroid Build Coastguard Worker         dict.FindDict(kMemoryDumpConfigParam);
467*6777b538SAndroid Build Coastguard Worker     if (memory_dump_config)
468*6777b538SAndroid Build Coastguard Worker       SetMemoryDumpConfigFromConfigDict(*memory_dump_config);
469*6777b538SAndroid Build Coastguard Worker     else
470*6777b538SAndroid Build Coastguard Worker       SetDefaultMemoryDumpConfig();
471*6777b538SAndroid Build Coastguard Worker   }
472*6777b538SAndroid Build Coastguard Worker 
473*6777b538SAndroid Build Coastguard Worker   systrace_events_.clear();
474*6777b538SAndroid Build Coastguard Worker   if (enable_systrace_) {
475*6777b538SAndroid Build Coastguard Worker     const Value::List* systrace_events = dict.FindList(kSystraceEventsParam);
476*6777b538SAndroid Build Coastguard Worker     if (systrace_events) {
477*6777b538SAndroid Build Coastguard Worker       for (const Value& value : *systrace_events) {
478*6777b538SAndroid Build Coastguard Worker         systrace_events_.insert(value.GetString());
479*6777b538SAndroid Build Coastguard Worker       }
480*6777b538SAndroid Build Coastguard Worker     }
481*6777b538SAndroid Build Coastguard Worker   }
482*6777b538SAndroid Build Coastguard Worker }
483*6777b538SAndroid Build Coastguard Worker 
InitializeFromConfigString(std::string_view config_string)484*6777b538SAndroid Build Coastguard Worker void TraceConfig::InitializeFromConfigString(std::string_view config_string) {
485*6777b538SAndroid Build Coastguard Worker   std::optional<Value> dict = JSONReader::Read(config_string);
486*6777b538SAndroid Build Coastguard Worker   if (dict && dict->is_dict())
487*6777b538SAndroid Build Coastguard Worker     InitializeFromConfigDict(dict->GetDict());
488*6777b538SAndroid Build Coastguard Worker   else
489*6777b538SAndroid Build Coastguard Worker     InitializeDefault();
490*6777b538SAndroid Build Coastguard Worker }
491*6777b538SAndroid Build Coastguard Worker 
InitializeFromStrings(std::string_view category_filter_string,std::string_view trace_options_string)492*6777b538SAndroid Build Coastguard Worker void TraceConfig::InitializeFromStrings(std::string_view category_filter_string,
493*6777b538SAndroid Build Coastguard Worker                                         std::string_view trace_options_string) {
494*6777b538SAndroid Build Coastguard Worker   if (!category_filter_string.empty())
495*6777b538SAndroid Build Coastguard Worker     category_filter_.InitializeFromString(category_filter_string);
496*6777b538SAndroid Build Coastguard Worker 
497*6777b538SAndroid Build Coastguard Worker   record_mode_ = RECORD_UNTIL_FULL;
498*6777b538SAndroid Build Coastguard Worker   trace_buffer_size_in_events_ = 0;
499*6777b538SAndroid Build Coastguard Worker   trace_buffer_size_in_kb_ = 0;
500*6777b538SAndroid Build Coastguard Worker   enable_systrace_ = false;
501*6777b538SAndroid Build Coastguard Worker   systrace_events_.clear();
502*6777b538SAndroid Build Coastguard Worker   enable_argument_filter_ = false;
503*6777b538SAndroid Build Coastguard Worker   enable_event_package_name_filter_ = false;
504*6777b538SAndroid Build Coastguard Worker   if (!trace_options_string.empty()) {
505*6777b538SAndroid Build Coastguard Worker     std::vector<std::string> split =
506*6777b538SAndroid Build Coastguard Worker         SplitString(trace_options_string, ",", TRIM_WHITESPACE, SPLIT_WANT_ALL);
507*6777b538SAndroid Build Coastguard Worker     for (const std::string& token : split) {
508*6777b538SAndroid Build Coastguard Worker       if (token == kRecordUntilFull) {
509*6777b538SAndroid Build Coastguard Worker         record_mode_ = RECORD_UNTIL_FULL;
510*6777b538SAndroid Build Coastguard Worker       } else if (token == kRecordContinuously) {
511*6777b538SAndroid Build Coastguard Worker         record_mode_ = RECORD_CONTINUOUSLY;
512*6777b538SAndroid Build Coastguard Worker       } else if (token == kTraceToConsole) {
513*6777b538SAndroid Build Coastguard Worker         record_mode_ = ECHO_TO_CONSOLE;
514*6777b538SAndroid Build Coastguard Worker       } else if (token == kRecordAsMuchAsPossible) {
515*6777b538SAndroid Build Coastguard Worker         record_mode_ = RECORD_AS_MUCH_AS_POSSIBLE;
516*6777b538SAndroid Build Coastguard Worker       } else if (token.find(kEnableSystrace) == 0) {
517*6777b538SAndroid Build Coastguard Worker         // Find optional events list.
518*6777b538SAndroid Build Coastguard Worker         const size_t length = token.length();
519*6777b538SAndroid Build Coastguard Worker         if (length == kEnableSystraceLength) {
520*6777b538SAndroid Build Coastguard Worker           // Use all predefined categories.
521*6777b538SAndroid Build Coastguard Worker           enable_systrace_ = true;
522*6777b538SAndroid Build Coastguard Worker           continue;
523*6777b538SAndroid Build Coastguard Worker         }
524*6777b538SAndroid Build Coastguard Worker         const auto system_events_not_trimmed =
525*6777b538SAndroid Build Coastguard Worker             token.substr(kEnableSystraceLength);
526*6777b538SAndroid Build Coastguard Worker         const auto system_events =
527*6777b538SAndroid Build Coastguard Worker             TrimString(system_events_not_trimmed, kWhitespaceASCII, TRIM_ALL);
528*6777b538SAndroid Build Coastguard Worker         if (system_events[0] != '=') {
529*6777b538SAndroid Build Coastguard Worker           LOG(ERROR) << "Failed to parse " << token;
530*6777b538SAndroid Build Coastguard Worker           continue;
531*6777b538SAndroid Build Coastguard Worker         }
532*6777b538SAndroid Build Coastguard Worker         enable_systrace_ = true;
533*6777b538SAndroid Build Coastguard Worker         const std::vector<std::string> split_systrace_events = SplitString(
534*6777b538SAndroid Build Coastguard Worker             system_events.substr(1), " ", TRIM_WHITESPACE, SPLIT_WANT_NONEMPTY);
535*6777b538SAndroid Build Coastguard Worker         for (const std::string& systrace_event : split_systrace_events)
536*6777b538SAndroid Build Coastguard Worker           systrace_events_.insert(systrace_event);
537*6777b538SAndroid Build Coastguard Worker       } else if (token == kEnableArgumentFilter) {
538*6777b538SAndroid Build Coastguard Worker         enable_argument_filter_ = true;
539*6777b538SAndroid Build Coastguard Worker       }
540*6777b538SAndroid Build Coastguard Worker     }
541*6777b538SAndroid Build Coastguard Worker   }
542*6777b538SAndroid Build Coastguard Worker 
543*6777b538SAndroid Build Coastguard Worker   if (category_filter_.IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
544*6777b538SAndroid Build Coastguard Worker     SetDefaultMemoryDumpConfig();
545*6777b538SAndroid Build Coastguard Worker   }
546*6777b538SAndroid Build Coastguard Worker }
547*6777b538SAndroid Build Coastguard Worker 
SetMemoryDumpConfigFromConfigDict(const Value::Dict & memory_dump_config)548*6777b538SAndroid Build Coastguard Worker void TraceConfig::SetMemoryDumpConfigFromConfigDict(
549*6777b538SAndroid Build Coastguard Worker     const Value::Dict& memory_dump_config) {
550*6777b538SAndroid Build Coastguard Worker   // Set allowed dump modes.
551*6777b538SAndroid Build Coastguard Worker   memory_dump_config_.allowed_dump_modes.clear();
552*6777b538SAndroid Build Coastguard Worker   const Value::List* allowed_modes_list =
553*6777b538SAndroid Build Coastguard Worker       memory_dump_config.FindList(kAllowedDumpModesParam);
554*6777b538SAndroid Build Coastguard Worker   if (allowed_modes_list) {
555*6777b538SAndroid Build Coastguard Worker     for (const Value& item : *allowed_modes_list) {
556*6777b538SAndroid Build Coastguard Worker       DCHECK(item.is_string());
557*6777b538SAndroid Build Coastguard Worker       memory_dump_config_.allowed_dump_modes.insert(
558*6777b538SAndroid Build Coastguard Worker           StringToMemoryDumpLevelOfDetail(item.GetString()));
559*6777b538SAndroid Build Coastguard Worker     }
560*6777b538SAndroid Build Coastguard Worker   } else {
561*6777b538SAndroid Build Coastguard Worker     // If allowed modes param is not given then allow all modes by default.
562*6777b538SAndroid Build Coastguard Worker     memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes();
563*6777b538SAndroid Build Coastguard Worker   }
564*6777b538SAndroid Build Coastguard Worker 
565*6777b538SAndroid Build Coastguard Worker   // Set triggers
566*6777b538SAndroid Build Coastguard Worker   memory_dump_config_.triggers.clear();
567*6777b538SAndroid Build Coastguard Worker   const Value::List* trigger_list = memory_dump_config.FindList(kTriggersParam);
568*6777b538SAndroid Build Coastguard Worker   if (trigger_list) {
569*6777b538SAndroid Build Coastguard Worker     for (const Value& trigger : *trigger_list) {
570*6777b538SAndroid Build Coastguard Worker       if (!trigger.is_dict()) {
571*6777b538SAndroid Build Coastguard Worker         continue;
572*6777b538SAndroid Build Coastguard Worker       }
573*6777b538SAndroid Build Coastguard Worker       const Value::Dict& trigger_dict = trigger.GetDict();
574*6777b538SAndroid Build Coastguard Worker 
575*6777b538SAndroid Build Coastguard Worker       MemoryDumpConfig::Trigger dump_config;
576*6777b538SAndroid Build Coastguard Worker       std::optional<int> interval = trigger_dict.FindInt(kMinTimeBetweenDumps);
577*6777b538SAndroid Build Coastguard Worker       if (!interval) {
578*6777b538SAndroid Build Coastguard Worker         // If "min_time_between_dumps_ms" param was not given, then the trace
579*6777b538SAndroid Build Coastguard Worker         // config uses old format where only periodic dumps are supported.
580*6777b538SAndroid Build Coastguard Worker         interval = trigger_dict.FindInt(kPeriodicIntervalLegacyParam);
581*6777b538SAndroid Build Coastguard Worker         dump_config.trigger_type = MemoryDumpType::kPeriodicInterval;
582*6777b538SAndroid Build Coastguard Worker       } else {
583*6777b538SAndroid Build Coastguard Worker         const std::string* trigger_type_str =
584*6777b538SAndroid Build Coastguard Worker             trigger_dict.FindString(kTriggerTypeParam);
585*6777b538SAndroid Build Coastguard Worker         DCHECK(trigger_type_str);
586*6777b538SAndroid Build Coastguard Worker         dump_config.trigger_type = StringToMemoryDumpType(*trigger_type_str);
587*6777b538SAndroid Build Coastguard Worker       }
588*6777b538SAndroid Build Coastguard Worker       DCHECK(interval.has_value());
589*6777b538SAndroid Build Coastguard Worker       DCHECK_GT(*interval, 0);
590*6777b538SAndroid Build Coastguard Worker       dump_config.min_time_between_dumps_ms = static_cast<uint32_t>(*interval);
591*6777b538SAndroid Build Coastguard Worker 
592*6777b538SAndroid Build Coastguard Worker       const std::string* level_of_detail_str =
593*6777b538SAndroid Build Coastguard Worker           trigger_dict.FindString(kTriggerModeParam);
594*6777b538SAndroid Build Coastguard Worker       DCHECK(level_of_detail_str);
595*6777b538SAndroid Build Coastguard Worker       dump_config.level_of_detail =
596*6777b538SAndroid Build Coastguard Worker           StringToMemoryDumpLevelOfDetail(*level_of_detail_str);
597*6777b538SAndroid Build Coastguard Worker 
598*6777b538SAndroid Build Coastguard Worker       memory_dump_config_.triggers.push_back(dump_config);
599*6777b538SAndroid Build Coastguard Worker     }
600*6777b538SAndroid Build Coastguard Worker   }
601*6777b538SAndroid Build Coastguard Worker 
602*6777b538SAndroid Build Coastguard Worker   // Set heap profiler options.
603*6777b538SAndroid Build Coastguard Worker   const Value::Dict* heap_profiler_options =
604*6777b538SAndroid Build Coastguard Worker       memory_dump_config.FindDict(kHeapProfilerOptions);
605*6777b538SAndroid Build Coastguard Worker   if (heap_profiler_options) {
606*6777b538SAndroid Build Coastguard Worker     std::optional<int> min_size_bytes =
607*6777b538SAndroid Build Coastguard Worker         heap_profiler_options->FindInt(kBreakdownThresholdBytes);
608*6777b538SAndroid Build Coastguard Worker     if (min_size_bytes && *min_size_bytes >= 0) {
609*6777b538SAndroid Build Coastguard Worker       memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes =
610*6777b538SAndroid Build Coastguard Worker           static_cast<uint32_t>(*min_size_bytes);
611*6777b538SAndroid Build Coastguard Worker     } else {
612*6777b538SAndroid Build Coastguard Worker       memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes =
613*6777b538SAndroid Build Coastguard Worker           MemoryDumpConfig::HeapProfiler::kDefaultBreakdownThresholdBytes;
614*6777b538SAndroid Build Coastguard Worker     }
615*6777b538SAndroid Build Coastguard Worker   }
616*6777b538SAndroid Build Coastguard Worker }
617*6777b538SAndroid Build Coastguard Worker 
SetDefaultMemoryDumpConfig()618*6777b538SAndroid Build Coastguard Worker void TraceConfig::SetDefaultMemoryDumpConfig() {
619*6777b538SAndroid Build Coastguard Worker   memory_dump_config_.Clear();
620*6777b538SAndroid Build Coastguard Worker   memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes();
621*6777b538SAndroid Build Coastguard Worker }
622*6777b538SAndroid Build Coastguard Worker 
SetProcessFilterConfig(const ProcessFilterConfig & config)623*6777b538SAndroid Build Coastguard Worker void TraceConfig::SetProcessFilterConfig(const ProcessFilterConfig& config) {
624*6777b538SAndroid Build Coastguard Worker   process_filter_config_ = config;
625*6777b538SAndroid Build Coastguard Worker }
626*6777b538SAndroid Build Coastguard Worker 
SetHistogramNamesFromConfigList(const Value::List & histogram_names)627*6777b538SAndroid Build Coastguard Worker void TraceConfig::SetHistogramNamesFromConfigList(
628*6777b538SAndroid Build Coastguard Worker     const Value::List& histogram_names) {
629*6777b538SAndroid Build Coastguard Worker   histogram_names_.clear();
630*6777b538SAndroid Build Coastguard Worker   for (const Value& value : histogram_names) {
631*6777b538SAndroid Build Coastguard Worker     histogram_names_.insert(value.GetString());
632*6777b538SAndroid Build Coastguard Worker   }
633*6777b538SAndroid Build Coastguard Worker }
634*6777b538SAndroid Build Coastguard Worker 
SetEventFiltersFromConfigList(const Value::List & category_event_filters)635*6777b538SAndroid Build Coastguard Worker void TraceConfig::SetEventFiltersFromConfigList(
636*6777b538SAndroid Build Coastguard Worker     const Value::List& category_event_filters) {
637*6777b538SAndroid Build Coastguard Worker   event_filters_.clear();
638*6777b538SAndroid Build Coastguard Worker 
639*6777b538SAndroid Build Coastguard Worker   for (const Value& event_filter : category_event_filters) {
640*6777b538SAndroid Build Coastguard Worker     if (!event_filter.is_dict()) {
641*6777b538SAndroid Build Coastguard Worker       continue;
642*6777b538SAndroid Build Coastguard Worker     }
643*6777b538SAndroid Build Coastguard Worker     const Value::Dict& event_filter_dict = event_filter.GetDict();
644*6777b538SAndroid Build Coastguard Worker 
645*6777b538SAndroid Build Coastguard Worker     const std::string* predicate_name =
646*6777b538SAndroid Build Coastguard Worker         event_filter_dict.FindString(kFilterPredicateParam);
647*6777b538SAndroid Build Coastguard Worker     CHECK(predicate_name) << "Invalid predicate name in category event filter.";
648*6777b538SAndroid Build Coastguard Worker 
649*6777b538SAndroid Build Coastguard Worker     EventFilterConfig new_config(*predicate_name);
650*6777b538SAndroid Build Coastguard Worker     new_config.InitializeFromConfigDict(event_filter_dict);
651*6777b538SAndroid Build Coastguard Worker     event_filters_.push_back(new_config);
652*6777b538SAndroid Build Coastguard Worker   }
653*6777b538SAndroid Build Coastguard Worker }
654*6777b538SAndroid Build Coastguard Worker 
ToValue() const655*6777b538SAndroid Build Coastguard Worker Value TraceConfig::ToValue() const {
656*6777b538SAndroid Build Coastguard Worker   Value::Dict dict;
657*6777b538SAndroid Build Coastguard Worker   dict.Set(kRecordModeParam, TraceConfig::TraceRecordModeToStr(record_mode_));
658*6777b538SAndroid Build Coastguard Worker   dict.Set(kEnableSystraceParam, enable_systrace_);
659*6777b538SAndroid Build Coastguard Worker   dict.Set(kEnableArgumentFilterParam, enable_argument_filter_);
660*6777b538SAndroid Build Coastguard Worker   if (trace_buffer_size_in_events_ > 0) {
661*6777b538SAndroid Build Coastguard Worker     dict.Set(kTraceBufferSizeInEvents,
662*6777b538SAndroid Build Coastguard Worker              base::checked_cast<int>(trace_buffer_size_in_events_));
663*6777b538SAndroid Build Coastguard Worker   }
664*6777b538SAndroid Build Coastguard Worker   if (trace_buffer_size_in_kb_ > 0) {
665*6777b538SAndroid Build Coastguard Worker     dict.Set(kTraceBufferSizeInKb,
666*6777b538SAndroid Build Coastguard Worker              base::checked_cast<int>(trace_buffer_size_in_kb_));
667*6777b538SAndroid Build Coastguard Worker   }
668*6777b538SAndroid Build Coastguard Worker 
669*6777b538SAndroid Build Coastguard Worker   dict.Set(kEnableEventPackageNameFilterParam,
670*6777b538SAndroid Build Coastguard Worker            enable_event_package_name_filter_);
671*6777b538SAndroid Build Coastguard Worker 
672*6777b538SAndroid Build Coastguard Worker   category_filter_.ToDict(dict);
673*6777b538SAndroid Build Coastguard Worker   process_filter_config_.ToDict(dict);
674*6777b538SAndroid Build Coastguard Worker 
675*6777b538SAndroid Build Coastguard Worker   if (!event_filters_.empty()) {
676*6777b538SAndroid Build Coastguard Worker     Value::List filter_list;
677*6777b538SAndroid Build Coastguard Worker     for (const EventFilterConfig& filter : event_filters_) {
678*6777b538SAndroid Build Coastguard Worker       Value::Dict filter_dict;
679*6777b538SAndroid Build Coastguard Worker       filter.ToDict(filter_dict);
680*6777b538SAndroid Build Coastguard Worker       filter_list.Append(std::move(filter_dict));
681*6777b538SAndroid Build Coastguard Worker     }
682*6777b538SAndroid Build Coastguard Worker     dict.Set(kEventFiltersParam, std::move(filter_list));
683*6777b538SAndroid Build Coastguard Worker   }
684*6777b538SAndroid Build Coastguard Worker 
685*6777b538SAndroid Build Coastguard Worker   if (category_filter_.IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
686*6777b538SAndroid Build Coastguard Worker     Value::List allowed_modes;
687*6777b538SAndroid Build Coastguard Worker     for (auto dump_mode : memory_dump_config_.allowed_dump_modes)
688*6777b538SAndroid Build Coastguard Worker       allowed_modes.Append(MemoryDumpLevelOfDetailToString(dump_mode));
689*6777b538SAndroid Build Coastguard Worker 
690*6777b538SAndroid Build Coastguard Worker     Value::Dict memory_dump_config;
691*6777b538SAndroid Build Coastguard Worker     memory_dump_config.Set(kAllowedDumpModesParam, std::move(allowed_modes));
692*6777b538SAndroid Build Coastguard Worker 
693*6777b538SAndroid Build Coastguard Worker     Value::List triggers_list;
694*6777b538SAndroid Build Coastguard Worker     for (const auto& config : memory_dump_config_.triggers) {
695*6777b538SAndroid Build Coastguard Worker       Value::Dict trigger_dict;
696*6777b538SAndroid Build Coastguard Worker 
697*6777b538SAndroid Build Coastguard Worker       trigger_dict.Set(kTriggerTypeParam,
698*6777b538SAndroid Build Coastguard Worker                        MemoryDumpTypeToString(config.trigger_type));
699*6777b538SAndroid Build Coastguard Worker       trigger_dict.Set(kMinTimeBetweenDumps,
700*6777b538SAndroid Build Coastguard Worker                        static_cast<int>(config.min_time_between_dumps_ms));
701*6777b538SAndroid Build Coastguard Worker       trigger_dict.Set(kTriggerModeParam,
702*6777b538SAndroid Build Coastguard Worker                        MemoryDumpLevelOfDetailToString(config.level_of_detail));
703*6777b538SAndroid Build Coastguard Worker       triggers_list.Append(std::move(trigger_dict));
704*6777b538SAndroid Build Coastguard Worker     }
705*6777b538SAndroid Build Coastguard Worker 
706*6777b538SAndroid Build Coastguard Worker     // Empty triggers will still be specified explicitly since it means that
707*6777b538SAndroid Build Coastguard Worker     // the periodic dumps are not enabled.
708*6777b538SAndroid Build Coastguard Worker     memory_dump_config.Set(kTriggersParam, std::move(triggers_list));
709*6777b538SAndroid Build Coastguard Worker 
710*6777b538SAndroid Build Coastguard Worker     if (memory_dump_config_.heap_profiler_options.breakdown_threshold_bytes !=
711*6777b538SAndroid Build Coastguard Worker         MemoryDumpConfig::HeapProfiler::kDefaultBreakdownThresholdBytes) {
712*6777b538SAndroid Build Coastguard Worker       Value::Dict options;
713*6777b538SAndroid Build Coastguard Worker       options.Set(
714*6777b538SAndroid Build Coastguard Worker           kBreakdownThresholdBytes,
715*6777b538SAndroid Build Coastguard Worker           base::checked_cast<int>(memory_dump_config_.heap_profiler_options
716*6777b538SAndroid Build Coastguard Worker                                       .breakdown_threshold_bytes));
717*6777b538SAndroid Build Coastguard Worker       memory_dump_config.Set(kHeapProfilerOptions, std::move(options));
718*6777b538SAndroid Build Coastguard Worker     }
719*6777b538SAndroid Build Coastguard Worker     dict.Set(kMemoryDumpConfigParam, std::move(memory_dump_config));
720*6777b538SAndroid Build Coastguard Worker   }
721*6777b538SAndroid Build Coastguard Worker 
722*6777b538SAndroid Build Coastguard Worker   if (!histogram_names_.empty()) {
723*6777b538SAndroid Build Coastguard Worker     base::Value::List histogram_names;
724*6777b538SAndroid Build Coastguard Worker     for (const std::string& histogram_name : histogram_names_)
725*6777b538SAndroid Build Coastguard Worker       histogram_names.Append(histogram_name);
726*6777b538SAndroid Build Coastguard Worker     dict.Set(kHistogramNamesParam, std::move(histogram_names));
727*6777b538SAndroid Build Coastguard Worker   }
728*6777b538SAndroid Build Coastguard Worker 
729*6777b538SAndroid Build Coastguard Worker   if (enable_systrace_) {
730*6777b538SAndroid Build Coastguard Worker     if (!systrace_events_.empty()) {
731*6777b538SAndroid Build Coastguard Worker       base::Value::List systrace_events;
732*6777b538SAndroid Build Coastguard Worker       for (const std::string& systrace_event : systrace_events_)
733*6777b538SAndroid Build Coastguard Worker         systrace_events.Append(systrace_event);
734*6777b538SAndroid Build Coastguard Worker       dict.Set(kSystraceEventsParam, std::move(systrace_events));
735*6777b538SAndroid Build Coastguard Worker     }
736*6777b538SAndroid Build Coastguard Worker   }
737*6777b538SAndroid Build Coastguard Worker 
738*6777b538SAndroid Build Coastguard Worker   return Value(std::move(dict));
739*6777b538SAndroid Build Coastguard Worker }
740*6777b538SAndroid Build Coastguard Worker 
EnableSystraceEvent(const std::string & systrace_event)741*6777b538SAndroid Build Coastguard Worker void TraceConfig::EnableSystraceEvent(const std::string& systrace_event) {
742*6777b538SAndroid Build Coastguard Worker   systrace_events_.insert(systrace_event);
743*6777b538SAndroid Build Coastguard Worker }
744*6777b538SAndroid Build Coastguard Worker 
EnableHistogram(const std::string & histogram_name)745*6777b538SAndroid Build Coastguard Worker void TraceConfig::EnableHistogram(const std::string& histogram_name) {
746*6777b538SAndroid Build Coastguard Worker   histogram_names_.insert(histogram_name);
747*6777b538SAndroid Build Coastguard Worker }
748*6777b538SAndroid Build Coastguard Worker 
ToTraceOptionsString() const749*6777b538SAndroid Build Coastguard Worker std::string TraceConfig::ToTraceOptionsString() const {
750*6777b538SAndroid Build Coastguard Worker   std::string ret;
751*6777b538SAndroid Build Coastguard Worker   switch (record_mode_) {
752*6777b538SAndroid Build Coastguard Worker     case RECORD_UNTIL_FULL:
753*6777b538SAndroid Build Coastguard Worker       ret = kRecordUntilFull;
754*6777b538SAndroid Build Coastguard Worker       break;
755*6777b538SAndroid Build Coastguard Worker     case RECORD_CONTINUOUSLY:
756*6777b538SAndroid Build Coastguard Worker       ret = kRecordContinuously;
757*6777b538SAndroid Build Coastguard Worker       break;
758*6777b538SAndroid Build Coastguard Worker     case RECORD_AS_MUCH_AS_POSSIBLE:
759*6777b538SAndroid Build Coastguard Worker       ret = kRecordAsMuchAsPossible;
760*6777b538SAndroid Build Coastguard Worker       break;
761*6777b538SAndroid Build Coastguard Worker     case ECHO_TO_CONSOLE:
762*6777b538SAndroid Build Coastguard Worker       ret = kTraceToConsole;
763*6777b538SAndroid Build Coastguard Worker       break;
764*6777b538SAndroid Build Coastguard Worker   }
765*6777b538SAndroid Build Coastguard Worker   if (enable_systrace_) {
766*6777b538SAndroid Build Coastguard Worker     ret += ",";
767*6777b538SAndroid Build Coastguard Worker     ret += kEnableSystrace;
768*6777b538SAndroid Build Coastguard Worker     bool first_param = true;
769*6777b538SAndroid Build Coastguard Worker     for (const std::string& systrace_event : systrace_events_) {
770*6777b538SAndroid Build Coastguard Worker       if (first_param) {
771*6777b538SAndroid Build Coastguard Worker         ret += "=";
772*6777b538SAndroid Build Coastguard Worker         first_param = false;
773*6777b538SAndroid Build Coastguard Worker       } else {
774*6777b538SAndroid Build Coastguard Worker         ret += " ";
775*6777b538SAndroid Build Coastguard Worker       }
776*6777b538SAndroid Build Coastguard Worker       ret = ret + systrace_event;
777*6777b538SAndroid Build Coastguard Worker     }
778*6777b538SAndroid Build Coastguard Worker   }
779*6777b538SAndroid Build Coastguard Worker   if (enable_argument_filter_) {
780*6777b538SAndroid Build Coastguard Worker     ret += ",";
781*6777b538SAndroid Build Coastguard Worker     ret += kEnableArgumentFilter;
782*6777b538SAndroid Build Coastguard Worker   }
783*6777b538SAndroid Build Coastguard Worker   return ret;
784*6777b538SAndroid Build Coastguard Worker }
785*6777b538SAndroid Build Coastguard Worker 
786*6777b538SAndroid Build Coastguard Worker #if BUILDFLAG(USE_PERFETTO_CLIENT_LIBRARY)
ToPerfettoTrackEventConfigRaw(bool privacy_filtering_enabled) const787*6777b538SAndroid Build Coastguard Worker std::string TraceConfig::ToPerfettoTrackEventConfigRaw(
788*6777b538SAndroid Build Coastguard Worker     bool privacy_filtering_enabled) const {
789*6777b538SAndroid Build Coastguard Worker   perfetto::protos::gen::TrackEventConfig te_cfg;
790*6777b538SAndroid Build Coastguard Worker   if (!base::Contains(category_filter_.excluded_categories(), "*") &&
791*6777b538SAndroid Build Coastguard Worker       !base::Contains(category_filter_.included_categories(), "*")) {
792*6777b538SAndroid Build Coastguard Worker     // In the case when the default behavior is not specified, apply the
793*6777b538SAndroid Build Coastguard Worker     // following rule: if no categories are explicitly enabled, enable the
794*6777b538SAndroid Build Coastguard Worker     // default ones; otherwise only enable matching categories.
795*6777b538SAndroid Build Coastguard Worker     if (category_filter_.included_categories().empty()) {
796*6777b538SAndroid Build Coastguard Worker       te_cfg.add_enabled_categories("*");
797*6777b538SAndroid Build Coastguard Worker     } else {
798*6777b538SAndroid Build Coastguard Worker       te_cfg.add_disabled_categories("*");
799*6777b538SAndroid Build Coastguard Worker     }
800*6777b538SAndroid Build Coastguard Worker   }
801*6777b538SAndroid Build Coastguard Worker   for (const auto& excluded : category_filter_.excluded_categories()) {
802*6777b538SAndroid Build Coastguard Worker     te_cfg.add_disabled_categories(excluded);
803*6777b538SAndroid Build Coastguard Worker   }
804*6777b538SAndroid Build Coastguard Worker   for (const auto& included : category_filter_.included_categories()) {
805*6777b538SAndroid Build Coastguard Worker     te_cfg.add_enabled_categories(included);
806*6777b538SAndroid Build Coastguard Worker   }
807*6777b538SAndroid Build Coastguard Worker   for (const auto& disabled : category_filter_.disabled_categories()) {
808*6777b538SAndroid Build Coastguard Worker     te_cfg.add_enabled_categories(disabled);
809*6777b538SAndroid Build Coastguard Worker   }
810*6777b538SAndroid Build Coastguard Worker   // Metadata is always enabled.
811*6777b538SAndroid Build Coastguard Worker   te_cfg.add_enabled_categories("__metadata");
812*6777b538SAndroid Build Coastguard Worker   te_cfg.set_enable_thread_time_sampling(true);
813*6777b538SAndroid Build Coastguard Worker   te_cfg.set_timestamp_unit_multiplier(1000);
814*6777b538SAndroid Build Coastguard Worker   if (privacy_filtering_enabled) {
815*6777b538SAndroid Build Coastguard Worker     te_cfg.set_filter_dynamic_event_names(true);
816*6777b538SAndroid Build Coastguard Worker     te_cfg.set_filter_debug_annotations(true);
817*6777b538SAndroid Build Coastguard Worker   }
818*6777b538SAndroid Build Coastguard Worker   return te_cfg.SerializeAsString();
819*6777b538SAndroid Build Coastguard Worker }
820*6777b538SAndroid Build Coastguard Worker #endif
821*6777b538SAndroid Build Coastguard Worker 
822*6777b538SAndroid Build Coastguard Worker }  // namespace base::trace_event
823