HTTP API истории ресурсов
Note
Доступно в Grafana 12 и более поздних версиях.
Этот API соответствует новой структуре API Grafana. Дополнительные сведения см. в документации о структуре API в Grafana.
Новые API Grafana отслеживают историю версий ресурсов. Вы можете получить историю любого ресурса, используя стандартную конечную точку List с определёнными параметрами запроса. На этой странице описано, как получить список истории ресурса, на примере дашбордов. Тот же подход применим к любому ресурсу.
История ресурсов доступна во всех стабильных (GA) версиях API (например, v1, v2). Версии alpha или beta могут её не поддерживать.
Получение списка истории ресурса
GET /apis/<group>/<version>/namespaces/<namespace>/<resource>?labelSelector=grafana.app/get-history=true&fieldSelector=metadata.name=<NAME>
Возвращает историю версий конкретного ресурса. Для этого используется стандартная конечная точка List с двумя обязательными параметрами запроса:
labelSelector: должно быть установлено вgrafana.app/get-history=true, чтобы запросить историю вместо обычного списка.fieldSelector: должно быть установлено вmetadata.name=<NAME>, чтобы идентифицировать конкретный ресурс.<NAME>— это полеmetadata.nameресурса (UID Grafana).
Управлять постраничной выдачей можно с помощью дополнительных параметров запроса:
limit(необязательно): максимальное количество записей истории, возвращаемых на странице.continue(необязательно): токен из предыдущего ответа для получения следующей страницы.
Записи истории возвращаются в обратном хронологическом порядке (сначала самые новые).
Пример с дашбордом
Следующий запрос получает историю версий дашборда с metadata.name, равным production-overview, в пространстве имён default:
Пример запроса:
GET /apis/dashboard.grafana.app/v1/namespaces/default/dashboards?labelSelector=grafana.app/get-history=true&fieldSelector=metadata.name=production-overview HTTP/1.1
Accept: application/json
Content-Type: application/json
Authorization: Bearer <SERVICE_ACCOUNT_TOKEN>
Пример ответа:
HTTP/1.1 200 OK
Content-Type: application/json
{
"kind": "DashboardList",
"apiVersion": "dashboard.grafana.app/v1",
"metadata": {
"resourceVersion": "1758777451428472",
"continue": "eyJvIjoxNTIsInYiOjE3NjE3MDQyMjQyMDcxODksInMiOmZhbHNlfQ=="
},
"items": [
{
"kind": "Dashboard",
"apiVersion": "dashboard.grafana.app/v1",
"metadata": {
"name": "production-overview",
"namespace": "default",
"uid": "a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8",
"resourceVersion": "1758777451428472",
"generation": 3,
"creationTimestamp": "2026-03-15T14:22:10Z",
"annotations": {
"grafana.app/updatedBy": "user:u000000001",
"grafana.app/message": "Added latency panel"
}
},
"spec": {
"title": "Production Overview",
"schemaVersion": 41,
...
}
},
{
"kind": "Dashboard",
"apiVersion": "dashboard.grafana.app/v1",
"metadata": {
"name": "production-overview",
"namespace": "default",
"uid": "a1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8",
"resourceVersion": "1758777451428100",
"generation": 2,
"creationTimestamp": "2026-03-10T09:15:30Z",
"annotations": {
"grafana.app/updatedBy": "user:u000000001",
"grafana.app/message": "Updated thresholds"
}
},
"spec": {
"title": "Production Overview",
"schemaVersion": 41,
...
}
}
]
}
Каждый элемент массива items представляет историческую версию ресурса. Для истории особенно важны следующие поля метаданных:
metadata.generation: номер версии. Он увеличивается каждый раз при изменении spec ресурса.metadata.resourceVersion: уникальный идентификатор этой конкретной версии. Используйте его для постраничной выдачи и обнаружения изменений.metadata.creationTimestamp: когда именно эта версия была сохранена.metadata.annotations.grafana.app/updatedBy: пользователь, сохранивший эту версию, в формате<user-type>:<uid>.metadata.annotations.grafana.app/message: необязательное сообщение коммита, заданное при обновлении. Эту аннотацию можно задать при обновлении ресурса.spec: полный spec ресурса в том виде, в каком он существовал на этой версии.
Постраничная выдача
Вы можете разбивать историю на страницы с помощью limit и continue так же, как разбиваете на страницы стандартный запрос List.
Пример запроса с постраничной выдачей:
GET /apis/dashboard.grafana.app/v1/namespaces/default/dashboards?labelSelector=grafana.app/get-history=true&fieldSelector=metadata.name=production-overview&limit=2 HTTP/1.1
Accept: application/json
Content-Type: application/json
Authorization: Bearer <SERVICE_ACCOUNT_TOKEN>
Если ответ содержит поле metadata.continue, передайте его как параметр запроса continue в следующем запросе, чтобы получить следующую страницу. Когда ответ не содержит поля continue, вы достигли последней страницы.
Пример запроса следующей страницы:
GET /apis/dashboard.grafana.app/v1/namespaces/default/dashboards?labelSelector=grafana.app/get-history=true&fieldSelector=metadata.name=production-overview&limit=2&continue=eyJvIjoxNTIsInYiOjE3NjE3MDQyMjQyMDcxODksInMiOmZhbHNlfQ== HTTP/1.1
Accept: application/json
Content-Type: application/json
Authorization: Bearer <SERVICE_ACCOUNT_TOKEN>
Получение конкретной версии
Чтобы получить полный ресурс на конкретной исторической версии, используйте стандартную конечную точку Get с параметром запроса resourceVersion, установленным в metadata.resourceVersion из списка истории.
Пример запроса:
GET /apis/dashboard.grafana.app/v1/namespaces/default/dashboards/production-overview?resourceVersion=1758777451428100 HTTP/1.1
Accept: application/json
Content-Type: application/json
Authorization: Bearer <SERVICE_ACCOUNT_TOKEN>
Это возвращает полный ресурс в том виде, в каком он существовал на этой версии.
Коды состояния
- 200: OK
- 400: Некорректный запрос (отсутствует
fieldSelector, недопустимыйlabelSelectorи т. д.) - 401: Не авторизован
- 403: Доступ запрещён