GCP Disk SSD with Low IOPS
What does ZopNight detect here?
GCP pd-ssd persistent disks whose combined read and write average stays below 100 operations per second over a 42-day lookback are recommended for pd-balanced. Savings derive from the authoritative pd-ssd to pd-balanced SKU rate delta; missing metrics or missing regional rates make the rule abstain.
Signal and threshold
| Field | Value |
|---|---|
| Rule IDs | RC-1234 |
| Category | rightsizing |
| Severity | low |
| Metric | none — pure configuration read |
| Source | disk_type_optimization.go |
Where it applies
pd-ssd disks with read and write ops
- resource.Metadata: disk_type (must be pd-ssd; producer writes meta[“disk_type”], not Tags)
- MetricsAware (EvalContextRule): GCPDiskReadOps + GCPDiskWriteOps over 42 days (both required; missing either = data gap → abstain)
- PricingAware + SKURatesAware: per-resource cost + pd-ssd / pd-balanced SKU rates (the exact catalog codes the GCP pricing extractor emits)
The 100 ops per second ceiling
diskTypeOptLowOpsCeiling=100 ops/sec (read avg + write avg), 42-day lookbackPricing the pd-ssd to pd-balanced move
concrete-or-abstain (cost-driven rightsizing). The prior hardcoded diskTypeOptSavingsFraction=0.30 fallback is removed. savings = model.DeriveCatalogDiffSavings(srcRate, dstRate, cost, 0) from provider-authoritative pd-ssd→pd-balanced SKU rates; with the 0 fallback, absent or out-of-band rates yield 0, so the rule abstains (returns nil) rather than fabricating a published delta. (Corrected 2026-07-02): RC-1234 does not have a permanent producer gap. fetchSKURates in internal/service/service.go skips a resource only when r.InstanceType == "" || r.Provider == "" || r.Region == "", and a GCP disk’s InstanceType is not always empty, because the discoverer’s enrichGCPDisk (asset_inventory.go) sets r.InstanceType = lastSegment(type) (e.g. “pd-ssd”) from the same source field that stamps meta[“disk_type”]. So for the pd-ssd disks this rule gates on, that skip does not fire: SetSKURates flips HasSKURatesAware(“gcp”,“disk”) to true and TargetSKUCandidates([“pd-ssd”,“pd-balanced”]) seeds both rates into the bulk rate fetch. If srcRate/dstRate still resolve to 0 in production, the cause is missing pd-ssd/pd-balanced coverage in pricing_cache for that disk’s region, not a missing InstanceType. (disk_type was already read from Metadata, so the only defect fixed in-rule was the hardcoded fraction; this update only corrects a stale in-code comment that had misdiagnosed a non-existent producer gap.) Remediation is advisory only (manual snapshot→recreate→reattach; no TargetSpecRecommender).
Reading disk IOPS in Cloud Monitoring
- Review disk IOPS metrics in Cloud Monitoring
Read and write ops over 42 days
GCPDiskReadOps, GCPDiskWriteOps (42-day lookback)