Vault (Log Archive)
Archive suppressed log lines to cloud storage and recover them instantly
What Is Vault?
Vault is Edge's log archiving feature. When enabled, Edge writes every suppressed event (the ones replaced by a summary) to cloud storage — giving you a complete, cost-effective archive of exactly the log lines you no longer see inline. Non-suppressed events are unaffected: they already reach your normal destination unchanged, so Vault does not duplicate them. Suppressed logs can be recovered instantly using the backfill link included in every suppression summary.
Key Benefits:
- Complete history of what was suppressed: every suppressed log line is archived, in full
- Instant recovery: Retrieve original logs in seconds
- Cost-effective: Cloud storage archiving at ~$0.02/GB/month
- Multi-cloud: Supports AWS S3, Google Cloud Storage, and Azure Blob Storage
Need a complete copy of every log line — suppressed or not — in storage you control? See Raw Archival Sink below.
Enabling Vault
Add the vault configuration under the configMap section in your values.yaml:
AWS S3
configMap:
forwarder:
vault:
enabled: true
provider: "s3"
bucket: "my-log-archive"
prefix: "logs" # Optional: object key prefix
region: "us-east-1" # AWS region (default: us-east-1)Authentication: Uses the node's IAM role or IRSA (recommended). No credentials needed in config. The role must allow s3:PutObject, s3:GetObject, s3:DeleteObject, and s3:ListBucket on the vault bucket.
Google Cloud Storage
configMap:
forwarder:
vault:
enabled: true
provider: "gcs"
bucket: "my-log-archive"
prefix: "logs"Authentication: Uses Workload Identity (recommended) or node service account. The identity must have the Storage Object Admin role on the vault bucket (covers create, get, delete, and list).
Azure Blob Storage
configMap:
forwarder:
vault:
enabled: true
provider: "azure"
bucket: "my-log-container" # Azure Blob Storage container name
prefix: "logs"
azure_storage_account: "mystorageaccount"Authentication: Uses Managed Identity (recommended) or storage account key. The Managed Identity needs one Azure RBAC role:
Storage Blob Data Contributoron the storage account or container — allows Edge to read, write, and delete archived log files
If using a storage account key instead of Managed Identity, only the key is needed — no RBAC roles required. Note: The bucket field maps to an Azure Blob Storage container name (the top-level grouping inside a storage account).
S3-Compatible Storage (MinIO)
Vault also supports any S3-compatible storage backend:
configMap:
forwarder:
vault:
enabled: true
provider: "s3"
bucket: "my-log-archive"
s3_endpoint: "https://minio.internal:9000"
s3_force_path_style: true # Required for MinIO
region: "us-east-1"Retrieving Archived Logs
Every suppression summary written by Edge includes a backfill_url field. Click the link to open the Replay Viewer with all original suppressed logs for that pattern and time window.
A backfill_url never dangles. Edge is fail-closed by default (require_archive): if its durable-write path to the Vault is unhealthy — a cloud-storage outage, an expired license, or a full retry spool — it stops suppressing and passes raw lines straight through to your log platform until durability is confirmed again. So Auditty never emits a summary (and never asks you to trust a backfill link) for data it could not durably archive. Combined with the on-disk retry spool and off-node write-ahead log, this makes the suppress→archive→backfill path lossless end to end.
Example summary (JSON format):
{
"message": "Health check passed",
"auditty": {
"suppressed": 100,
"window": { "start": "2026-01-15T09:00:00Z", "end": "2026-01-15T09:05:00Z" },
"duration": "5m0s",
"fingerprint": "a1b2c3d4",
"backfill_url": "https://<your-hivemind-url>/backfill/replay?token=<TOKEN>&sig=<SIG>"
}
}No extra tooling required. The backfill URL is self-contained and HMAC-signed. The link format is unchanged regardless of access level — verification is transparent to the person sharing the link.
Access control: Admins can require viewer identity verification (Google/Microsoft sign-in) or full authentication before viewing backfill URLs. See User Management & Access → Backfill Link Access Control for details.
Programmatic / Agentic Backfill API (JSON)
Raw (including suppressed) archived logs are available as JSON for scripts, agents, and compliance tooling — no browser required. For automated/agentic workflows use the versioned public API under /api/v1/backfill/*. These endpoints return JSON only and carry a stability guarantee (see below) — build against them rather than the HTML backfill page or the UI’s internal routes.
Authentication is the token + sig pair already embedded in every suppression summary’s backfill_url (HMAC-signed, tenant-scoped, capability-style). No session or separate API key is required, so an agent can go straight from a Datadog/Splunk record to its originals.
Endpoints
GET /api/v1/backfill/status— poll cache warm-up. Returns{ status }where status isloading|ready|empty|failed|unavailable. Passbust=1to force a re-fetch of an empty result.GET /api/v1/backfill/page— paginated raw original records. Params:page(1–1000, default 1),search(substring filter on the log line),sort(asc|desc, defaultdesc).GET /api/v1/backfill/histogram— time-bucketed counts:{ histogram: [{ t, count }] }.GET /api/v1/backfill/integrations— enabled restore targets for the tenant:[{ id, platform, name }](never keys or config).POST /api/v1/backfill/replay— restore the originals into an integration (e.g. Datadog). Body:{ token, sig, integrationId, force? }. Idempotent; streams progress when the request sendsAccept: text/event-stream.
Read flow — poll status until ready, then page through the records:
# token + sig come from the summary's backfill_url
GET /api/v1/backfill/status?token=<TOKEN>&sig=<SIG>
{ "status": "ready" } # retry while "loading"
GET /api/v1/backfill/page?token=<TOKEN>&sig=<SIG>&page=1&sort=desc
{
"records": [
{
"timestamp": "2026-01-01T00:00:01.123Z",
"namespace": "payments",
"workload": "api",
"fingerprint": "a1b2c3d4",
"node_id": "node-1",
"source_uri": "...",
"suppressed": true,
"log_line": "Health check passed",
"preserved_json": "{...}"
}
],
"totalCount": 100,
"hasMore": false,
"page": 1,
"pageSize": 100,
"queryTimeMs": 7
}
# paginate while hasMore === trueRestore flow — list targets, then replay the originals back into your platform:
GET /api/v1/backfill/integrations?token=<TOKEN>&sig=<SIG>
[ { "id": 12, "platform": "datadog", "name": "DD - prod" } ]
POST /api/v1/backfill/replay
{ "token": "<TOKEN>", "sig": "<SIG>", "integrationId": 12 }
{ "totalSent": 100, "totalFailed": 0, "durationMs": 842 }
# already replayed (idempotent): { "alreadyReplayed": true, "totalSent": 100, ... }
# pass "force": true to re-sendVersioning & stability
- Stable contract: response shapes under
/api/v1/backfill/*are frozen. We only make additive, backward-compatible changes (new optional fields). - No breaking changes to v1 — any incompatible change ships as a new
/api/v2/namespace, and v1 keeps working. - Tenant-isolated: the signed token scopes every call to a single tenant; a forged path or fingerprint cannot cross tenant boundaries.
POST /api/v1/backfill/replayrequires admin-enabled public replay (Settings → Backfill Replay); when disabled it returns403.
Alternative — by fingerprint (no summary needed). To query the archive for any fingerprint and date range, use GET /api/vault/logs?fingerprint=…&startDate=YYYY-MM-DD&page=1. This call is authenticated with your Auditty session (not a backfill token) and returns the same record shape, with { status: "loading", retryAfterMs } (HTTP 202) while a cold fingerprint warms up.
Field Predicates: Filtering by Value
The summary's ids object indexes only searchable correlation keys — bare magnitudes and measurements (latencies.kong, bytes_sent) are archived losslessly but aren't listed there. A field predicate lets you filter a backfill down to only the rows where a specific field in preserved_json matches a value or comparison — no need to promote the field first, and no need to page through every archived record by hand.
In the Replay Viewer, use the filter box above the table: enter a field name (dotted paths like latencies.kong work directly — no need to escape the dot), pick an operator, and a value.
Supported operators:
=/!=— exact match / not-equal (string or numeric)>/>=/</<=— numeric comparisoncontains— substring match
latencies.kong > 100 # only rows where the kong measurement exceeded 100Tamper-proof and shareable: the predicate is embedded in the signed backfill token itself (GET /api/backfill/refine mints a fresh token when you set or clear a filter), so a refined link filters identically for anyone who opens it — and can’t be edited client-side to see data outside the token’s original scope. Refining or clearing a filter reuses the already-fetched data; it does not re-run the backfill from scratch.
This works with the paginated table view and the time histogram alike, and with the JSON API (GET /api/v1/backfill/page) once the predicate is baked into the token you pass.
Make a repeated search permanent:
If you find yourself filtering the archive by the same field again and again, promote it: adding the field to promote_numeric_fields indexes it in every summary’s ids object — searchable directly in your logging platform, no archive query needed — and makes it eligible for real-time outlier passthrough. Auditty tracks which field names you filter on (never the values) to inform these suggestions.
Global Search by Log Text
The Vault Explorer’s search box accepts free text, not just fingerprint hashes. Type a fragment of a log line (“connection refused”, an error code, a service name) and Auditty searches across all fingerprints, returning the patterns whose logs contain it — each with its representative log line, namespace/workload, and last-seen date. Click a match to open its archived logs in the Replay Viewer, where a field predicate can narrow further.
Coverage: text search matches against signal-backed patterns — new patterns and rate spikes detected by Edge’s anomaly pipeline (90-day retention). These are exactly the patterns an operator typically hunts for. A pattern that never produced a signal is still fully archived and reachable by its fingerprint or via the backfill link on its suppression summaries; it just won’t match a text search.
Vault Explorer (Auditty UI)
Beyond following backfill links from summaries, you can browse all archived logs directly in Auditty. Navigate to Vault in the Auditty dashboard:
How It Works:
- Navigate to Vault in the Auditty dashboard
- Browse archived files by date and fingerprint — Auditty auto-discovers your bucket
- Click any fingerprint to open the Replay Viewer for that pattern and time range
- Search, paginate, and inspect original suppressed log lines
Vault data appears automatically after the first Edge upload — no manual credential configuration needed. Just ensure the Edge service account has the required permissions for your cloud provider (see the Enabling Vault section above).
Replay to Platform
The Replay Viewer lets you send archived logs directly back to your logging platform. Supported platforms include Datadog, Splunk, Elasticsearch, Coralogix, Grafana Loki, New Relic, Sumo Logic, and any custom endpoint via Webhook. This is useful when you need the suppressed logs re-ingested for investigation or compliance.
How Replay Works:
- Open a backfill URL from a suppression summary or the Vault Explorer
- Click the Replay button and select your integration — logs are sent in batches to your platform immediately
- A progress bar tracks delivery in real time
No Auditty account needed (once enabled). When public replay is turned on, the signed backfill URL grants replay access — an on-call engineer can click the link from Datadog or Splunk and replay immediately, no login required.
Guardrails:
- Idempotent: Replaying the same logs to the same integration is automatically detected — you see a confirmation that the records were already sent, with no duplicate ingestion. This works across both backfill URLs and the Vault Explorer.
- Opt-in, off by default: Public replay (clicking a backfill URL to replay without login, including
POST /api/v1/backfill/replay) is disabled by default. An admin enables it per tenant in Settings → Backfill Replay; while off, replay is only available through the Vault Explorer (requires login) and the public endpoint returns403. Viewing access is controlled separately via Settings → Backfill URL Access (Open, Verified, or Locked).
Query the Archive with SQL (Open Table Format)
The Vault is plain Parquet in your bucket under a Hive-style partition layout (tenant/year/month/day/hour) — open by construction, no proprietary format. In Vault Explorer, click Query with SQL, pick your engine, and copy the generated setup statement for your registered bucket. The full archive (suppressed originals included) is queryable with SQL, Spark, or any Parquet-native tool, with partition pruning and no Auditty components in the read path.
- Amazon Athena — partition projection: no crawler, no
MSCK REPAIR, new vault files are queryable the moment they land - Trino / Presto — hive connector external table
- Apache Iceberg (Spark SQL) — creates an Iceberg table and registers the existing vault files in place via
add_files(no copy, no rewrite)
Iceberg registrations are snapshots — schedule a refresh:
Athena and Trino list the bucket at query time, so they are always current with zero maintenance. Iceberg is different: add_files registers the files that exist at registration time. New vault files are not visible until re-registered, and the Auditty compactor periodically merges small files and deletes the originals — a stale Iceberg registration will then error on missing files. Refreshing is cheap (metadata only, no data copied): drop the table entry and re-run the DDL + add_files on a schedule that matches your compaction cadence.
No lock-in, by design:
Your data outlives any vendor decision — including ours. The schema is stable (timestamp, namespace, workload, fingerprint, node_id, source_uri, suppressed, log_line, preserved_json) and identical across Edge-written and compacted files. S3, GCS (gs://), and Azure (az://) layouts are handled per provider. Teams standardized on Apache Iceberg catalogs (Glue, Nessie, REST, Snowflake external tables, BigQuery BigLake) get a real catalog entry over the same files.
Raw Archival Sink (self-managed, full-fidelity)
Some teams need a complete, untouched copy of every log line in storage they control — independent of Auditty — for compliance or long-term retention. The raw archival sink is an optional, node-local sink that writes the complete pre-suppression stream (every line, suppressed or not) to plain-text files alongside the reduced stream that flows to your observability backend.
How it differs from Vault:
- Vault archives to Auditty-managed cloud storage as parquet, with backfill/replay built in.
- Raw archival sink writes plain-text files to a node-local directory that your agent (e.g. Vector, Fluentd) tails and ships to storage you own — no parquet, no Auditty-managed cloud, no lock-in.
- They are independent: use either, both, or neither.
configMap:
forwarder:
raw_archive:
enabled: true
directory: /var/log/auditty/raw # node-local base dir (mount as a hostPath/volume)
rotation_max_size: 104857600 # 100Mi; rotated files are plain text (not gzipped)
rotation_max_files: 3 # node-local buffer depth per sourceThe directory layout mirrors your source paths, so one recursive glob captures every stream. Point your downstream agent at it:
[sources.auditty_raw]
type = "file"
include = ["/var/log/auditty/raw/**/*.log"]The raw sink is best-effort and node-local: it can never slow down the reduced stream that feeds your observability backend, and it is always rotation-bounded so it cannot fill the node’s disk. It is Kubernetes-only and contains only your pre-suppression pod log stream — never Auditty-generated suppression summaries.
Summary
- Vault archives every suppressed log line to cloud storage — non-suppressed events already reach your normal destination and are not duplicated into Vault
- Multi-cloud support: AWS S3, Google Cloud Storage, Azure Blob Storage, and S3-compatible backends
- Instant recovery via backfill links in suppression summaries or Auditty Vault Explorer
- Suppression summaries include a signed backfill URL to view original logs instantly
- One-click replay: Send archived logs directly to your logging platform from the Replay Viewer
- Suppress with confidence: every suppressed original is archived to your own storage — no silent loss in normal operation, with bounded durability during outages (retry spool, drop-oldest at its cap)
- Automatic optimization: Archived files are consolidated in the background for fast retrieval — no configuration needed
- Raw archival sink (optional): Write the complete pre-suppression stream to node-local plain-text files for a downstream agent to ship to storage you control — independently of Auditty