Skip to main content

MetricFlow commands

MetricFlow allows you to define and query metrics in your dbt project in dbt platform or self-hosted dbt locally. To experience the power of the universal Semantic Layer and dynamically query those metrics in downstream tools, you'll need a dbt Starter, Enterprise, or Enterprise+ account.

Once you define metrics in your dbt project, you can query metrics, dimensions, and dimension values, and validate your configs using the MetricFlow commands, available across dbt versions.

MetricFlow is compatible with Python versions 3.8, 3.9, 3.10, 3.11, and 3.12.

MetricFlow

(Applies to dbt v1.12 and later)

MetricFlow is a Python library that allows you to define and query metrics in your dbt project. You can use MetricFlow to query metrics in your dbt project two ways: in the dbt platform or locally with self-hosted dbt, where you install and manage the engine yourself.

This section applies to dbt platform users running either the v1 or v2 engine, where commands and validations execute remotely in dbt platform.

  • Run MetricFlow commands using the dbt sl prefix in the Studio IDE or dbt platform CLI or using the VS Code extension.
  • For CLI or VS Code/Cursor users, MetricFlow commands are embedded, which means you can immediately run them once you install the dbt platform CLI or VS Code extension and don't need to install MetricFlow separately.
  • Using MetricFlow with dbt platform doesn't require you to manage versioning — your dbt account will automatically manage the versioning.
  • dbt jobs support the dbt sl validate command to automatically test your semantic nodes. You can also add MetricFlow validations with your Git provider (such as GitHub Actions) by installing MetricFlow (python -m pip install metricflow). This allows you to run MetricFlow commands as part of your continuous integration checks on PRs.

MetricFlow commands

Use MetricFlow commands to retrieve metadata and query metrics. The following table lists the compatibility matrix for MetricFlow commands and where you can run them.

Development setupEngineHosted on
Prefix
Notes
Studio IDE/dbt platform CLI or VS Code extensiondbt v2 or v1dbt platformdbt slRemote execution; Platform manages versions.
VS Code extension users must have a dbt_cloud.yml file with a valid token to connect to dbt platform
Self-hosted
(no dbt platform project)
dbt v2 or v1Local machinemfInstall and manage MetricFlow locally.
  • If you’re using v2 with dbt platform and have a dbt_cloud.yml file with a valid token to connect to dbt platform, run MetricFlow commands using the dbt sl prefix.
    • This allows you to interact with metrics that are executed remotely on dbt platform (for example, from the Studio IDE or dbt platform CLI).
  • If you’re using v2 CLI and aren't connected to dbt platform, install MetricFlow separately and use the mf prefix to run commands locally.
  • If you’re using v1 locally without v2, run MetricFlow commands using the mf prefix.

This section applies to dbt platform users running the v2 or v1 engine where commands and validations execute remotely in dbt platform.

  • Use the dbt sl prefix before the command name to execute them in the dbt platform (Studio IDE, VS Code/Cursor, dbt platform CLI) (like dbt sl list metrics to list all metrics).
    • For dbt platform users developing with a CLI or an editor (like VS Code), run the dbt sl --help command in the terminal to view a complete list of the MetricFlow commands and flags.
  • The following table lists the commands compatible with dbt platform (Studio IDE, VS Code/Cursor, dbt platform CLI) powered by the v2 or v1 engine:
Command
Description
Studio IDEdbt platform CLIVS Code/Cursor
list metricsLists metrics with dimensions.
list dimensionsLists unique dimensions for metrics.
list dimension-valuesList dimensions with metrics.
list entitiesLists all unique entities.
list saved-queriesLists available saved queries. Use the --show-exports flag to display each export listed under a saved query or --show-parameters to show the full query parameters each saved query uses.
queryQuery metrics, saved queries, and dimensions you want to see in the command line interface. Refer to query examples to query metrics and dimensions (such as querying metrics, using the where filter, adding an order, and more).
validateValidates semantic model configurations.
exportRuns exports for a singular saved query for testing and generating exports in your development environment. You can also use the --select flag to specify particular exports from a saved query.
export-allRuns exports for multiple saved queries at once, saving time and effort.
Run dbt parse to reflect metric changes

