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
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.