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 when creating a monitor

Required on all accounts, regardless of when the account was created. Monitors that already exist without a domain can still be updated without adding one.

The domain also filters the tables in asset_selection: the monitor covers only matching tables that belong to the domain. Adding or changing domains on an existing monitor can reduce its coverage, so check that the domain includes every table the monitor should cover. See Domains.

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 or mappings · optional

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

An entry can instead be a mapping that narrows an audience to specific triage priorities, so it is only notified about alerts scored at those priorities. Some audience must cover NOT_TRIAGED. See Routing alerts by triage priority.

audiences:
  - data-engineering
  - platform-alerts
  - audience: oncall
    triage_priority: [HIGH]
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
auto_tuning — override auto-apply tuning for this monitor

boolean · optional

Force auto-apply tuning on (true) or off (false) for this monitor, overriding the account or domain default. Omit to inherit. See the Tuning Agent.

auto_tuning: false
auto_triage — override auto-triage for this monitor

boolean · optional

Force auto-triage on (true) or off (false) for this monitor, overriding the account or domain default. Omit to inherit. See the Triage Agent.

auto_triage: false
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.


Did this page help you?