When you make changes to metrics, make sure to run dbt parse at a minimum to update the Semantic Layer. This updates the semantic_manifest.json file(Applies to dbt v1.12 and later) and osi_document.json, reflecting your changes when querying metrics. By running dbt parse, you won't need to rebuild all the models.

 How can I query or preview metrics with the dbt platform CLI?

Check out the following video for a short video demo of how to query or preview metrics with the dbt platform CLI:

List metrics

This command lists the metrics with their available dimensions:

dbt sl list metrics <metric_name>  # For dbt platform users (dbt v1 or v2)
mf list metrics <metric_name> # For self-hosted users (dbt v1 or v2)


Options:
--search TEXT Filter available metrics by this search term
--show-all-dimensions Show all dimensions associated with a metric.
--help Show this message and exit.

List dimensions

This command lists all unique dimensions for a metric or multiple metrics. It displays only common dimensions when querying multiple metrics:

dbt sl list dimensions --metrics <metric_name>  # For dbt platform users (dbt v1 or v2) 

mf list dimensions --metrics <metric_name> # For self-hosted users (dbt v1 or v2)


Options:
--metrics SEQUENCE List dimensions by given metrics (intersection). Ex. --metrics bookings,messages
--help Show this message and exit.

List dimension-values

This command lists all dimension values with the corresponding metric:

dbt sl list dimension-values --metrics <metric_name> --dimension <dimension_name>  # For dbt platform users (dbt v1 or v2) 

mf list dimension-values --metrics <metric_name> --dimension <dimension_name> # For self-hosted users (dbt v1 or v2)


Options:
--dimension TEXT Dimension to query values from [required]
--metrics SEQUENCE Metrics that are associated with the dimension
[required]
--end-time TEXT Optional iso8601 timestamp to constraint the end time of
the data (inclusive)
*Not available in the dbt platform/dbt v2 yet
--start-time TEXT Optional iso8601 timestamp to constraint the start time
of the data (inclusive)
*Not available in the dbt platform/dbt v2 yet
--help Show this message and exit.

List entities

This command lists all unique entities:

dbt sl list entities --metrics <metric_name>  # For dbt platform users (dbt v1 or v2) 

mf list entities --metrics <metric_name> # For self-hosted users (dbt v1 or v2)


Options:
--metrics SEQUENCE List entities by given metrics (intersection). Ex. --metrics bookings,messages
--help Show this message and exit.

List saved queries

This command lists all available saved queries:

dbt sl list saved-queries # For dbt platform users (dbt v1 or v2) 

You can also add the --show-exports flag (or option) to show each export listed under a saved query:

dbt sl list saved-queries --show-exports # For dbt platform users (dbt v1 or v2) 

Output

dbt sl list saved-queries --show-exports 

The list of available saved queries:
- new_customer_orders
exports:
- Export(new_customer_orders_table, exportAs=TABLE)
- Export(new_customer_orders_view, exportAs=VIEW)
- Export(new_customer_orders, alias=orders, schemas=customer_schema, exportAs=TABLE)

Validate

The following command performs validations against the defined semantic model configurations.

  • For dbt v2 and dbt platform CLI users with a valid dbt_cloud.yml:

    dbt sl validate
  • For self-hosted users (dbt v1 or v2):

    mf validate-configs
Options:

--timeout # dbt platform only
Optional timeout for data warehouse validation in dbt platform.
--dw-timeout INTEGER # dbt v1 only
Optional timeout for data warehouse
validation steps. Default None.
--skip-dw # dbt v1 only
Skips the data warehouse validations.
--show-all # dbt v1 only
Prints warnings and future errors.
--verbose-issues # dbt v1 only
Prints extra details about issues.
--semantic-validation-workers INTEGER # dbt v1 only
Uses specified number of workers for large configs.
--help Show this message and exit.

Health checks

The following command performs a health check against the data platform you provided in the configs.

