Build A Cost History Dashboard Using Azure Cost Management: A Practical Azure FinOps Guide

Why Dashboards Change Cost Behavior

A cost report that lives in a spreadsheet gets reviewed once a month, typically by someone who did not generate the costs. A cost dashboard that stays visible — pinned to a portal landing page, embedded in a team channel, or projected on a monitor in the engineering area — creates a constant feedback loop between spending and the people responsible for it. When engineers see their daily cost trend every time they open the Azure portal, they start making different choices about resource sizing, auto-shutdown policies, and cleanup of abandoned environments.

Azure Cost Management provides the building blocks for cost history dashboards across several platforms: the Azure portal itself, Power BI, Azure Data Explorer, and even Grafana. Each serves a different audience and interaction model. This guide walks through building dashboards on each platform, starting with the zero-setup option and progressing to fully customized solutions.

Azure Portal: Pin Cost Views to Your Dashboard

The fastest path to a cost dashboard requires no additional tools or subscriptions. Azure Cost Analysis views can be pinned directly to the Azure portal dashboard, creating a cost tile that appears every time you log in.

Pinning a Cost Analysis View

  1. Navigate to Cost Management → Cost analysis and select your desired scope
  2. Choose or configure a view — the Accumulated costs view works particularly well for an at-a-glance dashboard tile
  3. Click the Pin icon (📌) in the toolbar
  4. Choose an existing dashboard or create a new one
  5. Select Private (visible only to you) or Shared (visible to others with dashboard access)
  6. Click Pin

The pinned tile captures a snapshot of the current view configuration. You can pin multiple views to the same dashboard — accumulated costs for budget tracking, daily costs for spike detection, cost by service for service-level trends — creating a multi-panel cost cockpit without writing a single line of code.

Sharing Cost Views via URL

Every customized Cost Analysis view generates a shareable URL. Click Share → Copy URL to get a direct link that opens Cost Analysis with your exact configuration: date range, grouping, filters, chart type, and metric. Share these links in Teams channels, runbooks, or wiki pages to give teams one-click access to their specific cost views.

The URL encodes the view configuration as a compressed and Base64-encoded JSON payload. This means the link carries the full view definition without depending on a saved view — anyone with appropriate RBAC permissions can open it and see the same data.

Scheduled Email Reports

Cost Analysis includes a Subscribe feature that sends scheduled email snapshots of any view. Click Subscribe → Add to configure a recurring email that includes the chart image and a data table. This turns any Cost Analysis view into a push-based report that arrives in inboxes daily, weekly, or monthly.

Saving Custom Views

Custom views persist your specific configuration so you do not have to reconfigure the date range, grouping, and filters every time. After configuring a view, click Save as to create a named view. These appear in the View menu under “All views” and can be pinned or shared independently.

Power BI: Building Rich Interactive Dashboards

When portal tiles are not enough — when you need drill-through reports, calculated measures, or the ability to combine cost data with business metrics — Power BI provides a fully customizable dashboard experience.

Using the Template App (EA Customers)

The quickest Power BI path for Enterprise Agreement customers is the Cost Management Template App. Install it from AppSource, enter your EA enrollment number, and authenticate with OAuth 2.0. The app deploys pre-built reports immediately:

  • Account Overview — High-level summary across the enrollment
  • Usage by Subscriptions and Resource Groups — Drill-down from subscription to resource group level
  • Usage by Services — Service-level cost breakdown
  • Top 5 Usage Drivers — Highlights the biggest cost contributors
  • RI Chargeback — Reservation cost allocation by subscription
  • RI Savings — Savings generated by reservations
  • VM RI Coverage — How well VM reservations cover actual usage

The template app works for environments with up to approximately $2 million in monthly Azure spend. Beyond that, the data volume exceeds the connector’s import capacity and you should switch to the export-based approach.

Building Custom Reports with the Desktop Connector

The Power BI Desktop Cost Management connector supports both EA and MCA billing accounts. Open Power BI Desktop, go to Get Data → Azure → Azure Cost Management, select your scope, and authenticate. This gives you access to tables including Usage details, Usage details amortized, Budgets, RI charges, and Price sheets.

Build a cost history dashboard by creating these key visuals:

  • Monthly cost trend — Line chart on Date (month) vs. Cost, grouped by Subscription or Service name
  • Month-over-month comparison — Clustered column chart comparing the current month against the previous month by service
  • Top 10 resource groups — Horizontal bar chart ranked by cost
  • Daily cost pattern — Area chart showing daily costs for the current month with the budget line as a constant reference

Add slicers for date range, subscription, and service name to make the dashboard interactive. Publish to the Power BI service and schedule daily refresh to keep data current.

Export-Based Approach for Large Environments

For organizations exceeding the connector’s data limits, export cost data to a storage account in Parquet format and connect Power BI via DirectQuery to Azure Data Explorer (after ingestion) or import the Parquet files directly. This scales to any data volume and preserves multi-year history.

Azure Data Explorer: KQL-Powered Dashboards

Azure Data Explorer provides native dashboard capabilities that query cost data using KQL. After ingesting cost exports into an ADX database, you can build dashboards that run analytical queries in real time.

Setting Up the Data Pipeline

Configure a data connection from your cost export storage container to an ADX database. The data connection monitors for new blob files and ingests them automatically. Create an ingestion mapping that matches the export schema — if you are using FOCUS format, the column names and types are standardized.

