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:

Пример запроса:

http
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
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.

Пример запроса с постраничной выдачей:

http
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, вы достигли последней страницы.

Пример запроса следующей страницы:

http
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 из списка истории.

Пример запроса:

http
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: Доступ запрещён