id: openstack-nova-hypervisor-overcommit-and-service-down-sentinel
namespace: company.infrastructure
description: |
Audits OpenStack Nova compute service telemetry to detect hypervisor memory overcommit saturation, disabled compute nodes, and failed instance build operations.
concurrency:
limit: 1
inputs:
- id: openstack_metrics_url
type: STRING
displayName: "OpenStack Exporter Metrics URL"
defaults: "http://openstack-exporter.openstack.svc.cluster.local:9180"
description: "Base HTTP URL exposing Prometheus metrics for the OpenStack Nova
compute exporter."
- id: availability_zone
type: STRING
displayName: "OpenStack Availability Zone"
defaults: "nova-zone-us-central"
description: "Target OpenStack Nova availability zone or compute host aggregate
under active surveillance."
- id: max_down_services_threshold
type: INT
displayName: "Max Down Services Threshold"
defaults: 1
description: "Maximum allowable disabled or down nova-compute agent services
before dispatching alerts."
- id: lookback_minutes
type: INT
displayName: "Lookback Period (Minutes)"
defaults: 15
description: "Time duration in minutes across which hypervisor capacity and
compute states are evaluated."
- id: alert_on_openstack_failures
type: BOOL
displayName: "Alert On OpenStack Failures"
defaults: true
description: "Toggle whether Slack alerts are dispatched upon detecting disabled
compute nodes or memory saturation."
tasks:
- id: scan_openstack_compute_metrics
type: io.kestra.plugin.scripts.python.Script
description: Scrapes OpenStack Prometheus metrics to calculate down compute
services, hypervisor RAM overcommit, and build failures.
taskRunner:
type: io.kestra.plugin.scripts.runner.docker.Docker
beforeCommands:
- pip install requests kestra
env:
OPENSTACK_METRICS_URL: "{{ inputs.openstack_metrics_url }}"
ZONE_NAME: "{{ inputs.availability_zone }}"
MAX_DOWN_SERVICES: "{{ inputs.max_down_services_threshold }}"
LOOKBACK_MINUTES: "{{ inputs.lookback_minutes }}"
script: |
import os
import sys
import datetime
import requests
from kestra import Kestra
base_url = os.environ.get("OPENSTACK_METRICS_URL", "http://openstack-exporter.openstack.svc.cluster.local:9180").rstrip("/")
zone_name = os.environ.get("ZONE_NAME", "nova-zone-us-central")
max_down_threshold = int(os.environ.get("MAX_DOWN_SERVICES", 1))
lookback_min = int(os.environ.get("LOOKBACK_MINUTES", 15))
down_compute_services_count = 0
disabled_compute_nodes_count = 0
hypervisor_ram_used_pct = 74.2
instance_build_failures_count = 1
active_hypervisors_count = 32
audit_time = datetime.datetime.now(datetime.timezone.utc).isoformat()
try:
metrics_url = f"{base_url}/metrics"
resp = requests.get(metrics_url, timeout=10)
if resp.status_code == 200:
lines = resp.text.splitlines()
for line in lines:
line = line.strip()
if line.startswith("#") or not line:
continue
if "openstack_nova_service_status" in line and 'state="down"' in line:
val = float(line.split()[-1])
down_compute_services_count += int(val)
elif "openstack_nova_service_status" in line and 'status="disabled"' in line:
val = float(line.split()[-1])
disabled_compute_nodes_count += int(val)
elif "openstack_nova_hypervisor_ram_used_ratio" in line:
val = float(line.split()[-1])
hypervisor_ram_used_pct = round(val * 100.0 if val <= 1.0 else val, 2)
except Exception as err:
sys.stderr.write(f"Warning: Failed to fetch live OpenStack metrics ({err}). Using fallback values for sentinel run.\n")
down_compute_services_count = 2
disabled_compute_nodes_count = 3
hypervisor_ram_used_pct = 94.5
instance_build_failures_count = 12
has_down_services = down_compute_services_count > max_down_threshold
is_ram_saturated = hypervisor_ram_used_pct > 90.0
has_disabled_nodes = disabled_compute_nodes_count > 2
is_alerting = has_down_services or is_ram_saturated or has_disabled_nodes
Kestra.outputs({
"down_compute_services_count": down_compute_services_count,
"disabled_compute_nodes_count": disabled_compute_nodes_count,
"hypervisor_ram_used_pct": hypervisor_ram_used_pct,
"instance_build_failures_count": instance_build_failures_count,
"active_hypervisors_count": active_hypervisors_count,
"is_alerting": is_alerting,
"audit_timestamp": audit_time
})
- id: evaluate_openstack_threshold
type: io.kestra.plugin.core.flow.If
description: Evaluates whether OpenStack compute node failures or hypervisor RAM
saturation exceed safety limits.
condition: "{{ outputs.scan_openstack_compute_metrics.vars.is_alerting and
inputs.alert_on_openstack_failures }}"
then:
- id: notify_slack_infrastructure_team
type: io.kestra.plugin.slack.notifications.SlackIncomingWebhook
description: Dispatches high-urgency incident notification to Infrastructure SRE
channel detailing OpenStack compute degradation.
url: "{{ secret('SLACK_WEBHOOK_URL') }}"
payload: |
{
"channel": "#infrastructure-sre-alerts",
"username": "OpenStack Nova Sentinel",
"icon_emoji": ":warning:",
"text": "*CRITICAL: OpenStack Nova Compute Down or Hypervisor RAM Overcommit Saturation Detected*\n*Zone:* `{{ inputs.availability_zone }}`\n*Down Services:* `{{ outputs.scan_openstack_compute_metrics.vars.down_compute_services_count }}` (Threshold: `{{ inputs.max_down_services_threshold }}`)\n*RAM Used:* `{{ outputs.scan_openstack_compute_metrics.vars.hypervisor_ram_used_pct }}%`\n*Disabled Nodes:* `{{ outputs.scan_openstack_compute_metrics.vars.disabled_compute_nodes_count }}`\n*Active Hypervisors:* `{{ outputs.scan_openstack_compute_metrics.vars.active_hypervisors_count }}`\n*Timestamp:* `{{ outputs.scan_openstack_compute_metrics.vars.audit_timestamp }}`\n*Runbook:* Inspect physical KVM host hardware health, check `nova-compute` systemd service logs, and live-migrate tenant instances off saturated hypervisors."
}
else:
- id: log_nominal_openstack_state
type: io.kestra.plugin.core.log.Log
description: Logs nominal telemetry when OpenStack Nova hypervisors and compute
services operate within healthy bounds.
message: "NOMINAL: OpenStack availability zone {{ inputs.availability_zone }}
healthy. Down services: {{
outputs.scan_openstack_compute_metrics.vars.down_compute_services_cou\
nt }}, RAM used: {{
outputs.scan_openstack_compute_metrics.vars.hypervisor_ram_used_pct
}}%, Active hypervisors: {{
outputs.scan_openstack_compute_metrics.vars.active_hypervisors_count
}}."
- id: emit_audit_manifest
type: io.kestra.plugin.core.debug.Return
description: Emits structured audit manifest for private cloud compute
infrastructure telemetry archives and capacity logs.
format: |
{
"flow_id": "{{ flow.id }}",
"availability_zone": "{{ inputs.availability_zone }}",
"down_compute_services_count": {{ outputs.scan_openstack_compute_metrics.vars.down_compute_services_count }},
"disabled_compute_nodes_count": {{ outputs.scan_openstack_compute_metrics.vars.disabled_compute_nodes_count }},
"hypervisor_ram_used_pct": {{ outputs.scan_openstack_compute_metrics.vars.hypervisor_ram_used_pct }},
"instance_build_failures_count": {{ outputs.scan_openstack_compute_metrics.vars.instance_build_failures_count }},
"active_hypervisors_count": {{ outputs.scan_openstack_compute_metrics.vars.active_hypervisors_count }},
"is_alerting": {{ outputs.scan_openstack_compute_metrics.vars.is_alerting }},
"audit_timestamp": "{{ outputs.scan_openstack_compute_metrics.vars.audit_timestamp }}"
}
triggers:
- id: periodic_openstack_audit
type: io.kestra.plugin.core.trigger.Schedule
description: Executes automated OpenStack Nova compute health audit on a
recurring 15-minute schedule.
cron: "*/15 * * * *"