Building Dashboard Panels

ADX dashboards consist of query-driven tiles, each executing a KQL query and rendering the results as a chart or table.

// Panel 1: Monthly cost trend
CostExports
| where ChargePeriodStart >= ago(365d)
| summarize MonthlyCost = sum(BilledCost) by Month = startofmonth(ChargePeriodStart)
| order by Month asc
| render columnchart with (title="Monthly Cost Trend")
// Panel 2: Cost by service — current month
CostExports
| where ChargePeriodStart >= startofmonth(now())
| summarize ServiceCost = sum(BilledCost) by ServiceCategory
| top 10 by ServiceCost desc
| render piechart with (title="Current Month by Service")
// Panel 3: Daily cost with trend line
CostExports
| where ChargePeriodStart >= startofmonth(now())
| summarize DailyCost = sum(BilledCost) by bin(ChargePeriodStart, 1d)
| order by ChargePeriodStart asc
| render timechart with (title="Daily Costs This Month")

Each panel runs independently and can use different time ranges, filters, and visualizations. Add a dashboard-level parameter for subscription or resource group to make the entire dashboard filterable.

Grafana Integration for Cross-Platform Teams

Teams already using Grafana for infrastructure monitoring may prefer adding cost panels to their existing dashboards rather than switching to a separate tool. The Azure Monitor data source plugin provides the bridge.

Grafana’s Azure Monitor plugin does not query the Cost Management API directly. Instead, cost data reaches Grafana through Azure Data Explorer, where it has been ingested from cost exports. Configure the Azure Data Explorer data source in Grafana, then write KQL queries that return cost time series matching Grafana’s expected format.

This approach keeps cost data alongside operational metrics — compute utilization, request latency, error rates — in the same dashboard. When a cost spike appears, the adjacent performance panels may immediately explain why: a traffic surge scaled out more instances, a data migration moved terabytes through egress, or a misconfigured autoscaler created more nodes than needed.

Programmatic Dashboard Creation

For organizations managing dashboards across many teams, creating them programmatically ensures consistency and enables version control.

Exporting and Deploying Dashboard JSON

Any Azure portal dashboard can be exported as JSON. Navigate to your dashboard, click Export → Download to get the complete dashboard definition including all tiles, their positions, and their query configurations.

# Deploy a dashboard from an exported JSON template
$dashboardJson = Get-Content "cost-dashboard-template.json" -Raw
$dashboardJson = $dashboardJson.Replace("{subscriptionId}", $subscriptionId)

$uri = "https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$rgName/providers/Microsoft.Portal/dashboards/cost-history-dashboard?api-version=2022-12-01-preview"
$token = (Get-AzAccessToken -ResourceUrl https://management.azure.com).Token
$headers = @{ Authorization = "Bearer $token"; "Content-Type" = "application/json" }

Invoke-RestMethod -Uri $uri -Method PUT -Headers $headers -Body $dashboardJson

Parameterize the subscription IDs, scope strings, and view configurations in the JSON template, then deploy it for each team with their specific values. Store the template in source control alongside your infrastructure code.

Automating Dashboard Data Refresh

Portal dashboard tiles that are pinned from Cost Analysis display the data as it was at pin time — they refresh when the dashboard is viewed. The underlying Cost Management data refreshes every 4 to 8 hours. For Power BI dashboards, schedule dataset refresh once or twice daily. For ADX dashboards, data arrives automatically through the ingestion pipeline within minutes of export completion.

Designing Dashboards for Different Audiences

A dashboard for the CFO has different requirements than a dashboard for an engineering team lead. Effective cost dashboards are designed for their specific audience.

Executive Dashboard

Keep it to four or five tiles: total monthly spend with month-over-month change, a 12-month cost trend line, top three services by cost, budget consumption percentage, and forecast for the rest of the month. Executives need to see the trajectory and know whether spending is on plan. They do not need resource-level detail.

Engineering Team Dashboard

Show their specific resource groups or tagged resources. Include daily cost detail with spike annotations, a breakdown by resource type (VMs, storage, databases), and a list of the top 10 most expensive individual resources. Engineers need actionable detail that tells them which specific resources to investigate.

FinOps Team Dashboard

Cross-subscription comparison, reservation utilization trends, cost allocation summaries, and anomaly alerts. The FinOps team needs the broadest view with the ability to drill into any dimension.

Practical Recommendations

Start with pinned Cost Analysis views on the Azure portal dashboard. This takes five minutes and provides immediate value to anyone who logs into the portal. Pin the accumulated costs view for budget tracking and the daily costs view for operational awareness.

For team-level dashboards, use the Power BI Desktop connector if your environment is under $5 million in monthly Azure spend. Build two or three focused reports (monthly trend, service breakdown, resource group comparison) and share them with the relevant teams.

For enterprise-scale environments, invest in the ADX pipeline. The combination of automated export ingestion, KQL query flexibility, and native ADX dashboards provides both the scale and the analytical depth that large organizations need. The FinOps toolkit’s pre-built Power BI reports connected to the ADX backend offer the fastest path to a complete dashboard suite.

Whichever platform you choose, the design principle remains the same: make cost data visible to the people who generate the costs. A dashboard nobody checks is a reporting project. A dashboard embedded in a team’s daily workflow is a behavior-changing tool that pays for itself through the spending decisions it influences.

For more details, refer to the official documentation: What is Microsoft Cost Management.

Leave a Reply