> **๐Ÿ‘‹ New to Kubernetes? No problem.** > kwatch watches your cluster 24/7. When something fails, it tells you **what broke and why** โ€” with the error reason, diagnostic hints, logs, and events โ€” straight to your team chat. > โœจ **60 seconds to install. No backend. No dashboards. No YAML spaghetti.** --- ## ๐Ÿง What is kwatch? kwatch is like a **smart friend** for your Kubernetes cluster: - ๐Ÿ’ฅ Something crashes โ†’ you get a message that says *why* (not just "pod is broken") - ๐Ÿ”‡ Smart about noise โ€” groups related issues into a single notification, ignores flapping - ๐Ÿง  Optional AI that reads the logs and tells you what's likely wrong - โšก Works in **under a minute** โ€” just one command and a config file No Prometheus. No Grafana. No 50-step setup. Just alerts that **make sense**. --- ## ๐Ÿ†š kwatch vs the scary stuff | | โœจ kwatch | ๐Ÿ˜ฐ DIY Prometheus + Alertmanager | ๐Ÿ’ธ Heavy SaaS | |---|---|---|---| | โฑ๏ธ Setup time | **~5 minutes** | hours of YAML | agent + backend setup | | ๐Ÿ“ฆ Size | ~20 MB single binary | whole monitoring stack | per-node agents + cloud costs | | ๐Ÿ’ฌ Alerts | Self-explaining ("OOMKilled โ€” raise memory limit") | Rule-defined message | Depends on configuration | | ๐Ÿ—„๏ธ Storage | None (stateless) | Prometheus TSDB | Full retention (costly) | | ๐Ÿ“š Learning curve | One ConfigMap | PromQL + alert rules | Platform-specific DSL | --- ## ๐Ÿšจ Before vs After | Raw kubectl output ๐Ÿคท | kwatch tells you ๐Ÿ’ก | |---|---| | `CrashLoopBackOff` | ๐Ÿšจ **OOMKilled** (memory limit: 512Mi) โ€” try raising `limits.memory` ยท here are the logs + events | | `Error` | ๐Ÿšจ **HTTP probe** failing on `:8080/healthz` (exit 137) โ€” container ran out of memory | --- ## โšก๏ธ 60-second install ### ๐Ÿ“ฆ Helm (easiest ๐Ÿ†) ```shell helm repo add kwatch https://kwatch.dev/charts helm install [RELEASE_NAME] kwatch/kwatch --namespace kwatch --create-namespace --version 0.11.0 ``` More details in the [chart docs](https://github.com/abahmed/kwatch/blob/main/deploy/chart/README.md) ### ๐Ÿ™ kubectl ```shell curl -L https://raw.githubusercontent.com/abahmed/kwatch/v0.11.0/deploy/config.yaml -o config.yaml # โœ๏ธ Edit config.yaml with your Slack/Discord/email webhook kubectl apply -f config.yaml kubectl apply -f https://raw.githubusercontent.com/abahmed/kwatch/v0.11.0/deploy/deploy.yaml ``` --- ## ๐ŸŽฏ What does it catch? Every monitor below is **on by default** โ€” zero config needed: | Signal | Default | What you get | |--------|---------|-------------| | ๐ŸŸฅ Pod crashes (CrashLoop, OOM, ImagePull, Error) | โœ… **on** | Container state + previous logs + events โ€” tells you *why* | | โณ Pending pods (stuck Unschedulable) | โœ… **on** | Alerts after 300s stuck; includes scheduling delay in hint | | ๐ŸŽฏ Scheduling delay diagnostics | โœ… **on** | Prepends `"unschedulable for XmYs"` duration to Unschedulable hints | | ๐Ÿ–ฅ๏ธ Node issues (NotReady, Disk/Memory pressure) | โœ… **on** | Per-condition severity | | ๐Ÿ’พ PVC running out of space | โœ… **on** | Warn at 80%, critical at 90% | | โŒ Failed Jobs | โœ… **on** | `JobFailed` / `JobSuspended` | | ๐Ÿš€ Stuck rollouts | โœ… **on** | `ProgressDeadlineExceeded` โ€” deployment didn't finish | | ๐Ÿšฆ Deployment unavailable | โœ… **on** | `DeploymentUnavailable` โ€” unavailable replicas for `rolloutMonitor.sustainedMinutes` consecutive minutes | | ๐Ÿ“ก DaemonSet pods not running | โœ… **on** | Unavailable pods detected | | โฐ CronJob suspended or missing runs | โœ… **on** | Not scheduled in 24h? Alert. | | ๐Ÿ“ˆ HPA stuck at max replicas | โœ… **on** | After 20 minutes sustained | | ๐Ÿ”— Service endpoint health | โœ… **on** | Detects endpoints with zero ready addresses | | ๐Ÿงฉ Admission webhook backends | โœ… **on** | Alerts when a webhook's backing service has no ready endpoints | | ๐Ÿ›๏ธ Control-plane component health | โœ… **on** | Detects broken control-plane pods (apiserver, scheduler, etc.) | | ๐Ÿงฉ StatefulSet unavailable | โœ… **on** | `StsUnavailable` โ€” pods not ready for `statefulSetMonitor.sustainedMinutes` minutes | | ๐Ÿ”„ PDB blocking disruptions | โœ… **on** | `PdbViolation` โ€” PodDisruptionBudget has `disruptionsAllowed=0` and unhealthy pods | | ๐Ÿญ Node overcommit prediction | โœ… **on** | `NodeResourceHigh/Critical` โ€” warning at 2ร—, critical at 4ร— CPU/mem overcommit | | ๐Ÿ’ฅ OOM pattern detection | โœ… **on** | `OOMRepeating` โ€” 3+ OOM kills in 60-minute sliding window flags potential memory leak | | ๐ŸŒ Ingress backend health | โœ… **on** | Alerts when ingress backend services have no ready endpoints | | ๐Ÿšง NetworkPolicy over-restriction | โœ… **on** | Detects policies that may block all ingress traffic | | ๐Ÿ”’ TLS certs expiring | โŒ off | Enable if you want cert expiry warnings | | ๐Ÿง  Context-aware intelligence (dependency analysis) | โœ… **on** | Links incidents to root causes โ€” unhealthy nodes, bad rollouts, misconfigured ConfigMaps/Secrets | | ๐Ÿ“Š Mass failure detection | โœ… **on** | Detects when 30%+ of dependents sharing a node/configmap/secret fail simultaneously | โœ… **TLS is the only one off** โ€” everything else just works out of the box. --- ### ๐Ÿง  Context-aware intelligence kwatch builds a **dependency graph** of your cluster from pod informers โ€” mapping pods to their nodes, owners (Deployments/StatefulSets/DaemonSets), Services, PVCs, and referenced ConfigMaps/Secrets. When an incident fires, the insight engine analyzes it against the graph and answers: - **What likely caused this?** โ€” unhealthy node, failed rollout, or misconfigured resources (ConfigMap, Secret, PVC) - **What's the impact?** โ€” how many pods, services, or dependents are affected - **Recent changes?** โ€” correlated changes on the same resource or namespace The graph is built at startup from the informer cache, rebuilt periodically, and updated incrementally as pods come and go. No configuration needed. #### Mass failure detection The correlation engine periodically scans all active incidents for shared dependencies. If more than 30% of dependents sharing a node, ConfigMap, Secret, or PVC are in failure, a mass failure alert fires. The threshold is dynamic โ€” computed per dependency based on the current scope. Mass failures automatically resolve when the underlying incidents clear. --- ## ๐Ÿค– AI-powered troubleshooting (optional, off by default) kwatch ships with **built-in AI** (runs inside your cluster โ€” zero data leaves). It is disabled by default; set `enabled: true` to use it: ```yaml llm: enabled: false # โŒ off by default! ``` When a crash happens, the AI reads the logs and tells you the **most likely cause** and **what to do next**. Like having a senior SRE on-call with you. > **๐Ÿ“Œ Architecture note:** AI is available for **linux/amd64** and **linux/arm64** only. It does not support `arm/v6` or `arm/v7` (the main kwatch image supports all four). --- ## โš™๏ธ Configuration (simple) ### ๐Ÿ”ง General | Parameter | What it does | |:---|---| | `maxRecentLogLines` | How many log lines to include in alerts (default: 50) | | `resyncSeconds` | Check for problems periodically (0 = only on events, recommended) | | `workers` | How many parallel workers (default: 1, raise for big clusters) | | `namespaces` | ๐Ÿ”ฝ Limit to specific namespaces, or use `!kube-system` to exclude | | `reasons` | ๐Ÿ”ฝ Only alert on specific reasons, or exclude some with `!` | | `ignoreFailedGracefulShutdown` | โœ… Skip containers killed during graceful shutdown (default: true) | | `ignoreDisruptionTerminations` | โœ… Skip pods evicted during node drains (default: true) | | `runbooks` | ๐Ÿ“š Add links to your runbooks per error reason | | `llm.enabled` | ๐Ÿค– AI enrichment (default: false) | | `containerRestartThreshold` | Alert if a container restarts this many times (0 = off) | | `reportStartupBaseline` | ๐Ÿ“‹ Send one startup summary of pre-existing issues (default: true) | #### ๐Ÿ”ฝ Filter by namespace ```yaml # Watch only these namespaces namespaces: - default - production # Or exclude some (can't mix both) namespaces: - !kube-system - !monitoring ``` #### ๐Ÿ”ฝ Filter by reason ```yaml # Only these reasons trigger alerts reasons: - CrashLoopBackOff - ImagePullBackOff # Or exclude some reasons: - !Started - !Killing ``` ### ๐Ÿ“ฑ App settings | Parameter | What it does | |:---|---| | `app.proxyURL` | ๐Ÿ”— Proxy for outgoing HTTP requests | | `app.clusterName` | ๐Ÿท๏ธ Name shown in alerts so you know which cluster | | `app.disableStartupMessage` | Silence the "kwatch is alive" welcome message | | `app.logFormatter` | Log format: `text` (default) or `json` | | `includeEvents` | ๐Ÿ“‹ Include K8s events in alerts (default: true) | | `includeLogs` | ๐Ÿ“‹ Include container logs in alerts (default: true) | ### ๐Ÿ’“ Health checks | Parameter | What it does | |:---|---| | `healthCheck.enabled` | โœ… Health endpoints (default: true) | | `healthCheck.port` | Port to serve health on (default: 8060) | | `healthCheck.pprof` | ๐Ÿ”ฌ Go profiling endpoints (default: false) | | `healthCheck.diagnostics` | ๐Ÿฉบ Extra endpoints: `/incidents`, `/test-alert`, `/deadletters` | **Endpoints:** - `GET /healthz` โ€” โœ… Liveness - `GET /readyz` โ€” โœ… Readiness - `GET /health` โ€” `{"status": "ok"}` - `GET /incidents` โ€” ๐Ÿ“‹ All active incidents (requires `diagnostics: true`) - `POST /test-alert` โ€” ๐Ÿ“ค Send a test alert (requires `diagnostics: true`) - `GET /deadletters` โ€” ๐Ÿ’€ Recent delivery failures (requires `diagnostics: true`) ### ๐Ÿ”„ Upgrader | Parameter | What it does | |:---|---| | `upgrader.disableUpdateCheck` | ๐Ÿ”• Don't check for new kwatch versions | --- ## ๐Ÿ“Š Monitors ### ๐Ÿ’พ PVC Monitor โ€” disk space alerts | Parameter | What it does | |:---|---| | `pvcMonitor.enabled` | โœ… Monitor disk usage (default: true) | | `pvcMonitor.interval` | Check every N minutes (default: 5) | | `pvcMonitor.threshold` | โš ๏ธ Warn at this % (default: 80) | | `pvcMonitor.criticalThreshold` | ๐Ÿšจ Critical at this % (default: 90) | | `pvcMonitor.clearThreshold` | โœ… Resolve below this % (default: 75) | ### ๐Ÿ–ฅ๏ธ Node Monitor | Parameter | What it does | |:---|---| | `nodeMonitor.enabled` | โœ… Watch for node problems (default: true) | Catches: `NotReady`, `Unknown`, `MemoryPressure`, `DiskPressure`, `PIDPressure`, `NetworkUnavailable`. ### ๐Ÿš€ Rollout Monitor | Parameter | What it does | |:---|---| | `rolloutMonitor.enabled` | โœ… Watch for stuck deployments (default: true) | | `rolloutMonitor.sustainedMinutes` | โฑ๏ธ Minutes of unavailability before alerting (default: 2) | ### ๐Ÿ“ก DaemonSet Monitor | Parameter | What it does | |:---|---| | `daemonSetMonitor.enabled` | โœ… Watch for unavailable DaemonSet pods (default: true) | ### ๐Ÿง‘โ€๐Ÿ’ผ Job Monitor | Parameter | What it does | |:---|---| | `jobMonitor.enabled` | โœ… Watch for failed/suspended Jobs (default: true) | ### โฐ CronJob Monitor | Parameter | What it does | |:---|---| | `cronJobMonitor.enabled` | โœ… Watch for suspended CronJobs or missed schedules (default: true) | ### ๐Ÿ“ˆ HPA Monitor | Parameter | What it does | |:---|---| | `hpaMonitor.enabled` | โœ… Watch HPAs stuck at max replicas (default: true) | | `hpaMonitor.sustainedMinutes` | โฑ๏ธ How long before alerting (default: 20 min) | ### ๐Ÿ’“ Heartbeat Monitor (dead man's switch) | Parameter | What it does | |:---|---| | `heartbeatMonitor.enabled` | Send pings to a health-check URL (default: false) | | `heartbeatMonitor.interval` | โฑ๏ธ Seconds between pings (default: 300) | | `heartbeatMonitor.url` | ๐Ÿ”— External URL (e.g. Healthchecks.io) | If kwatch stops or crashes, the external monitor stops getting pings and pages you. ๐Ÿ”” ### ๐Ÿ”’ TLS Certificate Monitor | Parameter | What it does | |:---|---| | `tlsMonitor.enabled` | ๐Ÿ” Watch for expiring certs (default: false) | | `tlsMonitor.threshold` | ๐Ÿ“… Days before warning (default: 30) | | `tlsMonitor.criticalThreshold` | ๐Ÿšจ Days before critical (default: 3) | ### ๐Ÿ”— Service Endpoint Monitor | Parameter | What it does | |:---|---| | `serviceMonitor.enabled` | ๐Ÿ”— Watch for services with zero ready endpoints (default: true) | Detects when a Service's backing Endpoints object has zero ready addresses, indicating no healthy pods are available to serve traffic. Includes a 60-second debounce to avoid flapping during rolling updates or brief endpoint transitions. ### ๐Ÿงฉ Admission Webhook Monitor | Parameter | What it does | |:---|---| | `admissionWebhookMonitor.enabled` | ๐Ÿงฉ Watch for webhooks with unreachable backends (default: true) | Monitors `MutatingWebhookConfiguration` and `ValidatingWebhookConfiguration` resources. Alerts when a webhook's backing service has no ready endpoints, meaning admission requests may fail or timeout. ### ๐Ÿ›๏ธ Control-Plane Monitor | Parameter | What it does | |:---|---| | `controlPlaneMonitor.enabled` | ๐Ÿ›๏ธ Watch for broken control-plane components (default: true) | Detects container issues (CrashLoopBackOff, Error, OOMKilled, etc.) in control-plane pods (kube-apiserver, kube-scheduler, kube-controller-manager, etcd, kube-proxy, coredns). Runs a dedicated sweep at startup to catch pre-existing failures. ### ๐ŸŒ Ingress Backend Monitor | Parameter | What it does | |:---|---| | `ingressMonitor.enabled` | ๐ŸŒ Watch for ingress backends with no ready endpoints (default: true) | Alerts when an Ingress rule references a backend service that has zero ready endpoints, meaning traffic to that host/path would return an error. ### ๐Ÿšง Network Policy Monitor | Parameter | What it does | |:---|---| | `networkPolicyMonitor.enabled` | ๐Ÿšง Detect overly restrictive network policies (default: true) | Detects `NetworkPolicy` resources that deny all ingress traffic (no ingress rules defined). Helps identify policies that may unintentionally block legitimate traffic. ### ๐Ÿงฉ StatefulSet Monitor | Parameter | What it does | |:---|---| | `statefulSetMonitor.enabled` | โœ… Watch for unavailable StatefulSet pods (default: true) | | `statefulSetMonitor.sustainedMinutes` | โฑ๏ธ Minutes of unavailability before alerting, plus 15-minute rollout grace (default: 5) | Monitors StatefulSets where `readyReplicas < replicas` for a sustained period, with a 15-minute grace window during rollouts to avoid alerting mid-update. ### ๐Ÿ”„ PDB Monitor | Parameter | What it does | |:---|---| | `pdbMonitor.enabled` | โœ… Watch for PDBs blocking voluntary disruptions (default: true) | | `pdbMonitor.sustainedMinutes` | โฑ๏ธ Minutes of blocking before alerting (default: 5) | Alerts when a PodDisruptionBudget has `disruptionsAllowed=0` and `currentHealthy < desiredHealthy`, meaning voluntary disruptions (rollouts, node drains) are blocked. ### ๐Ÿญ Node Resource Monitor | Parameter | What it does | |:---|---| | `nodeResourceMonitor.enabled` | โœ… Check node overcommit levels (default: true) | | `nodeResourceMonitor.intervalSeconds` | โฑ๏ธ How often to check (default: 300) | | `nodeResourceMonitor.cpuWarning` | โš ๏ธ CPU overcommit ratio for warning (default: 2.0) | | `nodeResourceMonitor.cpuCritical` | ๐Ÿšจ CPU overcommit ratio for critical (default: 4.0) | | `nodeResourceMonitor.memWarning` | โš ๏ธ Memory overcommit ratio for warning (default: 2.0) | | `nodeResourceMonitor.memCritical` | ๐Ÿšจ Memory overcommit ratio for critical (default: 4.0) | Periodically computes the ratio of pod resource requests vs node allocatable for CPU and memory. Data is purely in-memory โ€” no TSDB or persistent storage needed. ### ๐Ÿ’ฅ OOM Pattern Monitor | Parameter | What it does | |:---|---| | `oomMonitor.enabled` | โœ… Track repeating OOMs (default: true) | | `oomMonitor.threshold` | ๐Ÿ”ข OOM count within window to flag (default: 3) | | `oomMonitor.windowMinutes` | โฑ๏ธ Sliding window in minutes (default: 60) | Tracks OOMKilled events per container in a sliding window. When the threshold is exceeded, the reason changes from `OOMKilled` to `OOMRepeating` with a hint suggesting a potential memory leak. ### ๐ŸŽฏ Scheduling Delay Diagnostics | Parameter | What it does | |:---|---| | `scheduleMonitor.enabled` | โœ… Compute unschedulable delay (default: true) | When a pod is stuck Unschedulable, computes `now - PodScheduled.LastTransitionTime` and prepends the delay to the hint (e.g., `"unschedulable for 5m30s โ€” ..."`). โณ **Pending Pod Threshold** โ€” alert after N seconds stuck in Pending (default: 300s) ### ๐ŸŽฏ Severity | Parameter | What it does | |:---|---| | `severityByOwnerKind` | Set severity per resource type, e.g. `StatefulSet: "high"` | Defaults: `StatefulSet` โ†’ ๐Ÿ”ด high, everything else โ†’ ๐ŸŸก normal ### ๐Ÿ”‡ Silences โ€” stop the noise ```yaml silences: - namespaces: ["kube-system", "monitoring"] - reasons: ["BackOff"] - podNamePatterns: ["my-fancy-pod-.*"] ``` ### ๐Ÿšซ Inhibition โ€” no double alerts | Parameter | What it does | |:---|---| | `inhibition.nodeSuppressesPods` | โœ… Don't alert on pod issues if the node itself is down (default: true) | ### ๐Ÿ“ Custom message templates ```yaml templates: CrashLoopBackOff: "{{.Incident.Name}} โ€” {{.Action}} โ€” {{.Incident.Hint}}" ``` ### ๐Ÿง  Correlation โ€” smart incident grouping | Parameter | What it does | |:---|---| | `correlation.window` | โฑ๏ธ Keep incidents in memory (default: 10 min) | | `correlation.resolveHoldDown` | โฑ๏ธ Wait before sending "resolved" (default: 30s) | | `correlation.lifecycleInterval` | โฑ๏ธ Lifecycle check frequency (default: 1 min) | | `correlation.escalation.enabled` | โœ… Escalate severity on repeated crashes (default: true) | | `correlation.escalation.tiers` | ๐Ÿ“Š Restart thresholds: `[3, 10, 50]` | | `correlation.renotify.maxPerIncident` | ๐Ÿ”” Max re-alerts per incident (default: 3) | ### ๐Ÿงน Smart Grouping โ€” coalesce duplicate notifications | Parameter | What it does | |:---|---| | `smartGrouping.windowSeconds` | โฑ Grouping window in seconds (default: 60). Set to 0 to disable. | kwatch groups related incidents by the dimension that best captures each failure type's root cause. For example, OOMKilled and probe failures group by owner+namespace, node conditions group by node (not pod errors on the same node), image pull errors group by image (or globally for rate limits), and CrashLoopBackOff with a matching log signature bridges across owners. Each group notification shows affected pods, owners, nodes, or images depending on scope, with overflow counting above 1,000 entries. After a group notification is sent, the same condition will not re-notify until the underlying incident is resolved and re-occurs, preventing periodic flooding. ### ๐Ÿ“‹ CRD โ€” live config changes | Parameter | What it does | |:---|---| | `crd.enabled` | Watch `KwatchConfig` CRs for live config updates (default: false) | ```yaml apiVersion: kwatch.abahmed.dev/v1alpha1 kind: KwatchConfig metadata: name: kwatch-config namespace: kwatch spec: maxRecentLogLines: 100 silences: - namespaces: ["kube-system"] ``` --- ## ๐Ÿ”” Alert providers ### ๐Ÿ’ฌ Slack **Webhook mode:** | Parameter | What it does | |:---|---| | `alert.slack.webhook` | ๐Ÿ”— Slack webhook URL | | `alert.slack.channel` | ๐Ÿ“ข Override channel | | `alert.slack.title` | โœ๏ธ Custom title | | `alert.slack.text` | โœ๏ธ Custom text | | `alert.slack.compact` | ๐Ÿ“ Single-line mode | **Bot Token mode:** | Parameter | What it does | |:---|---| | `alert.slack.token` | ๐Ÿ”‘ Bot token (`xoxb-...`) | | `alert.slack.channel` | ๐Ÿ“ข Channel to post to | | `alert.slack.title` | โœ๏ธ Custom title | | `alert.slack.text` | โœ๏ธ Custom text | | `alert.slack.compact` | ๐Ÿ“ Single-line mode | **Compact mode:** ```yaml alert: slack: webhook: "https://hooks.slack.com/..." compact: true ``` > ๐Ÿ’ก **Pro tip:** When using bot token mode, alerts become threaded conversations โ€” root message on first alert, updates as replies. Clean and organized! ๐Ÿงน #### ๐Ÿ“ฎ Provider Routing & Retry ```yaml alert: slack: webhook: "" routes: - namespaces: ["production"] severities: ["high", "critical"] retry: maxAttempts: 3 delay: 5s ``` Need a backup? Set a fallback: ```yaml alert: slack: webhook: "" fallback: "pagerduty" # ๐Ÿ†˜ tries PagerDuty if Slack fails retry: maxAttempts: 3 ``` ### ๐Ÿ’ฌ Discord | Parameter | What it does | |:---|---| | `alert.discord.webhook` | ๐Ÿ”— Discord webhook URL | | `alert.discord.title` | โœ๏ธ Custom title | | `alert.discord.text` | โœ๏ธ Custom text | ### ๐Ÿ“ง Email | Parameter | What it does | |:---|---| | `alert.email.from` | ๐Ÿ“ค From address | | `alert.email.password` | ๐Ÿ”‘ From password | | `alert.email.host` | ๐Ÿ–ฅ๏ธ SMTP host | | `alert.email.port` | ๐Ÿ”Œ SMTP port | | `alert.email.to` | ๐Ÿ“ฅ Receiver email | ### ๐Ÿšจ PagerDuty | Parameter | What it does | |:---|---| | `alert.pagerduty.integrationKey` | ๐Ÿ”‘ PagerDuty integration key | ### โœˆ๏ธ Telegram | Parameter | What it does | |:---|---| | `alert.telegram.token` | ๐Ÿ”‘ Bot token | | `alert.telegram.chatId` | ๐Ÿ’ฌ Chat ID | ### ๐Ÿ’ผ Microsoft Teams | Parameter | What it does | |:---|---| | `alert.teams.webhook` | ๐Ÿ”— Webhook URL | | `alert.teams.title` | โœ๏ธ Custom title | | `alert.teams.text` | โœ๏ธ Custom text | ### ๐Ÿš€ Rocket Chat | Parameter | What it does | |:---|---| | `alert.rocketchat.webhook` | ๐Ÿ”— Webhook URL | | `alert.rocketchat.text` | โœ๏ธ Custom text | ### ๐ŸŒ Mattermost | Parameter | What it does | |:---|---| | `alert.mattermost.webhook` | ๐Ÿ”— Webhook URL | | `alert.mattermost.title` | โœ๏ธ Custom title | | `alert.mattermost.text` | โœ๏ธ Custom text | ### ๐Ÿ”” Opsgenie | Parameter | What it does | |:---|---| | `alert.opsgenie.apiKey` | ๐Ÿ”‘ API Key | | `alert.opsgenie.title` | โœ๏ธ Custom title | | `alert.opsgenie.text` | โœ๏ธ Custom text | ### ๐Ÿ—๏ธ Matrix | Parameter | What it does | |:---|---| | `alert.matrix.homeServer` | ๐Ÿ–ฅ๏ธ HomeServer URL | | `alert.matrix.accessToken` | ๐Ÿ”‘ Access token | | `alert.matrix.internalRoomID` | ๐Ÿ†” Room ID | | `alert.matrix.title` | โœ๏ธ Custom title | | `alert.matrix.text` | โœ๏ธ Custom text | ### ๐Ÿ”” DingTalk | Parameter | What it does | |:---|---| | `alert.dingtalk.accessToken` | ๐Ÿ”‘ Access token | | `alert.dingtalk.secret` | ๐Ÿ” Signing secret | | `alert.dingtalk.title` | โœ๏ธ Custom title | ### ๐Ÿฆ FeiShu | Parameter | What it does | |:---|---| | `alert.feishu.webhook` | ๐Ÿ”— Webhook URL | | `alert.feishu.title` | โœ๏ธ Custom title | ### ๐Ÿ›ก๏ธ Zenduty | Parameter | What it does | |:---|---| | `alert.zenduty.integrationKey` | ๐Ÿ”‘ Integration Key | | `alert.zenduty.alertType` | ๐Ÿท๏ธ Alert type (default: critical) | ### ๐Ÿ’ฌ Google Chat | Parameter | What it does | |:---|---| | `alert.googlechat.webhook` | ๐Ÿ”— Webhook URL | | `alert.googlechat.text` | โœ๏ธ Custom text | ### ๐Ÿ”— Custom Webhook | Parameter | What it does | |:---|---| | `alert.webhook.url` | ๐Ÿ”— Webhook URL | | `alert.webhook.headers` | ๐Ÿ“‹ Custom headers | | `alert.webhook.basicAuth` | ๐Ÿ” Username + password | --- ## ๐Ÿ› ๏ธ CLI commands | Command | What it does | |:---|---| | `kwatch` | โ–ถ๏ธ Run the main monitor | | `kwatch --version` | โ„น๏ธ Print version | | `kwatch lint` | โœ… Validate your config | | `kwatch lint --strict` | โœ…โœ… Strict check (catches typos!) | | `kwatch lint --check` | โœ…โœ…โœ… Validate + test provider credentials | | `kwatch replay < events.jsonl` | ๐ŸŽฌ Replay past events to test | --- ## ๐Ÿงน Clean up ```shell kubectl delete -f https://raw.githubusercontent.com/abahmed/kwatch/v0.11.0/deploy/config.yaml kubectl delete -f https://raw.githubusercontent.com/abahmed/kwatch/v0.11.0/deploy/deploy.yaml ``` --- ## ๐Ÿ“– Not a monitoring platform โ€” and proud of it! ๐ŸŽ‰ kwatch is **not** a metrics collector, dashboard, or observability backend. No TSDB, no dashboards, no log storage, no query language. kwatch is the **alarm** โ€” your existing tools are the archive. Need full observability? Pair kwatch with Prometheus + Grafana for metrics, or Loki for logs. kwatch handles the one thing a dashboard cannot: telling you something broke **right now**. โฐ --- ## ๐Ÿ‘ Contribute & Support + โญ [Give us a star](https://github.com/abahmed/kwatch/stargazers) โ€” it really helps! + ๐Ÿ’ก [Suggest features](https://github.com/abahmed/kwatch/issues) + ๐Ÿ› [Report bugs](https://github.com/abahmed/kwatch/issues) ## ๐Ÿš€ Who uses kwatch? **kwatch** is trusted by: [](https://www.trella.app) [](https://ibecsystems.com/en#/) [](https://www.justwatch.com/us/talent) Want to add your company? [Open an issue!](https://github.com/abahmed/kwatch/issues) ## ๐Ÿ’ป Contributors ## โญ๏ธ Stargazers Stargazers over time ## ๐Ÿ‘‹ Get in touch Questions? Suggestions? [Chat with us on Discord](https://discord.gg/kzJszdKmJ7) โ€” we're friendly! ๐ŸŽ‰ ## โš ๏ธ License kwatch is [MIT Licensed](LICENSE) โ€” use it, fork it, share it! ๐ŸŽŠ