Skip to main content
rightsizing · gcp

GCP Disk SSD with Low IOPS

resource types
1
rule IDs covered
1
severity
low

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

How ZopNight evaluates GCP Disk SSD with Low IOPS.
Field Value
Rule IDsRC-1234
Categoryrightsizing
Severitylow
Metricnone — pure configuration read
Sourcedisk_type_optimization.go

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

Terminal window
diskTypeOptLowOpsCeiling=100 ops/sec (read avg + write avg), 42-day lookback

Pricing 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

  1. Review disk IOPS metrics in Cloud Monitoring

Read and write ops over 42 days

GCPDiskReadOps, GCPDiskWriteOps (42-day lookback)

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

417 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

417 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·