PerfSage SignalPilot – Kubernetes performance & error RCA copilot
Project description
PerfSage SignalPilot
Deploy went fine. Errors didn't.
Open-source Kubernetes RCA that answers "why did errors spike after my last deploy?" in under five minutes — by correlating deploy diffs, events, metrics, logs, and git into ranked findings with copy-pastekubectlfixes.
Landing page: perfsage.com/signalpilot · Sample report: examples/sample-report.html
Quick start
pip install perfsage-signalpilot
If PyPI is not yet available in your region, install from the v1.0.0 release:
pip install https://github.com/perfsage/signalpilot/releases/download/v1.0.0/perfsage_signalpilot-1.0.0-py3-none-any.whl
Then:
kubectl apply -f deploy/signalpilot-rbac.yaml
signalpilot analyze my-namespace --deployment my-app --output report.html
CI gate (exit 1 on HIGH+ findings):
signalpilot gate my-namespace --deployment my-app --junit-xml results.xml
From source:
git clone https://github.com/perfsage/signalpilot
cd signalpilot && pip install -e .
Why SignalPilot?
| kubectl | Grafana / APM | SignalPilot | |
|---|---|---|---|
| Deploy context | One object at a time | Metrics without diff | Deploy diff fused into every finding |
| Cross-source evidence | Manual tab-switching | Separate dashboards | Events + metrics + logs + git in one report |
| Actionable output | Raw YAML/events | Charts | Ranked findings + copy-paste kubectl fixes |
| Post-deploy RCA time | Hours (typical war room) | Still manual correlation | Under 5 minutes for typical regressions |
| Cluster agents | N/A | Often required | Read-only RBAC only — no app pod agents |
| Cost | Free | Enterprise tiers | MIT open source |
Not another dashboard. Analysis you can act on. Core RCA uses deterministic rules — optional LLM polish only if you want it.
How it works
SignalPilot runs observe → correlate → explain → recommend → verify → learn:
- Observe — parallel collectors across K8s API, metrics-server, logs, cAdvisor, Prometheus, network, and optional git
- Correlate — deterministic rules fuse cross-source evidence (e.g. OOMKilled + memory at 94% of limit + git commit touching heap code → undersized memory limit)
- Explain — plain-English narrative per finding; optional LLM polish
- Recommend — ranked, copy-paste
kubectlfixes - Verify — baseline before fix, compare after next deploy: Fixed / Regressed / Unchanged
- Learn — revision-keyed history in
.signalpilot/
Signal sources
| Tier | Source | Always-on? |
|---|---|---|
| 0 | Deploy diff (image/env/resources/probes/configmap) | Yes |
| 0 | Git repo correlation (commit SHA → suspect commits) | Optional (--git-repo) |
| 1 | K8s API: restarts, OOMKilled, CrashLoopBackOff, probes | Yes |
| 1 | K8s Events: FailedScheduling, BackOff, Unhealthy | Yes |
| 1 | metrics-server: CPU/memory saturation vs limits | Yes |
| 1 | Container logs: drain3 clustering, new-error detection | Yes |
| 2 | kubelet/cAdvisor: CPU throttling, memory working-set | Yes |
| 2 | Network: endpoint readiness, DNS failures | Yes |
| 4 | Prometheus: p95/p99, error rate, CFS throttle | Auto-detect |
| 4 | Loki, OTel/Jaeger traces | Auto-detect |
RCA rules
| Rule | Trigger signals | Typical fix |
|---|---|---|
oom_killed |
OOMKilled + mem working-set near limit | Raise memory limit |
cpu_throttled |
CFS throttle ratio > 30% ± latency regression | Raise CPU limit/request |
crash_loop |
CrashLoopBackOff + log patterns + config diff | Check env vars, rollback |
image_pull_error |
ImagePullBackOff / ErrImagePull | Fix image tag, rollback |
probe_failure |
Readiness/liveness probe failing | Fix probe path/port/timing |
pending_unschedulable |
Pending pod + FailedScheduling events | Reduce requests, add capacity |
code_regression |
New log fingerprints after deploy ± git suspect | Rollback, investigate commit |
network_latency |
TCP retransmits + DNS failures | Investigate network policy, CoreDNS |
More commands
# Git correlation
signalpilot analyze my-namespace --deployment my-app --git-repo https://github.com/org/app
# Web dashboard
signalpilot serve
# Watch for deploys (auto-analyze)
signalpilot watch my-namespace --output-dir ./reports/
Prerequisites
- Python 3.12+
kubectlconfigured with cluster access- RBAC:
kubectl apply -f deploy/signalpilot-rbac.yaml - Optional: Prometheus (auto-detected at common cluster URLs)
Configuration
All settings via env vars (SIGNALPILOT_*) or .env file:
SIGNALPILOT_PROMETHEUS_URL=http://prometheus:9090
SIGNALPILOT_LLM_PROVIDER=openai # optional
SIGNALPILOT_LLM_API_KEY=sk-... # optional
SIGNALPILOT_SLACK_WEBHOOK_URL=https://hooks.slack.com/...
SIGNALPILOT_GATE_SEVERITY_THRESHOLD=high
SIGNALPILOT_BASELINE_WINDOW_S=1800
SIGNALPILOT_DATA_DIR=.signalpilot
PerfSage product ladder
- PerfSage Reveal — JMeter JTL analysis in the lab
- SLO Reporter — CI gates on load tests
- SignalPilot — post-deploy RCA in production (this repo)
Development
bash install.sh --dev
source .venv/bin/activate
pytest tests/unit/
pytest tests/e2e/ # requires kubectl + sample apps
bash scripts/reset_scenarios.sh # deploy 16 test scenarios
License
MIT © PerfSage
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file perfsage_signalpilot-1.0.0.tar.gz.
File metadata
- Download URL: perfsage_signalpilot-1.0.0.tar.gz
- Upload date:
- Size: 241.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88e3bbc8c2e43969726bb8a9ed831d1a8a5cc457c02fddda8575c52ebb3a064e
|
|
| MD5 |
5e5f9ce22977725d5d94f2375c553a94
|
|
| BLAKE2b-256 |
53da468ebe6d3b2b76bd2481072c9e39c71430e1563fca1cbd7db98b7f2959cb
|
File details
Details for the file perfsage_signalpilot-1.0.0-py3-none-any.whl.
File metadata
- Download URL: perfsage_signalpilot-1.0.0-py3-none-any.whl
- Upload date:
- Size: 76.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
195da1df88a1505e6ec7d80490e652916c13876ecb3a81cf06a25d1e9a5bbd24
|
|
| MD5 |
12e13852ae085bb5d476a288b91b549d
|
|
| BLAKE2b-256 |
dfd91291f37dcefa034a589acd5619b901d5b8b5b206e90b608f58ecfa57fe5f
|