#!/bin/bash # Disk space monitoring for SDP volumes - writes Prometheus metrics # Managed by Ansible - do not edit manually METRICS_DIR="{{ p4prometheus_metrics_dir }}" METRICS_FILE="${METRICS_DIR}/p4_disk_space.prom" TMP_FILE="${METRICS_FILE}.$$" INSTANCE="{{ perforce_id }}" # SDP volume paths to monitor VOLUMES=( {% for vol in p4_monitor_volumes %} "{{ vol }}" {% endfor %} ) # Thresholds (percentage used) WARN_THRESHOLD={{ p4_disk_warn_percent }} CRIT_THRESHOLD={{ p4_disk_crit_percent }} { echo "# HELP p4_disk_total_bytes Total disk space in bytes." echo "# TYPE p4_disk_total_bytes gauge" echo "# HELP p4_disk_used_bytes Used disk space in bytes." echo "# TYPE p4_disk_used_bytes gauge" echo "# HELP p4_disk_avail_bytes Available disk space in bytes." echo "# TYPE p4_disk_avail_bytes gauge" echo "# HELP p4_disk_used_percent Percentage of disk space used." echo "# TYPE p4_disk_used_percent gauge" echo "# HELP p4_disk_alert Disk space alert level: 0=ok, 1=warning, 2=critical." echo "# TYPE p4_disk_alert gauge" for vol in "${VOLUMES[@]}"; do if [ -d "$vol" ]; then # Use df with 1K blocks for byte precision read -r total used avail pct <<< $(df -k "$vol" | tail -1 | awk '{print $2, $3, $4, $5}') pct_num=${pct%\%} total_bytes=$((total * 1024)) used_bytes=$((used * 1024)) avail_bytes=$((avail * 1024)) if [ "$pct_num" -ge "$CRIT_THRESHOLD" ]; then alert=2 elif [ "$pct_num" -ge "$WARN_THRESHOLD" ]; then alert=1 else alert=0 fi echo "p4_disk_total_bytes{instance=\"$INSTANCE\",volume=\"$vol\"} $total_bytes" echo "p4_disk_used_bytes{instance=\"$INSTANCE\",volume=\"$vol\"} $used_bytes" echo "p4_disk_avail_bytes{instance=\"$INSTANCE\",volume=\"$vol\"} $avail_bytes" echo "p4_disk_used_percent{instance=\"$INSTANCE\",volume=\"$vol\"} $pct_num" echo "p4_disk_alert{instance=\"$INSTANCE\",volume=\"$vol\"} $alert" fi done echo "# HELP p4_disk_check_timestamp_seconds Unix timestamp of last disk check." echo "# TYPE p4_disk_check_timestamp_seconds gauge" echo "p4_disk_check_timestamp_seconds{instance=\"$INSTANCE\"} $(date +%s)" } > "$TMP_FILE" mv "$TMP_FILE" "$METRICS_FILE"