Diagram Cloud & Automation
Report Engine Architecture Reference
A concise reference for report request validation, cache decisions, Fabric queries, asynchronous delivery and observability.
- Type
- Diagram
- Level
- Intermediate
- Updated
- Format
- Printable
In short
Trace UI and API requests through a secure report engine, tenant-aware cache or query path, result construction, asynchronous delivery, and monitoring.
Who it is for
- Engineers designing analytical APIs and report services
- Architects reviewing tenant isolation and caching
What it helps you do
- Explain the request lifecycle and cache decision
- Identify security, asynchronous delivery, and monitoring boundaries
Core path
UI or API clients call a gateway. The gateway establishes identity and coarse limits. The report engine authorizes the report, validates tenant and parameters, applies workload policy, checks a tenant-aware cache, and on a miss queries Fabric through controlled templates. The result builder produces an approved format and returns a bounded response or protected artifact.
Client → API Management or Gateway → Report Engine → Cache or Query → Fabric Warehouse or Lakehouse SQL endpoint → Result builder → Client
1 Consumers
2 Edge
3 Report Engine
- 1Authenticate & authorizeCaller, report and format allowed
- 2Validate requestRanges, filters, row and byte limits
- 3Tenant rulesTenant from trusted claims only
- 4Cache lookupKey: tenant · report · params · format · version
- 5Query builderApproved templates, bound parameters
- 6Result builderJSON · CSV · Parquet
4 Microsoft Fabric
Cached and generated outputs
storage-accountAzure Storage Account · private endpoint, encryption at restreport-cacheBlob container for report outputs{tenant}Tenant boundary: access and cache keys start here{report-name}One folder per report definition{yyyy}/{mm}/{dd}Date partitions; lifecycle rules expire old outputs{request-id}.{format}One output per request: json · csv · parquet
Example report-cache/contoso/sales-by-region/2026/10/03/7f3c9a1e.csv
Output path
Small, bounded result
- Result builder
- JSON in the response
- Web UI or API client
Large result or file
- Result builder
- CSV / Parquet written to Storage
- Short-lived download link
- Client downloads
Long-running request (asynchronous)
POST /reports- 202 Accepted + request ID
GET /reports/{id}status- Download link when succeeded
Status: queued · running · succeeded · failed · expired
Monitoring Azure Monitor · Application Insights
- Request and correlation IDs
- Latency per step
- Cache hit rate per tenant
- Fabric query duration
- Failures, throttling and retries
Request lifecycle
API Management
Step 1: Receive request
Assign a request ID, accept a correlation ID
Report Engine
Step 2: Validate request
Report, format, date range, row and byte limits
Report Engine
Step 3: Resolve tenant & security
Tenant from trusted claims; authorize report and filters
Storage account
Step 4: Check cache
Tenant-aware key; fresh output → skip to step 6 or 8
Microsoft Fabric
Step 5: Query Fabric if needed
Approved template, bound parameters, timeout
Only on a cache miss
Report Engine
Step 6: Build result
Shape rows into JSON, CSV or Parquet
Storage account
Step 7: Store output / cache result
Write to the tenant’s folder with a TTL
Report Engine
Step 8: Return response
JSON body or short-lived download link
In detail:
- Generate a request ID and accept a correlation ID according to a controlled policy.
- Authenticate the caller and derive tenant identity from trusted claims.
- Authorize the report, dimension, filters, and delivery format.
- Validate date order, maximum range, row and byte limits.
- Normalize the request into a canonical model.
- Apply tenant and client rate or concurrency limits.
- Check a cache key containing tenant, report type, range, dimensions, filters, format, and report version.
- On a miss, bind validated values to an approved Fabric query.
- Build JSON, CSV, Parquet, or another permitted result.
- Store and cache only with explicit freshness, expiration, encryption, and access policy.
Cache decision
- RequestValidated, tenant resolved
- Cache key
tenantreportparametersformatversion - Look upIn
report-cache, under{tenant}/{report}/… - Cached and fresh?Within the report’s TTL
Yes Cache hit
- Authorize again for this caller
- Read the stored output
- Return result
No Cache miss
- Query Fabric (approved template)
- Build output: JSON, CSV or Parquet
- Store under the tenant’s path, with a TTL
- Return result
Tenant-aware: same report, same parameters, different tenants
- contoso
contoso · sales-by-region · 2026-09 · csv · v3report-cache/contoso/sales-by-region/… - fabrikam
fabrikam · sales-by-region · 2026-09 · csv · v3report-cache/fabrikam/sales-by-region/…
Two keys, two folders: never shared.
A cache hit still requires authorization. A miss is not automatically safe to execute: cost and concurrency policy apply first. TTL follows the report’s freshness objective. Invalidation may follow a completed data refresh or a bounded time policy. Never share cache entries across tenants merely because other parameters match.
Asynchronous path
Small, bounded requests may return synchronously. Large work can use:
POST /reports → 202 Accepted plus reportRequestId
GET /reports/{id} → queued, running, succeeded, failed, or expired
GET /reports/{id}/download → short-lived authorized file access
Retries use idempotency so the same logical request does not create uncontrolled duplicate jobs or artifacts.
Monitoring fields
Capture request_id, correlation_id, tenant_id, client_id, api_key_id, report_name, requested_at, started_at, completed_at, duration_ms, cache_hit, query_duration_ms, rows_returned, output_bytes, status, and error_code. Protect high-cardinality and tenant data, but preserve enough context to connect a user symptom to gateway, engine, cache, query, and Fabric evidence.
Review points
Confirm tenant identity cannot be overridden by a request parameter. Ensure query generation is allow-listed and parameterized. Test stale cache, cache corruption, Fabric timeout, caller cancellation, oversized result, duplicate submission, and expired download. Review authorization again when a result is downloaded, not only when it was generated.
Go deeper: related articles
Cloud & Automation
What Is a Report Engine?
Define the report engine as a secure service between UI or API consumers and analytical data.
Cloud & Automation
Designing a Report Engine for UI and API Consumers
Design one governed report backend for interactive UI pages, external APIs, downloads and large asynchronous exports.
Cloud & Automation
Report Engine Architecture: Request to Result
Trace a report request through gateway, security, validation, cache, Fabric query, result construction and monitoring.
Cloud & Automation
Pre-Rendered Reports vs Live Queries
Choose pre-rendered, live, or hybrid report execution using freshness, repetition, variability, cost and security constraints.
Planned articles on these topics
Build it: related projects
Modern Report Engine
A planned reference implementation for secure, tenant-aware analytical requests, cache decisions, Fabric queries, exports and operational monitoring.
AI Data Assistant
A reference application for safe LLM access to structured enterprise data: approved tools, authorization before data access, validated answers and full observability.
Fabric Data Platform Template
A reusable end-to-end Microsoft Fabric reference implementation: ingestion, Bronze, Silver and Gold layers, serving, Git, CI/CD and observability, built with practical engineering patterns.
Related talks
Designing Microsoft Fabric for Scale
The architecture decisions that decide whether a Fabric platform stays manageable as data, teams and workloads grow: workload boundaries, Lakehouse vs Warehouse, Medallion layers, capacity, Git and observability.
Formats: Talk · Webinar · Workshop · Internal session
LLMs with Structured Data: Practical Enterprise Patterns
How to connect language models to enterprise data safely: retrieval, controlled SQL access, tool calling, authorization, validation and observability, and why most of the safety lives outside the model.
Formats: Talk · Webinar · Panel · Internal session