Note, in dbt, the health-checks command isn't required since it uses dbt's credentials to perform the health check.

mf health-checks # For self-hosted users (dbt v1 or v2)

Tutorial

Follow the dedicated MetricFlow tutorial to help you get started:

mf tutorial # For self-hosted users (dbt v1 or v2)

Query

Create a new query with MetricFlow and execute it against your data platform. The query returns the following result:

dbt sl query --metrics <metric_name> --group-by <dimension_name>  # For dbt platform users (dbt v1 or v2) 
dbt sl query --saved-query <name> # For dbt platform users (dbt v1 or v2)

mf query --metrics <metric_name> --group-by <dimension_name> # For self-hosted users (dbt v1 or v2)


Options:

--metrics SEQUENCE Syntax to query single metrics: --metrics metric_name
For example, --metrics bookings
To query multiple metrics, use --metrics followed by the metric names, separated by commas without spaces.
For example, --metrics bookings,messages

--group-by SEQUENCE Syntax to group by single dimension/entity: --group-by dimension_name
For example, --group-by ds
For multiple dimensions/entities, use --group-by followed by the dimension/entity names, separated by commas without spaces.
For example, --group-by ds,org


--end-time TEXT Optional iso8601 timestamp to constraint the end
time of the data (inclusive).
*Not available in the dbt platform/dbt v2 yet

--start-time TEXT Optional iso8601 timestamp to constraint the start
time of the data (inclusive)
*Not available in the dbt platform/dbt v2 yet

--where TEXT SQL-like where statement provided as a string and wrapped in quotes.
All filter items must explicitly reference fields or dimensions that are part of your model.
To query a single statement: ---where "{{ Dimension('order_id__revenue') }} > 100"
To query multiple statements: --where "{{ Dimension('order_id__revenue') }} > 100" --where "{{ Dimension('user_count') }} < 1000" # make sure to wrap each statement in quotes
To add a dimension filter, use the `Dimension()` template wrapper to indicate that the filter item is part of your model.
Refer to the FAQ for more info on how to do this using a template wrapper.

--limit TEXT Limit the number of rows out using an int or leave
blank for no limit. For example: --limit 100

--order-by SEQUENCE Specify metrics, dimension, or group bys to order by.
Add the `-` prefix to sort query in descending (DESC) order.
Leave blank for ascending (ASC) order.
For example, to sort metric_time in DESC order: --order-by -metric_time
To sort metric_time in ASC order and revenue in DESC order: --order-by metric_time,-revenue

--csv FILENAME Provide filepath for data frame output to csv

--compile (dbt platform/dbt v2) In the query output, show the query that was
--explain (dbt v1) executed against the data warehouse


--show-dataflow-plan Display dataflow plan in explain output

--display-plans Display plans (such as metric dataflow) in the browser

--decimals INTEGER Choose the number of decimal places to round for
the numerical values

--show-sql-descriptions Shows inline descriptions of nodes in displayed SQL

--help Show this message and exit.

Query examples

This section shares various types of query examples that you can use to query metrics and dimensions. The query examples listed are:

Query metrics

Use the example to query multiple metrics by dimension and return the order_total and users_active metrics by metric_time.

Query

dbt sl query --metrics order_total,users_active --group-by metric_time # For dbt platform users (dbt v1 or v2) 

mf query --metrics order_total,users_active --group-by metric_time # For self-hosted users (dbt v1 or v2)

Result

✔ Success 🦄 - query completed after 1.24 seconds
| METRIC_TIME | ORDER_TOTAL |
|:--------------|---------------:|
| 2017-06-16 | 792.17 |
| 2017-06-17 | 458.35 |
| 2017-06-18 | 490.69 |
| 2017-06-19 | 749.09 |
| 2017-06-20 | 712.51 |
| 2017-06-21 | 541.65 |

Query dimensions

You can include multiple dimensions in a query. For example, you can group by the is_food_order dimension to confirm if orders were for food or not. Note that when you query a dimension, you need to specify the primary entity for that dimension. In the following example, the primary entity is order_id.

