62 minutes after the incident
$ kubectl get events -n payments --sort-by=.lastTimestamp
No resources found in payments namespace.

kube-apiserver's --event-ttl defaults to 1h. After that, events are garbage-collected from etcd.

Radar OSS · Event timeline

Kubernetes deletes events after an hour. Radar doesn't.

Every event and resource delta, captured via Watch the instant it fires - so “what changed right before this broke?” still has an answer when the pager goes off hours later.

Radar timeline showing Kubernetes events and resource changes over time with problem lanes and a live edge

“So raise --event-ttl.”

On managed clusters (GKE, EKS, AKS), you usually can't. On self-managed clusters you can - but events live in etcd, so raising the TTL inflates etcd and eventually hurts control-plane latency. The default is low on purpose: don't use your API server as an audit log. Radar captures events via Watch the moment they fire and keeps the history outside the control plane - whatever the API server deletes in an hour, Radar has already seen and kept.

Deduplicated events
repeats collapse by resource + reason + message, with a count - a FailedScheduling that fires thirty times shows up once
Resource deltas with diffs
replicas 3 → 10, image bumps, ConfigMap edits - structured changes, not free-text log lines
Retention past the TTL
captured via Watch the moment they fire; in-memory by default (bounded by --history-limit, 10k events out of the box), SQLite when you want restarts survived
Hard filters, in the URL
type, namespace, kind, reason (OOMKilled, FailedMount), free text - paste the link in Slack, teammate sees the same view
Live via SSE
the timeline extends itself as events fire; no polling, no refresh button
Time-scoped resource views
click an entry and see that resource as it was at that moment - replica counts, labels, annotations, status conditions
A real timeline entry

Events with context, not just strings.

Every entry is structured: the involved object, the reason, the count, the first and last timestamps, the kubelet or controller that emitted it. Click into any entry and the resource detail opens with that resource's state at that moment - replica counts, labels, annotations, status conditions.

Structured entries are also what make the timeline filterable by reason and shareable by URL - the same view opens on the next engineer's screen.

Warning · 14:01:47ZOOMKilled
{
  "type": "Warning",
  "reason": "OOMKilled",
  "involvedObject": {
    "kind": "Pod",
    "name": "api-7d9f-k2pxq",
    "namespace": "api"
  },
  "message": "Container api exceeded memory limit (512Mi)",
  "firstTimestamp": "2026-03-10T14:01:47Z",
  "count": 1,
  "source": {
    "component": "kubelet",
    "host": "ip-10-0-4-212.ec2.internal"
  }
}
Under the hood

Why the timeline holds up.

01

Watch API, not polling

SharedInformers set up Watch connections against the apiserver. When an event fires, the informer fires a callback. Radar captures it before it's subject to TTL pressure.

02

Local or Cloud retention

In-memory by default - fast, fits the local use-case, gone on restart. --timeline-storage=sqlite persists to a local file so history survives between sessions. Radar Cloud adds cloud-backed retention up to one year.

03

Diffs, not blobs

Resource changes land as structured deltas - what fields moved, from what to what. That's how Radar can show you the exact ConfigMap edit that preceded the OOMKill, not just “something changed.”

Open source

Apache 2.0. Yours to inspect, fork, or self-host.

Radar's source is on GitHub. Every feature on this page is in the binary you install with brew install. No telemetry, no mandatory login, no cluster data out. The one outbound call is an anonymous version check when the UI opens. If we ever change that, you'll see it in a diff first.

skyhook-io/radar
2.6k★ GitHub stars
Apache 2.0 · Actively maintained
FAQ

Questions we get about the timeline.

What happens to Kubernetes events after the default 1-hour TTL?
kube-apiserver's --event-ttl defaults to one hour; after that, events are garbage-collected from etcd. Radar captures events the instant they fire via Kubernetes Watch, so its history isn't limited by what the API server has retained.
Why not just raise --event-ttl?
On managed clusters (GKE, EKS, AKS) you usually can't. On self-managed clusters you can, but events live in etcd - raising the TTL inflates etcd and eventually hurts control-plane latency. The default is low for a reason: the API server isn't an audit log. Radar keeps the history outside the control plane instead.
Does Radar's timeline survive a restart?
Not by default - in-memory storage is fast but clears on restart. In-memory history is bounded by --history-limit (10,000 events by default), so memory mode can't grow without bound. Pass --timeline-storage=sqlite to persist to a local file instead. Radar Cloud adds cloud-backed retention up to one year on top of either mode.
Can I see what actually changed, not just that something changed?
Yes. Resource changes land as structured deltas - replica count jumps, container image bumps, annotation and ConfigMap edits - not free-text log lines.
Can I filter and share a specific timeline view?
Yes. Filter by type (Normal/Warning), namespace, resource kind, reason (OOMKilled, FailedMount, Unhealthy), or free-text search. Filters live in the URL, so pasting a timeline link in Slack opens the same filtered view for the next engineer.

Need the history shared and durable? Radar Cloud retains each cluster's timeline for up to a year, for the whole team.

Debug from the record, not from memory.

Every event and delta since Radar started watching - kept past the TTL, filterable, shareable.

Apache 2.0 OSS · Unlimited clusters self-hosted · Hosted free tier for up to 3 clusters