Linking Grafana as a source
This source is currently in alpha. The interface and available tables may change.
The Grafana connector syncs your Grafana instance's metadata – dashboards, folders, teams, users, data sources, service accounts, alert rules, and annotations – into the PostHog Data warehouse, so you can query your observability setup alongside the rest of your data.
Prerequisites
- A Grafana Cloud stack or a self-hosted Grafana instance reachable from the public internet.
- Permission to create a service account and token in Grafana (or, for self-hosted OSS, a user account you can authenticate with).
Adding a data source
- In PostHog, go to the Sources tab of the data pipeline section.
- Click + New source and click Link next to this source.
- Enter your credentials (see Configuration below) and click Next.
- Select the tables you want to sync, choose a sync method and frequency, then click Import.
Once the syncs are complete, you can start querying this data in PostHog.
When linking Grafana, you'll need:
- Instance URL – your Grafana instance's public URL, for example
https://yourstack.grafana.net. - Authentication method – choose one of the following:
- Service account token (recommended) – in Grafana, go to Administration > Users and access > Service accounts, create a service account, and add a token (it starts with
glsa_). The Viewer role covers dashboards, folders, and annotations. To sync the remaining tables, grant these extra read permissions:users:read,teams:read,datasources:read,serviceaccounts:read, andalert.provisioning:read. - Username & password (self-hosted only) – the username and password of a Grafana user with read access to the data you want to sync. Grafana Cloud doesn't support basic auth on its HTTP API, so use a service account token there.
- Service account token (recommended) – in Grafana, go to Administration > Users and access > Service accounts, create a service account, and add a token (it starts with
- Organization ID (optional) – if your instance serves multiple organizations, set this to choose which organization to sync.
Sync modes
Each table can be synced in one of several modes, depending on what the source supports:
- Webhook (when available) – the source pushes changes to PostHog in real time. Fastest freshness, lowest ongoing cost, and the only mode that reliably captures updates and deletes.
- Incremental – only new or updated rows are synced on each run, using a cursor field (such as an
updated_attimestamp). Cheaper than a full refresh, but deletes aren't captured. - Append only – new rows are appended using a cursor field; existing rows are never updated. Ideal for immutable, append-only tables like event logs.
- Full refresh – the whole table is reloaded on every sync. Use it when a table has no reliable cursor or when you need deletions reflected.
See sync methods for a full explanation of how each mode works and how to choose between them.
Only the annotations table supports incremental sync (on the time field). All other tables are configuration and metadata endpoints without a server-side change cursor, so they sync as full refreshes.
Configuration
| Option | Type | Required |
|---|---|---|
Instance URL | text | Yes |
Authentication method | select | Yes |
Organization ID (optional, multi-org instances only) | text | No |
Supported tables
| Table | Description | Sync method | Incremental field | Primary key |
|---|---|---|---|---|
dashboards | Dashboard metadata from the search API; does not include panel definitions | Full refresh | — | — |
folders | Dashboard folders in the organization. | Full refresh | — | — |
teams | Teams in the organization. | Full refresh | — | — |
users | Users with membership in the organization. | Full refresh | — | — |
datasources | Data source connections configured in the organization. Secure fields (passwords, secrets) are never returned by the Grafana API. | Full refresh | — | — |
service_accounts | Service accounts in the organization (machine identities used for API access). | Full refresh | — | — |
alert_rules | Grafana-managed alert rules, as exposed by the alert provisioning API. | Full refresh | — | — |
annotations | User- and API-created annotations. Alert state history entries are not included (they have no stable identifier in the Grafana API) | Incremental, Full refresh | time | — |
Troubleshooting
- "Your Grafana credentials are missing the
<permission>permission" – grant the named read permission to your service account in Grafana, then retry. You can also deselect the affected table if you don't need it. - Alert state history is missing from the annotations table – this is expected. The Grafana API returns alert state history entries without a stable identifier, so only user- and API-created annotations are synced.
- Authentication errors – your credentials may be invalid or expired. Create a new service account token and reconnect.
- Host rejected – use your instance's public URL. Internal or private addresses aren't allowed.
If your sync is failing or data looks wrong, see the Data warehouse troubleshooting guide. If that doesn't help, contact support – we're happy to help.