Issue #2
Azure
AWS

Taming Azure’s Two Biggest Bills: Logs & AI

Cutting 78% on $2.30/GB noisy logs—and the physical capacity catch behind Microsoft Foundry PTUs. Audit your top billable Log Analytics tables, switch the noise to Basic Logs, and see the 100 GB/day TCO benchmark.

CloudHiro FinOps Team
CloudHiro FinOps Team
October 27, 2026•6 min read
Taming Azure’s Two Biggest Bills: Logs & AI

Issue #02 · FinOps Uncensored • Production Reality Briefing


In this issue:


Latest News from the world of FinOps

AWS Slashes Amazon EMR on EKS Pricing by 30%

AWS

AWS has officially lowered the EMR surcharge for Amazon EMR on EKS by 30%, making containerized big data analytics significantly more cost-competitive against EC2-based EMR deployments and self-managed Apache Spark clusters on Kubernetes.

🔗 AWS What's New Announcement →

⚡ The Catch: A 30% cut in the EMR fee is NOT a 30% cut in your total Spark bill. The EMR surcharge typically accounts for only 15% to 25% of the total cost of running a job (the remaining 75% to 85% is the underlying EC2 instance, EBS storage, and NAT/Cross-AZ data transfer).


Cut Microsoft Foundry AI Costs with PTU Reservations

Azure

Slash hourly AI compute costs in Microsoft Foundry by locking in 1-month or 1-year PTU Reservations (available for Global, Data Zone, or Regional SKUs across OpenAI, DeepSeek, and Llama models).

PAYG vs. PTUs in Microsoft Foundry: How to Scale GenAI and Slash Costs with PTU Reservations

As organizations move generative AI workloads from proof-of-concept into customer-facing production, one of the biggest architectural and FinOps decisions in Microsoft Foundry (including Azure OpenAI, DeepSeek, and Llama models) is choosing the right consumption model: Pay-As-You-Go (Standard) vs. Provisioned Throughput Units (PTUs)—and knowing when to layer Azure Reservations on top. Here is everything FinOps and AI engineering teams need to know.

1. PAYG (Standard) vs. PTU (Provisioned): What’s the Difference?

When deploying models in Microsoft Foundry, you choose between two fundamentally different architectures:

DimensionStandard Deployment (PAYG)Provisioned Throughput Units (PTUs)
How You Are BilledPer token consumed (Input tokens + Output tokens). If no one calls the model, you pay $0.Per PTU deployed per hour ($/PTU/hr), billed 24/7 while the deployment exists—whether you send 0 requests or 1 million requests.
Performance & LatencyShared multi-tenant capacity; latency and throughput can fluctuate during peak hours (risk of HTTP 429 throttling).Dedicated, reserved processing capacity with predictable latency and guaranteed tokens-per-minute (TPM) throughput.
Best ForSpiky, unpredictable traffic, PoCs, internal tools, and low-volume apps.High-volume, steady-state production apps, real-time customer chatbots, and latency-sensitive SLA workloads.

What Exactly Is a PTU?

A Provisioned Throughput Unit (PTU) is a standardized, model-independent unit of model processing capacity.

  • You allocate a block of PTUs to a deployment, and Microsoft Foundry reserves that compute capacity exclusively for your endpoint.
  • Model-Independent Pool: You don't buy PTUs tied to a single model version. The same PTU quota and reservation pool can cover GPT-4o, DeepSeek-R1, or Llama deployments. When you upgrade to a newer model in the future, your existing PTU reservation automatically covers it.

2. PTU Hourly Billing vs. PTU Reservations (1-Month & 1-Year)

Once you decide a workload needs PTUs, there are two ways to pay for them:

PTU Hourly Billing (On-Demand):

  • You pay the list $/PTU/hr rate, prorated to the minute (e.g., a 100-PTU deployment running for 15 minutes bills as 25 PTU-hours).
  • When to use it: Short-term benchmarking, load testing, or temporary event spikes (like a 48-hour hackathon).
  • Why NOT to use it for production: Leaving production PTUs on hourly billing is the most expensive way to run AI in Azure. Furthermore, scaling PTUs down at night and scaling them back up in the morning is risky: when you scale down, you release that physical GPU capacity back to the regional pool, and there is no guarantee it will still be available when you try to scale back up the next morning.

Microsoft Foundry PTU Reservations (1-Month or 1-Year):

  • By committing to a 1-month or 1-year Azure Reservation (in 1-PTU increments, paid upfront or monthly), you unlock a heavily discounted effective $/PTU/hr rate compared to hourly billing.
  • Any PTUs deployed up to your reserved quantity are covered by the reservation; if you temporarily scale above your reserved PTUs, only the excess (overage) is billed at the hourly rate.

⚡ The Catch: Reservations don't reserve physical GPU capacity—always deploy your PTUs first, then buy the reservation.

📘 Microsoft documentation: Provisioned throughput billing & reservations → · What is provisioned throughput? →


Actionable Playbook · Discovery Script

How to Audit Top Ingesting Tables and Switch High-Volume Noise to Basic Logs

Azure Log Analytics tables default to the Analytics tier (~$2.30/GB list price in East US). However, noisy debugging tables rarely require complex KQL joins or multi-row alerting. By switching eligible tables to the Basic Logs plan, you can cut ingestion costs by ~78% ($0.50/GB) while keeping the same 30-day interactive retention window.

