docs/sources/as-code/observability-as-code/git-sync/git-sync-setup/set-up-extend.md
After setup, you can optionally extend Git Sync by enabling pull request notifications and image previews of dashboard changes.
| Capability | Benefit | Requires |
|---|---|---|
| A table summarizing changes to your pull request | A convenient way to save changes back to GitHub | Webhooks configured |
| A dashboard preview image to a PR | A snapshot of dashboard changes to a pull request outside Grafana | Image renderer and webhooks configured |
Real-time notifications (or automatic pulling) is enabled and configured by default in Grafana Cloud.
In Grafana OSS/Enterprise, Git Sync uses webhooks to enable real-time updates from GitHub public repositories, or to enable pull request integrations. Without webhooks the polling interval is set during configuration, and is 60 seconds by default. You can set up webhooks with whichever service or tooling you prefer: Cloudflare Tunnels with a Cloudflare-managed domain, port-forwarding and DNS options, or a tool such as ngrok.
To set up webhooks:
ngrok, or any other method you prefer.[server]
root_url = https://<PUBLIC_DOMAIN>
<PUBLIC_DOMAIN> with your public domain.To check the configured webhooks, go to Administration > General > Provisioning and click the View link for your GitHub repository.
Git Sync registers its own webhooks for each repository connection, so when several Grafana instances sync the same repository, each connection adds to this total. Since Git providers limit the amount of webhooks you can set for each repository, when the limit is exceeded, your Git provider rejects new webhooks.
For example, in GitHub you can get an error such as:
GitHub API error (HTTP 422: Validation Failed: The "pull_request" event cannot have more than 20 hooks; The "push" event cannot have more than 20 hooks)
If you hit this limit, you can either:
The following limits apply:
push and pull_request. For more information refer to the official GitHub webhooks documentation.If you need to point [server] root_url to an internal address (for example, when Grafana runs behind a private ingress in a Kubernetes cluster), set the publicly-reachable URL with [provisioning] public_root_url instead. This URL is used both to register webhook callbacks with the Git provider and as the base for screenshot images embedded in pull-request comments, which the Git provider's servers fetch from the public internet.
[server]
root_url = http://internal.cluster.local
[provisioning]
public_root_url = https://<PUBLIC_DOMAIN>
The per-repository spec.webhook.baseUrl field still overrides public_root_url for webhook registration, and screenshot URLs always use public_root_url (or root_url when unset).
If your security setup doesn't permit publicly exposing the Grafana instance, you can either choose to allowlist the Git provider's IP addresses, or expose only the necessary paths.
For information about the traffic between Grafana and your Git server, refer to Network connectivity and IP allowlisting.
In RegExp, the necessary paths required to be exposed are /apis/provisioning\.grafana\.app/v0(alpha1)?/namespaces/[^/]+/repositories/[^/]+/(webhook|render/.*)$.
{{< admonition type="caution" >}}
Available in Grafana OSS and Grafana Enterprise only.
{{< /admonition >}}
To set up image rendering to add visual previews of dashboard updates directly in pull requests, install the Grafana Image Renderer in your Grafana instance. For more information and installation instructions, refer to the Image Renderer service.
Image rendering requires webhooks.
To learn more about using Git Sync refer to the following documents: