Notebooks · guide · updated October 2026

Which notebook writes this table? Fabric notebook lineage

A wrong number in a report almost always ends in a notebook. Finding which one is harder than it should be: table names are built from variables, configs live in other notebooks, and pipelines pass parameters at run time.

The patterns that hide the answer

# a config notebook, run first
%run nb_config        # sets lakehouse_abfss from config[env]

# a parameter cell, overridden by the pipeline
table = "players"

df.write.mode("overwrite").save(f"{lakehouse_abfss}Tables/bronze/{table}")

How to trace it by hand

  1. Check the table's Delta log: engineInfo tells you Spark wrote it and when.
  2. Match the commit time to notebook runs in the monitoring hub.
  3. Open the notebook, follow its %run notebooks, look up the parameters the pipeline passed and the Variable Library's active value set, and evaluate the path yourself.

How Fabriscope does it

Fabriscope parses every notebook with the context it runs in: it follows %run notebooks, reads parameter cells and the parameters each pipeline passes, resolves Variable Libraries and the running workspace, and evaluates the f-strings and .format() calls config notebooks use. Each table shows the notebook, the cell and the write mode; each notebook has a page with its code, everything it writes and reads, and anything it could not resolve.

The notebook and the exact statement that writes the table, highlighted.
The notebook and the exact statement that writes the table, highlighted. The real app, on a sample tenant.

Questions

Does it run my notebooks?

No. It reads their definitions and parses them; nothing is executed and no data is read.

What if a path is only known at run time?

It is shown as dynamic, with the expression, rather than guessed.

See it on your own tenant

Read-only, metadata only. About 15 minutes to set up; the trial covers up to 40 workspaces for 7 days.

Start the 7-day trial