Skip to content

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.md

Read-only. All data collected via az ... show / list / query style 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.go reads SPORTMONKS_LEAGUE_IDS (plural) and falls back to a baked-in default when unset. SPORTMONKS_LEAGUE_ID=271 (singular) on ftl-prd-api is 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 / list this session.
  • §3 env-var table: [Measured]az containerapp show per 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.