3.0 KiB
3.0 KiB
After refinement-phase-9 — Observability, ops hardening, docs honesty & scale-later
For the frontend / next backend phase. Backend-owned; frontend reads.
What changed for a client
Nothing user-facing. No route, envelope, shape, or enum changed. Two things worth knowing:
ApiResult.requestIdis now a real W3C trace id (the request's OpenTelemetry trace). It's the id to quote in a support ticket — it maps 1:1 to the server-side trace once an OTLP collector is wired.- Ticket message bodies are encrypted at rest server-side. The thread read still returns plaintext (the wire is unchanged); the change is purely storage-side (the refund/dispute paper trail is no longer plaintext in the DB).
What the platform now does / exposes (ops)
- One OpenTelemetry stack. Metrics scrape at
/metrics; distributed tracing (ASP.NET Core + EF Core) is wired. OTLP export is opt-in — setOpenTelemetry:Otlp:Endpoint(Grafana Tempo / Jaeger / OTEL Collector) to turn trace + metric export on. Prometheus-scrape-only is an acceptable MVP; prometheus-net was removed. - Health endpoints:
/healthz/live(process only — safe liveness),/healthz/ready(app DB + log DB [deployed]- an object-storage write probe — pull an instance out of rotation when a dependency is down),
/HealthCheck(aggregate, kept for compat). Point the orchestrator's liveness probe at/healthz/live, readiness at/healthz/ready.
- an object-storage write probe — pull an instance out of rotation when a dependency is down),
- Prod logs are Information+ with no PII/secrets. The OTP code is no longer logged in any environment. Log-table
retention on
Baya_Logsis an ops/DBA task (or ship logs to the OTLP collector). - Audit-log retention runs as a scheduled
IRecurringJob— two-tier (financial/verification rows kept ~7 yr, everyday rows ~2 yr) via theaudit_retention_*config keys. - gRPC reflection is Development-only (the plugin itself is unchanged; it shares the mixed-protocol listener).
For the next backend phase / deploy
- Turn tracing on in deployed envs by provisioning an OTLP collector and setting
OpenTelemetry:Otlp:Endpoint. - When Redis lands (>1 instance), add a
redisreadiness check (taggedready) toConfigureHealthChecks. - Register any new retention/cron via
IRecurringJob(unchanged from phase 7).
Deferred — recorded, NOT gaps (each has a written pull-trigger; see the phase report)
- Elasticsearch
INurseSearchbackend + outbox feeder — pull when SQL search shows strain. SQL search is the real MVP (Search:Backend=sql; any other value fails fast). - SMS/push channels of
INotificationDispatcher— pull when the notification UX demands out-of-app reach. In-app notifications are real now. - Analytics warehouse/stream, holiday-calendar feed, 8 deferred product tables (
organizations,organization_nurses,fraud_flags,recurring_booking_schedules,bnpl_settlement_entries, availability slots, customer national-ID KYC, geo bulk import) — each a pure additive step when product pulls it.