Query

dbt sl query --metrics order_total --group-by order_id__is_food_order # For dbt platform users (dbt v1 or v2) 

mf query --metrics order_total --group-by order_id__is_food_order # For self-hosted users (dbt v1 or v2)

Result

 Success 🦄 - query completed after 1.70 seconds
| METRIC_TIME | IS_FOOD_ORDER | ORDER_TOTAL |
|:--------------|:----------------|---------------:|
| 2017-06-16 | True | 499.27 |
| 2017-06-16 | False | 292.90 |
| 2017-06-17 | True | 431.24 |
| 2017-06-17 | False | 27.11 |
| 2017-06-18 | True | 466.45 |
| 2017-06-18 | False | 24.24 |
| 2017-06-19 | False | 300.98 |
| 2017-06-19 | True | 448.11 |

Add order/limit

You can add order and limit functions to filter and present the data in a readable format. The following query limits the data set to 10 records and orders them by metric_time, descending. Note that using the - prefix will sort the query in descending order. Without the - prefix sorts the query in ascending order.

Note that when you query a dimension, you need to specify the primary entity for that dimension. In the following example, the primary entity is order_id.

Query

# For dbt platform users (dbt v1 or v2) 
dbt sl query --metrics order_total --group-by order_id__is_food_order --limit 10 --order-by -metric_time

# For self-hosted users (dbt v1 or v2)

mf query --metrics order_total --group-by order_id__is_food_order --limit 10 --order-by -metric_time

Result

✔ Success 🦄 - query completed after 1.41 seconds
| METRIC_TIME | IS_FOOD_ORDER | ORDER_TOTAL |
|:--------------|:----------------|---------------:|
| 2017-08-31 | True | 459.90 |
| 2017-08-31 | False | 327.08 |
| 2017-08-30 | False | 348.90 |
| 2017-08-30 | True | 448.18 |
| 2017-08-29 | True | 479.94 |
| 2017-08-29 | False | 333.65 |
| 2017-08-28 | False | 334.73 |

Add where clause

You can further filter the data set by adding a where clause to your query. The following example shows you how to query the order_total metric, grouped by is_food_order with multiple where statements (orders that are food orders and orders from the week starting on or after Feb 1st, 2024).

Query

# For dbt platform users (dbt v1 or v2) 
dbt sl query --metrics order_total --group-by order_id__is_food_order --where "{{ Dimension('order_id__is_food_order') }} = True" --where "{{ TimeDimension('metric_time', 'week') }} >= '2024-02-01'"

# For self-hosted users (dbt v1 or v2)

mf query --metrics order_total --group-by order_id__is_food_order --where "{{ Dimension('order_id__is_food_order') }} = True" --where "{{ TimeDimension('metric_time', 'week') }} >= '2024-02-01'"

Notes:

  • The type of dimension changes the syntax you use. So if you have a date field, use TimeDimension instead of Dimension.
  • When you query a dimension, you need to specify the primary entity for that dimension. In the example just shared, the primary entity is order_id.

Result

 ✔ Success 🦄 - query completed after 1.06 seconds
| METRIC_TIME | IS_FOOD_ORDER | ORDER_TOTAL |
|:--------------|:----------------|---------------:|
| 2017-08-31 | True | 459.90 |
| 2017-08-30 | True | 448.18 |
| 2017-08-29 | True | 479.94 |
| 2017-08-28 | True | 513.48 |
| 2017-08-27 | True | 568.92 |
| 2017-08-26 | True | 471.95 |
| 2017-08-25 | True | 452.93 |
| 2017-08-24 | True | 384.40 |
| 2017-08-23 | True | 423.61 |
| 2017-08-22 | True | 401.91 |

Filter by time

To filter by time, there are dedicated start and end time options. Using these options to filter by time allows MetricFlow to further optimize query performance by pushing down the where filter when appropriate.

Note that when you query a dimension, you need to specify the primary entity for that dimension. In the following example, the primary entity is order_id.

Query

