Table Monitor
Broad anomaly detection for freshness, volume, and schema changes across many tables at once.
Overview
Get broad, low-config anomaly detection for freshness, volume, and schema changes across many tables at once. Point it at a database and schema, and Monte Carlo's ML handles the rest on its collection cycle. Table monitors use metadata instead of querying the table, keeping compute costs minimal.
Reference scopeThis page covers MaC YAML configuration. For how table monitors work and sensitivity settings, see Table Monitors.
Table monitors have no user-defined schedule or explicit thresholds. Alerting is anomaly detection only, controlled by sensitivity. For fixed thresholds or custom metrics on a single table, use a metric monitor.
Quick Start
montecarlo:
table:
- name: analytics_health
description: Monitor all analytics tables for freshness and volume
asset_selection:
databases:
- name: analytics
alert_conditions:
- metric: last_updated_on
- metric: total_row_count
domains:
- my-domainCreate interactively with create_or_update_table_monitor(dry_run=True) via the Monte Carlo MCP server.
Configuration
string Β· required
Displayed in the Monte Carlo UI and in incident notifications. Max 512 characters.
description: Monitor all analytics tables for freshness and volumeobject Β· required
Select tables by database, schema, name patterns, or tags. Combine databases with filters and exclusions for precise control.
asset_selection:
databases:
- name: analytics
schemas: [core, staging]
filters:
- table_name: fct_
table_name_operator: STARTS_WITH
exclusions:
- table_name: _deprecated
table_name_operator: ENDS_WITHProperties
databases β databases to monitor
array of objects Β· required
Each entry selects a database and optionally narrows to specific schemas.
| Property | Type | Required | Description |
|---|---|---|---|
name | string | yes | Database name |
schemas | array of strings | no | Schemas to include. Omit to include all. |
tables | object | no | Not supported β the backend rejects table-level selection for table monitors. Use filters instead. |
databases:
- name: analytics
schemas: [core, staging]
- name: rawfilters β narrow selection to matching tables
array of objects Β· optional
Each entry matches tables by name pattern, tag, or type. The type field is auto-inferred from the other fields present.
By name pattern:
| Property | Type | Required | Description |
|---|---|---|---|
table_name | string | yes | Pattern to match against table names |
table_name_operator | string | yes | STARTS_WITH Β· ENDS_WITH Β· CONTAINS Β· MATCH_PATTERN |
By tag:
| Property | Type | Required | Description |
|---|---|---|---|
table_tags | array of strings | yes | Tag values to match |
table_tags_operator | string | yes | HAS_ALL Β· HAS_ANY |
By type:
| Property | Type | Required | Description |
|---|---|---|---|
table_type | string | yes | TABLE Β· VIEW Β· EXTERNAL |
filters:
- table_name: fct_
table_name_operator: STARTS_WITH
- table_tags: [critical]
table_tags_operator: HAS_ANYexclusions β remove matching tables from selection
array of objects Β· optional
Same structure as filters. Tables matching any exclusion are removed even if they match a filter.
exclusions:
- table_name: _deprecated
table_name_operator: ENDS_WITHarray of objects Β· optional Β· default: all metrics
Each entry has a single metric property. Table monitors do not accept operators or thresholds β all alerting uses anomaly detection.
metric value | What it detects |
|---|---|
last_updated_on | Table not updated within expected cadence (freshness) |
total_row_count | Unexpected row count changes (volume) |
total_row_count_last_changed_on | Row count unchanged for unusual duration |
schema | Any schema modification (superset of the three below) |
schema_fields_added | New columns added |
schema_fields_removed | Columns removed |
schema_fields_type_change | Column data type changed |
alert_conditions:
- metric: last_updated_on
- metric: total_row_countarray of strings (exactly one entry) Β· required on accounts created after January 2025
Set default_domain in montecarlo.yml to avoid repeating it on every monitor.
domains:
- my-domainenum Β· optional Β· default: account-level setting
The only tuning lever for table monitors β there are no explicit thresholds.
| Value | Behavior |
|---|---|
low | Fewer alerts, only large deviations |
medium | Balanced |
high | More alerts, smaller deviations flagged |
sensitivity: mediumstring Β· required
Required for monitors created after Jan 29, 2024 (existing monitors keep working). Changing the name creates a new monitor and deletes the old one β incident history does not transfer.
name: analytics_freshness_checkstring Β· required if multiple warehouses
Warehouse UUID or name. Overrides default_resource from montecarlo.yml.
warehouse: my-snowflakeboolean Β· optional Β· default: false
When enabled, Monte Carlo runs queries to count rows instead of relying on metadata. More accurate but uses warehouse compute.
Properties:
| Property | Type | Required | Description |
|---|---|---|---|
enable_row_count_collection_limit | integer | no | Max tables to query. Only applies when enabled. |
enable_row_count_collection: true
enable_row_count_collection_limit: 500array of objects Β· optional
| Property | Type | Required | Description |
|---|---|---|---|
name | string | yes | Tag key |
value | string | no | Tag value |
tags:
- name: team
value: analytics
- name: environment
value: productionenum Β· optional
Accepted values: P1 Β· P2 Β· P3 Β· P4 Β· P5
priority: P2array of strings Β· optional
Audience names linking this monitor to channels defined in Notifications as Code.
audiences:
- data-engineering
- platform-alertsenum Β· optional
Accepted values: ACCURACY Β· COMPLETENESS Β· CONSISTENCY Β· TIMELINESS Β· UNIQUENESS Β· VALIDITY
data_quality_dimension: TIMELINESSstring Β· optional
Visible in the Monte Carlo UI. Not included in notifications.
notes: Owned by the analytics team. Reviewed quarterly.boolean Β· optional Β· default: false
Creates the monitor in a paused state. Omitting this on a later update resets to false (active) due to PUT semantics β always include it if you want the monitor to stay in draft.
is_draft: truestring Β· optional
Include the UUID of an existing monitor to update it instead of creating a new one.
uuid: 0dae7702-0950-45c7-909c-7e183bddca19Deprecated fields
| Field | Use instead |
|---|---|
resource | warehouse |
domain | domains |
domain_uuids | domains |
labels | audiences |
Examples
All tables in a database
montecarlo:
table:
- name: broad_analytics_monitoring
description: Monitor all analytics tables
asset_selection:
databases:
- name: analytics
domains:
- my-domainSpecific schemas with filtering
montecarlo:
table:
- name: core_fact_tables
description: Monitor fact tables in core schema
warehouse: my-snowflake
asset_selection:
databases:
- name: analytics
schemas: [core]
filters:
- table_name: fct_
table_name_operator: STARTS_WITH
exclusions:
- table_name: _deprecated
table_name_operator: ENDS_WITH
alert_conditions:
- metric: last_updated_on
- metric: total_row_count
- metric: schema
sensitivity: medium
audiences:
- data-engineering
priority: P2
domains:
- my-domain
tags:
- name: team
value: analyticsMultiple databases with row count collection
montecarlo:
table:
- name: production_monitoring
description: Cross-database production monitoring
asset_selection:
databases:
- name: warehouse
schemas: [public]
- name: mart
schemas: [finance, marketing]
alert_conditions:
- metric: last_updated_on
- metric: total_row_count
- metric: total_row_count_last_changed_on
enable_row_count_collection: true
enable_row_count_collection_limit: 500
sensitivity: low
domains:
- my-domainTroubleshooting
Scheduling and alerting
- Adding a
schedulefield β table monitors run on Monte Carlo's collection cycle. There is no schedule field. Adding one causes a validation error. - Using operators or thresholds in
alert_conditionsβ write{ metric: last_updated_on }, not{ metric: last_updated_on, operator: GT, threshold_value: 100 }. Table monitors use anomaly detection only. - Redundant schema metrics β
schemais a superset ofschema_fields_added,schema_fields_removed, andschema_fields_type_change. Using both is redundant.
Selection and updates
- Attempting table-level selection β while
databases[].tablesexists in the schema, the backend rejects it. Usefilters/exclusionsfor finer control. - Forgetting PUT semantics on updates β when updating a monitor by including
uuid, every field you omit reverts to its default. Always specify the complete configuration, not just what changed.
Updated about 2 hours ago
