Dev UI panel
When running in dev mode, Goblin provides a control panel in the Quarkus Dev UI (accessible at /q/dev). You reach it by clicking the Goblin card in the extension grid:
The Goblin card in the Dev UI extension grid.
Chaos Dashboard
The dashboard is the main control surface. It exposes the master toggle, the target level, the chaos layers, the profile, per-type toggles and configuration forms, quick picks, and live assault counters.
The Chaos Dashboard with latency enabled at 100% target level.
-
Master toggle — Activate/deactivate all chaos with a single click. When inactive, the status dot turns red and the
Deactivatebutton becomesActivate. The active flag is not persisted: after a restart it comes back fromquarkus.goblin.enabled. -
Kill switch —
Disable all(orCtrl/Cmd+Shift+Xwhile the Chaos Dashboard is open) asks for confirmation, then deactivates chaos, turns every assault type and client-side assault off, resets the profile toNONEand cancels any pending auto-off. -
Auto-off — Optionally deactivate chaos automatically after 5, 10, 30 or 60 minutes. The deadline is held by the engine, not by the browser: chaos switches off at the deadline even when the Dev UI is closed, and a pending auto-off survives a live reload. A countdown shows the remaining time and can be cancelled; deactivating chaos (master toggle or kill switch) cancels it too.
-
Blast radius warning — A banner warns when chaos is active with two or more server-side assaults at a 100% level: every eligible request is then assaulted.
-
Live counters — The status bar shows the total number of assaults since the last reset (with a
resetaction) and one chip per source that fired (REST,service,database,messaging,REST client,WebClient), refreshed every 2 seconds together with the config. -
Profile selector — Pick a predefined composite assault mode (
NONE,SLOW_FAILURE,INTERMITTENT,TIMEOUT); a predefined profile other thanNONEasks for confirmation before it is applied. It turns every server-side assault off, then enables its own assaults with their defaults (see Profiles). The active profile is shown in the status bar, with anoverridemarker when a server-side toggle no longer matches the profile. Individual toggles stay overridable on top of the profile. -
Custom profiles —
Save current as profileasks for a name and stores the current configuration in the browser (not on the server). A custom profile is re-applied from the profile selector (Custom: <name>) and removed withDelete active. The status bar keeps showing the predefined profile held by the engine (oftenNone (manual)); the custom name only appears in the selector. -
Assault type toggles — Independent on/off switches for each assault type (Latency, Exception, HTTP Status, Dependency Degradation, Response Body, Response Header). Multiple types can be active simultaneously. Enabled types are highlighted with the Quarkus primary color, and each row shows its priority.
-
Priority badges — Each assault row shows when it runs:
10latency,20exception,30HTTP status and40dependency degradation run in that order before the endpoint (the first aborting one short-circuits the request);Rmarks the response-phase transformations (response body, then response headers);Cmarks the client-side assaults on outgoing calls. -
Client-side assault toggles — A dedicated section controls
client latencyandclient exception, applied to outgoing MicroProfile REST Client and Vert.x WebClient calls. They default to off and reuse the latency range and exception class/message configured above. -
Quick picks — One-click presets in the Exception section (verified exception classes, served by the engine and guaranteed to be throwable — no fallback) and in the HTTP Status section (
500,503,429,404). A pick fills the form; clickSaveto apply it. -
Config sections — Each assault type has its own configuration section (latency range, exception class/message, HTTP status code/message, response body mode/percentage, response header rules as editable rows with a single
Save headersaction). While a type is off, its section only shows a summary of the current values (e.g.Current: 503. Enable HTTP status assault to configure.); enable the type to display and edit its parameters. Every section has its ownSavebutton, enabled once the form is modified. -
Validation — The latency, exception, HTTP status, response body and level forms are checked as you type: an invalid value (for example a latency
mingreater thanmax) shows a message and keepsSavedisabled. The response header rules are checked when you clickSave headers: an empty name or a name that is not an HTTP token is reported in an error toast and nothing is saved. Values the forms accept are still checked by the engine, which may correct them (see Configuration validation); the correction is shown in a toast. -
Target level — A numeric field (0-100%) in the status bar sets the percentage of affected requests, saved with its own button.
-
Chaos layers — A dedicated section lists one switch per chaos layer, from the deepest to the shallowest:
Database,Messaging,Service,Outbound HTTPandInbound REST(DATABASE,MESSAGING,SERVICE,HTTP_OUT,HTTP_IN). Only the armed layers are candidates each request; the deepest armed layer whose probability roll passes wins for that request (see Chaos layers).Database(requires a JDBC datasource) andMessaging(requiresquarkus-messaging) are marked unavailable and cannot be switched on when the application lacks the matching extension. By defaultHTTP_INandHTTP_OUTare armed, which keeps the pre-layers behaviour; switching every layer off re-arms that default. -
Danger zone — Export the current configuration as a JSON file, import a previously exported one (or any partial config), or reset the whole configuration. The reset asks for confirmation, then restores the built-in defaults — not the values of
application.properties: latency assault on with100-5000ms, every other assault off, HTTP503, level100, no header rules, layersHTTP_IN+HTTP_OUT. It leaves the active flag and any pending auto-off unchanged. An import is applied at once: a rejected file changes nothing. -
All changes apply instantly — no restart needed. A WARN log is emitted in the console for every change, and a toast confirms each action in the UI. If the engine corrects a value (see Configuration validation), the toast shows the applied correction.
-
Persistence — In dev mode every configuration change is written to
.goblin-state.jsonin the project directory, and that file is loaded at the next start instead of thequarkus.goblin.assault.*andquarkus.goblin.target.levelproperties (the active flag excepted). Delete the file to start again fromapplication.properties(see Configuration reference).
| When chaos is deactivated, every toggle and form stays editable: you can prepare your assault configuration before turning chaos on. |
History
The History panel is a live chaos-testing console. It auto-refreshes every 2 seconds while the panel is visible, so new assaults appear as they happen without a manual reload.
The Assault History panel showing past triggered assaults.
Each row shows:
-
the timestamp of the assault — millisecond precision, with the full ISO timestamp shown on hover
-
the assaulted target: the resource method (
SampleResource.hello), the application bean method (SERVICE),Database <datasource> connection,Messaging <consumer>, or the outgoing call (REST-Client GET <url>,WebClient GET <url>) -
the assault type shown as a colored badge —
Latency,Exception,HTTP Status,Dependency, and for response body assaults two distinct badges depending on the mode:Truncate(response-body-truncate) andInflate(response-body-inflate). Response header rules are shown asHeader Set: <name>/Header Remove: <name> -
the actual applied latency duration when the assault was a latency injection
-
the active assault configuration at the time of the assault, stored compactly in an
Active Configcell — click the cell to expand or collapse it
Newest assaults appear first. A summary band above the table shows the totals per assault type and the average injected latency, updated live (the response body total combines both modes, the response header total combines every header rule).
A filter bar narrows the list: filter by assault type (the Response Body entry groups the truncate and inflate modes, the Response Header entry groups every header rule), by a method text search, or by time period (last 5 minutes, 30 minutes, 1 hour, 24 hours, or all time). The counter shows how many of the total assaults match the current filters.
The history is an in-memory buffer capped at the latest 1000 assaults. Use it to confirm that your targeting rules and level are applying to the expected endpoints before drawing conclusions about your resilience checks. Clear History wipes the buffer between test sessions — the first click arms the button, a second click within 3 seconds performs the clear.
Markdown report export
The History panel also offers an Export Markdown button. Clicking it generates a factual Markdown report of the current Goblin session and displays it in a panel with Copy and Download actions:
-
the current status (active/inactive) and target level
-
the current assault configuration (active profile, armed chaos layers, latency, exception, HTTP status, dependency degradation, response body toggles and values, response header rules, client-side assault toggles)
-
the full assault history, including the source of each assault (
server,service,database,messaging,rest-client,webclient), the actual latency duration applied for each latency assault and a snapshot of the active configuration at the time of each assault — so a config change between two calls is clearly visible (e.g.latency enabled (100 - 500 ms)vslatency enabled (1000 - 5000 ms))
The exported Markdown report with the assault history table.
The report is intentionally factual: it records what Goblin observed (configuration and assault history), without judging your application’s resilience. This makes it directly usable as input for an LLM assistant tasked with reviewing and hardening your endpoints — the facts ("`GET /api/orders` was subject to a 4945 ms latency at 10:37 UTC") are there, the verdict is left to the reviewer.