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 scope

This 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-domain

Create interactively with create_or_update_table_monitor(dry_run=True) via the Monte Carlo MCP server.

Configuration

description โ€” what this monitor covers

string ยท required

Displayed in the Monte Carlo UI and in incident notifications. Max 512 characters.

description: Monitor all analytics tables for freshness and volume
asset_selection โ€” which tables to monitor

object ยท 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_WITH

Properties


databases โ€” databases to monitor

array of objects ยท required

Each entry selects a database and optionally narrows to specific schemas.

PropertyTypeRequiredDescription
namestringyesDatabase name
schemasarray of stringsnoSchemas to include. Omit to include all.
tablesobjectnoNot supported โ€” the backend rejects table-level selection for table monitors. Use filters instead.

databases:
  - name: analytics
    schemas: [core, staging]
  - name: raw

filters โ€” 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:

PropertyTypeRequiredDescription
table_namestringyesPattern to match against table names
table_name_operatorstringyesSTARTS_WITH ยท ENDS_WITH ยท CONTAINS ยท MATCH_PATTERN

By tag:

PropertyTypeRequiredDescription
table_tagsarray of stringsyesTag values to match
table_tags_operatorstringyesHAS_ALL ยท HAS_ANY

By type:

PropertyTypeRequiredDescription
table_typestringyesTABLE ยท VIEW ยท EXTERNAL

filters:
  - table_name: fct_
    table_name_operator: STARTS_WITH
  - table_tags: [critical]
    table_tags_operator: HAS_ANY

exclusions โ€” 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_WITH
alert_conditions โ€” health signals to monitor

array 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 valueWhat it detects
last_updated_onTable not updated within expected cadence (freshness)
total_row_countUnexpected row count changes (volume)
total_row_count_last_changed_onRow count unchanged for unusual duration
schemaAny schema modification (superset of the three below)
schema_fields_addedNew columns added
schema_fields_removedColumns removed
schema_fields_type_changeColumn data type changed

alert_conditions:
  - metric: last_updated_on
  - metric: total_row_count
domains โ€” domain for this monitor

array 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-domain
sensitivity โ€” anomaly detection aggressiveness

enum ยท optional ยท default: account-level setting

The only tuning lever for table monitors โ€” there are no explicit thresholds.

ValueBehavior
lowFewer alerts, only large deviations
mediumBalanced
highMore alerts, smaller deviations flagged

sensitivity: medium
name โ€” unique identifier within the namespace

string ยท 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_check
warehouse โ€” which warehouse to use

string ยท required if multiple warehouses

Warehouse UUID or name. Overrides default_resource from montecarlo.yml.

warehouse: my-snowflake
enable_row_count_collection โ€” run explicit row count queries

boolean ยท optional ยท default: false

When enabled, Monte Carlo runs queries to count rows instead of relying on metadata. More accurate but uses warehouse compute.

Properties:

PropertyTypeRequiredDescription
enable_row_count_collection_limitintegernoMax tables to query. Only applies when enabled.

enable_row_count_collection: true
enable_row_count_collection_limit: 500
tags โ€” key-value pairs for organizing monitors

array of objects ยท optional

PropertyTypeRequiredDescription
namestringyesTag key
valuestringnoTag value

tags:
  - name: team
    value: analytics
  - name: environment
    value: production
priority โ€” incident priority level

enum ยท optional

Accepted values: P1 ยท P2 ยท P3 ยท P4 ยท P5

priority: P2
audiences โ€” notification channels

array of strings ยท optional

Audience names linking this monitor to channels defined in Notifications as Code.

audiences:
  - data-engineering
  - platform-alerts
alert_grouping โ€” control how breaches are grouped into alerts

object ยท 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_alert
data_quality_dimension โ€” data quality category

enum ยท optional

Accepted values: ACCURACY ยท COMPLETENESS ยท CONSISTENCY ยท TIMELINESS ยท UNIQUENESS ยท VALIDITY

data_quality_dimension: TIMELINESS
notes โ€” internal notes

string ยท optional

Visible in the Monte Carlo UI. Not included in notifications.

notes: Owned by the analytics team. Reviewed quarterly.
is_draft โ€” create as draft without activating

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: true
uuid โ€” update an existing monitor

string ยท optional

Include the UUID of an existing monitor to update it instead of creating a new one.

uuid: 0dae7702-0950-45c7-909c-7e183bddca19
Deprecated fields
FieldUse instead
resourcewarehouse
domaindomains
domain_uuidsdomains
labelsaudiences

Examples

All tables in a database

montecarlo:
  table:
    - name: broad_analytics_monitoring
      description: Monitor all analytics tables
      asset_selection:
        databases:
          - name: analytics
      domains:
        - my-domain

Specific 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: analytics

Multiple 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-domain

Troubleshooting

Scheduling and alerting

  • Adding a schedule field โ€” 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 โ€” schema is a superset of schema_fields_added, schema_fields_removed, and schema_fields_type_change. Using both is redundant.

Selection and updates

  • Attempting table-level selection โ€” while databases[].tables exists in the schema, the backend rejects it. Use filters/exclusions for 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.