Schema-level anomaly detection for Databricks Unity Catalog using the Data Quality API (Public Preview). Automatically monitors table freshness and completeness using ML models. Use when setting up schema-wide data reliability monitoring, detecting stale or incomplete tables, configuring anomaly detection alerts, or querying the system results table. **Auto-triggered by Silver and Gold layer setup workflows** to ensure every new schema has baseline freshness/completeness monitoring from day one.
Scanned 9/12/2026
Install to Claude Code
npx -y skills add databricks-solutions/vibe-coding-workshop-template --skill 04-anomaly-detection --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of 04 Anomaly Detection?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/databricks-solutions-04-anomaly-detection)More formats (shields.io, HTML) on the badges page.
---
name: anomaly-detection
description: Schema-level anomaly detection for Databricks Unity Catalog using the Data Quality API (Public Preview). Automatically monitors table freshness and completeness using ML models. Use when setting up schema-wide data reliability monitoring, detecting stale or incomplete tables, configuring anomaly detection alerts, or querying the system results table. **Auto-triggered by Silver and Gold layer setup workflows** to ensure every new schema has baseline freshness/completeness monitoring from day one.
clients: [ide_cli, genie_code]
bundle_resource: monitors
deploy_verb: bundle_deploy
deploy_note: "Schema-level anomaly detection (Data Quality API) on the per-user prefixed schema; deployed via `bundle deploy --target dev` (runDatabricksCli on Genie Code)."
coverage: full
metadata:
author: prashanth subrahmanyam
version: "1.1"
domain: monitoring
role: worker
pipeline_stage: 7
pipeline_stage_name: observability
triggers:
- anomaly detection
- freshness
- completeness
- stale tables
- unhealthy tables
- schema monitoring
- silver setup
- gold setup
- silver layer
- gold layer
- schema setup
called_by:
- observability-setup
- silver-layer-setup
- gold-layer-setup
standalone: true
last_verified: "2026-08-30"
volatility: medium
verification_sources:
- url: "https://databricks-sdk-py.readthedocs.io/en/latest/workspace/dataquality/data_quality.html"
check_for: "DataQualityAPI method signatures: create_monitor(monitor), delete_monitor(object_type, object_id), get_monitor(object_type, object_id), update_monitor(object_type, object_id, monitor, update_mask), list_monitor"
- url: "https://databricks-sdk-py.readthedocs.io/en/latest/dbdataclasses/dataquality.html"
check_for: "Monitor, AnomalyDetectionConfig field names (excluded_table_full_names), object_type/object_id semantics"
- url: "https://learn.microsoft.com/en-us/azure/databricks/data-quality-monitoring/anomaly-detection/"
check_for: "Anomaly detection overview, freshness/completeness concepts, enable/disable workflow"
- url: "https://learn.microsoft.com/en-us/azure/databricks/data-quality-monitoring/anomaly-detection/results"
check_for: "system.data_quality_monitoring.table_results schema, nested struct fields (freshness, completeness, downstream_impact)"
upstream_sources:
- name: "databricks-sdk-py"
repo: "databricks/databricks-sdk-py"
paths:
- "databricks/sdk/service/dataquality.py"
relationship: "reference"
last_synced: "2026-08-30"
sync_commit: "latest"
---
## Overview
Anomaly Detection is a **schema-level** monitoring capability that automatically assesses data quality by evaluating **freshness** (is the table up-to-date?) and **completeness** (did we get the expected number of rows?). It uses ML models built from historical patterns — no custom metric definitions needed.
**API Status:** Public Preview (`POST /api/data-quality/v1/monitors`)
**SDK Module:** `databricks.sdk.service.dataquality`
### When to Use This Skill vs. Lakehouse Monitoring
| Question | Use This Skill | Use Lakehouse Monitoring |
|----------|---------------|------------------------|
| "Did my pipeline break?" | **Yes** — detects stale/incomplete tables | No |
| "Is my revenue trending correctly?" | No | **Yes** — custom AGGREGATE/DERIVED/DRIFT metrics |
| "Which tables are unhealthy?" | **Yes** — schema-wide scan | No (per-table only) |
| "What's the average transaction value?" | No | **Yes** — custom business KPIs |
| "How quickly can I set up monitoring?" | **Yes** — minutes (enable on schema) | 2+ hours (custom metrics per table) |
| "Do I need ML model monitoring?" | No | **Yes** — `InferenceLogConfig` support |
**Use both together** for comprehensive monitoring: anomaly detection for baseline reliability + custom metrics for business KPIs.
## Core Concepts
### Freshness
Analyzes commit history to build a per-table model predicting next commit time. If a commit is unusually late, the table is marked **stale**.
### Completeness
Analyzes historical row counts to predict expected rows in the last 24 hours. If actual rows fall below the lower bound, the table is marked **incomplete**.
### Intelligent Scanning
Automatically aligns scan frequency with table update cadence. High-impact tables (by popularity and downstream usage) are prioritized; less critical tables are scanned less frequently.
### Results Storage
All results are stored in the system table:
```
system.data_quality_monitoring.table_results
```
**Access:** Only account admins by default. Grant access to others as needed.
## Quick Start
### Enable via UI (Simplest)
1. Navigate to schema in Catalog Explorer
2. Click **Details** tab
3. Click **Enable** under Data Quality Monitoring
4. Click **Save**
### Enable via SDK
```python
from databricks.sdk import WorkspaceClient
from databricks.sdk.service.dataquality import Monitor, AnomalyDetectionConfig
w = WorkspaceClient()
# Get schema UUID (required — NOT the three-level name)
schema_info = w.schemas.get(full_name=f"{catalog}.{schema}")
schema_id = schema_info.schema_id
# Enable anomaly detection
monitor = w.data_quality.create_monitor(
monitor=Monitor(
object_type="schema",
object_id=schema_id,
anomaly_detection_config=AnomalyDetectionConfig(
excluded_table_full_names=[
f"{catalog}.{schema}.staging_table", # Optional: tables to skip
]
)
)
)
```
### Disable via SDK
```python
w.data_quality.delete_monitor(
object_type="schema",
object_id=schema_id
)
```
**Warning:** Disabling deletes ALL anomaly detection tables and information. This cannot be undone.
## Critical Rules
### Rule 1: create_monitor() Takes a Monitor Object with UUID
```python
# ✅ CORRECT: Wrap in Monitor object, use schema UUID
schema_info = w.schemas.get(full_name=f"{catalog}.{schema}")
w.data_quality.create_monitor(
monitor=Monitor(object_type="schema", object_id=schema_info.schema_id, ...)
)
# ❌ WRONG: Three-level name, keyword args instead of Monitor object
w.data_quality.create_monitor(object_id=f"{catalog}.{schema}", ...)
```
### Rule 2: Permissions Required
To create/manage a **schema** monitor (anomaly detection), the caller must have **either** of these sets (per the Data Quality Monitoring API):
- **(a)** `MANAGE` **and** `USE_CATALOG` on the schema's parent catalog, **or**
- **(b)** `USE_CATALOG` on the parent catalog **plus** `MANAGE` **and** `USE_SCHEMA` on the schema.
(The Catalog Explorer UI states it more simply: `MANAGE` on the schema or its parent catalog.)
- To view table health indicators: `SELECT` or `BROWSE` on the tables.
- To query results: **SELECT** on `system.data_quality_monitoring.table_results`
### Rule 3: System Table Access Is Restricted
The results table contains data from ALL catalogs in the metastore. **Use caution when granting access** — it includes sample values from every monitored table.
### Rule 4: Anomaly Detection Does NOT Monitor Views
Only tables are scanned. Views are silently skipped.
### Rule 5: Completeness Only Checks Row Counts
Completeness does NOT evaluate null fractions, zero values, or NaN. For column-level quality monitoring, use the `lakehouse-monitoring-comprehensive` skill with custom metrics.
## Configuration Options
### Exclude Specific Tables
```python
AnomalyDetectionConfig(
excluded_table_full_names=[
f"{catalog}.{schema}.staging_raw",
f"{catalog}.{schema}.temp_processing",
]
)
```
### Advanced Configuration (via REST API)
For freshness/completeness threshold overrides and table-specific settings, see `references/configuration-guide.md`.
## Querying Results
```sql
-- Find all unhealthy tables in a schema
SELECT
table_name,
status,
freshness.status as freshness_status,
completeness.status as completeness_status,
downstream_impact.impact_level,
downstream_impact.num_downstream_tables
FROM system.data_quality_monitoring.table_results
WHERE catalog_name = '{catalog}'
AND schema_name = '{schema}'
AND status = 'Unhealthy'
ORDER BY event_time DESC;
```
For the complete results schema and query patterns, see `references/results-schema.md`.
## Setting Up Alerts
```sql
-- Alert on unhealthy tables with downstream impact
SELECT
CONCAT(catalog_name, '.', schema_name, '.', table_name) AS full_table_name,
status,
downstream_impact.num_queries_on_affected_tables AS impacted_queries
FROM system.data_quality_monitoring.table_results
WHERE event_time >= current_timestamp() - INTERVAL 6 HOURS
AND status = 'Unhealthy'
AND downstream_impact.num_queries_on_affected_tables > :min_tables_affected;
```
For complete alert templates including custom email notifications, see `references/alert-patterns.md`.
## Integration with Silver & Gold Layer Setup
**This skill is automatically invoked by `silver-layer-setup` and `gold-layer-setup` orchestrators.** Every new Silver or Gold schema should have anomaly detection enabled to provide baseline freshness/completeness monitoring from day one.
### Reusable Enable Function
Use this pattern in setup scripts to enable anomaly detection as part of schema creation:
```python
from databricks.sdk import WorkspaceClient
from databricks.sdk.service.dataquality import Monitor, AnomalyDetectionConfig
def enable_anomaly_detection_on_schema(
w: WorkspaceClient,
catalog: str,
schema: str,
excluded_tables: list = None,
):
"""
Enable anomaly detection on a schema. Safe to call if already enabled.
Called by Silver and Gold layer setup workflows to ensure every schema
has baseline freshness/completeness monitoring.
Args:
w: WorkspaceClient
catalog: Catalog name
schema: Schema name
excluded_tables: Optional list of table names to exclude
(e.g., staging, quarantine, temp tables)
"""
schema_info = w.schemas.get(full_name=f"{catalog}.{schema}")
schema_id = schema_info.schema_id
excluded_full_names = None
if excluded_tables:
excluded_full_names = [
f"{catalog}.{schema}.{t}" for t in excluded_tables
]
try:
monitor = w.data_quality.create_monitor(
monitor=Monitor(
object_type="schema",
object_id=schema_id,
anomaly_detection_config=AnomalyDetectionConfig(
excluded_table_full_names=excluded_full_names
)
)
)
print(f"✓ Anomaly detection enabled on {catalog}.{schema}")
return monitor
except Exception as e:
if "already exists" in str(e).lower():
print(f"✓ Anomaly detection already enabled on {catalog}.{schema} (skipping)")
else:
print(f"⚠️ Could not enable anomaly detection on {catalog}.{schema}: {e}")
print(" (Non-blocking — schema setup continues)")
```
### When Invoked by Silver Layer Setup
```python
# After Silver schema creation and DLT pipeline deployment
enable_anomaly_detection_on_schema(
w, catalog, silver_schema,
excluded_tables=["dq_rules"] # Exclude metadata tables
)
```
### When Invoked by Gold Layer Setup
```python
# After Gold tables are created via setup_tables.py
enable_anomaly_detection_on_schema(
w, catalog, gold_schema,
excluded_tables=None # Monitor all Gold tables
)
```
### Why Enable at Schema Setup Time?
1. **Freshness baselines start building immediately** — ML models need historical commit patterns
2. **Completeness models train earlier** — more scan cycles = more accurate predictions
3. **Zero cost to enable** — no custom metrics needed, runs automatically
4. **Catches pipeline breaks early** — stale/incomplete tables detected before anyone queries them
5. **Complements custom metrics** — anomaly detection for reliability, Lakehouse Monitoring for business KPIs
## Workflow
| Phase | Duration | Activities |
|-------|----------|------------|
| Phase 1: Enable | 5 min | Enable anomaly detection on schema via UI or SDK |
| Phase 2: Wait | 15-30 min | First scan runs automatically |
| Phase 3: Review | 10 min | Check results in Catalog Explorer or system table |
| Phase 4: Alerts | 15 min | Set up SQL alerts on system table |
## Reference Files
### [configuration-guide.md](references/configuration-guide.md)
Complete configuration reference including:
- REST API endpoint and request schema
- SDK-based enable/disable patterns
- `excluded_table_full_names` configuration
- Advanced threshold overrides (freshness, completeness)
- Table skip/scan lists
- Event timestamp column configuration
### [results-schema.md](references/results-schema.md)
System results table documentation including:
- Full schema of `system.data_quality_monitoring.table_results`
- Nested struct documentation (freshness, completeness, downstream_impact, root_cause_analysis)
- Query patterns for common scenarios
- Metastore-level dashboard template reference
### [alert-patterns.md](references/alert-patterns.md)
SQL alert configuration including:
- Alert query template with downstream impact filtering
- Custom email notification template
- Alert configuration steps
- Integration with Databricks SQL Alerts
## Scripts
### [enable_anomaly_detection.py](scripts/enable_anomaly_detection.py)
SDK-based anomaly detection management including:
- Enable on schema with optional table exclusions
- Disable (with warning about data deletion)
- List monitored schemas
- Check monitor status
### [query_results.py](scripts/query_results.py)
Results querying utilities including:
- Query unhealthy tables
- Extract root cause analysis
- Filter by freshness/completeness status
- Generate summary reports
## Assets
### [alert-query-template.sql](assets/templates/alert-query-template.sql)
Ready-to-use SQL query for Databricks SQL Alerts with configurable thresholds and custom email template.
## Limitations
- Does NOT support views (only tables)
- Completeness does not evaluate null fractions, zero values, or NaN
- System table access is restricted to account admins by default
- Disabling deletes all monitoring data (irreversible)
- Event freshness (based on event time columns) is not supported in the current version
## Troubleshooting
### Monitor Not Detecting Anomalies
- **Check permissions:** Ensure MANAGE SCHEMA or MANAGE CATALOG
- **Wait for scan:** First scan may take 15-30 minutes
- **Check table activity:** Tables that rarely change may be classified as "static"
### Cannot Access Results Table
- **Default access:** Only account admins can read `system.data_quality_monitoring.table_results`
- **Grant access:** Account admin must grant SELECT on the system table
### Tables Showing as "Training"
- **Normal behavior:** New tables need historical data to build ML models
- **Wait:** Models improve after several scan cycles
## References
- [Anomaly Detection Overview](https://learn.microsoft.com/en-us/azure/databricks/data-quality-monitoring/anomaly-detection/)
- [Results Schema](https://learn.microsoft.com/en-us/azure/databricks/data-quality-monitoring/anomaly-detection/results)
- [Alert Setup](https://learn.microsoft.com/en-us/azure/databricks/data-quality-monitoring/anomaly-detection/alerts)
- [REST API](https://docs.databricks.com/api/azure/workspace/dataquality/createmonitor)
- [Python SDK Dataclasses](https://databricks-sdk-py.readthedocs.io/en/latest/dbdataclasses/dataquality.html)
## Summary
Anomaly Detection provides automated, schema-level monitoring for table freshness and completeness. It complements the `lakehouse-monitoring-comprehensive` skill's custom business metrics with baseline data reliability monitoring. Enable it in minutes via UI or SDK, query results from the system table, and set up SQL alerts for proactive notification.
## Version History
- **2026-08-30** — Aligned Rule 2 permission wording to the live Data Quality Monitoring API: a schema monitor requires either `MANAGE` + `USE_CATALOG` on the parent catalog, or `USE_CATALOG` on the catalog + `MANAGE` + `USE_SCHEMA` on the schema; added the `SELECT`/`BROWSE` requirement for health indicators. Bumped `last_verified` and upstream `last_synced`.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!