4740687b96
Release / test (push) Failing after 6s
Release / build (amd64, darwin) (push) Has been skipped
Release / build (amd64, linux) (push) Has been skipped
Release / build (arm64, darwin) (push) Has been skipped
Release / build (arm64, linux) (push) Has been skipped
Release / release (push) Has been skipped
Stats was the one full-screen view reached by a key of its own rather than by tab, and the interface was less coherent for it. It is now a section sitting third, after Alerts, and behaves like every other one: tab in, tab out, r to refresh. Three things fall out of the move. It auto-refreshes for the first time — the tick handler skips every non-dashboard mode, which is why the overlay never updated while it was open. Its error path no longer forces the queue back into view on a failed fetch, an assumption that only made sense while stats floated above the dashboard. And first-visit loading keys off a statsLoaded flag rather than slice emptiness, because the three empty slices a quiet server returns are a real answer, not a missing one; the loading placeholder is likewise suppressed once something has been drawn, so a background refresh cannot blank the page out from under whoever is reading it. The S key is gone, and with it the ability to peek at statistics from an open incident and land back on it. That round-trip was the only thing statsReturnMode bought, and it was the whole reason stats needed a mode.
133 lines
3.9 KiB
Markdown
133 lines
3.9 KiB
Markdown
# terdut-tui
|
|
|
|
A terminal user interface for [terdut-server](https://github.com/terdut-server). Communicates with the server over its REST API.
|
|
|
|
Written in Go using [Bubbletea](https://github.com/charmbracelet/bubbletea).
|
|
|
|
## Features
|
|
|
|
- **Incident queue** — open incidents with severity, status, assignee and age, auto-refreshing
|
|
- **Incident actions** — acknowledge, assign, snooze, note, resolve and archive
|
|
- **Timeline** — the full history of an incident, system events and notes together
|
|
- **Alert feed** — the raw read-only alerts underneath, each linked to its incident
|
|
- **On-call schedule** — visual calendar of who is on duty, assign and remove entries
|
|
- **Statistics** — MTTA and MTTR, plus alert frequency by name, hour and day
|
|
- **User management** — add and remove users, manage API keys
|
|
|
|
> Requires terdut-server **v0.4.0 or later**. Earlier servers have no incidents API;
|
|
> use terdut-tui v0.3.x with those.
|
|
|
|
## Alerts and incidents
|
|
|
|
The server keeps two objects and this client follows that split:
|
|
|
|
- An **alert** is Alertmanager's record — firing or resolved, and read-only here.
|
|
- An **incident** is the work item. It is what you acknowledge, assign, snooze,
|
|
discuss and resolve, and it is where all the actions live.
|
|
|
|
Incidents are correlated by the `groupKey` Alertmanager already computed from your
|
|
`group_by` configuration, so several alerts commonly share one incident.
|
|
|
|
Two behaviours worth knowing before you press a key:
|
|
|
|
- **Resolving is final.** The server treats a manual resolve as terminal: a later
|
|
occurrence opens a *new* incident rather than reopening this one, and if the alert
|
|
underneath never stops firing the incident stays closed. The TUI asks for
|
|
confirmation before doing it.
|
|
- **Snooze is the "not now" button.** It hides an incident from the default queue
|
|
without closing it, and expires on its own.
|
|
|
|
## Installation
|
|
|
|
Download the latest release binary for your platform from the [releases page](https://github.com/yeniklas/terdut-tui/releases), or build from source:
|
|
|
|
```bash
|
|
go install github.com/yeniklas/terdut-tui@latest
|
|
```
|
|
|
|
## Configuration
|
|
|
|
Create `~/.config/terdut-tui/config.yaml`:
|
|
|
|
```yaml
|
|
server_url: https://terdut.example.com
|
|
api_key: <your-api-key>
|
|
refresh_interval: 30 # seconds, optional
|
|
```
|
|
|
|
The API key is generated in terdut-server. See the server documentation for how to bootstrap a user and issue an API key.
|
|
|
|
## Usage
|
|
|
|
```
|
|
terdut-tui start the TUI
|
|
terdut-tui --version print version
|
|
terdut-tui --self-update update to the latest release
|
|
```
|
|
|
|
### Keybindings
|
|
|
|
Global:
|
|
|
|
| Key | Action |
|
|
|-----|--------|
|
|
| `j` / `↓` | Move down |
|
|
| `k` / `↑` | Move up |
|
|
| `tab` / `shift+tab` | Next / previous section |
|
|
| `enter` | Open detail |
|
|
| `esc` | Go back |
|
|
| `r` | Refresh |
|
|
| `f` | Cycle filter |
|
|
| `q` | Quit |
|
|
|
|
The sections, in `tab` order: Incidents · Alerts · Stats · Archived · Schedule · Users.
|
|
|
|
Incidents section:
|
|
|
|
| Key | Action |
|
|
|-----|--------|
|
|
| `f` | Cycle: open → triggered → acknowledged → resolved → snoozed |
|
|
| `x` | Archive (resolved incidents only) |
|
|
|
|
Incident detail:
|
|
|
|
| Key | Action |
|
|
|-----|--------|
|
|
| `a` / `A` | Acknowledge / clear acknowledgement |
|
|
| `R` | Resolve — asks to confirm, and is final |
|
|
| `s` | Assign to a user |
|
|
| `z` / `Z` | Snooze for a duration / un-snooze |
|
|
| `c` | Add a note |
|
|
| `[` / `]` | Select a note |
|
|
| `d` | Delete the selected note (your own only) |
|
|
| `x` | Archive / un-archive |
|
|
|
|
Alerts section (read-only):
|
|
|
|
| Key | Action |
|
|
|-----|--------|
|
|
| `f` | Cycle: firing → resolved → all → archived |
|
|
| `i` | In detail: jump to the alert's incident |
|
|
|
|
Stats section:
|
|
|
|
| Key | Action |
|
|
|-----|--------|
|
|
| `j` / `k`, `pgup` / `pgdn` | Scroll |
|
|
|
|
Schedule section:
|
|
|
|
| Key | Action |
|
|
|-----|--------|
|
|
| `+` / `W` | Assign a day / a whole week |
|
|
| `d` | Remove the assignment |
|
|
| `←` / `→` | Shift the week window |
|
|
|
|
Users section:
|
|
|
|
| Key | Action |
|
|
|-----|--------|
|
|
| `n` | Create a user |
|
|
| `d` | Delete a user |
|
|
| `k` | API keys for the selected user |
|