← Back to blog
Solution 4 min read 炬鲸团队

Observability for Finance: Audit Retention, Active-Active Resilience, and Fast Diagnosis

Observability for financial institutions: audit retention with hot/cold tiering, field-level isolation across legal entities, active-active resilience, and a path that cuts P0 MTTR from hours to minutes.

For a financial institution, observability isn't just "being able to see." It has to satisfy three hard constraints: audit retention, data isolation, and active-active resilience. This post collects what we learned rolling out across several mid-to-large financial institutions.

1. Audit retention: logs aren't yours to delete

Regulators require transaction logs be retained for 3–15 years, complete, tamper-evident, and traceable. We handle this with three measures:

  1. Hot/cold tiering: the last 30 days sit on SSD; older data is archived to object storage with a SHA-256 digest to prevent tampering after the fact.
  2. Read-only archive: the archive area is read-only for normal accounts, and deletion requires two-person review.
  3. Export as evidence: you can export a complete log package by time window + transaction ID, with a checksum, ready to hand to auditors.

The tiering matters for cost as much as compliance: keeping fifteen years of hot data on SSD is financially absurd, and the digest makes the cold tier defensible in an audit rather than a liability. Concretely, you'll typically keep 30 days hot, 13 months warm on compressed disk, and everything beyond that cold with digests — the exact splits depend on the regulator and the asset class.

2. Isolation and permissions: multi-entity boundaries

Financial groups often run multiple legal entities and business lines. OBSERVE's tenant model splits by entity, with physical isolation at the storage layer and field-level RBAC on top — a risk-control team can read transaction logs but not sensitive fields like card numbers or phone numbers, which are masked at ingestion. Auditor accounts are read-only by default, and every query a user runs is itself written to the audit log, so "who looked at what" is always answerable.

Masking happens at ingestion, not at query time. A card-number field is redacted to a pattern like 6222 * * 1234 the moment it arrives, so no downstream view, dashboard, or export can leak the full number — and the redaction is consistent everywhere rather than being re-applied differently in each dashboard.

3. Active-active resilience: the observability system can't be the first to die

If production is active-active, the observability platform must be too. Our approach:

  1. Dual-write collectors: the same logs and metrics write into two data centers; a single-side failure loses nothing.
  2. Metadata primary/standby: DM/KingbaseES runs in primary/standby with automatic failover, drilled quarterly.
  3. Independent alerting path: alerts go out through a separate SMS gateway and dedicated voice line, never relying on the monitored network — so a network outage can't also kill the alert about itself.

The third point is the one most teams discover during their first major outage. If your alert channel rides the same network as the thing it's monitoring, the two fail together, and the first sign of trouble is silence.

4. Sub-minute diagnosis: from "it's paging" to "I know what's wrong"

The standard path is: alert aggregated by service → open that service's golden signals (latency, error rate, saturation) → drill into the anomalous host's logs → expand the call graph by trace_id. We've wired this path into a single "incident workbench" that threads the three views together by trace_id, cutting MTTR for P0 incidents from hours to minutes.

The golden signal teams most often skip is saturation — CPU, connection-pool depth, and queue depth all degrade before an error threshold trips, so they're the earliest warning you have. Get them on the board before the latency and error charts. And when an incident does hit, the same workbench is what you point at during the post-mortem: the trace_id from the incident ticket pulls up the exact spans and log lines that the runbook should reference.

5. Practical advice: make one path work before covering everything

The worst mistake in financial system modernization is going big-bang. Pick one core transaction path (payments, for example), get logs, metrics, and traces working end-to-end and sign it off, then replicate horizontally. Fix naming conventions during the pilot — service names, log fields, trace attributes — and establish a capacity baseline, or you'll pay twice the cost later when dozens of systems onboard with inconsistent names and no sense of expected volume. The baseline also feeds your retention sizing: you can't decide hot/warm/cold splits sensibly until you know how much you actually ingest per day.