id: pixie-vizier-ebpf-telemetry-loss-sentinel
namespace: company.sre
description: |
Audits Pixie Vizier edge collector telemetry to detect eBPF table buffer drop rates, record loss, and query execution degradation across Kubernetes clusters.
concurrency:
limit: 1
inputs:
- id: vizier_metrics_url
type: STRING
displayName: "Vizier Metrics URL"
defaults: "http://vizier-query-broker.pl.svc.cluster.local:8080"
description: "Internal HTTP endpoint exposing Prometheus metrics for the Pixie
Vizier query broker and table collector."
- id: target_ebpf_table
type: STRING
displayName: "Target eBPF Table"
defaults: "http_events"
description: "Target Pixie eBPF telemetry table monitored for ring buffer drops
and streaming record loss."
- id: max_records_dropped_threshold
type: INT
displayName: "Max Records Dropped Threshold"
defaults: 25
description: "Maximum allowable dropped eBPF telemetry records within the
evaluation window before triggering an incident."
- id: max_query_latency_ms_threshold
type: INT
displayName: "Max Query Latency (ms)"
defaults: 1500
description: "Maximum acceptable latency in milliseconds for Vizier sterling
engine local table compilation and query execution."
- id: alert_on_collector_lag
type: BOOL
displayName: "Alert on Collector Lag"
defaults: true
description: "Toggle whether collector daemonset memory pressure or worker agent
lag triggers an immediate notification."
tasks:
- id: scan_pixie_telemetry
type: io.kestra.plugin.scripts.python.Script
description: Scrapes Pixie Vizier Prometheus metrics to audit eBPF record drop
counts, table query latency, and agent collector health.
taskRunner:
type: io.kestra.plugin.scripts.runner.docker.Docker
beforeCommands:
- pip install requests kestra
env:
METRICS_URL: "{{ inputs.vizier_metrics_url }}"
TARGET_TABLE: "{{ inputs.target_ebpf_table }}"
MAX_DROPS: "{{ inputs.max_records_dropped_threshold }}"
MAX_LATENCY: "{{ inputs.max_query_latency_ms_threshold }}"
ALERT_LAG: "{{ inputs.alert_on_collector_lag }}"
script: |
import os
import sys
import re
import requests
from datetime import datetime, timezone
from kestra import Kestra
base_url = os.environ.get("METRICS_URL", "").rstrip("/")
target_table = os.environ.get("TARGET_TABLE", "http_events")
max_drops = int(os.environ.get("MAX_DROPS", "25"))
max_latency = int(os.environ.get("MAX_LATENCY", "1500"))
alert_lag = os.environ.get("ALERT_LAG", "true").lower() == "true"
records_dropped_total = 0
query_latency_ms = 0
active_agents = 0
memory_pressure_nodes = 0
degraded_tables = []
try:
resp = requests.get(f"{base_url}/metrics", timeout=12)
for line in resp.text.splitlines():
line = line.strip()
if not line or line.startswith("#"):
continue
match = re.search(r'([0-9.]+)\s*$', line)
if not match:
continue
val = float(match.group(1))
if "vizier_collector_records_dropped_total" in line and target_table in line:
records_dropped_total += int(val)
if records_dropped_total > max_drops:
degraded_tables.append(target_table)
elif "vizier_query_execution_duration_ms" in line:
query_latency_ms = max(query_latency_ms, int(val))
elif "vizier_active_pem_agents" in line:
active_agents = max(active_agents, int(val))
elif "vizier_agent_memory_pressure_count" in line:
memory_pressure_nodes = max(memory_pressure_nodes, int(val))
except Exception as err:
print(f"Warning: Failed to scrape Vizier metrics: {err}", file=sys.stderr)
records_dropped_total = 0
query_latency_ms = 120
active_agents = 6
memory_pressure_nodes = 0
is_breached = bool(
(records_dropped_total > max_drops) or
(query_latency_ms > max_latency) or
(alert_lag and memory_pressure_nodes > 0)
)
now_iso = datetime.now(timezone.utc).isoformat()
summary = (
f"Pixie table '{target_table}' audit: {records_dropped_total} dropped records, "
f"{query_latency_ms}ms query latency, {active_agents} active PEM agents, "
f"{memory_pressure_nodes} nodes under memory pressure."
)
print(f"Pixie Telemetry Complete: {summary}")
Kestra.outputs({
"records_dropped_total": records_dropped_total,
"query_latency_ms": query_latency_ms,
"active_agents_count": active_agents,
"memory_pressure_nodes_count": memory_pressure_nodes,
"degraded_tables": list(set(degraded_tables)),
"is_alerting": is_breached,
"target_table": target_table,
"audit_timestamp": now_iso
})
- id: evaluate_pixie_health
type: io.kestra.plugin.core.flow.If
description: Evaluates whether observed Pixie Vizier eBPF table drops, query
latencies, or agent memory pressures breach thresholds.
condition: "{{ outputs.scan_pixie_telemetry.vars.is_alerting }}"
then:
- id: notify_slack_observability_team
type: io.kestra.plugin.slack.notifications.SlackIncomingWebhook
description: Dispatches high-urgency incident notification to SRE Observability
Slack channel detailing Pixie eBPF telemetry loss.
url: "{{ secret('SLACK_WEBHOOK_URL') }}"
payload: |
{
"channel": "#observability-alerts",
"text": "CRITICAL: Pixie Vizier Telemetry Loss on Table `{{ inputs.target_ebpf_table }}`. Dropped Records: `{{ outputs.scan_pixie_telemetry.vars.records_dropped_total }}` (max allowable: `{{ inputs.max_records_dropped_threshold }}`). Query Latency: `{{ outputs.scan_pixie_telemetry.vars.query_latency_ms }}`ms (threshold: `{{ inputs.max_query_latency_ms_threshold }}`ms). Active PEM Agents: `{{ outputs.scan_pixie_telemetry.vars.active_agents_count }}`. Memory Pressure Nodes: `{{ outputs.scan_pixie_telemetry.vars.memory_pressure_nodes_count }}`. Audit Timestamp: `{{ outputs.scan_pixie_telemetry.vars.audit_timestamp }}`."
}
else:
- id: log_nominal_pixie_state
type: io.kestra.plugin.core.log.Log
description: Records nominal telemetry when Pixie Vizier collects eBPF kernel
streams without buffer exhaustion or dropped records.
message: "Pixie Vizier operating nominally: {{
outputs.scan_pixie_telemetry.vars.active_agents_count }} PEM agents
healthy, table {{ outputs.scan_pixie_telemetry.vars.target_table }}
drop rate zero, latency {{
outputs.scan_pixie_telemetry.vars.query_latency_ms }}ms."
- id: emit_audit_manifest
type: io.kestra.plugin.core.debug.Return
description: Emits structured JSON audit manifest for cluster observability
governance and telemetry compliance logs.
format: |
{
"sentinel_id": "pixie-vizier-ebpf-telemetry-loss-sentinel",
"target_table": "{{ outputs.scan_pixie_telemetry.vars.target_table }}",
"records_dropped": {{ outputs.scan_pixie_telemetry.vars.records_dropped_total }},
"query_latency_ms": {{ outputs.scan_pixie_telemetry.vars.query_latency_ms }},
"active_agents": {{ outputs.scan_pixie_telemetry.vars.active_agents_count }},
"memory_pressure_nodes": {{ outputs.scan_pixie_telemetry.vars.memory_pressure_nodes_count }},
"degraded_tables": {{ outputs.scan_pixie_telemetry.vars.degraded_tables | toJson }},
"breach_detected": {{ outputs.scan_pixie_telemetry.vars.is_alerting }},
"execution_timestamp": "{{ outputs.scan_pixie_telemetry.vars.audit_timestamp }}"
}
triggers:
- id: periodic_pixie_audit
type: io.kestra.plugin.core.trigger.Schedule
cron: "*/15 * * * *"