Step 1: Run KQL in Log Analytics to Identify Top Billable Tables

top_billable_tables.kql
1// Replace 30d with your preferred lookback window (e.g., 7d, 14d, 30d)
2Usage
3| where TimeGenerated > ago(30d)
4| where IsBillable == true
5| summarize TotalGB = round(sum(Quantity) / 1000.0, 2) by DataType
6| extend EstMonthlyCost = strcat("$", tostring(round(TotalGB * 2.30, 2)))
7| sort by TotalGB desc
8| take 10
Read-Only Query•Zero infrastructure modification
Run in: Azure Monitor Logs

Note: Quantity in the Usage table is measured in MB, so dividing by 1000 converts it to billable GB.

Run this in Azure Monitor Logs. If supported tables like ContainerLogV2, AppTraces, or custom _CL tables account for >50% of your volume and are only used for ad-hoc debugging, they are prime candidates for the Basic Plan.

Step 2: Switch the High-Volume Table to the Basic Plan via Azure CLI

switch_table_to_basic_plan.sh
1az monitor log-analytics workspace table update \
2 --resource-group YOUR_RESOURCE_GROUP \
3 --workspace-name YOUR_WORKSPACE_NAME \
4 --name YOUR_TABLE_NAME \
5 --plan Basic
Modifies Resources•Review the checklist before running
Requires: az CLI

This drops ingestion billing from $2.30/GB down to $0.50/GB (Pay-As-You-Go) for all newly ingested data on that table without interrupting your log pipelines.

Pre-Switch FinOps Safety Checklist

  • Scheduled Query Alerts & KQL Operators: Tables on the Basic Plan do not support multi-row aggregated Scheduled Query Alerts (they only support single-row Simple Log Alerts), and each query can only read from that one table—joins with other tables are restricted. Verify that no P1/P2 incident rules or Azure Workbooks depend on aggregated alerts or cross-table joins from this table before switching.
  • Watch Out for Query Scan Charges ($0.005/GB): Unlike Analytics tables (where queries are free), Basic Logs charge $0.005 per GB of data scanned. Remove Basic tables from auto-refreshing Grafana dashboards or automated polling scripts.
  • Retention (30 Days Included + Long-Term Retention): Basic Plan tables include a fixed 30-day interactive retention window (upgraded from the old 8-day limit). For compliance requirements (e.g., 365 days), pair it with Azure Monitor Long-term retention ($0.02/GB/mo).
  • Weekly Plan Switch Cooldown: Azure enforces a 7-day waiting period between plan changes on the same table (and you can only change a table's plan once per week). Double-check your dependencies before running the command.

Cost Comparisons · 1-Year TCO Benchmark

30-Day TCO Benchmark: 100 GB/day (3,000 GB/month)

Most FinOps teams try to tame runaway Azure Log Analytics bills by purchasing a Commitment Tier. But locking in a 100 GB/day commitment ($196/day) only trims your bill by ~13.4%. If the bulk of your ingestion is unindexed stdout (like AKS ContainerLogV2) or high-frequency application traces, reclassifying those tables to the Basic Logs plan cuts the same workload from $7,548.50 down to $2,230.00/month—saving $63,822 every year.

Below is the line-by-line 1-year TCO benchmark for a 100 GB/day (3,000 GB/month) baseline stored for 12 months (30 days interactive + 11 months long-term retention), factoring in 20 ad-hoc 7-day diagnostic queries per month:

Cost Component (30-Day Month)Analytics (PAYG)Analytics (100 GB/day Tier)Basic Logs PlanAuxiliary / Lake (~1.3x: 3,900 GB)
1. Monthly Ingestion$6,888.50 ((3,000 - 5 free GB) × $2.30)$5,880.00 (30 days × $196.00/day)$1,500.00 (3,000 GB × $0.50)$195.00 (3,900 GB × $0.05)
2. Interactive Queries (20 queries × 7 days)$0.00 (Included)$0.00 (Included)$70.00 (14,000 GB × $0.005/GB)$91.00 (18,200 GB × $0.005/GB)
3. 1-Year Retention (11 mos × $0.02/GB/mo)$660.00$660.00$660.00$858.00
Total Monthly Cost$7,548.50 / mo$6,540.00 / mo$2,230.00 / mo$1,144.00 / mo
Annualized Savings vs. PAYGBaselineSave $12,102 / yr (-13.4%)Save $63,822 / yr (-70.5%)Save $76,854 / yr (-84.8%)

⚡ Cost Verdict: Don't commit to capacity tiers for unindexed noise. Keep alert-critical security and infrastructure tables on Analytics PAYG, and flip noisy container stdout and debug traces to Basic Logs. You keep your 30-day interactive troubleshooting window, protect your alerting coverage, and instantly bank $63,822 in net annual savings per 100 GB/day.


Want to see the best Azure FinOps?

Meet Us at Microsoft Ignite 2026 in San Francisco

Attending Microsoft Ignite in San Francisco? Let's grab a coffee and talk Azure pricing, reservation lock-in, and how to protect your cloud budget.

👉 Let's talk →

To cleaner architectures and lower cloud bills,
The CloudHiro Team

Share this issue: