Grid Checks
Grid checks allow you to monitor multiple dimensions simultaneously in a single check. Instead of creating separate checks for each store, region, API endpoint, or product, you can monitor them all together and see issues at a glance.When to Use Grid Checks
Use grid checks when you want to:- Monitor the same metric across multiple entities (stores, regions, services, etc.)
- Detect when specific entities stop reporting data
- Alert when new entities appear unexpectedly
- See health status across many dimensions in one view
How Grid Checks Work
Key Insight: Your SQL query defines WHAT data to check. The condition type defines HOW to evaluate it.Query Format
Grid checks work with two columns:name- The dimension/entity you’re monitoring (store name, region, endpoint, etc.)value- The metric you’re checking (count, amount, status, etc.)
name and the second as value automatically. If only one of name/value
is present, the other column fills the missing one. So this works too:
AS name / AS value aliases are still recommended for clarity, and
are required when your query returns three or more columns (Alertee can’t
guess which column is the dimension and which is the metric). Extra columns
beyond name/value are preserved and can be used for labels/display.
Each time the check runs, it creates a snapshot of all your dimensions and their values.
Condition Types
Grid checks support four simple condition types:Polarity: the comparison you set describes the healthy state of each cell — the same as a single-value check — and the check alerts on cells that don’t satisfy it.
1. Every Cell (all_cells)
Every row must satisfy the condition; alert if ANY row fails.
Use case: Each entity should be healthy — alert on any that isn’t.
Example: Alert if any store has fewer than 5 orders
all_cells where each cell’s value >= 5
Result: “Alert! Store ‘Downtown’ has 3 orders (not >= 5)“
2. At Least One Cell (any_cell)
At least one row must satisfy the condition; alert only if NONE do.
Use case: A pool where at least one member must be healthy.
Example: Alert if no replica is caught up
any_cell where each cell’s value <= 5
Result: “Alert! No cell satisfies <= 5 (at least one required)“
3. Dimension Missing
Alert if dimensions from the previous run are absent from current results. Use case: Detect when entities stop reporting data. Example: Alert if regions that were reporting stop sending datadimension_missing (no configuration needed - automatically compares against last run)
How it works: On each run, Alertee compares current dimensions against the previous run. If regions like “us-west” or “eu-central” were present before but are missing now, you’ll get alerted.
Result: “Alert! Missing dimensions (were present in last run): [us-west, eu-central]“
4. Dimension Added
Alert if new dimensions appear that weren’t in the previous run. Use case: Detect when new entities appear unexpectedly. Example: Alert when a new service appearsdimension_added (no configuration needed - automatically compares against last run)
How it works: On each run, Alertee compares current dimensions against the previous run. If new services like “rogue-service” appear that weren’t present before, you’ll get alerted.
Result: “Alert! New dimensions detected (not in last run): [rogue-service]“
Advanced: Custom Dimension Columns
By default, grid checks look for a column namedname to identify dimensions. You can specify a different column:
Condition: dimension_missing with dimension_column: "user_id" and expected dimensions ["user-123", "user-456"]
This allows you to check any categorical column in your results.
Best Practices
1. Use SQL for Filtering, Not UI
Instead of using complex UI filters, use SQL WHERE clauses: Good:2. Keep Queries Simple
Your query runs on every check interval. Keep it performant:- Use indexes on filtered columns
- Limit time ranges to recent data
- Use
GROUP BYto aggregate, not return raw rows
3. Use Time Windows That Match Check Intervals
If your check runs every 15 minutes, query data from the last 15 minutes:4. Start with “Every Cell” Conditions
Most use cases needall_cells — assert that every entity is healthy and alert on any that isn’t. Reserve any_cell for pools where only one member needs to be healthy (alert when none are).
Note: the worked examples further down this doc still use the older “alert when a cell matches the problem” phrasing and are being revised to the healthy-assertion model described above.
5. One condition per check
A check has a single condition and severity. To watch the same query at two severities (e.g. warning at one threshold, critical at another), or to combine a value check withdimension_missing, create separate checks over the same
query — each with its own condition and severity.
Common Patterns
Pattern 1: Service Health Monitoring
Monitor if all services are healthy:all_cells where value = 1 (critical) — every service must be up
(1); alerts on any that’s down. Add a second check with dimension_missing to
catch a service that stops reporting entirely.
Pattern 2: Regional Metrics
Track metrics across regions:all_cells where value >= 100 (warning) — every region must
stay at or above 100 active users; alerts on any that drops below.
Pattern 3: API Endpoint Performance
Monitor p95 latency per endpoint:all_cells where value <= 2000 (warning) — every endpoint’s p95
must stay at or below 2000 ms; alerts on any that’s slower. For a stricter
critical tier, add a second check with all_cells where value <= 5000.
Pattern 4: Inventory Tracking
Alert on low stock across products:all_cells where value >= 10 (warning) — every product must keep
at least 10 in stock; alerts on any that runs low.
Visualization
Grid checks display results in two views:- Current Snapshot: A table showing the latest value for each dimension
- Historical Grid: A heatmap showing how values changed over time
- X-axis: Time (from check execution history)
- Y-axis: Dimensions (from
namecolumn) - Cell colors: Green (pass), Yellow (warning), Red (critical)
- Sort (the ↕ icon): order dimensions by name (A–Z) or by Recently updated, which floats the dimensions whose value changed most recently to the top. The choice is remembered per browser.
- Which dimensions fail most often?
- Are there specific times when issues occur?
- Are problems isolated or system-wide?
Limitations
- Maximum 100 rows returned per check (for performance)
- Query timeout: 30 seconds
- Column names
nameandvalueare required (or specify customdimension_column)
Troubleshooting
”Query returned multiple columns”
Your query returns more thanname and value. Grid checks only support two columns. Remove extra columns or create a single-value check instead.
”Missing dimensions” alert on first run
dimension_missing and dimension_added conditions require at least one previous successful run to compare against. On the first run, these conditions will not trigger any alerts since there’s no historical data yet.
After the first run, each subsequent run will compare dimensions against the previous run to detect changes.
Check runs but no grid appears
Verify your query returns columns named exactlyname and value. Column names are case-sensitive in some databases.
Examples
Example 1: E-commerce Store Monitoring
Monitor order volume across all stores, alert if any store drops to zero:all_cells where value > 0 (critical: “Store has no
orders!”) — every store must have orders; alerts on any that drops to zero. Add a
second check with dimension_missing to catch a store that stops reporting.
Example 2: Multi-Region API Health
Track API success rate by region:all_cells where value >= 95 (critical: “API success rate in dropped to %”) — every region must stay at or above 95%; alerts on any that drops below.
Example 3: Worker Queue Monitoring
Monitor queue lengths across different job types:all_cells where value <= 1000 (warning: “Queue backlog for ”) — every queue must stay at or below 1000 pending jobs; alerts on any that backs up. Add a second check with dimension_added to flag a new job type.
Next Steps
- Create your first grid check from the Checks page
- Test your query using “Test Query” before saving
- Start with
all_cells(every dimension must be healthy) — it fits most use cases; reserveany_cellfor “at least one must be healthy” pools - Use the historical grid to identify patterns and refine your thresholds