Standard-class buckets whose objects are almost never read
What does ZopNight detect here?
Standard storage costs about $0.020 per GB-month while Nearline costs $0.010 in the same regions, a 50% delta. ZopNight recommends the move only when the measured access rate stays under 0.05 operations per day for 30 days. An uninstrumented bucket is never reclassed blind.
Signal and threshold
| Field | Value |
|---|---|
| Rule IDs | RC-1233 |
| Category | rightsizing |
| Severity | low |
| Metric | none — pure configuration read |
| Source | bucket_nearline.go |
Where it applies
One access every 20 days is the bar
The rule watches each Standard-class bucket’s average daily API-operation rate over 30 days and calls it cold below 0.05 operations per day, roughly one access every 20 days. That bar is deliberately severe, because Nearline punishes misclassification: it adds a per-GB retrieval fee and per-operation charges that erase the storage saving on any bucket that is actually read. A bucket at or above the bar is left on Standard without comment.
Half the storage rate, same bucket
Standard storage runs about $0.020 per GB-month against Nearline’s $0.010 (us-central1 reference pricing), so the recommendation applies a 50% delta to the bucket’s known monthly cost, a real cost because bucket capacity is backfilled from the measured total-bytes series rather than assumed. Three gates must all pass: the default class is recorded as STANDARD, the access-rate series exists and reads cold, and a positive cost is known. Miss any one and nothing is emitted; in particular, a bucket whose monitoring was never instrumented has an unknown access pattern and is never reclassed on that unknown.
Measure the access rate
curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \ "https://monitoring.googleapis.com/v3/projects/PROJECT_ID/timeSeries?filter=metric.type%3D%22storage.googleapis.com%2Fapi%2Frequest_count%22%20AND%20resource.labels.bucket_name%3D%22my-bucket%22&interval.startTime=$(date -u -v-30d +%Y-%m-%dT%H:%M:%SZ)&interval.endTime=$(date -u +%Y-%m-%dT%H:%M:%SZ)"The series behind the rule is read with monitoring.timeSeries.list
(roles/monitoring.viewer); the bucket’s own configuration comes from
storage.buckets.get.
Default class changes affect new objects first
gcloud storage buckets update gs://my-bucket --default-storage-class=NEARLINE changes
what class new objects land in. Existing objects keep their class until rewritten or
moved by a lifecycle rule, so pair the default-class change with a transition rule if the
bulk of the data is already there. Mind Nearline’s 30-day minimum storage duration:
objects deleted or reclassed sooner still bill the full 30 days.
Quiet cases
Buckets already on Nearline, Coldline, or Archive; buckets whose storage class was never recorded; access at or above 0.05 ops/day; a missing access-rate series; or an unknown cost. Each abstains; the rule never converts an unmeasured bucket.