Skip to content

Real-Time Dashboard

A Fabric Real-Time Dashboard over the curated FdaInteractions table, complementing the WinForms review app: the app is for per-interaction drill-down; the dashboard is for fleet-level health & tuning trends. Both read the same table.

Source: fabric/dashboards/FDA_Observability_RTI_Dashboard.json (+ a README.md with the manual-build query pack).

Tiles

Tile Visual Purpose
KPIs table Total, % with DAX, error %, unmatched %, users, P95 ms over the selected range
Interactions over time timechart Volume + how many carried executed DAX
Error rate % timechart NL2DAX failure trend
DAX latency P50/P95 timechart Performance tuning signal
Capture source coverage pie Which surfaces are feeding the pipeline (graph/audit/monitoring)
DAX correlation confidence bar Exact vs Windowed vs Unmatched (data-quality of the join)
Top question patterns table Highest-volume questions → candidates for FDA example queries
Slowest generated DAX table Worst-performing queries to optimize
Recent interactions table question → DAX → answer, newest first

All tiles honour the built-in Time range parameter (_startTime / _endTime), default last 7 days, auto-refresh 5 min.

JSON structure

The dashboard JSON (schema version 56) declares:

  • dataSources — one manual-kusto source ds-fda with a clusterUri and database you replace at import.
  • parameters — a duration parameter p-timerange exposing _startTime / _endTime, default 7 days.
  • pages — a single Overview page.
  • tiles — each with a visualType, grid layout, and a queryRef to a query id.
  • queries — the KQL backing each tile (the query pack below).

Import (preferred)

  1. In your Fabric workspace: + New item → Real-Time Dashboard, name it FDA Observability.
  2. Open it → Manage → Replace with file (or New dashboard → Import) and pick FDA_Observability_RTI_Dashboard.json.
  3. Open the Data sources pane and set the connection on ds-fda:
    • Cluster URI = your Eventhouse Query URI (replace REPLACE-cluster.REPLACE-region).
    • Database = FDA_Observability_EH.
  4. Save. If a tile errors, confirm 01_tables.kql + 02_policies.kql were run (a tile calls the stored function FdaTopQuestions).

Schema-versioned JSON

Real-Time Dashboard JSON is schema-versioned. If your Fabric build rejects the file on import, create the dashboard manually and paste the queries from the pack below — it takes ~10 minutes and is version-proof. The connection lives only in the data source, so nothing else is environment-specific.

Query pack (manual build / fallback)

Create one data source pointing at the Eventhouse, add a Time range parameter (variables _startTime, _endTime), then add a tile per query.

FdaInteractions
| where Timestamp between (_startTime .. _endTime)
| summarize Total=count(), WithDAX=countif(isnotempty(ExecutedDax)), Errors=countif(Status=='Error'),
            Unmatched=countif(MatchConfidence=='Unmatched'), Users=dcount(User), P95ms=round(percentile(DurationMs,95),0)
| extend ['With DAX %']=round(100.0*WithDAX/Total,1), ['Error %']=round(100.0*Errors/Total,1),
         ['Unmatched %']=round(100.0*Unmatched/Total,1)
| project Total, ['With DAX %'], ['Error %'], ['Unmatched %'], Users, P95ms
FdaInteractions
| where Timestamp between (_startTime .. _endTime)
| summarize Interactions=count(), WithDAX=countif(isnotempty(ExecutedDax)) by bin(Timestamp, 1h)
| order by Timestamp asc
FdaInteractions
| where Timestamp between (_startTime .. _endTime)
| summarize Total=count(), Errors=countif(Status=='Error') by bin(Timestamp, 1h)
| extend ['Error %']=round(100.0*Errors/Total,1)
| project Timestamp, ['Error %']
| order by Timestamp asc
FdaInteractions
| where Timestamp between (_startTime .. _endTime) and isnotempty(ExecutedDax)
| summarize P50=round(percentile(DurationMs,50),0), P95=round(percentile(DurationMs,95),0) by bin(Timestamp, 1h)
| order by Timestamp asc
FdaInteractions
| where Timestamp between (_startTime .. _endTime)
| mv-expand Source=Sources to typeof(string)
| summarize Interactions=count() by Source
FdaInteractions
| where Timestamp between (_startTime .. _endTime)
| summarize Interactions=count() by MatchConfidence
FdaTopQuestions(_startTime, _endTime, 25)
FdaInteractions
| where Timestamp between (_startTime .. _endTime) and isnotempty(ExecutedDax)
| top 25 by DurationMs desc
| project Timestamp, User, DurationMs, CpuTimeMs, Question, ExecutedDax
FdaInteractions
| where Timestamp between (_startTime .. _endTime)
| order by Timestamp desc
| take 100
| project Timestamp, User, AppHost, SemanticModelName, Question, ExecutedDax, Answer, Status, MatchConfidence

Power BI route (alternative)

Prefer Power BI? Build a report on the same Eventhouse:

  1. Get data → Azure Data Explorer (Kusto) → paste the Eventhouse Query URI → database FDA_Observability_EH.
  2. Use DirectQuery for live data (or Import for snapshots). Point the model at FdaInteractions (and call the FdaTuningSummary / FdaTopQuestions functions via a native query for the aggregate pages).
  3. Recreate the tiles above as Power BI visuals. The Microsoft workspace-monitoring Power BI template (fabric-toolbox monitoring/workspace-monitoring-dashboards) is a good styling reference.