How to Check Google Persistent Disk Space Usage Programmatically (Bulk Monitoring Guide)


2 views

html

When managing multiple Google Persistent Disks, checking each disk individually through the Cloud Console becomes impractical. DevOps engineers need programmatic solutions that provide:

  • Bulk disk space metrics aggregation
  • Automation-friendly output formats
  • Integration with monitoring systems

The most efficient approach combines gcloud commands with jq for JSON processing:

# List all disks with space metrics in JSON format
gcloud compute disks list --format=json \
  --filter="status:READY" \
  | jq -r '.[] | [.name, .sizeGb, .users] | @tsv'

For more detailed metrics including actual usage (requires OS-level tools):

# SSH into instance and check mounted disks
gcloud compute ssh INSTANCE_NAME --command="df -h | grep -E '/dev/sd[a-z]'"

For production environments, use the Cloud Monitoring API:

from google.cloud import monitoring_v3

client = monitoring_v3.MetricServiceClient()
project_name = f"projects/YOUR_PROJECT_ID"

# Query for disk usage metrics
results = client.list_time_series(
    name=project_name,
    filter='metric.type="agent.googleapis.com/disk/percent_used"',
    interval=monitoring_v3.TimeInterval(),
)
for result in results:
    print(f"Disk: {result.metric.labels['device']}")
    print(f"Usage: {result.points[0].value.double_value}%")

Create a complete monitoring solution with Cloud Functions:

const {Monitoring} = require('@google-cloud/monitoring');
const monitoring = new Monitoring();

exports.checkDiskSpace = async (event, context) => {
  const [timeSeries] = await monitoring.listTimeSeries({
    name: monitoring.projectPath(process.env.GCP_PROJECT),
    filter: 'metric.type="agent.googleapis.com/disk/percent_used"',
    interval: {
      startTime: {seconds: Date.now()/1000 - 300},
      endTime: {seconds: Date.now()/1000},
    },
  });

  timeSeries.forEach(series => {
    const usage = series.points[0].value.doubleValue;
    if (usage > 85) {
      // Trigger alert via Cloud Pub/Sub
      console.error(ALERT: ${series.metric.labels.device} at ${usage}%);
    }
  });
};
  • Combine with Stackdriver for historical trends
  • Set up IAM permissions properly for service accounts
  • Consider regional vs zonal disk differences in your queries
  • Use labels to organize disks by environment or application

When managing multiple Google Persistent Disks in production environments, administrators often need to quickly assess storage utilization across their entire fleet. The standard Cloud Console interface requires clicking into each disk individually, which becomes inefficient at scale.

The Google Cloud SDK provides powerful command-line tools for retrieving disk metrics:

gcloud compute disks list \
  --format="table(name,sizeGb,users,type,status)" \
  --filter="status=READY"

For more detailed usage metrics including actual space utilization:

gcloud monitoring read-time-series \
  --metric=storage.googleapis.com/disk/bytes_used \
  --interval=P1D \
  --filter="resource.type=gce_disk"

For programmatic access to disk metrics across projects:


from google.cloud import monitoring_v3

client = monitoring_v3.MetricServiceClient()
project_name = f"projects/YOUR_PROJECT_ID"

results = client.list_time_series(
    name=project_name,
    filter='metric.type="storage.googleapis.com/disk/bytes_used"',
    interval=monitoring_v3.TimeInterval(),
    view=monitoring_v3.ListTimeSeriesRequest.TimeSeriesView.FULL
)

for series in results:
    print(f"Disk {series.resource.labels['device_name']}: {series.points[0].value.double_value} bytes used")

Create comprehensive dashboards by connecting Google Data Studio to:

  1. BigQuery disk metrics export
  2. Cloud Monitoring data source
  3. Custom CSV exports from gcloud

Configure Cloud Monitoring alerts for critical disk space situations:


# alert-policy.yaml
displayName: "High Disk Usage Alert"
combiner: OR
conditions:
- conditionThreshold:
    filter: 'metric.type="storage.googleapis.com/disk/percent_used" AND resource.type="gce_disk"'
    comparison: COMPARISON_GT
    thresholdValue: 90
    duration: 600s