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

Observability in Finance: From Audit Compliance to Second-Level Incident Triage

An observability blueprint for banking, securities, and insurance: tamper-evident audit log retention, second-level alerting on trading paths, log-and-trace triage, and unified monitoring across data centers.

Observability in Finance: From Audit Compliance to Second-Level Incident Triage

How finance differs from internet-scale systems

The hard part of observability in finance isn't the tech stack; it's the constraints. First, regulation: audit logs must be retained for years and must resist tampering. Second, trading paths are extremely latency-sensitive, where one slow query can mean direct monetary loss. Third, disaster recovery, with dual-active within a city and multi-center across regions as the norm, means monitoring itself has to span data centers. Here is a practical approach built around those three constraints.

Audit logs: retention, tamper evidence, traceability

The first requirement for audit logs isn't fast search; it's that they stay put, can't be altered, and reconcile end to end. OBSERVE routes audit logs through a dedicated pipeline: append-on-write, read-only retention, periodic hash chaining, and archival to object storage. Any modification is exposed by the hash chain.

audit:
  retention_days: 1825        # five years
  append_only: true
  hash_chain: sha256
  archive:
    type: oss
    bucket: audit-archive

Combined with tiered permissions, audit-log read access is limited to compliance and audit roles, so ordinary operations staff can't see them at all, cutting off insider tampering at the source. When a regulator asks for "all operations on customer accounts for the last three years," you export a consistent, timestamped set rather than scrambling across systems. Reconcile the hash chain against the archive daily, so tampering is detected quickly instead of discovered during an audit.

Trading paths: second-level alerting before money moves

Trading paths need second-level alert latency. Watching dashboards by hand doesn't scale, so the right move is to define golden signals, latency, error rate, throughput, for the critical paths and detect breaches continuously with sliding windows. For example, treat "order API P99 latency above 200ms for five consecutive seconds" as a P0 that goes straight to phone, rather than waiting out a five-minute aggregation window.

sum(rate(order_api_latency_seconds_bucket{le="0.2"}[30s]))
  / sum(rate(order_api_latency_seconds_count[30s])) < 0.99

This PromQL reads as "99% of requests over the last 30 seconds completed within 200ms." A value below 0.99 means requests are slowing down, and with silence periods and grouping in the alert engine, you avoid an instant wall of duplicates. The point of a P0 on latency rather than on errors is timing: by the time an error rate spikes, money has already been lost. Latency warns you before the failure, which is exactly when you can still do something.

Triage: read logs and traces together

The worst kind of trading incident is one where the alert fires but nobody knows which layer broke. OBSERVE correlates traces and logs through traceId, so from a triggered alert you can walk the trace hop by hop, gateway, trading service, ledger, then open the logs attached to the failing span and see the SQL and stack trace directly. A fault that used to take three teams half an hour to localize usually shrinks to under ten minutes.

One detail that pays off in finance is tagging every span with a business key such as order ID, account ID, or transaction ID in addition to the technical fields. Then a customer complaint like "my order never completed" becomes a one-line trace search instead of a multi-team hunt.

Multi-center DR: monitoring must be highly available too

With dual-active and multi-region topologies, a monitoring platform deployed in only one center goes dark the moment you cut over. Deploy a collection node in every center, forward data to the primary while keeping a local buffer, and let a secondary center take over queries and alerting when the primary fails. The local buffer also covers data loss during cross-region line jitter.

Rolling out without disturbing trading hours

Finally, roll out in phases that respect the trading calendar. Instrument one non-critical service first, watch the overhead, then expand. Keep sampling off for the critical paths and on for the noisy ones. Run any load test outside trading hours, and rehearse the DR cutover during a maintenance window, so the first real failover is not also the first time anyone has done it. Throughout, keep an eye on collector overhead on the instrumented hosts; on modern hardware it should stay well under a few percent of CPU, and if it does not, revisit your sampling and batch settings before the rollup continues.