This is documentation for the next version of Grafana documentation. For the latest stable release, go to the latest version.
MySQL annotations
Annotations overlay event data on your dashboard graphs, helping you correlate events with metrics. You can use MySQL as a data source for annotations to display events such as deployments, alerts, or other significant occurrences on your visualizations.
For general information about annotations, refer to Annotate visualizations.
Before you begin
Before creating MySQL annotations, ensure you have:
- A MySQL data source configured in Grafana.
- Tables containing event data with timestamp fields.
- Read access to the tables containing your events.
Create an annotation query
To add a MySQL annotation to your dashboard:
- Navigate to the dashboard you want to update and click Edit.
- Click the Add new element icon (blue plus sign).
- Click Annotation query.
- Enter a name for the annotation query.
- If you don’t want to use the annotation query right away, clear the Enabled checkbox.
- Select a color for the annotation event markers.
- Select an option in the Show annotation controls in drop-down list to control where on the dashboard the annotation is displayed.
- Select an option in the Show in drop-down list to control the panels in which the annotation is displayed.
- Click Open query editor to open the Annotation Query dialog box.
- Select your MySQL data source from the Data source drop-down list.
- Configure the annotation query and field mappings.
- (Optional) Click Test annotation query to ensure that the query is working properly.
- Click Close when you’ve completed the query setup.
- Click Save.
- (Optional) Enter a description of the changes you’ve made.
- Click Save.
- Click Exit edit.
Query columns
Your annotation query must return a time column and can optionally include timeend, text, and tags columns.
Example queries
The following examples show common annotation query patterns.
Basic annotation with epoch time
Display events using UNIX epoch timestamps:
SELECT
epoch_time as time,
description as text,
CONCAT(tag1, ',', tag2) as tags
FROM events
WHERE $__unixEpochFilter(epoch_time)Annotation with a single tag
Display events with a single tag value:
SELECT
epoch_time as time,
message as text,
category as tags
FROM event_log
WHERE $__unixEpochFilter(epoch_time)Range annotation with start and end time
Display events with duration as shaded regions:
SELECT
start_time as time,
end_time as timeend,
description as text,
CONCAT(type, ',', severity) as tags
FROM incidents
WHERE $__unixEpochFilter(start_time)Annotation with native SQL datetime
Display events using native MySQL datetime columns:
SELECT
event_date as time,
message as text,
CONCAT(category, ',', priority) as tags
FROM system_events
WHERE $__timeFilter(event_date)Deployment annotations
Display deployment events:
SELECT
deployed_at as time,
CONCAT('Deployed ', version, ' to ', environment) as text,
environment as tags
FROM deployments
WHERE $__timeFilter(deployed_at)Maintenance window annotations
Display maintenance windows as range annotations:
SELECT
start_time as time,
end_time as timeend,
CONCAT('Maintenance: ', description) as text,
'maintenance' as tags
FROM maintenance_windows
WHERE $__timeFilter(start_time)Macros
Use these macros in your annotation queries to filter by the dashboard time range:
Best practices
Follow these best practices when creating MySQL annotations:
- Use time filters: Always include
$__timeFilter()or$__unixEpochFilter()to limit results to the dashboard time range. - Keep queries efficient: Add indexes on time columns and filter columns to improve query performance.
- Use meaningful text: Include descriptive information in the
textcolumn to make annotations useful. - Organize with tags: Use consistent tag values to categorize annotations and enable filtering.
- Test queries first: Verify your query returns expected results in Explore before adding it as an annotation.


