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-alertsobject ยท optional ยท default: 5-hour schema-based grouping
Groups subsequent same-schema breaches into the currently open alert instead of the default 5-hour window. Freshness, volume, and time since last row count change alerts are always grouped together; schema change alerts group with other schema change alerts.
mode
Accepted values: group_into_open_alert
alert_grouping:
mode: group_into_open_alertenum ยท 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.
