Volumetric Check Examples¶
Three real-world scenarios that show how the Volumetric check behaves in production: a load cycle that adds no rows, a weekly growth band, and a table whose size should stay in a fixed range. Volumetric is a Shape-only rule, so every failure is reported as a single Shape Anomaly for the container.
The situation: An ETL job appends the day's orders to ORDERS every night and finishes by 23:30 UTC. When the job fails silently, the table keeps its old rows, so nothing looks wrong until a report is empty. The team wants an alert on any day that adds no rows.
Check configuration
| Field | Value |
|---|---|
| Rule | Volumetric |
| Table / File | ORDERS |
| Comparison | Absolute Change |
| Measurement Period Days | 1 |
| Min Value | 1 |
| Max Value | (empty) |
| Owner | (check creator) |
| Anomaly Assignee | (Data Engineering on-call) |
| Description | ORDERS must gain at least one row per daily load. |
| Tags | daily-load |
| Status | Active |
Payload
{
"description": "ORDERS must gain at least one row per daily load.",
"rule": "volumetric",
"fields": [],
"container_id": 145,
"filter": null,
"properties": {"comparison": "Absolute Change", "window_size": 1, "min": 1, "max": null},
"tags": ["daily-load"],
"additional_metadata": {},
"template_id": null,
"status": "Active",
"owner_id": 7,
"default_anomaly_assignee_id": 12
}
What it takes to alert
The check by itself only sets the expectation. Three more pieces turn it into an alert:
- A Scan with the Metadata category runs every day at 00:10 UTC, after the load and before the hourly Observability measurement at 00:30. The Scan's count is then the only count of the day, so tomorrow's comparison sees exactly the rows this load left. See Schedule Options.
- Volume Tracking is on for
ORDERS, so a day without a Scan still gets a count and the history has no gap. - A Flow with the Anomaly Detected trigger, filtered by Check Rule Types = Volumetric and Anomaly's Tags =
daily-load, sends the notification. Anomalies inherit the check's tags, which is what the tag filter matches. See Flow Triggers.
When AI Managed checks are on
With Create AI Volumetric checks on, ORDERS usually already has an AI Managed Absolute Change check with a 1 day period, and a second Active check with the same comparison and period is rejected. Edit that check instead: set its Min to 1 and clear its Max. The edit converts it to Authored, so Qualytics stops adjusting its limits.
Sample Data
| Scan (UTC) | Count yesterday | Count today | Change |
|---|---|---|---|
| Mon 00:10 | 24,100 | 25,000 | +900 |
| Tue 00:10 | 25,000 | 25,000 | 0 |
| Wed 00:10 | 25,000 | 26,750 | +1,750 |
What gets flagged
Monday night's load fails, so Tuesday's Scan finds the same 25,000 rows that Monday's Scan counted. The check expects at least Monday's count plus 1, so the Scan reports a Shape Anomaly and the Flow sends the alert. On Wednesday the job catches up and the check passes again.
Shape Anomaly
ORDERS received 25000 records, fewer than the expected minimum of 25001
Flowchart
graph TD
A["Scan counts the rows of ORDERS"] --> B["Read yesterday's count from the history"]
B --> C{"Count today at least<br/>yesterday's count + 1?"}
C -->|Yes| D["Check passes"]
C -->|No| E["Report a Shape Anomaly"]
E --> F["Flow matches rule type and tag<br/>and sends the alert"]
Equivalent SQL
The situation: EVENTS grows with traffic, so its size drifts steadily, and weekends are quieter than weekdays. A fixed number of rows would be wrong most of the week. The team wants to know when the table is more than 20% smaller, or more than 50% larger, than it was on the same weekday last week.
Check configuration
| Field | Value |
|---|---|
| Rule | Volumetric |
| Table / File | EVENTS |
| Comparison | Percentage Change |
| Measurement Period Days | 7 |
| Min Percentage | -20 |
| Max Percentage | 50 |
| Owner | (check creator) |
| Description | EVENTS stays within -20% and +50% of its size one week earlier. |
| Tags | traffic |
| Status | Active |
Payload
{
"description": "EVENTS stays within -20% and +50% of its size one week earlier.",
"rule": "volumetric",
"fields": [],
"container_id": 212,
"filter": null,
"properties": {"comparison": "Percentage Change", "window_size": 7, "min": -0.2, "max": 0.5},
"tags": ["traffic"],
"additional_metadata": {},
"template_id": null,
"status": "Active",
"owner_id": 7,
"default_anomaly_assignee_id": null
}
Sample Data
| Scan | Count 7 days earlier | Count today | Change |
|---|---|---|---|
| Week 1, Monday | 1,000,000 | 1,180,000 | +18% |
| Week 2, Monday | 1,180,000 | 2,450,000 | +107.6% |
What gets flagged
In week 2 a replayed backfill loaded the same events twice. The count more than doubled against the same Monday a week earlier, past the +50% limit. The days in between play no part: only the count from exactly seven days earlier is compared.
Shape Anomaly
EVENTS received 2450000 records, more than the expected maximum of 1770000
The expected maximum is the earlier count (1,180,000) plus 50%.
Flowchart
graph TD
A["Scan counts the rows of EVENTS"] --> B["Read the count from 7 days earlier"]
B --> C{"Change between -20%<br/>and +50%?"}
C -->|Yes| D["Check passes"]
C -->|No| E["Report a Shape Anomaly"]
The situation: CURRENCY_RATES is fully reloaded every day with one row per currency pair, so it should always hold about 160 rows. The team allows for a few pairs being added or retired, and wants to smooth out a single odd day.
Check configuration
| Field | Value |
|---|---|
| Rule | Volumetric |
| Table / File | CURRENCY_RATES |
| Comparison | Absolute Value |
| Measurement Period Days | 3 |
| Min Value | 150 |
| Max Value | 180 |
| Owner | (check creator) |
| Description | CURRENCY_RATES averages between 150 and 180 rows over three days. |
| Tags | reference-data |
| Status | Active |
Payload
{
"description": "CURRENCY_RATES averages between 150 and 180 rows over three days.",
"rule": "volumetric",
"fields": [],
"container_id": 98,
"filter": null,
"properties": {"comparison": "Absolute Value", "window_size": 3, "min": 150, "max": 180},
"tags": ["reference-data"],
"additional_metadata": {},
"template_id": null,
"status": "Active",
"owner_id": 7,
"default_anomaly_assignee_id": null
}
Sample Data
| Scan | Two days earlier | One day earlier | Count today | 3-day average |
|---|---|---|---|---|
| Wednesday | 162 | 161 | 40 | 121 |
| Thursday | 161 | 40 | 163 | 121.33 |
| Friday | 40 | 163 | 162 | 121.67 |
| Saturday | 163 | 162 | 161 | 162 |
What gets flagged
On Wednesday a partial reload left 40 rows. The three-day average dropped to 121, below the Min of 150, so the Scan reports an anomaly. Because the low day stays inside the averaging period, Thursday and Friday also fail even though their own counts are normal. The check passes again on Saturday, once Wednesday leaves the period.
Shape Anomaly
CURRENCY_RATES received 121 records, fewer than the expected minimum of 150
A longer Measurement Period smooths small swings, but it also keeps one bad day in the average for the whole period. Use 1 day when every day must stand on its own.
Flowchart
graph TD
A["Scan counts the rows of CURRENCY_RATES"] --> B["Average with the previous two daily counts"]
B --> C{"Average between<br/>150 and 180?"}
C -->|Yes| D["Check passes"]
C -->|No| E["Report a Shape Anomaly"]
See Also¶
-
Best Practices
Guidelines for choosing the comparison and Measurement Period, scheduling the Scan, and working with AI Managed checks.
-
Permissions
The team permission each action needs: view, create, edit, archive, restore, and delete.
-
How It Works
The complete reference: definition, when the check is evaluated, the properties, the history it needs, and AI Managed Volumetric checks.
-
Comparisons
What Absolute Value, Absolute Change, and Percentage Change measure, and what each one compares against.
-
Anomaly Reporting
What the Shape Anomaly reports, how to read the numbers in the message, and why there is nothing to report per row.