Global forwarding rules charging their hourly fee with no traffic
What does ZopNight detect here?
Every global forwarding rule carries a fixed hourly fee whether traffic flows or not. ZopNight reads up to 9 traffic axes (requests, ingress and egress bytes, new and open connections) and reports the full fee as recoverable only when every harvested axis stays under a 0.05 floor for 30 days.
Signal and threshold
| Field | Value |
|---|---|
| Rule IDs | RC-1255 |
| Category | idle |
| Severity | medium |
| Metric | none — pure configuration read |
| Source | gke_idle_lb.go (GCPGlobalIdleLBRule, embeds GKEIdleLBRule) |
Where it applies
A fee that ignores traffic
GCP bills each forwarding rule a fixed hourly fee, about $0.025/hour or roughly $18 a month, from creation until deletion, before any per-GB data charges. A global forwarding rule left behind after a migration keeps that meter running against nothing. The idle verdict recovers the full fee: the optimized cost of an unused forwarding rule is $0, because unlike a compute resource there is no smaller size to move it to.
Nine axes, every one must be quiet
Load balancers express traffic in different vocabularies depending on their type: HTTPS request counts, external and internal ingress/egress bytes for passthrough LBs, and new connections, open connections, and proxied bytes for TCP/SSL proxies. The rule declares all 9 series and reads each one by name for the resource. A download-heavy passthrough LB can show near-zero ingress while egress is enormous, and a long-lived-connection proxy shows no new connections while very much alive. Idle means every axis that was actually harvested sits below the 0.05 floor. If no axis was harvested at all, the rule abstains instead of firing on absence.
Peaks veto, not just averages
The floor is applied to both the average and the maximum of each full series, so a single real burst inside an otherwise calm month blocks the delete. A measured span shorter than 30 days also blocks it: a rule observed for a week might be newly provisioned and simply not wired up yet, which is not the same thing as abandoned.
Find candidate forwarding rules
gcloud compute forwarding-rules list --global \ --format="table(name,IPAddress,target,creationTimestamp)"Cross-check any candidate against its Cloud Monitoring request graph, then delete the forwarding rule and its backend configuration together. The fee belongs to the rule, but orphaned backends invite reuse confusion.
What blocks the recommendation
Unknown or zero pricing, any axis at or above the floor on average or peak, a measurable
history shorter than 30 days, or no harvested traffic series at all. There is no fallback
to backend counts or tags; the provider-authoritative monitoring data, read through
monitoring.timeSeries.list in roles/monitoring.viewer, is the only accepted evidence.