> AI agents: this is one page from PostHog's docs. Full index of Markdown docs for LLMs: https://posthog.com/llms.txt # Linking Grafana as a source Canonical URL: https://posthog.com/docs/data-pipelines/sources/grafana > **Cloud region:** This page uses US Cloud hosts. For an EU Cloud project, use `https://eu.posthog.com` instead of `https://us.posthog.com` or `https://app.posthog.com` (app host for links). ## On this page - [Prerequisites](#prerequisites) - [Adding a data source](#adding-a-data-source) - [Sync modes](#sync-modes) - [Configuration](#configuration) - [Supported tables](#supported-tables) - [Troubleshooting](#troubleshooting) ![](https://res.cloudinary.com/dmukukwp6/image/upload/texture_tan_9608fcca70) ![](https://res.cloudinary.com/dmukukwp6/image/upload/texture_tan_dark_a92b0e022d) Let AI connect your sources for you Skip the manual setup — run this in your project and the wizard auto-detects your databases and APIs and connects them to PostHog. `npx @posthog/wizard warehouse` ![PostHog Wizard hedgehog](https://res.cloudinary.com/dmukukwp6/image/upload/wizard_3f8bb7a240.png) ![](https://res.cloudinary.com/dmukukwp6/image/upload/wizard_3f8bb7a240.png)Let AI connect your sources for you 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 1. In PostHog, go to the [Sources tab](https://app.posthog.com/data-management/sources) of the data pipeline section. 2. Click **\+ New source** and click **Link** next to this source. 3. Enter your credentials (see [Configuration](#configuration) below) and click **Next**. 4. 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`, and `alert.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. - **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_at` timestamp). 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](https://posthog.com/docs/data-pipelines/sources.md#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 | — | — | | `dashboard_versions` | Saved versions of every dashboard. Needs permission to edit dashboards | Full refresh | — | — | | `folders` | Dashboard folders in the organization. | Full refresh | — | — | | `teams` | Teams in the organization. | Full refresh | — | — | | `team_members` | Membership of users in teams (one row per user per team). | Full refresh | — | — | | `library_elements` | Library panels: reusable panels that dashboards reference instead of defining inline. | Full refresh | — | — | | `dashboard_permissions` | Users, teams, and basic roles granted access, one row per grant. `subject` identifies who holds it | Full refresh | — | — | | `folder_permissions` | Users, teams, and basic roles granted access, one row per grant. `subject` identifies who holds it | Full refresh | — | — | | `roles` | Access control roles and their permissions. Only available on Grafana Enterprise and Grafana Cloud | Full refresh | — | — | | `users` | Users with membership in the organization. | Full refresh | — | — | | `orgs` | Every organization on the instance. Needs a Grafana server admin username and password | 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"** – 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](https://posthog.com/docs/data-warehouse/troubleshooting.md). If that doesn't help, [contact support](https://us.posthog.com/#panel=support%3Asupport%3Adata_warehouse%3A%3Atrue) – we're happy to help.