Skip to content

Audit Log

The Audit Log (/audit-log) is the system-wide record of every operator action that mutated state in a monitored service. Pause a listener, replay a DLQ batch, hard-delete a tenant — it lands here, signed with the operator's identity and the parameters of the action.

This is the page you open when production is acting weird and you need to know who did what, when.

Filters

The filter row at the top of the page narrows the table to a subset of entries.

FilterEffect
All Services dropdownRestrict to actions targeting one service
All Actions dropdownRestrict to one action type (e.g. HardDeleteTenant)
SearchFree-text search against details, target URI, action name, and service name

Service and Action filters re-fetch from the server (the search box filters the already-loaded page in-memory). Filters do not persist across reloads.

Table

ColumnMeaning
TimestampRelative time (e.g. 12m ago) — tooltip shows the absolute timestamp
ActionAction type, rendered as a colored badge (see badge-colour mapping below)
ServiceThe service the action targeted
TargetOptional target URI (endpoint URI, projection shard, tenant id, etc.)
DetailsFree-form description
Parameters"Show (N)" button if the action carried structured parameters; click to expand a key=value list under the row
UserInitiated-by identity

Action Categories

Every action belongs to one of six categories, used for badge colouring and quick filtering by intent:

CategoryActions in this categoryBadge colour
dlqReplayDlq, DiscardDlqOrange
listenerPauseListener, RestartListenerBlue
projectionRebuildProjection, RewindSubscriptionPurple
alertClearAlertGreen
tenantAddTenant, RemoveTenant, HardDeleteTenant, DisableTenant, EnableTenantTeal
configEditScheduledMessage, UpdateEndpointConfig, PushAgentThresholds, othersGrey

The mapping lives in src/FrontEnd/src/composables/useAuditLog.ts (actionCategory() and actionBadgeColor()).

HardDeleteTenant Entries

The new HardDeleteTenant action type is logged with extra parameters captured at the moment of confirmation:

ParameterMeaning
tenantIdThe exact tenant id the operator typed
databaseUriThe database that was dropped
confirmedAtWall-clock time of the typed-id confirmation

Click "Show (3)" on a HardDeleteTenant row to expand these. Audit entries for hard deletes are intentionally verbose because the action is irreversible; the parameters block lets you reconstruct the exact state at the moment of click.

Pagination

Bottom of the page. Page sizes 25 / 50 / 100. Server-side cap is 500 entries per fetch — the audit log is intended for recent forensic work, not long-term archival. For longer retention, configure the AuditLogRetentionDays value in Settings → Data Retention (default: 30 days).

Auto-Refresh

The "Auto-Refresh Off" / "Auto-Refresh On" toggle in the header polls every 10 seconds when enabled. Auto-refresh is off by default — the audit log doesn't change frequently and the display would jitter on every poll. Turn it on if you're following a coordinated incident in real time.

Refresh

Manual refresh button next to the auto-refresh toggle. Re-fetches with the current filters applied.

API

The audit table is backed by GET /api/critterwatch/audit-log with optional ?service= and ?action= query parameters. Operators with shell access can query the same data directly with curl for offline analysis or scripted exports. The default fetch limit is 500 rows.

Released under the MIT License.