# For self-hosted users (dbt v1 or v2)

mf query --metrics order_total --group-by order_id__is_food_order --limit 10 --order-by -metric_time --where "is_food_order = True" --start-time '2017-08-22' --end-time '2017-08-27'

Result

✔ Success 🦄 - query completed after 1.53 seconds
| METRIC_TIME | IS_FOOD_ORDER | ORDER_TOTAL |
|:--------------|:----------------|---------------:|
| 2017-08-27 | True | 568.92 |
| 2017-08-26 | True | 471.95 |
| 2017-08-25 | True | 452.93 |
| 2017-08-24 | True | 384.40 |
| 2017-08-23 | True | 423.61 |
| 2017-08-22 | True | 401.91 |

Query saved queries

You can use this for frequently used queries. Replace <name> with the name of your saved query.

Query

dbt sl query --saved-query <name> # For dbt platform users (dbt v1 or v2) 

mf query --saved-query <name> # For self-hosted users (dbt v1 or v2)

For example, if you use dbt and have a saved query named new_customer_orders, you would run dbt sl query --saved-query new_customer_orders.

A note on querying saved queries

When querying saved queries, you can use parameters such as where, limit, order, compile, and so on. However, keep in mind that you can't access metric or group_by parameters in this context. This is because they are predetermined and fixed parameters for saved queries, and you can't change them at query time. If you would like to query more metrics or dimensions, you can build the query using the standard format.

Additional query examples

The following tabs present additional query examples, like exporting to a CSV. Select the tab that best suits your needs:

Add --compile (or --explain for v1 users) to your query to view the SQL generated by MetricFlow.

Query

# For dbt platform users (dbt v1 or v2) 
dbt sl query --metrics order_total --group-by metric_time,is_food_order --limit 10 --order-by -metric_time --where "is_food_order = True" --start-time '2017-08-22' --end-time '2017-08-27' --compile

# For self-hosted users (dbt v1 or v2)

mf query --metrics order_total --group-by metric_time,is_food_order --limit 10 --order-by -metric_time --where "is_food_order = True" --start-time '2017-08-22' --end-time '2017-08-27' --explain

Result

✔ Success 🦄 - query completed after 0.28 seconds
🔎 SQL (remove --compile to see data or add --show-dataflow-plan to see the generated dataflow plan):
select
metric_time
, is_food_order
, sum(order_cost) as order_total
from (
select
cast(ordered_at as date) as metric_time
, is_food_order
, order_cost
from analytics.js_dbt_sl_demo.orders orders_src_1
where cast(ordered_at as date) between cast('2017-08-22' as timestamp) and cast('2017-08-27' as timestamp)
) subq_3
where is_food_order = True
group by
metric_time
, is_food_order
order by metric_time desc
limit 10

Time granularity

Optionally, you can specify the time granularity you want your data to be aggregated at by appending two underscores and the unit of granularity you want to metric_time, the global time dimension. You can group the granularity by: day, week, month, quarter, and year.

Below is an example for querying metric data at a monthly grain:

dbt sl query --metrics revenue --group-by metric_time__month # For dbt platform users (dbt v1 or v2) 

mf query --metrics revenue --group-by metric_time__month # For self-hosted users (dbt v1 or v2)

Export

Run exports for a specific saved query. Use this command to test and generate exports in your development environment. You can also use the --select flag to specify particular exports from a saved query. Refer to exports in development for more info.

Export is available in dbt.

dbt sl export # For dbt platform users (dbt v1 or v2)

Export-all

Run exports for multiple saved queries at once. This command provides a convenient way to manage and execute exports for several queries simultaneously, saving time and effort. Refer to exports in development for more info.

Export is available in dbt.

dbt sl export-all # For dbt platform users (dbt v1 or v2)

FAQs

 How can I add a dimension filter to a where filter?
 Why is my query limited to 100 rows in the dbt platform CLI?
 How can I query multiple metrics, group bys, or where statements?
 How can I sort my query in ascending or descending order?

Was this page helpful?

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

0
Loading