diff options
Diffstat (limited to 'src/trace_processor/importers/proto/system_probes_parser.cc')
-rw-r--r-- | src/trace_processor/importers/proto/system_probes_parser.cc | 77 |
1 files changed, 71 insertions, 6 deletions
diff --git a/src/trace_processor/importers/proto/system_probes_parser.cc b/src/trace_processor/importers/proto/system_probes_parser.cc index 5ca7ca1a9..29050b3da 100644 --- a/src/trace_processor/importers/proto/system_probes_parser.cc +++ b/src/trace_processor/importers/proto/system_probes_parser.cc @@ -19,17 +19,18 @@ #include "perfetto/base/logging.h" #include "perfetto/ext/traced/sys_stats_counters.h" #include "perfetto/protozero/proto_decoder.h" -#include "src/trace_processor/event_tracker.h" -#include "src/trace_processor/metadata.h" -#include "src/trace_processor/metadata_tracker.h" -#include "src/trace_processor/process_tracker.h" -#include "src/trace_processor/syscall_tracker.h" -#include "src/trace_processor/trace_processor_context.h" +#include "src/trace_processor/importers/common/event_tracker.h" +#include "src/trace_processor/importers/common/process_tracker.h" +#include "src/trace_processor/importers/proto/metadata_tracker.h" +#include "src/trace_processor/importers/syscalls/syscall_tracker.h" +#include "src/trace_processor/storage/metadata.h" +#include "src/trace_processor/types/trace_processor_context.h" #include "protos/perfetto/trace/ps/process_stats.pbzero.h" #include "protos/perfetto/trace/ps/process_tree.pbzero.h" #include "protos/perfetto/trace/sys_stats/sys_stats.pbzero.h" #include "protos/perfetto/trace/system_info.pbzero.h" +#include "protos/perfetto/trace/system_info/cpu_info.pbzero.h" namespace perfetto { namespace trace_processor { @@ -253,6 +254,17 @@ void SystemProbesParser::ParseProcessStats(int64_t ts, ConstBytes blob) { pid = fld.as_uint32(); continue; } + if (fld.id() == + protos::pbzero::ProcessStats::Process::kThreadsFieldNumber) { + if (PERFETTO_UNLIKELY(ms_per_tick_ == 0 || + thread_time_in_state_cpu_str_ids_.empty())) { + context_->storage->IncrementStats( + stats::thread_time_in_state_out_of_order); + continue; + } + ParseThreadStats(ts, pid, fld.as_bytes()); + continue; + } bool is_counter_field = fld.id() < proc_stats_process_names_.size() && !proc_stats_process_names_[fld.id()].is_null(); if (is_counter_field) { @@ -284,6 +296,35 @@ void SystemProbesParser::ParseProcessStats(int64_t ts, ConstBytes blob) { } } +void SystemProbesParser::ParseThreadStats(int64_t ts, + uint32_t pid, + ConstBytes blob) { + protos::pbzero::ProcessStats::Thread::Decoder stats(blob.data, blob.size); + UniqueTid utid = context_->process_tracker->UpdateThread( + static_cast<uint32_t>(stats.tid()), pid); + auto index_it = stats.cpu_freq_indices(); + auto tick_it = stats.cpu_freq_ticks(); + std::map<StringId, uint64_t> total_ticks_cpu; + for (; index_it && tick_it; index_it++, tick_it++) { + auto freq_index = *index_it; + if (PERFETTO_UNLIKELY(freq_index == 0 || + freq_index >= + thread_time_in_state_cpu_str_ids_.size())) { + context_->storage->IncrementStats( + stats::thread_time_in_state_unknown_cpu_freq); + continue; + } + total_ticks_cpu[thread_time_in_state_cpu_str_ids_[freq_index]] += *tick_it; + } + + for (auto it : total_ticks_cpu) { + TrackId track = + context_->track_tracker->InternThreadCounterTrack(it.first, utid); + auto ticks = it.second; + context_->event_tracker->PushCounter(ts, ticks * ms_per_tick_, track); + } +} + void SystemProbesParser::ParseSystemInfo(ConstBytes blob) { protos::pbzero::SystemInfo::Decoder packet(blob.data, blob.size); if (packet.has_utsname()) { @@ -296,6 +337,8 @@ void SystemProbesParser::ParseSystemInfo(ConstBytes blob) { syscall_tracker->SetArchitecture(kAarch64); } else if (machine == "x86_64") { syscall_tracker->SetArchitecture(kX86_64); + } else if (machine == "i686") { + syscall_tracker->SetArchitecture(kX86); } else { PERFETTO_ELOG("Unknown architecture %s", machine.ToStdString().c_str()); } @@ -325,6 +368,28 @@ void SystemProbesParser::ParseSystemInfo(ConstBytes blob) { Variadic::String(context_->storage->InternString( packet.android_build_fingerprint()))); } + + int64_t hz = packet.hz(); + if (hz > 0) + ms_per_tick_ = 1000u / static_cast<uint64_t>(hz); +} + +void SystemProbesParser::ParseCpuInfo(ConstBytes blob) { + protos::pbzero::CpuInfo::Decoder packet(blob.data, blob.size); + uint32_t cpu_index = 0; + thread_time_in_state_cpu_str_ids_.push_back( + context_->storage->InternString("invalid")); + for (auto it = packet.cpus(); it; it++) { + protos::pbzero::CpuInfo::Cpu::Decoder cpu(*it); + std::string cpu_index_string = + "cpu" + std::to_string(cpu_index) + ".time_in_state"; + base::StringView cpu_string(cpu_index_string); + for (auto freq_it = cpu.frequencies(); freq_it; freq_it++) { + thread_time_in_state_cpu_str_ids_.push_back( + context_->storage->InternString(cpu_string)); + } + cpu_index++; + } } } // namespace trace_processor |