Part 9 · 1 chapters · ~10 min
Operating Across Markets
Running a multi-country platform day to day: country as a first-class label on every signal, SLOs and alerts per market, a feature parity matrix generated from configuration, configuration changes treated as deploys, incidents and degradation scoped to the affected country, and a monthly portfolio review.
18
Healthy overall, broken in one country
code
# transfer success rate by country, worst first (PromQL)
sort(
sum by (country) (rate(transfer_completed_total[30m]))
/
sum by (country) (rate(transfer_submitted_total[30m]))
)
# client events carry the same label
rum.track('transfer_submitted', { country: session.country, rail: draft.rail, appVersion: BUILD_VERSION });| practice | what it prevents |
|---|---|
| country label on every signal | a market broken for hours while global dashboards look green |
| SLOs and alerts per market | small markets never paging because they are a rounding error in the total |
| parity matrix from configs | support promising a feature that is not live in that country |
| config changes with canary and rollback | a limit typo blocking every transfer in a country |
| per-country banners and degradation | pausing every market because one rail is down |
the frontend's share
The client knows its country and app version, so RUM and error tracking can be sliced the same way as the backend. A crash that only happens with one country's document type shows up in minutes instead of in a support queue.
OPERATING ACROSS MARKETS
observability sliced by country, SLOs per market, feature parity as data, and incidents that affect one country only
swipe the figure sideways, or tap expand for full screen
1/6
country dimension
Country as a first-class dimension: every metric, log, trace and client event carries the tenant or country (a small, fixed label set, so cardinality stays safe). A global success rate of 99.5% can hide a country at 92%; dashboards show the worst market, not just the average.