aboutsummaryrefslogtreecommitdiff
path: root/src/trace_processor/importers/proto/system_probes_parser.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/trace_processor/importers/proto/system_probes_parser.cc')
-rw-r--r--src/trace_processor/importers/proto/system_probes_parser.cc77
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