Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(83)

Side by Side Diff: base/trace_event/trace_config.cc

Issue 1923533004: Tracing pre-filtering (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review fixes Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2015 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/trace_event/trace_config.h" 5 #include "base/trace_event/trace_config.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
48 // String parameters that is used to parse memory dump config in trace config 48 // String parameters that is used to parse memory dump config in trace config
49 // string. 49 // string.
50 const char kMemoryDumpConfigParam[] = "memory_dump_config"; 50 const char kMemoryDumpConfigParam[] = "memory_dump_config";
51 const char kAllowedDumpModesParam[] = "allowed_dump_modes"; 51 const char kAllowedDumpModesParam[] = "allowed_dump_modes";
52 const char kTriggersParam[] = "triggers"; 52 const char kTriggersParam[] = "triggers";
53 const char kPeriodicIntervalParam[] = "periodic_interval_ms"; 53 const char kPeriodicIntervalParam[] = "periodic_interval_ms";
54 const char kModeParam[] = "mode"; 54 const char kModeParam[] = "mode";
55 const char kHeapProfilerOptions[] = "heap_profiler_options"; 55 const char kHeapProfilerOptions[] = "heap_profiler_options";
56 const char kBreakdownThresholdBytes[] = "breakdown_threshold_bytes"; 56 const char kBreakdownThresholdBytes[] = "breakdown_threshold_bytes";
57 57
58 // String parameters used to parse category event filters.
59 const char kEventFiltersParam[] = "event_filters";
60 const char kFilterPredicateParam[] = "filter_predicate";
61 const char kFilterArgsParam[] = "filter_args";
62
58 // Default configuration of memory dumps. 63 // Default configuration of memory dumps.
59 const TraceConfig::MemoryDumpConfig::Trigger kDefaultHeavyMemoryDumpTrigger = { 64 const TraceConfig::MemoryDumpConfig::Trigger kDefaultHeavyMemoryDumpTrigger = {
60 2000, // periodic_interval_ms 65 2000, // periodic_interval_ms
61 MemoryDumpLevelOfDetail::DETAILED}; 66 MemoryDumpLevelOfDetail::DETAILED};
62 const TraceConfig::MemoryDumpConfig::Trigger kDefaultLightMemoryDumpTrigger = { 67 const TraceConfig::MemoryDumpConfig::Trigger kDefaultLightMemoryDumpTrigger = {
63 250, // periodic_interval_ms 68 250, // periodic_interval_ms
64 MemoryDumpLevelOfDetail::LIGHT}; 69 MemoryDumpLevelOfDetail::LIGHT};
65 70
66 class ConvertableTraceConfigToTraceFormat 71 class ConvertableTraceConfigToTraceFormat
67 : public base::trace_event::ConvertableToTraceFormat { 72 : public base::trace_event::ConvertableToTraceFormat {
68 public: 73 public:
69 explicit ConvertableTraceConfigToTraceFormat(const TraceConfig& trace_config) 74 explicit ConvertableTraceConfigToTraceFormat(const TraceConfig& trace_config)
70 : trace_config_(trace_config) {} 75 : trace_config_(trace_config) {}
76
71 ~ConvertableTraceConfigToTraceFormat() override {} 77 ~ConvertableTraceConfigToTraceFormat() override {}
72 78
73 void AppendAsTraceFormat(std::string* out) const override { 79 void AppendAsTraceFormat(std::string* out) const override {
74 out->append(trace_config_.ToString()); 80 out->append(trace_config_.ToString());
75 } 81 }
76 82
77 private: 83 private:
78 const TraceConfig trace_config_; 84 const TraceConfig trace_config_;
79 }; 85 };
80 86
(...skipping 27 matching lines...) Expand all
108 const MemoryDumpConfig& other) = default; 114 const MemoryDumpConfig& other) = default;
109 115
110 TraceConfig::MemoryDumpConfig::~MemoryDumpConfig() {} 116 TraceConfig::MemoryDumpConfig::~MemoryDumpConfig() {}
111 117
112 void TraceConfig::MemoryDumpConfig::Clear() { 118 void TraceConfig::MemoryDumpConfig::Clear() {
113 allowed_dump_modes.clear(); 119 allowed_dump_modes.clear();
114 triggers.clear(); 120 triggers.clear();
115 heap_profiler_options.Clear(); 121 heap_profiler_options.Clear();
116 } 122 }
117 123
124 TraceConfig::EventFilterConfig::EventFilterConfig(
125 const std::string& predicate_name)
126 : predicate_name_(predicate_name) {}
127 TraceConfig::EventFilterConfig::~EventFilterConfig() {}
shatch 2016/08/15 21:25:47 nit: Add newline
oystein (OOO til 10th of July) 2016/08/16 22:17:52 Done.
128
129 TraceConfig::EventFilterConfig::EventFilterConfig(const EventFilterConfig& tc) {
130 *this = tc;
131 }
132
133 TraceConfig::EventFilterConfig& TraceConfig::EventFilterConfig::operator=(
134 const TraceConfig::EventFilterConfig& rhs) {
135 if (this == &rhs)
136 return *this;
137
138 predicate_name_ = rhs.predicate_name_;
139 included_categories_ = rhs.included_categories_;
140 excluded_categories_ = rhs.excluded_categories_;
141 if (rhs.args_)
142 args_ = rhs.args_->CreateDeepCopy();
143
144 return *this;
145 }
146
147 void TraceConfig::EventFilterConfig::AddIncludedCategory(
148 const std::string& category) {
149 included_categories_.push_back(category);
150 }
151
152 void TraceConfig::EventFilterConfig::AddExcludedCategory(
153 const std::string& category) {
154 excluded_categories_.push_back(category);
155 }
156
157 void TraceConfig::EventFilterConfig::SetArgs(
158 std::unique_ptr<base::DictionaryValue> args) {
159 args_ = std::move(args);
160 }
161
162 bool TraceConfig::EventFilterConfig::IsCategoryGroupEnabled(
163 const char* category_group_name) const {
164 CStringTokenizer category_group_tokens(
165 category_group_name, category_group_name + strlen(category_group_name),
166 ",");
167 while (category_group_tokens.GetNext()) {
168 std::string category_group_token = category_group_tokens.token();
169
170 for (const auto& excluded_category : excluded_categories_) {
171 if (base::MatchPattern(category_group_token, excluded_category)) {
172 return false;
173 }
174 }
175
176 for (const auto& included_category : included_categories_) {
177 if (base::MatchPattern(category_group_token, included_category)) {
178 return true;
179 }
180 }
181 }
182
183 return false;
184 }
185
118 TraceConfig::TraceConfig() { 186 TraceConfig::TraceConfig() {
119 InitializeDefault(); 187 InitializeDefault();
120 } 188 }
121 189
122 TraceConfig::TraceConfig(StringPiece category_filter_string, 190 TraceConfig::TraceConfig(StringPiece category_filter_string,
123 StringPiece trace_options_string) { 191 StringPiece trace_options_string) {
124 InitializeFromStrings(category_filter_string, trace_options_string); 192 InitializeFromStrings(category_filter_string, trace_options_string);
125 } 193 }
126 194
127 TraceConfig::TraceConfig(StringPiece category_filter_string, 195 TraceConfig::TraceConfig(StringPiece category_filter_string,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 227
160 TraceConfig::TraceConfig(const TraceConfig& tc) 228 TraceConfig::TraceConfig(const TraceConfig& tc)
161 : record_mode_(tc.record_mode_), 229 : record_mode_(tc.record_mode_),
162 enable_sampling_(tc.enable_sampling_), 230 enable_sampling_(tc.enable_sampling_),
163 enable_systrace_(tc.enable_systrace_), 231 enable_systrace_(tc.enable_systrace_),
164 enable_argument_filter_(tc.enable_argument_filter_), 232 enable_argument_filter_(tc.enable_argument_filter_),
165 memory_dump_config_(tc.memory_dump_config_), 233 memory_dump_config_(tc.memory_dump_config_),
166 included_categories_(tc.included_categories_), 234 included_categories_(tc.included_categories_),
167 disabled_categories_(tc.disabled_categories_), 235 disabled_categories_(tc.disabled_categories_),
168 excluded_categories_(tc.excluded_categories_), 236 excluded_categories_(tc.excluded_categories_),
169 synthetic_delays_(tc.synthetic_delays_) {} 237 synthetic_delays_(tc.synthetic_delays_),
238 event_filters_(tc.event_filters_) {}
170 239
171 TraceConfig::~TraceConfig() { 240 TraceConfig::~TraceConfig() {
172 } 241 }
173 242
174 TraceConfig& TraceConfig::operator=(const TraceConfig& rhs) { 243 TraceConfig& TraceConfig::operator=(const TraceConfig& rhs) {
175 if (this == &rhs) 244 if (this == &rhs)
176 return *this; 245 return *this;
177 246
178 record_mode_ = rhs.record_mode_; 247 record_mode_ = rhs.record_mode_;
179 enable_sampling_ = rhs.enable_sampling_; 248 enable_sampling_ = rhs.enable_sampling_;
180 enable_systrace_ = rhs.enable_systrace_; 249 enable_systrace_ = rhs.enable_systrace_;
181 enable_argument_filter_ = rhs.enable_argument_filter_; 250 enable_argument_filter_ = rhs.enable_argument_filter_;
182 memory_dump_config_ = rhs.memory_dump_config_; 251 memory_dump_config_ = rhs.memory_dump_config_;
183 included_categories_ = rhs.included_categories_; 252 included_categories_ = rhs.included_categories_;
184 disabled_categories_ = rhs.disabled_categories_; 253 disabled_categories_ = rhs.disabled_categories_;
185 excluded_categories_ = rhs.excluded_categories_; 254 excluded_categories_ = rhs.excluded_categories_;
186 synthetic_delays_ = rhs.synthetic_delays_; 255 synthetic_delays_ = rhs.synthetic_delays_;
256 event_filters_ = rhs.event_filters_;
187 return *this; 257 return *this;
188 } 258 }
189 259
190 const TraceConfig::StringList& TraceConfig::GetSyntheticDelayValues() const { 260 const TraceConfig::StringList& TraceConfig::GetSyntheticDelayValues() const {
191 return synthetic_delays_; 261 return synthetic_delays_;
192 } 262 }
193 263
194 std::string TraceConfig::ToString() const { 264 std::string TraceConfig::ToString() const {
195 std::unique_ptr<DictionaryValue> dict = ToDict(); 265 std::unique_ptr<DictionaryValue> dict = ToDict();
196 std::string json; 266 std::string json;
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
307 void TraceConfig::Clear() { 377 void TraceConfig::Clear() {
308 record_mode_ = RECORD_UNTIL_FULL; 378 record_mode_ = RECORD_UNTIL_FULL;
309 enable_sampling_ = false; 379 enable_sampling_ = false;
310 enable_systrace_ = false; 380 enable_systrace_ = false;
311 enable_argument_filter_ = false; 381 enable_argument_filter_ = false;
312 included_categories_.clear(); 382 included_categories_.clear();
313 disabled_categories_.clear(); 383 disabled_categories_.clear();
314 excluded_categories_.clear(); 384 excluded_categories_.clear();
315 synthetic_delays_.clear(); 385 synthetic_delays_.clear();
316 memory_dump_config_.Clear(); 386 memory_dump_config_.Clear();
387 event_filters_.clear();
317 } 388 }
318 389
319 void TraceConfig::InitializeDefault() { 390 void TraceConfig::InitializeDefault() {
320 record_mode_ = RECORD_UNTIL_FULL; 391 record_mode_ = RECORD_UNTIL_FULL;
321 enable_sampling_ = false; 392 enable_sampling_ = false;
322 enable_systrace_ = false; 393 enable_systrace_ = false;
323 enable_argument_filter_ = false; 394 enable_argument_filter_ = false;
324 } 395 }
325 396
326 void TraceConfig::InitializeFromConfigDict(const DictionaryValue& dict) { 397 void TraceConfig::InitializeFromConfigDict(const DictionaryValue& dict) {
(...skipping 27 matching lines...) Expand all
354 425
355 if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) { 426 if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
356 // If dump triggers not set, the client is using the legacy with just 427 // If dump triggers not set, the client is using the legacy with just
357 // category enabled. So, use the default periodic dump config. 428 // category enabled. So, use the default periodic dump config.
358 const DictionaryValue* memory_dump_config = nullptr; 429 const DictionaryValue* memory_dump_config = nullptr;
359 if (dict.GetDictionary(kMemoryDumpConfigParam, &memory_dump_config)) 430 if (dict.GetDictionary(kMemoryDumpConfigParam, &memory_dump_config))
360 SetMemoryDumpConfigFromConfigDict(*memory_dump_config); 431 SetMemoryDumpConfigFromConfigDict(*memory_dump_config);
361 else 432 else
362 SetDefaultMemoryDumpConfig(); 433 SetDefaultMemoryDumpConfig();
363 } 434 }
435
436 const base::ListValue* category_event_filters = nullptr;
437 if (dict.GetList(kEventFiltersParam, &category_event_filters))
438 SetEventFilters(*category_event_filters);
364 } 439 }
365 440
366 void TraceConfig::InitializeFromConfigString(StringPiece config_string) { 441 void TraceConfig::InitializeFromConfigString(StringPiece config_string) {
367 auto dict = DictionaryValue::From(JSONReader::Read(config_string)); 442 auto dict = DictionaryValue::From(JSONReader::Read(config_string));
368 if (dict) 443 if (dict)
369 InitializeFromConfigDict(*dict); 444 InitializeFromConfigDict(*dict);
370 else 445 else
371 InitializeDefault(); 446 InitializeDefault();
372 } 447 }
373 448
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 } 623 }
549 } 624 }
550 625
551 void TraceConfig::SetDefaultMemoryDumpConfig() { 626 void TraceConfig::SetDefaultMemoryDumpConfig() {
552 memory_dump_config_.Clear(); 627 memory_dump_config_.Clear();
553 memory_dump_config_.triggers.push_back(kDefaultHeavyMemoryDumpTrigger); 628 memory_dump_config_.triggers.push_back(kDefaultHeavyMemoryDumpTrigger);
554 memory_dump_config_.triggers.push_back(kDefaultLightMemoryDumpTrigger); 629 memory_dump_config_.triggers.push_back(kDefaultLightMemoryDumpTrigger);
555 memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes(); 630 memory_dump_config_.allowed_dump_modes = GetDefaultAllowedMemoryDumpModes();
556 } 631 }
557 632
633 void TraceConfig::SetEventFilters(
634 const base::ListValue& category_event_filters) {
635 event_filters_.clear();
636
637 for (size_t event_filter_index = 0;
638 event_filter_index < category_event_filters.GetSize();
639 ++event_filter_index) {
640 const base::DictionaryValue* event_filter = nullptr;
641 if (!category_event_filters.GetDictionary(event_filter_index,
642 &event_filter))
643 continue;
644
645 std::string predicate_name;
646 CHECK(event_filter->GetString(kFilterPredicateParam, &predicate_name))
647 << "Invalid predicate name in category event filter.";
648
649 EventFilterConfig new_config(predicate_name);
650 const base::ListValue* included_list = nullptr;
651 CHECK(event_filter->GetList(kIncludedCategoriesParam, &included_list))
652 << "Missing included_categories in category event filter.";
653
654 for (size_t i = 0; i < included_list->GetSize(); ++i) {
655 std::string category;
656 if (included_list->GetString(i, &category))
657 new_config.AddIncludedCategory(category);
658 }
659
660 const base::ListValue* excluded_list = nullptr;
661 if (event_filter->GetList(kExcludedCategoriesParam, &excluded_list)) {
662 for (size_t i = 0; i < excluded_list->GetSize(); ++i) {
663 std::string category;
664 if (excluded_list->GetString(i, &category))
665 new_config.AddExcludedCategory(category);
666 }
667 }
668
669 const base::DictionaryValue* args_dict = nullptr;
670 if (event_filter->GetDictionary(kFilterArgsParam, &args_dict))
671 new_config.SetArgs(args_dict->CreateDeepCopy());
672
673 event_filters_.push_back(new_config);
674 }
675 }
676
558 std::unique_ptr<DictionaryValue> TraceConfig::ToDict() const { 677 std::unique_ptr<DictionaryValue> TraceConfig::ToDict() const {
559 auto dict = MakeUnique<DictionaryValue>(); 678 auto dict = MakeUnique<DictionaryValue>();
560 switch (record_mode_) { 679 switch (record_mode_) {
561 case RECORD_UNTIL_FULL: 680 case RECORD_UNTIL_FULL:
562 dict->SetString(kRecordModeParam, kRecordUntilFull); 681 dict->SetString(kRecordModeParam, kRecordUntilFull);
563 break; 682 break;
564 case RECORD_CONTINUOUSLY: 683 case RECORD_CONTINUOUSLY:
565 dict->SetString(kRecordModeParam, kRecordContinuously); 684 dict->SetString(kRecordModeParam, kRecordContinuously);
566 break; 685 break;
567 case RECORD_AS_MUCH_AS_POSSIBLE: 686 case RECORD_AS_MUCH_AS_POSSIBLE:
(...skipping 11 matching lines...) Expand all
579 dict->SetBoolean(kEnableArgumentFilterParam, enable_argument_filter_); 698 dict->SetBoolean(kEnableArgumentFilterParam, enable_argument_filter_);
580 699
581 StringList categories(included_categories_); 700 StringList categories(included_categories_);
582 categories.insert(categories.end(), 701 categories.insert(categories.end(),
583 disabled_categories_.begin(), 702 disabled_categories_.begin(),
584 disabled_categories_.end()); 703 disabled_categories_.end());
585 AddCategoryToDict(dict.get(), kIncludedCategoriesParam, categories); 704 AddCategoryToDict(dict.get(), kIncludedCategoriesParam, categories);
586 AddCategoryToDict(dict.get(), kExcludedCategoriesParam, excluded_categories_); 705 AddCategoryToDict(dict.get(), kExcludedCategoriesParam, excluded_categories_);
587 AddCategoryToDict(dict.get(), kSyntheticDelaysParam, synthetic_delays_); 706 AddCategoryToDict(dict.get(), kSyntheticDelaysParam, synthetic_delays_);
588 707
708 if (!event_filters_.empty()) {
709 std::unique_ptr<base::ListValue> filter_list(new base::ListValue());
710 for (const EventFilterConfig& filter : event_filters_) {
711 std::unique_ptr<base::DictionaryValue> filter_dict(
712 new base::DictionaryValue());
713 filter_dict->SetString(kFilterPredicateParam, filter.predicate_name());
714
715 std::unique_ptr<base::ListValue> included_categories_list(
716 new base::ListValue());
717 for (const std::string& included_category : filter.included_categories())
718 included_categories_list->AppendString(included_category);
719
720 filter_dict->Set(kIncludedCategoriesParam,
721 std::move(included_categories_list));
722
723 if (!filter.excluded_categories().empty()) {
724 std::unique_ptr<base::ListValue> excluded_categories_list(
725 new base::ListValue());
726 for (const std::string& excluded_category :
727 filter.excluded_categories())
728 excluded_categories_list->AppendString(excluded_category);
729
730 filter_dict->Set(kExcludedCategoriesParam,
731 std::move(excluded_categories_list));
732 }
733
734 if (filter.filter_args())
735 filter_dict->Set(kFilterArgsParam,
736 filter.filter_args()->CreateDeepCopy());
737
738 filter_list->Append(std::move(filter_dict));
739 }
740 dict->Set(kEventFiltersParam, std::move(filter_list));
741 }
742
589 if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) { 743 if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) {
590 auto allowed_modes = MakeUnique<ListValue>(); 744 auto allowed_modes = MakeUnique<ListValue>();
591 for (auto dump_mode : memory_dump_config_.allowed_dump_modes) 745 for (auto dump_mode : memory_dump_config_.allowed_dump_modes)
592 allowed_modes->AppendString(MemoryDumpLevelOfDetailToString(dump_mode)); 746 allowed_modes->AppendString(MemoryDumpLevelOfDetailToString(dump_mode));
593 747
594 auto memory_dump_config = MakeUnique<DictionaryValue>(); 748 auto memory_dump_config = MakeUnique<DictionaryValue>();
595 memory_dump_config->Set(kAllowedDumpModesParam, std::move(allowed_modes)); 749 memory_dump_config->Set(kAllowedDumpModesParam, std::move(allowed_modes));
596 750
597 auto triggers_list = MakeUnique<ListValue>(); 751 auto triggers_list = MakeUnique<ListValue>();
598 for (const auto& config : memory_dump_config_.triggers) { 752 for (const auto& config : memory_dump_config_.triggers) {
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 StringPiece str) { 851 StringPiece str) {
698 return str.empty() || str.front() == ' ' || str.back() == ' '; 852 return str.empty() || str.front() == ' ' || str.back() == ' ';
699 } 853 }
700 854
701 bool TraceConfig::HasIncludedPatterns() const { 855 bool TraceConfig::HasIncludedPatterns() const {
702 return !included_categories_.empty(); 856 return !included_categories_.empty();
703 } 857 }
704 858
705 } // namespace trace_event 859 } // namespace trace_event
706 } // namespace base 860 } // namespace base
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698