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" {