From 1fb910e0a2e01fdca7b44ce83e495dde96448432 Mon Sep 17 00:00:00 2001 From: PJ Date: Sat, 22 Aug 2026 21:41:40 +0530 Subject: [PATCH] fix(driver): a CPU sample the driver never took is absent, not zero CDP exposes no per-page CPU, so chrome's Metrics filled CPUPercent with a zero, which is the same answer an idle app gives. Making the field optional is the same fix as the iOS reads: absence is the only honest way to say nothing looked. --- internal/driver/driver.go | 5 ++++- internal/driver/sidecar/client.go | 3 ++- internal/driver/sidecar/client_test.go | 3 ++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/internal/driver/driver.go b/internal/driver/driver.go index 4d1ca25..71e5fab 100644 --- a/internal/driver/driver.go +++ b/internal/driver/driver.go @@ -183,7 +183,10 @@ type Health struct { } type Metrics struct { - CPUPercent float64 + // CPUPercent is nil on a driver that samples memory but not CPU, which + // Chrome does: zero is a reading an idle app can produce, so a driver that + // never looked has to answer with nothing rather than with that. + CPUPercent *float64 HeapBytes int64 TotalMemoryBytes int64 } diff --git a/internal/driver/sidecar/client.go b/internal/driver/sidecar/client.go index 1673103..5f4ef8a 100644 --- a/internal/driver/sidecar/client.go +++ b/internal/driver/sidecar/client.go @@ -300,8 +300,9 @@ func (c *Client) Metrics(ctx context.Context, bundleID string) (driver.Metrics, if err != nil { return driver.Metrics{}, err } + cpuPercent := response.GetCpuPercent() return driver.Metrics{ - CPUPercent: response.GetCpuPercent(), + CPUPercent: &cpuPercent, HeapBytes: response.GetHeapBytes(), TotalMemoryBytes: response.GetTotalMemoryBytes(), }, nil diff --git a/internal/driver/sidecar/client_test.go b/internal/driver/sidecar/client_test.go index d9c5693..37b746d 100644 --- a/internal/driver/sidecar/client_test.go +++ b/internal/driver/sidecar/client_test.go @@ -651,7 +651,8 @@ func TestClient_MetricsMapsResponseFields(t *testing.T) { if err != nil { t.Fatal(err) } - if got.CPUPercent != 12.5 || got.HeapBytes != 100 || got.TotalMemoryBytes != 200 { + if got.CPUPercent == nil || *got.CPUPercent != 12.5 || + got.HeapBytes != 100 || got.TotalMemoryBytes != 200 { t.Errorf("metrics mapping wrong: %+v", got) } if len(state.fake.metricsBundles) != 1 || state.fake.metricsBundles[0] != "com.example" {