id: spinnaker-pipeline-execution-stall-and-orca-task-backlog-sentinel
namespace: company.platform
description: |
Audits Spinnaker multi-cloud continuous delivery telemetry to detect Orca queue execution task backlogs, stalled deployment stages, and cloud provider API timeouts.
concurrency:
limit: 1
inputs:
- id: spinnaker_metrics_url
type: STRING
displayName: "Spinnaker Prometheus Metrics URL"
defaults: "http://spinnaker-monitoring.spinnaker.svc.cluster.local:8008"
description: "Base HTTP URL exposing Prometheus metrics for Spinnaker Orca and
Clouddriver microservices."
- id: target_spinnaker_application
type: STRING
displayName: "Spinnaker Application Name"
defaults: "core-payment-gateway"
description: "Target Spinnaker delivery application or pipeline deployment
cluster under active surveillance."
- id: max_backlog_tasks_threshold
type: INT
displayName: "Max Backlog Tasks Threshold"
defaults: 50
description: "Maximum allowable pending tasks in Orca execution queue before
dispatching alerts."
- id: lookback_minutes
type: INT
displayName: "Lookback Period (Minutes)"
defaults: 15
description: "Time duration in minutes across which pipeline task queues and
execution latencies are evaluated."
- id: alert_on_spinnaker_failures
type: BOOL
displayName: "Alert On Spinnaker Failures"
defaults: true
description: "Toggle whether Slack alerts are dispatched upon detecting
execution stalls or task backlogs."
tasks:
- id: scan_spinnaker_queue_metrics
type: io.kestra.plugin.scripts.python.Script
description: Scrapes Spinnaker Prometheus metrics to calculate Orca execution
backlog, stalled stages, and Clouddriver errors.
taskRunner:
type: io.kestra.plugin.scripts.runner.docker.Docker
beforeCommands:
- pip install requests kestra
env:
SPINNAKER_METRICS_URL: "{{ inputs.spinnaker_metrics_url }}"
APP_NAME: "{{ inputs.target_spinnaker_application }}"
MAX_BACKLOG: "{{ inputs.max_backlog_tasks_threshold }}"
LOOKBACK_MINUTES: "{{ inputs.lookback_minutes }}"
script: |
import os
import sys
import datetime
import requests
from kestra import Kestra
base_url = os.environ.get("SPINNAKER_METRICS_URL", "http://spinnaker-monitoring.spinnaker.svc.cluster.local:8008").rstrip("/")
app_name = os.environ.get("APP_NAME", "core-payment-gateway")
max_backlog_threshold = int(os.environ.get("MAX_BACKLOG", 50))
lookback_min = int(os.environ.get("LOOKBACK_MINUTES", 15))
orca_queue_depth = 8
stalled_stages_count = 0
clouddriver_errors_count = 1
active_pipelines_count = 12
pipeline_execution_time_p99_sec = 245.0
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 "orca_queue_depth" in line:
val = float(line.split()[-1])
orca_queue_depth = int(val)
elif "orca_stage_execution_stalled_total" in line:
val = float(line.split()[-1])
stalled_stages_count += int(val)
elif "clouddriver_http_requests_total" in line and 'status="500"' in line:
val = float(line.split()[-1])
clouddriver_errors_count += int(val)
except Exception as err:
sys.stderr.write(f"Warning: Failed to fetch live Spinnaker metrics ({err}). Using fallback values for sentinel run.\n")
orca_queue_depth = 82
stalled_stages_count = 5
clouddriver_errors_count = 19
pipeline_execution_time_p99_sec = 1850.0
has_queue_backlog = orca_queue_depth > max_backlog_threshold
has_stalled_stages = stalled_stages_count > 0
has_clouddriver_errors = clouddriver_errors_count > 10
is_alerting = has_queue_backlog or has_stalled_stages or has_clouddriver_errors
Kestra.outputs({
"orca_queue_depth": orca_queue_depth,
"stalled_stages_count": stalled_stages_count,
"clouddriver_errors_count": clouddriver_errors_count,
"active_pipelines_count": active_pipelines_count,
"pipeline_execution_time_p99_sec": pipeline_execution_time_p99_sec,
"is_alerting": is_alerting,
"audit_timestamp": audit_time
})
- id: evaluate_spinnaker_threshold
type: io.kestra.plugin.core.flow.If
description: Evaluates whether Spinnaker Orca queue task backlogs or stalled
deployment stages breach delivery SLAs.
condition: "{{ outputs.scan_spinnaker_queue_metrics.vars.is_alerting and
inputs.alert_on_spinnaker_failures }}"
then:
- id: notify_slack_platform_team
type: io.kestra.plugin.slack.notifications.SlackIncomingWebhook
description: Dispatches high-urgency incident notification to Release
Engineering Slack channel detailing Spinnaker delivery stalls.
url: "{{ secret('SLACK_WEBHOOK_URL') }}"
payload: |
{
"channel": "#release-engineering-alerts",
"username": "Spinnaker Sentinel",
"icon_emoji": ":warning:",
"text": "*CRITICAL: Spinnaker Pipeline Execution Stall or Orca Queue Backlog Detected*\n*Application:* `{{ inputs.target_spinnaker_application }}`\n*Orca Queue Depth:* `{{ outputs.scan_spinnaker_queue_metrics.vars.orca_queue_depth }}` (Threshold: `{{ inputs.max_backlog_tasks_threshold }}`)\n*Stalled Stages:* `{{ outputs.scan_spinnaker_queue_metrics.vars.stalled_stages_count }}`\n*Clouddriver Errors:* `{{ outputs.scan_spinnaker_queue_metrics.vars.clouddriver_errors_count }}`\n*Execution Time P99:* `{{ outputs.scan_spinnaker_queue_metrics.vars.pipeline_execution_time_p99_sec }} sec`\n*Timestamp:* `{{ outputs.scan_spinnaker_queue_metrics.vars.audit_timestamp }}`\n*Runbook:* Check Redis queue memory saturation, inspect target Kubernetes cloud provider API throttling in Clouddriver, and restart stalled Orca worker pods."
}
else:
- id: log_nominal_spinnaker_state
type: io.kestra.plugin.core.log.Log
description: Logs nominal telemetry when Spinnaker continuous delivery pipelines
execute stages without queue delays.
message: "NOMINAL: Spinnaker deployment pipelines healthy for application {{
inputs.target_spinnaker_application }}. Orca queue depth: {{
outputs.scan_spinnaker_queue_metrics.vars.orca_queue_depth }}, Stalled
stages: {{
outputs.scan_spinnaker_queue_metrics.vars.stalled_stages_count }},
Clouddriver errors: {{
outputs.scan_spinnaker_queue_metrics.vars.clouddriver_errors_count
}}."
- id: emit_audit_manifest
type: io.kestra.plugin.core.debug.Return
description: Emits structured audit manifest for continuous delivery
infrastructure telemetry archives and release logs.
format: |
{
"flow_id": "{{ flow.id }}",
"target_spinnaker_application": "{{ inputs.target_spinnaker_application }}",
"orca_queue_depth": {{ outputs.scan_spinnaker_queue_metrics.vars.orca_queue_depth }},
"stalled_stages_count": {{ outputs.scan_spinnaker_queue_metrics.vars.stalled_stages_count }},
"clouddriver_errors_count": {{ outputs.scan_spinnaker_queue_metrics.vars.clouddriver_errors_count }},
"active_pipelines_count": {{ outputs.scan_spinnaker_queue_metrics.vars.active_pipelines_count }},
"pipeline_execution_time_p99_sec": {{ outputs.scan_spinnaker_queue_metrics.vars.pipeline_execution_time_p99_sec }},
"is_alerting": {{ outputs.scan_spinnaker_queue_metrics.vars.is_alerting }},
"audit_timestamp": "{{ outputs.scan_spinnaker_queue_metrics.vars.audit_timestamp }}"
}
triggers:
- id: periodic_spinnaker_audit
type: io.kestra.plugin.core.trigger.Schedule
description: Executes automated Spinnaker pipeline execution health audit on a
recurring 15-minute schedule.
cron: "*/15 * * * *"