Merge "ui: update screenshots for integration tests"
diff --git a/Android.bp b/Android.bp
index c7f2447..57ce922 100644
--- a/Android.bp
+++ b/Android.bp
@@ -3683,6 +3683,7 @@
"protos/perfetto/metrics/android/mem_metric.proto",
"protos/perfetto/metrics/android/mem_unagg_metric.proto",
"protos/perfetto/metrics/android/multiuser_metric.proto",
+ "protos/perfetto/metrics/android/network_metric.proto",
"protos/perfetto/metrics/android/package_list.proto",
"protos/perfetto/metrics/android/powrails_metric.proto",
"protos/perfetto/metrics/android/process_metadata.proto",
@@ -3740,6 +3741,7 @@
"protos/perfetto/metrics/android/mem_metric.proto",
"protos/perfetto/metrics/android/mem_unagg_metric.proto",
"protos/perfetto/metrics/android/multiuser_metric.proto",
+ "protos/perfetto/metrics/android/network_metric.proto",
"protos/perfetto/metrics/android/package_list.proto",
"protos/perfetto/metrics/android/powrails_metric.proto",
"protos/perfetto/metrics/android/process_metadata.proto",
@@ -8082,6 +8084,7 @@
"src/trace_processor/metrics/sql/android/android_mem_unagg.sql",
"src/trace_processor/metrics/sql/android/android_multiuser.sql",
"src/trace_processor/metrics/sql/android/android_multiuser_populator.sql",
+ "src/trace_processor/metrics/sql/android/android_netperf.sql",
"src/trace_processor/metrics/sql/android/android_package_list.sql",
"src/trace_processor/metrics/sql/android/android_powrails.sql",
"src/trace_processor/metrics/sql/android/android_proxy_power.sql",
diff --git a/BUILD b/BUILD
index ccc51d8..0fbed3c 100644
--- a/BUILD
+++ b/BUILD
@@ -1054,6 +1054,7 @@
"src/trace_processor/metrics/sql/android/android_mem_unagg.sql",
"src/trace_processor/metrics/sql/android/android_multiuser.sql",
"src/trace_processor/metrics/sql/android/android_multiuser_populator.sql",
+ "src/trace_processor/metrics/sql/android/android_netperf.sql",
"src/trace_processor/metrics/sql/android/android_package_list.sql",
"src/trace_processor/metrics/sql/android/android_powrails.sql",
"src/trace_processor/metrics/sql/android/android_proxy_power.sql",
@@ -2618,6 +2619,7 @@
"protos/perfetto/metrics/android/mem_metric.proto",
"protos/perfetto/metrics/android/mem_unagg_metric.proto",
"protos/perfetto/metrics/android/multiuser_metric.proto",
+ "protos/perfetto/metrics/android/network_metric.proto",
"protos/perfetto/metrics/android/package_list.proto",
"protos/perfetto/metrics/android/powrails_metric.proto",
"protos/perfetto/metrics/android/process_metadata.proto",
diff --git a/CHANGELOG b/CHANGELOG
index 36136a7..19f75ba 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -9,6 +9,14 @@
*
+v22.1 - 2021-12-07:
+ Tracing service and probes:
+ * Added workaround for a Linux kernel bug causing some ftrace strings to
+ be non-null-terminated (https://github.com/torvalds/linux/commit/f0a5157).
+ Trace Processor:
+ * Fixed build failures on Windows.
+
+
v22.0 - 2021-12-03:
Tracing service and probes:
* Added Android SDK version to the SystemInfo trace packet.
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 9c87072..27b4e88 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -242,8 +242,7 @@
if f.LocalPath() != 'tools/ftrace_proto_gen/event_list':
continue
if any((not new_line.startswith('removed')) and new_line != old_line
- for old_line, new_line in itertools.izip(f.OldContents(),
- f.NewContents())):
+ for old_line, new_line in zip(f.OldContents(), f.NewContents())):
return [
output_api.PresubmitError(
'event_list only has two supported changes: '
diff --git a/protos/perfetto/metrics/android/BUILD.gn b/protos/perfetto/metrics/android/BUILD.gn
index c217438..b4cc80b 100644
--- a/protos/perfetto/metrics/android/BUILD.gn
+++ b/protos/perfetto/metrics/android/BUILD.gn
@@ -40,6 +40,7 @@
"mem_metric.proto",
"mem_unagg_metric.proto",
"multiuser_metric.proto",
+ "network_metric.proto",
"package_list.proto",
"powrails_metric.proto",
"process_metadata.proto",
diff --git a/protos/perfetto/metrics/android/network_metric.proto b/protos/perfetto/metrics/android/network_metric.proto
new file mode 100644
index 0000000..61fac5c
--- /dev/null
+++ b/protos/perfetto/metrics/android/network_metric.proto
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+syntax = "proto2";
+
+package perfetto.protos;
+
+message AndroidNetworkMetric {
+ message PacketStatistic {
+ // Packet count
+ optional int64 packets = 1;
+
+ // Packet Bytes
+ optional int64 bytes = 2;
+
+ // Timestamp when first packet received or transmitted
+ optional int64 first_packet_timestamp_ns = 3;
+
+ // Timestamp when last packet received or transmitted
+ optional int64 last_packet_timestamp_ns = 4;
+
+ // Interval between first & last packet. The minimum interval is 10ms.
+ optional int64 interval_ns = 5;
+
+ // Data Speed
+ optional double data_rate_kbps = 6;
+ }
+
+ message CorePacketStatistic {
+ optional uint32 id = 1;
+ optional PacketStatistic packet_statistic = 2;
+ }
+
+ message Rx {
+ // Total packets statistic
+ optional PacketStatistic total = 1;
+ // Per core packets statistic
+ repeated CorePacketStatistic core = 2;
+ }
+
+ message NetDevice {
+ // Network device name
+ optional string name = 1;
+
+ // Ingress traffic statistic
+ optional Rx rx = 2;
+ }
+
+ // Network device metrics
+ repeated NetDevice net_devices = 1;
+}
diff --git a/protos/perfetto/metrics/metrics.proto b/protos/perfetto/metrics/metrics.proto
index c948145..8bdc51e 100644
--- a/protos/perfetto/metrics/metrics.proto
+++ b/protos/perfetto/metrics/metrics.proto
@@ -38,6 +38,7 @@
import "protos/perfetto/metrics/android/mem_metric.proto";
import "protos/perfetto/metrics/android/mem_unagg_metric.proto";
import "protos/perfetto/metrics/android/multiuser_metric.proto";
+import "protos/perfetto/metrics/android/network_metric.proto";
import "protos/perfetto/metrics/android/package_list.proto";
import "protos/perfetto/metrics/android/powrails_metric.proto";
import "protos/perfetto/metrics/android/profiler_smaps.proto";
@@ -94,7 +95,7 @@
// Root message for all Perfetto-based metrics.
//
-// Next id: 40
+// Next id: 41
message TraceMetrics {
reserved 4, 10, 13, 14, 16, 19;
@@ -196,6 +197,9 @@
// Metrics for dynamic voltage and frequency scaling.
optional AndroidDvfsMetric android_dvfs = 39;
+ // Metrics for network performance.
+ optional AndroidNetworkMetric android_netperf = 40;
+
// Demo extensions.
extensions 450 to 499;
diff --git a/protos/perfetto/metrics/perfetto_merged_metrics.proto b/protos/perfetto/metrics/perfetto_merged_metrics.proto
index 15a8d87..9bd0298 100644
--- a/protos/perfetto/metrics/perfetto_merged_metrics.proto
+++ b/protos/perfetto/metrics/perfetto_merged_metrics.proto
@@ -796,6 +796,55 @@
}
// End of protos/perfetto/metrics/android/multiuser_metric.proto
+// Begin of protos/perfetto/metrics/android/network_metric.proto
+
+message AndroidNetworkMetric {
+ message PacketStatistic {
+ // Packet count
+ optional int64 packets = 1;
+
+ // Packet Bytes
+ optional int64 bytes = 2;
+
+ // Timestamp when first packet received or transmitted
+ optional int64 first_packet_timestamp_ns = 3;
+
+ // Timestamp when last packet received or transmitted
+ optional int64 last_packet_timestamp_ns = 4;
+
+ // Interval between first & last packet. The minimum interval is 10ms.
+ optional int64 interval_ns = 5;
+
+ // Data Speed
+ optional double data_rate_kbps = 6;
+ }
+
+ message CorePacketStatistic {
+ optional uint32 id = 1;
+ optional PacketStatistic packet_statistic = 2;
+ }
+
+ message Rx {
+ // Total packets statistic
+ optional PacketStatistic total = 1;
+ // Per core packets statistic
+ repeated CorePacketStatistic core = 2;
+ }
+
+ message NetDevice {
+ // Network device name
+ optional string name = 1;
+
+ // Ingress traffic statistic
+ optional Rx rx = 2;
+ }
+
+ // Network device metrics
+ repeated NetDevice net_devices = 1;
+}
+
+// End of protos/perfetto/metrics/android/network_metric.proto
+
// Begin of protos/perfetto/metrics/android/package_list.proto
message AndroidPackageList {
@@ -1272,7 +1321,7 @@
// Root message for all Perfetto-based metrics.
//
-// Next id: 40
+// Next id: 41
message TraceMetrics {
reserved 4, 10, 13, 14, 16, 19;
@@ -1374,6 +1423,9 @@
// Metrics for dynamic voltage and frequency scaling.
optional AndroidDvfsMetric android_dvfs = 39;
+ // Metrics for network performance.
+ optional AndroidNetworkMetric android_netperf = 40;
+
// Demo extensions.
extensions 450 to 499;
diff --git a/src/base/http/http_server.cc b/src/base/http/http_server.cc
index 1a90339..0b098e1 100644
--- a/src/base/http/http_server.cc
+++ b/src/base/http/http_server.cc
@@ -29,7 +29,7 @@
namespace base {
namespace {
-constexpr size_t kMaxPayloadSize = 32 * 1024 * 1024;
+constexpr size_t kMaxPayloadSize = 64 * 1024 * 1024;
constexpr size_t kMaxRequestSize = kMaxPayloadSize + 4096;
enum WebsocketOpcode : uint8_t {
diff --git a/src/trace_processor/importers/ftrace/ftrace_parser.cc b/src/trace_processor/importers/ftrace/ftrace_parser.cc
index 390d82f..403b300 100644
--- a/src/trace_processor/importers/ftrace/ftrace_parser.cc
+++ b/src/trace_processor/importers/ftrace/ftrace_parser.cc
@@ -223,8 +223,14 @@
void FtraceParser::ParseFtraceStats(ConstBytes blob) {
protos::pbzero::FtraceStats::Decoder evt(blob.data, blob.size);
- size_t phase =
- evt.phase() == protos::pbzero::FtraceStats_Phase_END_OF_TRACE ? 1 : 0;
+ bool is_start =
+ evt.phase() == protos::pbzero::FtraceStats_Phase_START_OF_TRACE;
+ bool is_end = evt.phase() == protos::pbzero::FtraceStats_Phase_END_OF_TRACE;
+ if (!is_start && !is_end) {
+ PERFETTO_ELOG("Ignoring unknown ftrace stats phase %d", evt.phase());
+ return;
+ }
+ size_t phase = is_end ? 1 : 0;
// This code relies on the fact that each ftrace_cpu_XXX_end event is
// just after the corresponding ftrace_cpu_XXX_begin event.
@@ -238,15 +244,81 @@
for (auto it = evt.cpu_stats(); it; ++it) {
protos::pbzero::FtraceCpuStats::Decoder cpu_stats(*it);
int cpu = static_cast<int>(cpu_stats.cpu());
+
+ int64_t entries = static_cast<int64_t>(cpu_stats.entries());
+ int64_t overrun = static_cast<int64_t>(cpu_stats.overrun());
+ int64_t commit_overrun = static_cast<int64_t>(cpu_stats.commit_overrun());
+ int64_t bytes_read = static_cast<int64_t>(cpu_stats.bytes_read());
+ int64_t dropped_events = static_cast<int64_t>(cpu_stats.dropped_events());
+ int64_t read_events = static_cast<int64_t>(cpu_stats.read_events());
+ int64_t now_ts = static_cast<int64_t>(cpu_stats.now_ts() * 1e9);
+
storage->SetIndexedStats(stats::ftrace_cpu_entries_begin + phase, cpu,
- static_cast<int64_t>(cpu_stats.entries()));
+ entries);
storage->SetIndexedStats(stats::ftrace_cpu_overrun_begin + phase, cpu,
- static_cast<int64_t>(cpu_stats.overrun()));
+ overrun);
storage->SetIndexedStats(stats::ftrace_cpu_commit_overrun_begin + phase,
- cpu,
- static_cast<int64_t>(cpu_stats.commit_overrun()));
+ cpu, commit_overrun);
storage->SetIndexedStats(stats::ftrace_cpu_bytes_read_begin + phase, cpu,
- static_cast<int64_t>(cpu_stats.bytes_read()));
+ bytes_read);
+ storage->SetIndexedStats(stats::ftrace_cpu_dropped_events_begin + phase,
+ cpu, dropped_events);
+ storage->SetIndexedStats(stats::ftrace_cpu_read_events_begin + phase, cpu,
+ read_events);
+ storage->SetIndexedStats(stats::ftrace_cpu_now_ts_begin + phase, cpu,
+ now_ts);
+
+ if (is_end) {
+ auto opt_entries_begin =
+ storage->GetIndexedStats(stats::ftrace_cpu_entries_begin, cpu);
+ if (opt_entries_begin) {
+ int64_t delta_entries = entries - opt_entries_begin.value();
+ storage->SetIndexedStats(stats::ftrace_cpu_entries_delta, cpu,
+ delta_entries);
+ }
+
+ auto opt_overrun_begin =
+ storage->GetIndexedStats(stats::ftrace_cpu_overrun_begin, cpu);
+ if (opt_overrun_begin) {
+ int64_t delta_overrun = overrun - opt_overrun_begin.value();
+ storage->SetIndexedStats(stats::ftrace_cpu_overrun_delta, cpu,
+ delta_overrun);
+ }
+
+ auto opt_commit_overrun_begin =
+ storage->GetIndexedStats(stats::ftrace_cpu_commit_overrun_begin, cpu);
+ if (opt_commit_overrun_begin) {
+ int64_t delta_commit_overrun =
+ commit_overrun - opt_commit_overrun_begin.value();
+ storage->SetIndexedStats(stats::ftrace_cpu_commit_overrun_delta, cpu,
+ delta_commit_overrun);
+ }
+
+ auto opt_bytes_read_begin =
+ storage->GetIndexedStats(stats::ftrace_cpu_bytes_read_begin, cpu);
+ if (opt_bytes_read_begin) {
+ int64_t delta_bytes_read = bytes_read - opt_bytes_read_begin.value();
+ storage->SetIndexedStats(stats::ftrace_cpu_bytes_read_delta, cpu,
+ delta_bytes_read);
+ }
+
+ auto opt_dropped_events_begin =
+ storage->GetIndexedStats(stats::ftrace_cpu_dropped_events_begin, cpu);
+ if (opt_dropped_events_begin) {
+ int64_t delta_dropped_events =
+ dropped_events - opt_dropped_events_begin.value();
+ storage->SetIndexedStats(stats::ftrace_cpu_dropped_events_delta, cpu,
+ delta_dropped_events);
+ }
+
+ auto opt_read_events_begin =
+ storage->GetIndexedStats(stats::ftrace_cpu_read_events_begin, cpu);
+ if (opt_read_events_begin) {
+ int64_t delta_read_events = read_events - opt_read_events_begin.value();
+ storage->SetIndexedStats(stats::ftrace_cpu_read_events_delta, cpu,
+ delta_read_events);
+ }
+ }
// oldest_event_ts can often be set to very high values, possibly because
// of wrapping. Ensure that we are not overflowing to avoid ubsan
@@ -266,14 +338,6 @@
storage->SetIndexedStats(stats::ftrace_cpu_oldest_event_ts_begin + phase,
cpu, static_cast<int64_t>(oldest_event_ts));
}
-
- storage->SetIndexedStats(stats::ftrace_cpu_now_ts_begin + phase, cpu,
- static_cast<int64_t>(cpu_stats.now_ts() * 1e9));
- storage->SetIndexedStats(stats::ftrace_cpu_dropped_events_begin + phase,
- cpu,
- static_cast<int64_t>(cpu_stats.dropped_events()));
- storage->SetIndexedStats(stats::ftrace_cpu_read_events_begin + phase, cpu,
- static_cast<int64_t>(cpu_stats.read_events()));
}
}
diff --git a/src/trace_processor/metrics/sql/BUILD.gn b/src/trace_processor/metrics/sql/BUILD.gn
index 7ddbf2a..8be8f90 100644
--- a/src/trace_processor/metrics/sql/BUILD.gn
+++ b/src/trace_processor/metrics/sql/BUILD.gn
@@ -30,6 +30,7 @@
"android/android_hwui_threads.sql",
"android/android_mem.sql",
"android/android_mem_unagg.sql",
+ "android/android_netperf.sql",
"android/android_ion.sql",
"android/composer_execution.sql",
"android/composition_layers.sql",
diff --git a/src/trace_processor/metrics/sql/android/android_netperf.sql b/src/trace_processor/metrics/sql/android/android_netperf.sql
new file mode 100644
index 0000000..f7d8ae5
--- /dev/null
+++ b/src/trace_processor/metrics/sql/android/android_netperf.sql
@@ -0,0 +1,93 @@
+--
+-- Copyright 2021 The Android Open Source Project
+--
+-- Licensed under the Apache License, Version 2.0 (the "License");
+-- you may not use this file except in compliance with the License.
+-- You may obtain a copy of the License at
+--
+-- https://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software
+-- distributed under the License is distributed on an "AS IS" BASIS,
+-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+-- See the License for the specific language governing permissions and
+-- limitations under the License.
+
+DROP VIEW IF EXISTS rx_packets;
+CREATE VIEW rx_packets AS
+ SELECT
+ ts,
+ RTRIM(name, " Received KB") AS dev,
+ EXTRACT_ARG(arg_set_id, 'cpu') AS cpu,
+ EXTRACT_ARG(arg_set_id, 'len') AS len
+ FROM counter c
+ LEFT JOIN counter_track t
+ ON c.track_id = t.id
+ WHERE name GLOB "* Received KB"
+ ORDER BY ts DESC;
+
+DROP VIEW IF EXISTS device_total_ingress_traffic;
+CREATE VIEW device_total_ingress_traffic AS
+ SELECT
+ dev,
+ MIN(ts) AS start_ts,
+ MAX(ts) AS end_ts,
+ IIF((MAX(ts) - MIN(ts)) > 10000000, MAX(ts)-MIN(ts), 10000000) AS interval,
+ count(1) AS packets,
+ SUM(len) AS bytes
+ FROM rx_packets
+ GROUP BY dev;
+
+DROP VIEW IF EXISTS device_per_core_ingress_traffic;
+CREATE VIEW device_per_core_ingress_traffic AS
+ SELECT
+ dev,
+ AndroidNetworkMetric_CorePacketStatistic(
+ 'id', cpu,
+ 'packet_statistic', AndroidNetworkMetric_PacketStatistic(
+ 'packets', count(1),
+ 'bytes', SUM(len),
+ 'first_packet_timestamp_ns', MIN(ts),
+ 'last_packet_timestamp_ns', MAX(ts),
+ 'interval_ns', IIF((MAX(ts)-MIN(ts))>10000000, MAX(ts)-MIN(ts), 10000000),
+ 'data_rate_kbps', (SUM(len)*8)/(IIF((MAX(ts)-MIN(ts))>10000000, MAX(ts)-MIN(ts), 10000000)/1e9)/1024
+ )
+ ) AS proto
+ FROM rx_packets
+ GROUP BY dev, cpu;
+
+DROP VIEW IF EXISTS device_ingress_traffic_statistic;
+CREATE VIEW device_ingress_traffic_statistic AS
+ SELECT
+ AndroidNetworkMetric_NetDevice(
+ 'name', dev,
+ 'rx', AndroidNetworkMetric_Rx(
+ 'total', AndroidNetworkMetric_PacketStatistic(
+ 'packets', packets,
+ 'bytes', bytes,
+ 'first_packet_timestamp_ns', start_ts,
+ 'last_packet_timestamp_ns', end_ts,
+ 'interval_ns', interval,
+ 'data_rate_kbps', (bytes*8)/(interval/1e9)/1024
+ ),
+ 'core', (
+ SELECT
+ RepeatedField(proto)
+ FROM device_per_core_ingress_traffic
+ WHERE device_per_core_ingress_traffic.dev = device_total_ingress_traffic.dev
+ )
+ )
+ ) AS proto
+ FROM device_total_ingress_traffic
+ ORDER BY dev;
+
+DROP VIEW IF EXISTS android_netperf_output;
+CREATE VIEW android_netperf_output AS
+ SELECT AndroidNetworkMetric(
+ 'net_devices', (
+ SELECT
+ RepeatedField(proto)
+ FROM device_ingress_traffic_statistic
+ )
+ );
+
diff --git a/src/trace_processor/python/perfetto/trace_processor/metrics.descriptor b/src/trace_processor/python/perfetto/trace_processor/metrics.descriptor
index 167645f..9ade464 100644
--- a/src/trace_processor/python/perfetto/trace_processor/metrics.descriptor
+++ b/src/trace_processor/python/perfetto/trace_processor/metrics.descriptor
Binary files differ
diff --git a/src/trace_processor/python/perfetto/trace_processor/metrics.descriptor.sha1 b/src/trace_processor/python/perfetto/trace_processor/metrics.descriptor.sha1
index 5d91f78..1a51f76 100644
--- a/src/trace_processor/python/perfetto/trace_processor/metrics.descriptor.sha1
+++ b/src/trace_processor/python/perfetto/trace_processor/metrics.descriptor.sha1
@@ -2,5 +2,5 @@
// SHA1(tools/gen_binary_descriptors)
// 9fc6d77de57ec76a80b76aa282f4c7cf5ce55eec
// SHA1(protos/perfetto/metrics/metrics.proto)
-// fe8af2b2dce211830488daf2357aea79b4b2a539
+// 1653b1ab1e7701e7a30c606e357ab1957fa2fd48
\ No newline at end of file
diff --git a/src/trace_processor/storage/stats.h b/src/trace_processor/storage/stats.h
index 7e537ca..b52a4c9 100644
--- a/src/trace_processor/storage/stats.h
+++ b/src/trace_processor/storage/stats.h
@@ -35,22 +35,28 @@
F(ftrace_bundle_tokenizer_errors, kSingle, kError, kAnalysis, ""), \
F(ftrace_cpu_bytes_read_begin, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_bytes_read_end, kIndexed, kInfo, kTrace, ""), \
- F(ftrace_cpu_commit_overrun_begin, kIndexed, kError, kTrace, ""), \
- F(ftrace_cpu_commit_overrun_end, kIndexed, kError, kTrace, ""), \
- F(ftrace_cpu_dropped_events_begin, kIndexed, kError, kTrace, ""), \
- F(ftrace_cpu_dropped_events_end, kIndexed, kError, kTrace, ""), \
+ F(ftrace_cpu_bytes_read_delta, kIndexed, kInfo, kTrace, ""), \
+ F(ftrace_cpu_commit_overrun_begin, kIndexed, kInfo, kTrace, ""), \
+ F(ftrace_cpu_commit_overrun_end, kIndexed, kInfo, kTrace, ""), \
+ F(ftrace_cpu_commit_overrun_delta, kIndexed, kError, kTrace, ""), \
+ F(ftrace_cpu_dropped_events_begin, kIndexed, kInfo, kTrace, ""), \
+ F(ftrace_cpu_dropped_events_end, kIndexed, kInfo, kTrace, ""), \
+ F(ftrace_cpu_dropped_events_delta, kIndexed, kError, kTrace, ""), \
F(ftrace_cpu_entries_begin, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_entries_end, kIndexed, kInfo, kTrace, ""), \
+ F(ftrace_cpu_entries_delta, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_now_ts_begin, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_now_ts_end, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_oldest_event_ts_begin, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_oldest_event_ts_end, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_overrun_begin, kIndexed, kInfo, kTrace, ""), \
- F(ftrace_cpu_overrun_end, kIndexed, kDataLoss, kTrace, \
+ F(ftrace_cpu_overrun_end, kIndexed, kInfo, kTrace, ""), \
+ F(ftrace_cpu_overrun_delta, kIndexed, kDataLoss, kTrace, \
"The kernel ftrace buffer cannot keep up with the rate of events " \
"produced. Indexed by CPU. This is likely a misconfiguration."), \
F(ftrace_cpu_read_events_begin, kIndexed, kInfo, kTrace, ""), \
F(ftrace_cpu_read_events_end, kIndexed, kInfo, kTrace, ""), \
+ F(ftrace_cpu_read_events_delta, kIndexed, kInfo, kTrace, ""), \
F(fuchsia_non_numeric_counters, kSingle, kError, kAnalysis, ""), \
F(fuchsia_timestamp_overflow, kSingle, kError, kAnalysis, ""), \
F(fuchsia_invalid_event, kSingle, kError, kAnalysis, ""), \
diff --git a/src/trace_processor/storage/trace_storage.h b/src/trace_processor/storage/trace_storage.h
index f092c74..af98024 100644
--- a/src/trace_processor/storage/trace_storage.h
+++ b/src/trace_processor/storage/trace_storage.h
@@ -256,6 +256,17 @@
stats_[key].indexed_values[index] = value;
}
+ // Example usage: opt_cpu_failure = GetIndexedStats(stats::cpu_failure, 1);
+ base::Optional<int64_t> GetIndexedStats(size_t key, int index) {
+ PERFETTO_DCHECK(key < stats::kNumKeys);
+ PERFETTO_DCHECK(stats::kTypes[key] == stats::kIndexed);
+ auto kv = stats_[key].indexed_values.find(index);
+ if (kv != stats_[key].indexed_values.end()) {
+ return kv->second;
+ }
+ return base::nullopt;
+ }
+
class ScopedStatsTracer {
public:
ScopedStatsTracer(TraceStorage* storage, size_t key)
diff --git a/test/trace_processor/network/index b/test/trace_processor/network/index
index a252836..73f9898 100644
--- a/test/trace_processor/network/index
+++ b/test/trace_processor/network/index
@@ -1,2 +1,3 @@
# Network performance
netif_receive_skb.textproto netif_receive_skb.sql netif_receive_skb.out
+netperf_metric.textproto android_netperf netperf_metric.out
diff --git a/test/trace_processor/network/netperf_metric.out b/test/trace_processor/network/netperf_metric.out
new file mode 100644
index 0000000..89ca722
--- /dev/null
+++ b/test/trace_processor/network/netperf_metric.out
@@ -0,0 +1,61 @@
+android_netperf{
+ net_devices {
+ name: "rmnet0"
+ rx {
+ total {
+ packets: 4
+ bytes: 4096
+ first_packet_timestamp_ns: 100000000
+ last_packet_timestamp_ns: 140000000
+ interval_ns: 40000000
+ data_rate_kbps: 800.0
+ }
+ core {
+ id: 0
+ packet_statistic {
+ packets: 2
+ bytes: 2048
+ first_packet_timestamp_ns: 100000000
+ last_packet_timestamp_ns: 140000000
+ interval_ns: 40000000
+ data_rate_kbps: 400.0
+ }
+ }
+ core {
+ id: 1
+ packet_statistic {
+ packets: 2
+ bytes: 2048
+ first_packet_timestamp_ns: 120000000
+ last_packet_timestamp_ns: 140000000
+ interval_ns: 20000000
+ data_rate_kbps: 800.0
+ }
+ }
+ }
+ }
+ net_devices {
+ name: "wlan"
+ rx {
+ total {
+ packets: 1
+ bytes: 512
+ first_packet_timestamp_ns: 100000000
+ last_packet_timestamp_ns: 100000000
+ interval_ns: 10000000
+ data_rate_kbps: 400.0
+ }
+ core {
+ id: 4
+ packet_statistic {
+ packets: 1
+ bytes: 512
+ first_packet_timestamp_ns: 100000000
+ last_packet_timestamp_ns: 100000000
+ interval_ns: 10000000
+ data_rate_kbps: 400.0
+ }
+ }
+ }
+ }
+}
diff --git a/test/trace_processor/network/netperf_metric.textproto b/test/trace_processor/network/netperf_metric.textproto
new file mode 100644
index 0000000..ffa3ad1
--- /dev/null
+++ b/test/trace_processor/network/netperf_metric.textproto
@@ -0,0 +1,65 @@
+ packet {
+ ftrace_events {
+ cpu: 0
+ event {
+ timestamp: 100000000
+ pid: 200
+ netif_receive_skb {
+ name: "rmnet0"
+ len: 1024
+ }
+ }
+ }
+}
+packet {
+ ftrace_events {
+ cpu: 1
+ event {
+ timestamp: 120000000
+ pid: 300
+ netif_receive_skb {
+ name: "rmnet0"
+ len: 1024
+ }
+ }
+ }
+}
+packet {
+ ftrace_events {
+ cpu: 0
+ event {
+ timestamp: 140000000
+ pid: 400
+ netif_receive_skb {
+ name: "rmnet0"
+ len: 1024
+ }
+ }
+ }
+}
+packet {
+ ftrace_events {
+ cpu: 1
+ event {
+ timestamp: 140000000
+ pid: 500
+ netif_receive_skb {
+ name: "rmnet0"
+ len: 1024
+ }
+ }
+ }
+}
+packet {
+ ftrace_events {
+ cpu: 4
+ event {
+ timestamp: 100000000
+ pid: 600
+ netif_receive_skb {
+ name: "wlan"
+ len: 512
+ }
+ }
+ }
+}
diff --git a/test/trace_processor/parsing/android_sched_and_ps_stats.out b/test/trace_processor/parsing/android_sched_and_ps_stats.out
index 4ff60f7..fcc2279 100644
--- a/test/trace_processor/parsing/android_sched_and_ps_stats.out
+++ b/test/trace_processor/parsing/android_sched_and_ps_stats.out
@@ -15,38 +15,62 @@
"ftrace_cpu_bytes_read_end",5,"info","trace",1188
"ftrace_cpu_bytes_read_end",6,"info","trace",1576
"ftrace_cpu_bytes_read_end",7,"info","trace",3264
-"ftrace_cpu_commit_overrun_begin",0,"error","trace",0
-"ftrace_cpu_commit_overrun_begin",1,"error","trace",0
-"ftrace_cpu_commit_overrun_begin",2,"error","trace",0
-"ftrace_cpu_commit_overrun_begin",3,"error","trace",0
-"ftrace_cpu_commit_overrun_begin",4,"error","trace",0
-"ftrace_cpu_commit_overrun_begin",5,"error","trace",0
-"ftrace_cpu_commit_overrun_begin",6,"error","trace",0
-"ftrace_cpu_commit_overrun_begin",7,"error","trace",0
-"ftrace_cpu_commit_overrun_end",0,"error","trace",0
-"ftrace_cpu_commit_overrun_end",1,"error","trace",0
-"ftrace_cpu_commit_overrun_end",2,"error","trace",0
-"ftrace_cpu_commit_overrun_end",3,"error","trace",0
-"ftrace_cpu_commit_overrun_end",4,"error","trace",0
-"ftrace_cpu_commit_overrun_end",5,"error","trace",0
-"ftrace_cpu_commit_overrun_end",6,"error","trace",0
-"ftrace_cpu_commit_overrun_end",7,"error","trace",0
-"ftrace_cpu_dropped_events_begin",0,"error","trace",0
-"ftrace_cpu_dropped_events_begin",1,"error","trace",0
-"ftrace_cpu_dropped_events_begin",2,"error","trace",0
-"ftrace_cpu_dropped_events_begin",3,"error","trace",0
-"ftrace_cpu_dropped_events_begin",4,"error","trace",0
-"ftrace_cpu_dropped_events_begin",5,"error","trace",0
-"ftrace_cpu_dropped_events_begin",6,"error","trace",0
-"ftrace_cpu_dropped_events_begin",7,"error","trace",0
-"ftrace_cpu_dropped_events_end",0,"error","trace",0
-"ftrace_cpu_dropped_events_end",1,"error","trace",0
-"ftrace_cpu_dropped_events_end",2,"error","trace",0
-"ftrace_cpu_dropped_events_end",3,"error","trace",0
-"ftrace_cpu_dropped_events_end",4,"error","trace",0
-"ftrace_cpu_dropped_events_end",5,"error","trace",0
-"ftrace_cpu_dropped_events_end",6,"error","trace",0
-"ftrace_cpu_dropped_events_end",7,"error","trace",0
+"ftrace_cpu_bytes_read_delta",0,"info","trace",20236
+"ftrace_cpu_bytes_read_delta",1,"info","trace",11380
+"ftrace_cpu_bytes_read_delta",2,"info","trace",12336
+"ftrace_cpu_bytes_read_delta",3,"info","trace",6236
+"ftrace_cpu_bytes_read_delta",4,"info","trace",2676
+"ftrace_cpu_bytes_read_delta",5,"info","trace",1188
+"ftrace_cpu_bytes_read_delta",6,"info","trace",1576
+"ftrace_cpu_bytes_read_delta",7,"info","trace",3264
+"ftrace_cpu_commit_overrun_begin",0,"info","trace",0
+"ftrace_cpu_commit_overrun_begin",1,"info","trace",0
+"ftrace_cpu_commit_overrun_begin",2,"info","trace",0
+"ftrace_cpu_commit_overrun_begin",3,"info","trace",0
+"ftrace_cpu_commit_overrun_begin",4,"info","trace",0
+"ftrace_cpu_commit_overrun_begin",5,"info","trace",0
+"ftrace_cpu_commit_overrun_begin",6,"info","trace",0
+"ftrace_cpu_commit_overrun_begin",7,"info","trace",0
+"ftrace_cpu_commit_overrun_end",0,"info","trace",0
+"ftrace_cpu_commit_overrun_end",1,"info","trace",0
+"ftrace_cpu_commit_overrun_end",2,"info","trace",0
+"ftrace_cpu_commit_overrun_end",3,"info","trace",0
+"ftrace_cpu_commit_overrun_end",4,"info","trace",0
+"ftrace_cpu_commit_overrun_end",5,"info","trace",0
+"ftrace_cpu_commit_overrun_end",6,"info","trace",0
+"ftrace_cpu_commit_overrun_end",7,"info","trace",0
+"ftrace_cpu_commit_overrun_delta",0,"error","trace",0
+"ftrace_cpu_commit_overrun_delta",1,"error","trace",0
+"ftrace_cpu_commit_overrun_delta",2,"error","trace",0
+"ftrace_cpu_commit_overrun_delta",3,"error","trace",0
+"ftrace_cpu_commit_overrun_delta",4,"error","trace",0
+"ftrace_cpu_commit_overrun_delta",5,"error","trace",0
+"ftrace_cpu_commit_overrun_delta",6,"error","trace",0
+"ftrace_cpu_commit_overrun_delta",7,"error","trace",0
+"ftrace_cpu_dropped_events_begin",0,"info","trace",0
+"ftrace_cpu_dropped_events_begin",1,"info","trace",0
+"ftrace_cpu_dropped_events_begin",2,"info","trace",0
+"ftrace_cpu_dropped_events_begin",3,"info","trace",0
+"ftrace_cpu_dropped_events_begin",4,"info","trace",0
+"ftrace_cpu_dropped_events_begin",5,"info","trace",0
+"ftrace_cpu_dropped_events_begin",6,"info","trace",0
+"ftrace_cpu_dropped_events_begin",7,"info","trace",0
+"ftrace_cpu_dropped_events_end",0,"info","trace",0
+"ftrace_cpu_dropped_events_end",1,"info","trace",0
+"ftrace_cpu_dropped_events_end",2,"info","trace",0
+"ftrace_cpu_dropped_events_end",3,"info","trace",0
+"ftrace_cpu_dropped_events_end",4,"info","trace",0
+"ftrace_cpu_dropped_events_end",5,"info","trace",0
+"ftrace_cpu_dropped_events_end",6,"info","trace",0
+"ftrace_cpu_dropped_events_end",7,"info","trace",0
+"ftrace_cpu_dropped_events_delta",0,"error","trace",0
+"ftrace_cpu_dropped_events_delta",1,"error","trace",0
+"ftrace_cpu_dropped_events_delta",2,"error","trace",0
+"ftrace_cpu_dropped_events_delta",3,"error","trace",0
+"ftrace_cpu_dropped_events_delta",4,"error","trace",0
+"ftrace_cpu_dropped_events_delta",5,"error","trace",0
+"ftrace_cpu_dropped_events_delta",6,"error","trace",0
+"ftrace_cpu_dropped_events_delta",7,"error","trace",0
"ftrace_cpu_entries_begin",0,"info","trace",4
"ftrace_cpu_entries_begin",1,"info","trace",4
"ftrace_cpu_entries_begin",2,"info","trace",23
@@ -63,6 +87,14 @@
"ftrace_cpu_entries_end",5,"info","trace",21
"ftrace_cpu_entries_end",6,"info","trace",26
"ftrace_cpu_entries_end",7,"info","trace",54
+"ftrace_cpu_entries_delta",0,"info","trace",337
+"ftrace_cpu_entries_delta",1,"info","trace",191
+"ftrace_cpu_entries_delta",2,"info","trace",202
+"ftrace_cpu_entries_delta",3,"info","trace",107
+"ftrace_cpu_entries_delta",4,"info","trace",45
+"ftrace_cpu_entries_delta",5,"info","trace",21
+"ftrace_cpu_entries_delta",6,"info","trace",26
+"ftrace_cpu_entries_delta",7,"info","trace",54
"ftrace_cpu_now_ts_begin",0,"info","trace",81473010735000
"ftrace_cpu_now_ts_begin",1,"info","trace",81473010800000
"ftrace_cpu_now_ts_begin",2,"info","trace",81473010839000
@@ -103,14 +135,22 @@
"ftrace_cpu_overrun_begin",5,"info","trace",0
"ftrace_cpu_overrun_begin",6,"info","trace",0
"ftrace_cpu_overrun_begin",7,"info","trace",0
-"ftrace_cpu_overrun_end",0,"data_loss","trace",0
-"ftrace_cpu_overrun_end",1,"data_loss","trace",0
-"ftrace_cpu_overrun_end",2,"data_loss","trace",0
-"ftrace_cpu_overrun_end",3,"data_loss","trace",0
-"ftrace_cpu_overrun_end",4,"data_loss","trace",0
-"ftrace_cpu_overrun_end",5,"data_loss","trace",0
-"ftrace_cpu_overrun_end",6,"data_loss","trace",0
-"ftrace_cpu_overrun_end",7,"data_loss","trace",0
+"ftrace_cpu_overrun_end",0,"info","trace",0
+"ftrace_cpu_overrun_end",1,"info","trace",0
+"ftrace_cpu_overrun_end",2,"info","trace",0
+"ftrace_cpu_overrun_end",3,"info","trace",0
+"ftrace_cpu_overrun_end",4,"info","trace",0
+"ftrace_cpu_overrun_end",5,"info","trace",0
+"ftrace_cpu_overrun_end",6,"info","trace",0
+"ftrace_cpu_overrun_end",7,"info","trace",0
+"ftrace_cpu_overrun_delta",0,"data_loss","trace",0
+"ftrace_cpu_overrun_delta",1,"data_loss","trace",0
+"ftrace_cpu_overrun_delta",2,"data_loss","trace",0
+"ftrace_cpu_overrun_delta",3,"data_loss","trace",0
+"ftrace_cpu_overrun_delta",4,"data_loss","trace",0
+"ftrace_cpu_overrun_delta",5,"data_loss","trace",0
+"ftrace_cpu_overrun_delta",6,"data_loss","trace",0
+"ftrace_cpu_overrun_delta",7,"data_loss","trace",0
"ftrace_cpu_read_events_begin",0,"info","trace",0
"ftrace_cpu_read_events_begin",1,"info","trace",0
"ftrace_cpu_read_events_begin",2,"info","trace",0
@@ -127,6 +167,14 @@
"ftrace_cpu_read_events_end",5,"info","trace",23232
"ftrace_cpu_read_events_end",6,"info","trace",36733
"ftrace_cpu_read_events_end",7,"info","trace",39240
+"ftrace_cpu_read_events_delta",0,"info","trace",62303
+"ftrace_cpu_read_events_delta",1,"info","trace",54916
+"ftrace_cpu_read_events_delta",2,"info","trace",55882
+"ftrace_cpu_read_events_delta",3,"info","trace",47953
+"ftrace_cpu_read_events_delta",4,"info","trace",31345
+"ftrace_cpu_read_events_delta",5,"info","trace",23232
+"ftrace_cpu_read_events_delta",6,"info","trace",36733
+"ftrace_cpu_read_events_delta",7,"info","trace",39240
"traced_buf_buffer_size",0,"info","trace",0
"traced_buf_bytes_overwritten",0,"info","trace",0
"traced_buf_bytes_read",0,"info","trace",0