open-standards/openpay/docs/observability/README.md
Transaction Science a437feb8ab Parallel ingest: 9 issues' worth of work across openpay / smart-byte / eoc
openpay/
  compliance/                     PCI-DSS readiness package (scope-map,
                                  pci-zero-architecture, hsm-kms-guidance,
                                  qsa-checklist), citing PCI-DSS v4.0.1
                                  requirements. (#1)
  examples/pci-zero/              Runnable example demonstrating a deployment
                                  where merchant code never touches a PAN. (#1)
  crates/op-core/                 Tokenized<Card> typestate + NetworkToken
                                  + CardNetwork + Cryptogram. (#2)
  crates/op-rails-card/network_token/
                                  NetworkTokenProvider trait + VTS adapter
                                  + MDES adapter, with deterministic stubs
                                  behind a 'live' feature flag. (#2)
  crates/op-driver-sdk/conformance/network_token.rs
                                  Conformance harness for third-party
                                  NetworkTokenProvider implementations. (#2)
  crates/op-cli/src/ledger/       'openpay ledger as-of' subcommand for
                                  bi-temporal queries. (#3)
  crates/op-orchestrator/src/telemetry.rs
                                  OpenTelemetry span emission per
                                  Payment<S> transition with semantic-
                                  conventions tags. (#3)
  docs/observability/             Grafana dashboard JSON + wiring guide
                                  for the bi-temporal ledger lens. (#3)

smart-byte/
  smart-byte-rs/                  Rust reference implementation: envelope
                                  encode/decode (canonical CBOR + BLAKE3
                                  content addressing), Ed25519 sign +
                                  verify, lockstep BFT commit MVP, Iroh
                                  transport scaffold, CLI. (#4)
  spec/identity_and_key_rotation.md
                                  Adopts KERI SAIDs + key-event log
                                  format; explicitly does not adopt ACDC
                                  chaining wholesale. (#5)
  conformance/v1/                 21 test vectors covering canonicalisation,
                                  SAID computation, signature verification,
                                  lockstep commit, gossip propagation.
                                  CI gate enforces spec/vector coupling. (#6)

eoc/
  eoc-rs/                         Rust + WASM reference implementation:
                                  4-stage cascade (cache -> kv -> graph ->
                                  neural), joule counters via RAPL / NVML /
                                  powermetrics, CLI, wasm-bindgen surface.
                                  18 tests pass. (#7)
  eoc-bench/                      Benchmark harness, MT-Bench and Router
                                  case sets, 'joules per MT-Bench point'
                                  metric, 'eoc-bench run | compare' CLI. (#8)
  standards/sci-for-ai-submission.md
                                  Submission proposal mapping EOC's
                                  receipt schema to GSF SCI-for-AI. (#9)
  cookbook/                       HuggingFace-style cookbook (markdown +
                                  runnable Python) demonstrating EOC's
                                  cascade with HF AI Energy Score. (#9)
  docs/bench-v0.md                Reproducibility doc for eoc-bench.

Workspace state:
- openpay clippy -- -D warnings: clean across all touched crates
- smart-byte-rs cargo test --workspace + clippy: clean
- eoc-rs cargo test --workspace + clippy: clean (18 tests)
- eoc-bench cargo check --workspace + clippy + 15 tests: clean

Rust 1.95.0 edition 2024 pinned at the open-standards root via
rust-toolchain.toml; every workspace inherits.

Closes #1 #2 #3 #4 #5 #6 #7 #8 #9.
2026-05-23 13:24:05 -04:00

3.9 KiB

OpenPay Observability

The bi-temporal append-only ledger is one of OpenPay's architectural moats: every state transition is a recorded event with both a valid-time (when the event happened in the real world) and a transaction-time (when the ledger learned of it). Inspecting that moat requires three things: a CLI for ad-hoc queries, OpenTelemetry traces over the live Payment<S> typestate, and a Grafana dashboard to watch the system from the operations side.

This directory holds the second and third.

Wiring up

1. OpenTelemetry collector

# otel-collector.yaml
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318
exporters:
  prometheus:
    endpoint: 0.0.0.0:9464
service:
  pipelines:
    metrics:
      receivers:  [otlp]
      exporters:  [prometheus]
    traces:
      receivers:  [otlp]
      exporters:  [prometheus]

2. OpenPay process

Compile op-orchestrator with the telemetry feature and set OPENPAY_OTLP_ENDPOINT=http://localhost:4317 in the environment. op_orchestrator::telemetry::init_telemetry(...) wires the global subscriber at startup. Every Payment<S> state transition emits a span with these attributes:

Attribute Type Example
payment.id string pay_019e30baa...
payment.state.from string Authorized
payment.state.to string Captured
payment.rail string card · a2a · crypto
payment.amount.minor int 1299
payment.amount.currency string USD

3. Prometheus + Grafana

Scrape the collector's prometheus exporter at :9464. Import grafana-dashboard.json into Grafana. The dashboard ships with three template variables: $rail, $currency, and the standard $time_range.

Example bi-temporal query

What was account acct_019e3...'s balance on May 4 as we knew it on May 5?

op ledger as-of \
  --valid 2026-05-04T00:00:00Z \
  --transaction 2026-05-05T00:00:00Z \
  --account acct_019e30baa9507793b467ac644636b3e2 \
  --human

Output (with --human):

account                   acct_019e30baa9507793b467ac644636b3e2
valid-time                2026-05-04T00:00:00Z
transaction-time          2026-05-05T00:00:00Z
balance                   12_450 minor USD
entries-cited             487

Strip --human to get the same content as structured JSON for scripting and reconciliation tooling.

What the dashboard shows

  • State-transition rate — transitions per second by (from, to) pair. Spikes on Authorized → Captured are the healthy steady state; * → Refunded rate is the dispute / refund pulse.
  • In-flight by state — current count of payments in each typestate. Long tails in Authorized indicate captures that aren't landing.
  • Refund vs capture ratio — short-window and long-window. Spikes beyond a configurable threshold can be wired into the alert manager.
  • Rail split — card vs A2A vs crypto, by volume and by count.
  • Latency per transition — p50 / p95 / p99 per state transition, bucketed by rail.
  • Error rate per state — counts of Err(...) returns from each state-transition function, bucketed by rail and error class.

Recompute history

The bi-temporal property of the ledger is the real magic: when an old reconciliation finds a discrepancy in last week's data, recording the correction does not rewrite history. It appends a new entry with valid-time = last week, transaction-time = now. The CLI query above will return the correction when asked from "now" forward and the original (uncorrected) state when asked from before "now". The dashboard's data source does the same.