Microsoft Sentinel Cost Optimisation: A Complete Engineer’s Guide for 2026
Microsoft Sentinel Cost Optimisation: Cut Bills Without Cutting Coverage
📋 Table of Contents
Microsoft Sentinel charges per gigabyte of data ingested. In large enterprise environments, monthly bills can run into tens of thousands of dollars — often driven by a handful of noisy data sources that contribute volume without proportionate detection value. The good news: with the right architecture and tooling, organisations routinely cut Sentinel costs by 30–50% without losing meaningful security coverage.
This guide walks through every lever available in 2026 — from commitment tiers and log storage tiers to DCR-based pre-ingestion filtering and KQL-driven ingestion auditing.
1. How Sentinel Billing Works
Sentinel pricing has two components:
- Data ingestion — charged per GB of data written to the Log Analytics workspace. This is the dominant cost driver for most customers.
- Data retention — first 90 days are free. Days 91–730 are charged at a lower rate. Beyond 730 days requires Archive tier or exporting to long-term storage.
2. Commitment Tiers vs Pay-As-You-Go
Pay-As-You-Go (PAYG) is the default but also the most expensive ingestion model. Commitment tiers offer significant discounts in exchange for a daily GB commitment.
| Tier (GB/day) | Effective Price vs PAYG | Best For |
|---|---|---|
| 100 GB | ~15% discount | Small SOC teams |
| 200 GB | ~22% discount | Mid-size organisations |
| 300 GB | ~28% discount | Mid-size organisations |
| 500 GB | ~34% discount | Enterprise |
| 1000 GB | ~42% discount | Large enterprise |
| 2000 GB+ | ~50%+ discount | Very large enterprise / MSSP |
Usage table and set a budget alert at 110% of your commitment.
3. Log Tiers: Analytics, Basic & Archive
Not all log data needs to be in the expensive Analytics tier. Sentinel supports three storage tiers for Log Analytics tables:
| Tier | Cost | Query Support | Retention | Best Use |
|---|---|---|---|---|
| Analytics | Full price | Full KQL, analytic rules | Up to 2 years | High-value security tables |
| Basic | ~70% cheaper ingestion | Simple KQL only (no joins) | 8 days interactive | High-volume, low-query logs |
| Auxiliary | Cheapest | Limited (restore required for complex) | Up to 12 years | Compliance archiving |
Tables to consider moving to Basic tier
CommonSecurityLog— firewall/proxy logs with very high volumeSyslog— Linux system logs, especially from non-critical hostsAzureDiagnostics— often contains enormous Azure service telemetryAppServiceHTTPLogs/AppServiceConsoleLogs— web app noise
4. DCR-Based Ingestion Filtering
Data Collection Rules (DCRs) let you filter, transform, and route logs before they are ingested — meaning you pay nothing for dropped rows. This is the most powerful cost reduction tool available in 2026.
Common DCR filter patterns
- Drop
SecurityEventIDs that have no detection value (4799, 4985, 5379) - Filter
SigninLogsto only ingest failed sign-ins and sign-ins from non-trusted locations - Drop
AzureDiagnosticsrows from non-critical resource types - Filter
CommonSecurityLogto exclude internal-to-internal traffic
// Identify low-value SecurityEvent IDs worth filtering SecurityEvent | where TimeGenerated > ago(7d) | summarize Count = count() by EventID | order by Count desc | take 30 // Review: EventIDs like 4799 (local group membership enumeration) and // 4985 (state of transaction changed) are typically safe to filter
source | where EventID !in (4799, 4985, 5379, 4656)
5. Auditing Your Ingestion with KQL
Before optimising, you need to know exactly where your GB are going. The Usage table is the authoritative source for billable ingestion data.
// Top tables by ingestion volume — last 30 days
Usage
| where TimeGenerated > ago(30d)
| where IsBillable == true
| summarize TotalGB = round(sum(Quantity) / 1024, 2) by DataType
| order by TotalGB desc
| take 20
// Daily ingestion trend — detect spikes
Usage
| where TimeGenerated > ago(30d)
| where IsBillable == true
| summarize DailyGB = round(sum(Quantity) / 1024, 2) by bin(TimeGenerated, 1d)
| render timechart
// Monthly cost estimate by table (USD approximation at PAYG rate $2.76/GB)
Usage
| where TimeGenerated > ago(30d)
| where IsBillable == true
| summarize MonthlyGB = sum(Quantity) / 1024 by DataType
| extend EstimatedCostUSD = round(MonthlyGB * 2.76, 2)
| order by EstimatedCostUSD desc
// Top contributing computers per noisy table
Heartbeat
| where TimeGenerated > ago(1d)
| summarize HeartbeatCount = count() by Computer, ComputerEnvironment
| order by HeartbeatCount desc
| take 20
// Find tables contributing the most raw rows
union withsource=TableName *
| where TimeGenerated > ago(1d)
| summarize
RowCount = count(),
EstGB = round(sum(_BilledSize) / (1024.0 * 1024 * 1024), 4)
by TableName
| order by EstGB desc
| take 25
6. Top 7 Cost Reduction Wins
- Switch to a Commitment Tier — the single biggest lever. Even the 100 GB/day tier saves 15% vs PAYG immediately.
- Move high-volume, low-query tables to Basic tier — Syslog, CommonSecurityLog, and AzureDiagnostics are prime candidates.
- Use DCR transformation rules to drop low-value event IDs and internal traffic before ingestion.
- Scope AMA data collection to only the servers and event IDs you actually have detection coverage for.
- Remove duplicate data sources — many environments have both the legacy MMA agent and AMA sending the same logs. Check
Heartbeatfor dual-reporting machines. - Archive completed investigations — move old incidents and their associated log exports out of Analytics tier after 90 days.
- Set workspace daily ingestion caps as a safety net — but set them above your peak operational need to avoid alert gaps.
