GCP Bigtable Instance Idle
What does ZopNight detect here?
Bigtable instances whose request count averages and peaks at zero across a window with at least 30 days of coverage are flagged as idle, provided cluster CPU load stays under the 2% internal-work veto. Savings equal the instance's full monthly cost; an absent request-count series abstains.
Signal and threshold
| Field | Value |
|---|---|
| Rule IDs | RC-1244 |
| Category | idle |
| Severity | medium |
| Metric | none — pure configuration read |
| Source | bigtable_idle.go |
Where it applies
Request count, with CPU load as a veto
- MetricsAware (SetMultiMetrics): BigtableRequestCount read by name off the nested UID→metricName view; BigtableCPULoad read the same way as a corroborating “still doing internal work” veto (cpuActive, threshold 2.0%). No tag/Metadata fallback; the previous operations tag was a producerless field the discoverer never wrote and has been removed, and the rule abstains when BigtableRequestCount is absent.
- Producer fix: the Cloud Monitoring filter previously keyed BigtableRequestCount/BigtableCPULoad on the table/cluster resource labels against the Bigtable instance ID, but those labels are a table name and a cluster ID respectively and never equal the instance ID, so the filter matched no series and both metrics were permanently unproduced (rule always abstained fleet-wide). Fixed to key on the instance resource label (present on both bigtable_table and bigtable_cluster, equal to the instance ID). Because one instance can have multiple tables/clusters sharing that label, the mappings also now set aggregation.crossSeriesReducer (REDUCE_SUM for request count across tables, REDUCE_MAX for cpu_load across clusters) with groupByFields=resource.label.”instance”, so a multi-table or replicated (multi-cluster) instance resolves to one instance-wide series instead of an arbitrary single one.
Why zero requests refunds the whole instance
Concrete or abstain (cost-driven idle). Skips when the priced run-rate cost is unknown/zero (resource.pricing). Fires only when BigtableRequestCount averages/peaks at zero over a ≥30d-covered window and BigtableCPULoad does not corroborate active internal work (compaction/replication/GC) at or above 2.0%: CurrentCostUSD = SavingsUSD = cost, OptimizedCostUSD = 0. The rule abstains (returns nil) when pricing is unknown, BigtableRequestCount is absent, any request activity is observed, the CPU-corroboration veto fires, or coverage is below the 30d floor; never a fixed or fabricated estimate.
Exporting data before you delete
- Verify no applications depend on this Bigtable instance
- Export data if needed using cbt export (CLI) or the Dataflow Cloud Bigtable to Avro Files on Cloud Storage template
- Delete the instance to stop charges
- Consider Bigtable autoscaling for variable workloads
One instance-wide series across tables and clusters
BigtableRequestCount (primary, server/request_count, SUM-reduced across tables) + BigtableCPULoad (corroborating veto, cluster/cpu_load, MAX-reduced across clusters), both 30d (aggregator: backend/aggregator/internal/metrics/gcp/monitoring.go)