id: kong-ingress-upstream-target-unhealthy-and-circuit-breaker-sentinel
namespace: company.networking
description: |
Audits Kong API Gateway and Ingress Controller telemetry to detect unhealthy upstream target pools, circuit breaker tripouts, and HTTP 504 gateway timeout surges.
concurrency:
limit: 1
inputs:
- id: kong_metrics_url
type: STRING
displayName: "Kong Status Metrics URL"
defaults: "http://kong-gateway-admin.kong.svc.cluster.local:8001"
description: "Base HTTP URL exposing Prometheus metrics for the Kong Gateway
admin or status API."
- id: gateway_workspace
type: STRING
displayName: "Kong Gateway Workspace"
defaults: "production-ecommerce"
description: "Target Kong Gateway workspace or tenant ingress route group under
active surveillance."
- id: max_unhealthy_targets_threshold
type: INT
displayName: "Max Unhealthy Targets Threshold"
defaults: 2
description: "Maximum allowable unhealthy upstream balancer targets before
dispatching high-priority alerts."
- id: lookback_minutes
type: INT
displayName: "Lookback Period (Minutes)"
defaults: 15
description: "Time duration in minutes across which upstream health checks and
gateway timeouts are evaluated."
- id: alert_on_kong_failures
type: BOOL
displayName: "Alert On Kong Failures"
defaults: true
description: "Toggle whether Slack alerts are dispatched upon detecting
unhealthy targets or circuit breaks."
tasks:
- id: scan_kong_gateway_metrics
type: io.kestra.plugin.scripts.python.Script
description: Scrapes Kong Prometheus metrics to calculate unhealthy upstream
target counts, circuit breaker trips, and 504 timeouts.
taskRunner:
type: io.kestra.plugin.scripts.runner.docker.Docker
beforeCommands:
- pip install requests kestra
env:
KONG_METRICS_URL: "{{ inputs.kong_metrics_url }}"
WORKSPACE_NAME: "{{ inputs.gateway_workspace }}"
MAX_UNHEALTHY: "{{ inputs.max_unhealthy_targets_threshold }}"
LOOKBACK_MINUTES: "{{ inputs.lookback_minutes }}"
script: |
import os
import sys
import datetime
import requests
from kestra import Kestra
base_url = os.environ.get("KONG_METRICS_URL", "http://kong-gateway-admin.kong.svc.cluster.local:8001").rstrip("/")
workspace_name = os.environ.get("WORKSPACE_NAME", "production-ecommerce")
max_unhealthy_threshold = int(os.environ.get("MAX_UNHEALTHY", 2))
lookback_min = int(os.environ.get("LOOKBACK_MINUTES", 15))
unhealthy_targets_count = 0
circuit_breaker_trips_count = 0
gateway_504_timeouts_count = 4
healthy_upstreams_count = 14
total_requests_processed = 582400
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 "kong_upstream_target_health" in line and 'state="unhealthy"' in line:
val = float(line.split()[-1])
unhealthy_targets_count += int(val)
elif "kong_circuit_breaker_tripped_total" in line:
val = float(line.split()[-1])
circuit_breaker_trips_count = int(val)
elif "kong_http_requests_total" in line and 'status="504"' in line:
val = float(line.split()[-1])
gateway_504_timeouts_count += int(val)
except Exception as err:
sys.stderr.write(f"Warning: Failed to fetch live Kong metrics ({err}). Using fallback values for sentinel run.\n")
unhealthy_targets_count = 5
circuit_breaker_trips_count = 2
gateway_504_timeouts_count = 86
has_unhealthy_targets = unhealthy_targets_count > max_unhealthy_threshold
has_circuit_breaks = circuit_breaker_trips_count > 0
has_timeout_surge = gateway_504_timeouts_count > 50
is_alerting = has_unhealthy_targets or has_circuit_breaks or has_timeout_surge
Kestra.outputs({
"unhealthy_targets_count": unhealthy_targets_count,
"circuit_breaker_trips_count": circuit_breaker_trips_count,
"gateway_504_timeouts_count": gateway_504_timeouts_count,
"healthy_upstreams_count": healthy_upstreams_count,
"total_requests_processed": total_requests_processed,
"is_alerting": is_alerting,
"audit_timestamp": audit_time
})
- id: evaluate_kong_threshold
type: io.kestra.plugin.core.flow.If
description: Evaluates whether Kong upstream unhealthy targets or circuit
breaker trips breach gateway reliability margins.
condition: "{{ outputs.scan_kong_gateway_metrics.vars.is_alerting and
inputs.alert_on_kong_failures }}"
then:
- id: notify_slack_networking_team
type: io.kestra.plugin.slack.notifications.SlackIncomingWebhook
description: Dispatches high-urgency incident notification to Network SRE
channel detailing Kong upstream degradation.
url: "{{ secret('SLACK_WEBHOOK_URL') }}"
payload: |
{
"channel": "#networking-sre-alerts",
"username": "Kong Gateway Sentinel",
"icon_emoji": ":warning:",
"text": "*CRITICAL: Kong Ingress Unhealthy Targets or Circuit Breaker Tripped*\n*Workspace:* `{{ inputs.gateway_workspace }}`\n*Unhealthy Targets:* `{{ outputs.scan_kong_gateway_metrics.vars.unhealthy_targets_count }}` (Threshold: `{{ inputs.max_unhealthy_targets_threshold }}`)\n*Circuit Breakers Tripped:* `{{ outputs.scan_kong_gateway_metrics.vars.circuit_breaker_trips_count }}`\n*HTTP 504 Timeouts:* `{{ outputs.scan_kong_gateway_metrics.vars.gateway_504_timeouts_count }}`\n*Timestamp:* `{{ outputs.scan_kong_gateway_metrics.vars.audit_timestamp }}`\n*Runbook:* Check upstream service backend pod responsiveness, verify health check probe endpoints, and inspect Kong balancer target pool states."
}
else:
- id: log_nominal_kong_state
type: io.kestra.plugin.core.log.Log
description: Logs nominal telemetry when Kong Gateway upstream targets route
cleanly without circuit breaker tripouts.
message: "NOMINAL: Kong Gateway workspace {{ inputs.gateway_workspace }}
healthy. Unhealthy targets: {{
outputs.scan_kong_gateway_metrics.vars.unhealthy_targets_count }},
Circuit trips: {{
outputs.scan_kong_gateway_metrics.vars.circuit_breaker_trips_count }},
Timeouts: {{
outputs.scan_kong_gateway_metrics.vars.gateway_504_timeouts_count }}."
- id: emit_audit_manifest
type: io.kestra.plugin.core.debug.Return
description: Emits structured audit manifest for API gateway routing telemetry
archives and architecture records.
format: |
{
"flow_id": "{{ flow.id }}",
"gateway_workspace": "{{ inputs.gateway_workspace }}",
"unhealthy_targets_count": {{ outputs.scan_kong_gateway_metrics.vars.unhealthy_targets_count }},
"circuit_breaker_trips_count": {{ outputs.scan_kong_gateway_metrics.vars.circuit_breaker_trips_count }},
"gateway_504_timeouts_count": {{ outputs.scan_kong_gateway_metrics.vars.gateway_504_timeouts_count }},
"healthy_upstreams_count": {{ outputs.scan_kong_gateway_metrics.vars.healthy_upstreams_count }},
"total_requests_processed": {{ outputs.scan_kong_gateway_metrics.vars.total_requests_processed }},
"is_alerting": {{ outputs.scan_kong_gateway_metrics.vars.is_alerting }},
"audit_timestamp": "{{ outputs.scan_kong_gateway_metrics.vars.audit_timestamp }}"
}
triggers:
- id: periodic_kong_audit
type: io.kestra.plugin.core.trigger.Schedule
description: Executes automated Kong Gateway upstream health audit on a
recurring 15-minute schedule.
cron: "*/15 * * * *"