Documentation

Everything you need to install, configure, and operate Reflex Runtime.

How Reflex works

Reflex is a Kubernetes controller that watches your Prometheus metrics, detects SLO breaches, and runs a chosen remediation. Three steps:

  1. Detect. An SLO breach trips when a Prometheus query crosses your error-budget burn rate threshold over the configured window.
  2. Analyze. The Recommender pipeline runs flap and blip filters, gathers Prometheus context (deploy age, traffic, memory, CPU), matches against curated patterns, and on Pro tier asks an AI reasoner for a root cause.
  3. Act. Depending on the Reflex's automation level, the action either logs (observe), posts a Slack approval (dry-run), or executes immediately (auto). Every step is recorded to the local event log.

Trust ladder details are below; the live demo at reflexslo.io/demo shows the full loop in real time.

Requirements

  • Kubernetes 1.24+ — runs on EKS, GKE, AKS, k3s, kind, and any conformant distribution.
  • Helm 3.x — the official chart at charts.reflexslo.io is the supported install path.
  • Prometheus 2.x — Reflex queries the Prometheus HTTP API. Bring your own, or bundle one with --set prometheus.install.enabled=true.
  • Slack incoming webhook — optional, but recommended. Required for dry-run approval buttons on Pro.
  • OpenAI API key — optional. Pro tier only. BYOK; the controller readsOPENAI_API_KEYat startup and never persists it.

Installation

Reflex runs in your Kubernetes cluster via Helm. Requirements: Kubernetes 1.24+, Helm 3.x, Prometheus.

Free Tier

# Add Reflex chart repository
helm repo add reflex https://charts.reflexslo.io
helm repo update

# Install (observe mode, 3 SLOs, 3 Reflexes)
helm install reflex reflex/reflex-runtime \
  --set prometheus.url="http://prometheus:9090"

Pro Tier

After purchasing at reflexslo.io/pricing, you'll receive a license key via email.

helm install reflex reflex/reflex-runtime \
  --set license.key="YOUR_LICENSE_KEY" \
  --set prometheus.url="http://prometheus:9090" \
  --set slack.webhookUrl="https://hooks.slack.com/services/..."  # optional
Common Prometheus URLs:
  • kube-prometheus-stack: http://prometheus-kube-prometheus-prometheus.monitoring:9090
  • Standalone: http://prometheus-server.monitoring:9090
  • Don't have Prometheus? Add --set prometheus.install.enabled=true

Quickstart: First SLO in 5 Minutes

1. Install Reflex

Follow the installation steps above.

2. Auto-discover SLOs from Prometheus

Download the CLI from the latest release, then:

# Port-forward Prometheus
kubectl port-forward -n monitoring svc/prometheus 9090:9090 &

# Preview what Reflex finds (dry-run)
reflex setup --dry-run --prometheus-url http://localhost:9090

# Apply SLOs when ready
reflex setup --prometheus-url http://localhost:9090

3. View your SLOs

kubectl get slo -A
kubectl get reflex -A
kubectl get reflexrecommendation -A

4. Watch the logs

kubectl logs -l app.kubernetes.io/name=reflex-runtime -f

Trust Ladder

Every reflex starts in observe mode. Promote when you trust it.

Observe

Logs what it would do. Sends Slack notification. No action taken.

Dry-run (Pro)

Sends Slack message with Approve / Reject / Snooze buttons. Waits for human approval before executing.

Auto (Pro)

Executes immediately when triggered. Notifies Slack after the action.

Promote a Reflex

# observe → dry-run
kubectl patch reflex <name> -n <namespace> \
  --type=merge -p '{"spec":{"automationLevel":"dry-run"}}'

# dry-run → auto
kubectl patch reflex <name> -n <namespace> \
  --type=merge -p '{"spec":{"automationLevel":"auto"}}'

Slack Integration

Reflex sends breach notifications and approval requests to Slack.

1. Create a Slack App

Go to api.slack.com/apps → Create New App → From scratch.

2. Enable Incoming Webhooks

In the app settings → Incoming Webhooks → toggle On → Add New Webhook → select your alerts channel.

3. Add webhook to Helm values

--set slack.webhookUrl="https://hooks.slack.com/services/YOUR/WEBHOOK/URL"

4. Interactive Approval Buttons (Optional)

For dry-run mode approval buttons to work, enable Interactivity in your Slack app and set the Request URL to your controller's callback endpoint:

https://<your-reflex-controller>:8080/slack/callback

This requires the controller to be reachable from the internet (LoadBalancer, Ingress, or ngrok for testing).

Configuration

Key Helm values for customizing Reflex:

ParameterDefaultDescription
license.key""Pro license key from purchase email
prometheus.urlhttp://prometheus:9090Prometheus server URL
slack.webhookUrl""Slack incoming webhook URL
slack.enabledtrueEnable Slack notifications
ai.apiKey""OpenAI API key (BYOK)
ai.modelgpt-4o-miniAI model for analysis
events.enabledtrueEnable JSONL event logging
prometheus.install.enabledfalseBundle kube-prometheus-stack

Example: Availability SLO + Restart Reflex

# SLO: API must be 99.9% available
apiVersion: reflex.io/v1
kind: SLO
metadata:
  name: api-availability
spec:
  service: api-gateway
  indicator:
    type: availability
    metric: http_requests_total
    goodQuery: 'sum(rate(http_requests_total{service="api",status!~"5.."}[5m]))'
    totalQuery: 'sum(rate(http_requests_total{service="api"}[5m]))'
  objective:
    target: 99.9
    window: "30d"
  errorBudget:
    policy: high
    burnRate:
      critical: 14.4
      high: 6.0
# Reflex: restart when error rate spikes
apiVersion: reflex.io/v1
kind: Reflex
metadata:
  name: restart-api
spec:
  trigger:
    errorRate: "> 5%"
    window: "5m"
  action:
    type: restart
    target: deployment/api-gateway
  automationLevel: observe  # Start safe
  cooldown: "10m"

Free vs Pro

FeatureFreePro ($149/mo)
ClustersUnlimitedUnlimited
SLOs3Unlimited
Reflexes3Unlimited
ModesObserve onlyObserve + Dry-run + Auto
Slack notificationsYesYes + approval buttons
AI recommendationsNoYes (BYOK OpenAI)
SupportCommunityPriority email

Troubleshooting

Pod won't start (CrashLoopBackOff)

Check logs: kubectl logs -l app.kubernetes.io/name=reflex-runtime

Common causes: invalid license key, Prometheus URL unreachable.

SLO shows no data

Verify Prometheus can reach your services. Check that your SLO queries match your actual metric labels.

Slack notifications not sending

Verify SLACK_WEBHOOK_URL is set. Check controller logs for webhook errors.

Reflex not triggering

Check that the reflex's trigger thresholds are being exceeded. View SLO state: kubectl get slo -A

CRD Reference

After installing, all CRD fields are self-documenting:

kubectl explain slo.spec
kubectl explain slo.spec.indicator
kubectl explain reflex.spec
kubectl explain reflex.spec.action
kubectl explain reflexrecommendation.spec

Need help?

Pro customers get priority email support. Free tier users can file issues on GitHub.