docs/sources/datasources/mssql/alerting/index.md
You can use Grafana Alerting with Microsoft SQL Server to create alerts based on your SQL Server data. This allows you to monitor metrics, detect anomalies, and receive notifications when specific conditions are met.
For general information about Grafana Alerting, refer to Grafana Alerting.
Before creating alerts with Microsoft SQL Server, ensure you have:
Microsoft SQL Server alerting works with time series queries that return numeric data over time. Table-formatted queries are not supported in alert rule conditions.
To create a valid alert query:
time column that returns an SQL datetime/datetime2 or a Unix epoch timestampFor more information on writing time series queries, refer to Microsoft SQL Server query editor.
| Query format | Alerting support | Notes |
|---|---|---|
| Time series | Yes | Required for alerting |
| Table | No | Convert to time series format for alerts |
To create an alert rule using Microsoft SQL Server:
$__timeGroup() or $__timeGroupAlias() macro.$__timeFilter() to filter data by the evaluation time range.For detailed instructions, refer to Create a Grafana-managed alert rule.
The following examples show common alerting scenarios with Microsoft SQL Server.
Monitor the number of errors over time:
SELECT
$__timeGroupAlias(created_at, '1m'),
COUNT(*) AS error_count
FROM error_logs
WHERE $__timeFilter(created_at)
AND level = 'error'
GROUP BY $__timeGroup(created_at, '1m')
ORDER BY 1
Condition: When error_count is above 100.
Monitor API response times:
SELECT
$__timeGroupAlias(request_time, '5m'),
AVG(response_time_ms) AS avg_response_time
FROM api_requests
WHERE $__timeFilter(request_time)
GROUP BY $__timeGroup(request_time, '5m')
ORDER BY 1
Condition: When avg_response_time is above 500 (milliseconds).
Detect drops in order activity:
SELECT
$__timeGroupAlias(order_date, '1h'),
COUNT(*) AS order_count
FROM orders
WHERE $__timeFilter(order_date)
GROUP BY $__timeGroup(order_date, '1h')
ORDER BY 1
Condition: When order_count is below 10.
Monitor server resource metrics:
SELECT
$__timeGroupAlias(recorded_at, '5m'),
AVG(cpu_percent) AS avg_cpu
FROM sys_metrics
WHERE $__timeFilter(recorded_at)
GROUP BY $__timeGroup(recorded_at, '5m')
ORDER BY 1
Condition: When avg_cpu is above 85.
When using Microsoft SQL Server with Grafana Alerting, be aware of the following limitations.
Alert queries cannot contain template variables. Grafana evaluates alert rules on the backend without dashboard context, so variables like $hostname or $environment aren't resolved.
If your dashboard query uses template variables, create a separate query for alerting with hard-coded values.
Queries using the Table format cannot be used for alerting. Set the query format to Time series and ensure your query returns a time column.
Complex queries with large datasets may time out during alert evaluation. Optimize queries for alerting by:
WHERE clauses to limit dataIf your data source uses Azure Entra ID Current User authentication, alerting, reporting, and recorded queries are not supported. These features require backend-level credentials that don't rely on a specific user's session.
Follow these best practices when creating Microsoft SQL Server alerts:
$__timeFilter() macro to limit data to the evaluation window.$__timeGroupAlias() and $__timeGroup() over manual time-bucketing expressions.WHERE clauses and GROUP BY.