title: Prod Snapshot 2026-06-11
status: snapshot
last-updated: 2026-06-11
authors: [@amalkrsihna]
abstract: >
Read-only inventory of every Azure resource in ftl-prd-rg-cin,
Container Apps env-var values, and MTD bill — captured 2026-06-11
late evening UTC ahead of the WC26 opener. Companion to the
cost-estimate-audit doc.
companion: cost-estimate-audit-2026-06-11
Prod Snapshot — 2026-06-11¶
Companion doc:
cost-estimate-audit-2026-06-11.mdRead-only. All data collected via
az ... show / list / querystyle calls. Zero prod mutations.Currency: Indian Rupees (INR / ₹).
1. Context¶
WC26 opener kicks off at 2026-06-11 19:00 UTC (Mexico vs South Africa). Earlier this same day a full session shipped four fixes to staging (release/staging): timeline-include for offside, MicroBumpDecay = 1.0 (events + stats persist), per-position close cooldown sourced from opened_at_ms, and the OTel ErrorPreservingProcessor at 1 % SDK sampling.
This file pins the measured prod state as of pre-kickoff so the next operator can tell at a glance:
- What's deployed on prod today vs what's on release/staging.
- Which Container Apps env vars are set vs missing.
- What the current prod burn rate is and where it goes.
- The gaps vs the WC26 5K-user cost-model sizing.
Every fact below is [Measured] via a session-time az call. Production was not modified by any of the read paths.
2. Measured resource inventory¶
2.1 Container Apps (3 services)¶
| Name | min / max | vCPU | Memory | Mode | Image tag (commit SHA) | Ingress external |
|---|---|---|---|---|---|---|
ftl-prd-api |
1 / 2 | 0.5 | 1 GiB | Single | fea5dc41… (2026-05-22 build) |
true |
ftl-prd-ws |
1 / 2 | 1.0 | 2 GiB | Single | fea5dc41… (same commit) |
true |
ftl-prd-flusher |
1 / 1 | 0.5 | 1 GiB | Single | fea5dc41… (same commit) |
none (internal) |
All three services run the same Git SHA
fea5dc41…, built 2026-05-22 (~20 days stale at snapshot time). None of today's session work is on prod yet.The image registry path is
ftlstgacrcin.azurecr.io/...— the ACR lives in staging's resource group (ftl-stg-rg-cin). Prod pulls from staging's registry. Unusual but works; flagged so the shared dependency is documented.
2.2 Container Apps Job¶
| Name | Trigger | Notes |
|---|---|---|
ftl-prd-migrate |
Manual | One-shot schema migration runner; runs from CI on each prod-deploy. |
2.3 Container Apps Environment¶
| Name | Workload profile | Zone-redundant |
|---|---|---|
ftl-prd-cae-cin |
Consumption only | false |
Managed certificates present on the environment:
- mc-ftl-prd-cae-ci-prd-api-ftljeta--3854
- mc-ftl-prd-cae-ci-prd-ws-ftljeta-c-5837
2.4 PostgreSQL Flexible Server¶
| Field | Measured value |
|---|---|
| Name | ftl-prd-pg-cin |
| SKU | Standard_B2ms (burstable) |
| Tier | Burstable |
| Storage | 64 GiB |
| autoGrow | Disabled |
| Engine version | 16 |
| Backup retention | 7 days |
| HA mode | Disabled |
| Geo-redundant backup | Disabled |
2.5 Redis¶
| Field | Measured value |
|---|---|
| Name | ftl-prd-redis-cin |
| SKU | Basic |
| Capacity | 0 (C0 = 250 MB) |
| Family | C |
| Engine version | 6.0 |
| Replicas/master | None |
2.6 Application Insights + Log Analytics¶
| Field | Measured value |
|---|---|
| AppInsights name | ftl-prd-ai-cin |
| Kind | web |
| Retention | 90 days |
| Sampling percentage | null (= 100 %) |
| LAW workspace name | ftl-prd-law-cin |
| LAW SKU | PerGB2018 |
| LAW retention | 30 days |
| LAW dailyQuotaGb | 30.0 (operator-applied 2026-06-11 06:03 UTC) |
| LAW ingestionStatus | RespectQuota (cap is active and enforced) |
2.7 Key Vault¶
| Name | SKU | Soft delete |
|---|---|---|
ftl-prd-kv-cin |
standard | enabled |
2.8 Static Web App¶
| Field | Measured value |
|---|---|
| Name | ftl-prd-frontend |
| SKU | Free |
| Location | East Asia |
| Default hostname | blue-grass-01f012000.7.azurestaticapps.net |
| Custom domain | ftl.jetafutures.com (attached) |
2.9 Communication / Email Services¶
NONE present in ftl-prd-rg-cin. (Staging has both ftl-stg-acs-cin Communication Service + ftl-stg-ecs-gl Email Service with the jetafutures.com Azure-managed domain.) Welcome emails + milestone notifications from prod will silently no-op until these are stood up.
2.10 Azure Container Registry¶
NONE present in ftl-prd-rg-cin. Prod pulls images from ftlstgacrcin in ftl-stg-rg-cin. The shared ACR has Basic SKU.
3. Container Apps env vars — measured vs expected¶
These are the env vars that materially affect cost or behaviour. "Expected" is what staging today has (and what the cost report assumes for prod).
| Env var | ftl-prd-api |
ftl-prd-ws |
ftl-prd-flusher |
Expected (per staging) |
|---|---|---|---|---|
APPLICATIONINSIGHTS_CONNECTION_STRING |
not set | not set | not set | secretref appinsights-conn |
OTEL_TRACE_SAMPLE_RATIO |
not set | not set | not set | 0.01 |
OTEL_EXPORTER_OTLP_ENDPOINT |
not set | not set | not set | unset (Collector sidecar pending) |
NOISE_ENABLED |
not set | not set | not set | false (cosmetic; noise code dead) |
SPORTMONKS_LEAGUE_IDS (plural) |
not set | not applicable | not applicable | comma-separated league IDs |
SPORTMONKS_LEAGUE_ID (singular, legacy) |
271 (set) |
not applicable | not applicable | — (dead config key in current binary) |
The singular vs plural matters.
internal/config/config.goreadsSPORTMONKS_LEAGUE_IDS(plural) and falls back to a baked-in default when unset.SPORTMONKS_LEAGUE_ID=271(singular) onftl-prd-apiis read by nothing in the deployed binary.
4. Prod bill snapshot (MTD June 1–11, 2026)¶
| Service | MTD INR | Share |
|---|---|---|
| Azure Database for PostgreSQL | 4 501.56 | 70 % |
| Azure Container Apps | 1 380.03 | 22 % |
| Azure Cache for Redis | 505.26 | 8 % |
| Key Vault | 2.64 | <1 % |
| Log Analytics | 0.00 | 0 |
| Total MTD | 6 389 | 100 % |
| Implied monthly run-rate | ~₹17 425 | — |
Daily LAW ingestion (last 11 days, prod workspace)¶
| Date | Ingested GB | Notes |
|---|---|---|
| 2026-06-11 | 0.000021 | |
| 2026-06-10 | 0.019531 | ~200× a typical day; likely a deploy / smoke |
| 2026-06-09 | 0.000121 | |
| 2026-06-08 | 0.000111 | |
| 2026-06-07 | 0.000086 | |
| 2026-06-06 | 0.000392 | |
| 2026-06-05 | 0.000081 | |
| 2026-06-04 | 0.000073 | |
| 2026-06-03 | 0.000078 | |
| 2026-06-02 | 0.000091 | |
| 2026-06-01 | 0.000074 |
Per-table breakdown over the same window:
| Table | Ingested GB |
|---|---|
ContainerAppConsoleLogs_CL |
0.019891 |
ContainerAppSystemLogs_CL |
0.000841 |
AppTraces / AppRequests / AppDependencies tables are empty — confirms OTel telemetry is not flowing to AppInsights today. The only log source is Container Apps stdout/stderr.
5. Cross-check against the WC26 cost report¶
The companion cost-estimate-audit-2026-06-11 projects ~₹41 077 over the 39-day tournament at the 5K-user / 3K-concurrent tier. That projection assumes the recommended sizing per §11.4:
| Resource | Cost-report assumption | Measured prod today | Status |
|---|---|---|---|
| PG | Standard_D2ds_v5 |
Standard_B2ms |
⚠ NOT yet upgraded |
| PG autoGrow | Enabled | Disabled | ⚠ NOT yet enabled |
| Redis | Standard C1 (1 GB) | Basic C0 (250 MB) | ⚠ Lower tier than recommended |
| Sampler | OTel sampler shipped | Not on prod (May-22 image) | ⚠ Image stale 20 days |
| Sampler env | OTEL_TRACE_SAMPLE_RATIO=0.01 |
not set | ⚠ Env var missing |
| Sportmonks | SPORTMONKS_LEAGUE_IDS=732 |
unset (default) | ⚠ Possibly wrong leagues polled |
| AppInsights | Connection wired | Not wired | ⚠ AppInsights resource unused |
| LAW cap | 30 GB/day | 30 GB/day | ✅ Operator-applied today |
| Single-rev | Enforced | Single (all 3 apps) | ✅ As expected |
Net: at the current prod sizing the 39-day cost will be higher than the report until the PG SKU + Redis tier are right-sized, and lower than the report on the Container Apps + LAW lines (because no traffic yet + no traces flowing). The shape of the bill will only converge with the report once a prod deploy ships the new image and the SKU upgrades land.
6. Outstanding gaps before WC26 traffic¶
These are the items the cost report calls out as still-needed; this snapshot adds the measured prod state for each.
| # | Action | Measured state today | Bill impact if skipped | Effort |
|---|---|---|---|---|
| 1 | Roll today's release/staging image to prod |
prod on fea5dc41… May-22 |
None of today's fixes live | Trigger deploy-prod.yml |
| 2 | Set SPORTMONKS_LEAGUE_IDS=732 on prod manifest |
unset (default may poll 5 leagues) | Bot CPU + Redis pressure ×7 | 1 line YAML |
| 3 | Set OTEL_TRACE_SAMPLE_RATIO=0.01 on prod manifest |
unset | None today (OTel no-op anyway), insurance for later | 1 line YAML |
| 4 | Set APPLICATIONINSIGHTS_CONNECTION_STRING (secretref) |
not set | AppInsights remains empty | Mirror staging secret pattern |
| 5 | Upgrade prod PG B2ms → D2ds_v5 |
B2ms | Credit-cliff throttling under load | Online resize, ~5–10 min |
| 6 | Enable prod PG autoGrow |
Disabled | Disk-full halt at 64 GiB | One CLI command |
| 7 | Upgrade prod Redis Basic C0 → Standard C1 |
Basic C0 | Memory ceiling + no SLA | ~30 s failover |
| 8 | Verify Single-revision mode after every prod deploy | Single (all 3 apps today) | May 2 audit drift recurrence | One CLI command |
Operator decision today (2026-06-11): none of these are performed in this session. Plan is to revisit before WC26 traffic arrives.
7. Verification commands (read-only)¶
Re-runnable any time. None mutate prod.
# Container Apps revision + image + replica mode
AZURE_CONFIG_DIR=~/.azure-ftl az containerapp list -g ftl-prd-rg-cin \
--query '[].{name:name, rev:properties.latestRevisionName, image:properties.template.containers[0].image, mode:properties.configuration.activeRevisionsMode}' -o tsv
# Specific env values per app (api shown; repeat for ws + flusher)
AZURE_CONFIG_DIR=~/.azure-ftl az containerapp show -g ftl-prd-rg-cin -n ftl-prd-api \
--query "properties.template.containers[0].env[?name=='OTEL_TRACE_SAMPLE_RATIO' || name=='SPORTMONKS_LEAGUE_IDS' || name=='APPLICATIONINSIGHTS_CONNECTION_STRING' || name=='SPORTMONKS_LEAGUE_ID' || name=='NOISE_ENABLED']" -o json
# PG state
AZURE_CONFIG_DIR=~/.azure-ftl az postgres flexible-server show -g ftl-prd-rg-cin -n ftl-prd-pg-cin \
--query '{sku:sku.name, autoGrow:storage.autoGrow, storage:storage.storageSizeGb, version:version, backup:backup.backupRetentionDays, ha:highAvailability.mode}' -o json
# Redis state
AZURE_CONFIG_DIR=~/.azure-ftl az redis show -g ftl-prd-rg-cin -n ftl-prd-redis-cin \
--query '{tier:sku.name, capacity:sku.capacity, family:sku.family, version:redisVersion}' -o json
# LAW cap + ingestion volume
AZURE_CONFIG_DIR=~/.azure-ftl az monitor log-analytics workspace show -g ftl-prd-rg-cin -n ftl-prd-law-cin \
--query 'workspaceCapping' -o json
AZURE_CONFIG_DIR=~/.azure-ftl az monitor log-analytics query \
-w 70e5df86-b238-4a05-a4a3-503ffae12533 \
--analytics-query "Usage | where TimeGenerated > ago(1d) | summarize ingestedGB=sum(Quantity)/1024.0"
# Bill — month-to-date by service
AZURE_CONFIG_DIR=~/.azure-ftl az consumption usage list \
--start-date 2026-06-01 --end-date <today> \
--query "[?resourceGroup=='ftl-prd-rg-cin']" -o json | \
jq 'group_by(.meterCategory) | map({service: .[0].meterCategory, total_INR: ([.[].pretaxCost | tonumber] | add)})'
8. Confidence summary¶
- §2 inventory:
[Measured]—az ... show / listthis session. - §3 env-var table:
[Measured]—az containerapp showper app this session. - §4 bill snapshot:
[Measured]— Cost Management API + LAW Usage table KQL this session. - §5 cross-check:
[Measured]×[Estimated]— measured prod state vs cost report's[Estimated]projection. - §6 outstanding-gap impacts:
[Estimated]— extrapolated from[Measured]baselines + the cost report's load model.