Index: base/trace_event/trace_event_impl.cc |
diff --git a/base/trace_event/trace_event_impl.cc b/base/trace_event/trace_event_impl.cc |
index 12f9598a2c8a099ccd62700a8a98a0d0a9983d41..734b10692390bc9e702c13c0ea4d46a94ea5cfaa 100644 |
--- a/base/trace_event/trace_event_impl.cc |
+++ b/base/trace_event/trace_event_impl.cc |
@@ -694,34 +694,45 @@ void TraceEvent::AppendValueAsJSON(unsigned char type, |
} |
} |
-void TraceEvent::AppendAsJSON(std::string* out) const { |
+void TraceEvent::AppendAsJSON( |
+ std::string* out, |
+ const EventFilterPredicate& event_filter_predicate) const { |
int64 time_int64 = timestamp_.ToInternalValue(); |
int process_id = TraceLog::GetInstance()->process_id(); |
+ const char* category_group_name = |
+ TraceLog::GetCategoryGroupName(category_group_enabled_); |
+ |
// Category group checked at category creation time. |
DCHECK(!strchr(name_, '"')); |
- StringAppendF(out, |
- "{\"pid\":%i,\"tid\":%i,\"ts\":%" PRId64 "," |
- "\"ph\":\"%c\",\"cat\":\"%s\",\"name\":\"%s\",\"args\":{", |
- process_id, |
- thread_id_, |
- time_int64, |
- phase_, |
- TraceLog::GetCategoryGroupName(category_group_enabled_), |
- name_); |
+ StringAppendF(out, "{\"pid\":%i,\"tid\":%i,\"ts\":%" PRId64 |
+ "," |
+ "\"ph\":\"%c\",\"cat\":\"%s\",\"name\":\"%s\",\"args\":{", |
+ process_id, thread_id_, time_int64, phase_, category_group_name, |
+ name_); |
// Output argument names and values, stop at first NULL argument name. |
- for (int i = 0; i < kTraceMaxNumArgs && arg_names_[i]; ++i) { |
- if (i > 0) |
- *out += ","; |
- *out += "\""; |
- *out += arg_names_[i]; |
- *out += "\":"; |
- |
- if (arg_types_[i] == TRACE_VALUE_TYPE_CONVERTABLE) |
- convertable_values_[i]->AppendAsTraceFormat(out); |
- else |
- AppendValueAsJSON(arg_types_[i], arg_values_[i], out); |
+ if (arg_names_[0]) { |
+ bool allow_args = event_filter_predicate.is_null() || |
+ event_filter_predicate.Run(category_group_name, name_); |
+ |
+ if (allow_args) { |
+ for (int i = 0; i < kTraceMaxNumArgs && arg_names_[i]; ++i) { |
+ if (i > 0) |
+ *out += ","; |
+ *out += "\""; |
+ *out += arg_names_[i]; |
+ *out += "\":"; |
+ |
+ if (arg_types_[i] == TRACE_VALUE_TYPE_CONVERTABLE) |
+ convertable_values_[i]->AppendAsTraceFormat(out); |
+ else |
+ AppendValueAsJSON(arg_types_[i], arg_values_[i], out); |
+ } |
+ } else { |
+ *out += "\"stripped\":1"; |
+ } |
} |
+ |
*out += "}"; |
if (phase_ == TRACE_EVENT_PHASE_COMPLETE) { |
@@ -1480,6 +1491,12 @@ void TraceLog::SetEnabled(const CategoryFilter& category_filter, |
} |
} |
+void TraceLog::SetEventFilterPredicate( |
+ const TraceEvent::EventFilterPredicate& event_filter_predicate) { |
+ AutoLock lock(lock_); |
+ event_filter_predicate_ = event_filter_predicate; |
+} |
+ |
TraceLog::InternalTraceOptions TraceLog::GetInternalOptionsFromTraceOptions( |
const TraceOptions& options) { |
InternalTraceOptions ret = |
@@ -1748,8 +1765,8 @@ void TraceLog::Flush(const TraceLog::OutputCallback& cb, |
// Usually it runs on a different thread. |
void TraceLog::ConvertTraceEventsToTraceFormat( |
scoped_ptr<TraceBuffer> logged_events, |
- const TraceLog::OutputCallback& flush_output_callback) { |
- |
+ const OutputCallback& flush_output_callback, |
+ const TraceEvent::EventFilterPredicate& event_filter_predicate) { |
if (flush_output_callback.is_null()) |
return; |
@@ -1768,7 +1785,8 @@ void TraceLog::ConvertTraceEventsToTraceFormat( |
for (size_t j = 0; j < chunk->size(); ++j) { |
if (json_events_str_ptr->size()) |
json_events_str_ptr->data().append(",\n"); |
- chunk->GetEventAt(j)->AppendAsJSON(&(json_events_str_ptr->data())); |
+ chunk->GetEventAt(j)->AppendAsJSON(&(json_events_str_ptr->data()), |
+ event_filter_predicate); |
} |
} |
flush_output_callback.Run(json_events_str_ptr, has_more_events); |
@@ -1778,6 +1796,7 @@ void TraceLog::ConvertTraceEventsToTraceFormat( |
void TraceLog::FinishFlush(int generation) { |
scoped_ptr<TraceBuffer> previous_logged_events; |
OutputCallback flush_output_callback; |
+ TraceEvent::EventFilterPredicate event_filter_predicate; |
if (!CheckGeneration(generation)) |
return; |
@@ -1792,20 +1811,23 @@ void TraceLog::FinishFlush(int generation) { |
flush_message_loop_proxy_ = NULL; |
flush_output_callback = flush_output_callback_; |
flush_output_callback_.Reset(); |
+ |
+ event_filter_predicate = event_filter_predicate_; |
+ event_filter_predicate_.Reset(); |
} |
if (use_worker_thread_ && |
WorkerPool::PostTask( |
- FROM_HERE, |
- Bind(&TraceLog::ConvertTraceEventsToTraceFormat, |
- Passed(&previous_logged_events), |
- flush_output_callback), |
+ FROM_HERE, Bind(&TraceLog::ConvertTraceEventsToTraceFormat, |
+ Unretained(this), Passed(&previous_logged_events), |
+ flush_output_callback, event_filter_predicate), |
true)) { |
return; |
} |
ConvertTraceEventsToTraceFormat(previous_logged_events.Pass(), |
- flush_output_callback); |
+ flush_output_callback, |
+ event_filter_predicate); |
} |
// Run in each thread holding a local event buffer. |
@@ -1856,6 +1878,7 @@ void TraceLog::OnFlushTimeout(int generation) { |
void TraceLog::FlushButLeaveBufferIntact( |
const TraceLog::OutputCallback& flush_output_callback) { |
scoped_ptr<TraceBuffer> previous_logged_events; |
+ TraceEvent::EventFilterPredicate event_filter_predicate; |
{ |
AutoLock lock(lock_); |
AddMetadataEventsWhileLocked(); |
@@ -1865,10 +1888,12 @@ void TraceLog::FlushButLeaveBufferIntact( |
thread_shared_chunk_.Pass()); |
} |
previous_logged_events = logged_events_->CloneForIteration().Pass(); |
+ event_filter_predicate = event_filter_predicate_; |
} // release lock |
ConvertTraceEventsToTraceFormat(previous_logged_events.Pass(), |
- flush_output_callback); |
+ flush_output_callback, |
+ event_filter_predicate); |
} |
void TraceLog::UseNextTraceBuffer() { |