Skip to content

Телеметрия ​

Что отправляет установка, зависит от того, есть ли у неё лицензионный ключ:

УстановкаПо умолчаниюKVALLI_TELEMETRY=falseKVALLI_TELEMETRY=true
С ключом (Pro, Enterprise)ничегоничегополный отчёт раз в час
Без ключа (бесплатный Starter)анонимный пинг раз в деньничегополный отчёт раз в час

Установка с ключом ничего не отправляет, пока оператор сам не включит телеметрию: платный продукт продаётся с обещанием, что данные клиента остаются внутри его периметра.

Анонимный пинг ​

Установка без ключа отправляет один пинг при запуске и затем раз в день — так мы считаем, сколько всего установок бесплатного тарифа. В пинге ровно это:

json
{ "kind": "ping", "schema": 1, "installId": "3f7c0d1e-…", "sentAt": "2026-10-14T09:00:00.000Z",
  "version": "2.1.0", "edition": "starter", "plan": "starter", "activeUsers": 4 }

Идентификатор установки случайный, создаётся при первом запуске и ничего не говорит о том, кто её запускает. Ни имён, ни адресов, ни содержимого кейсов, ни конфигурации, ни счётчиков кроме числа активных аккаунтов. При запуске лог сообщает, что пинг включён. KVALLI_TELEMETRY=false (или install.sh --telemetry off) выключает его, а Настройки → Администрирование → Телеметрия показывает пинг целиком.

Включить отчёт ​

bash
KVALLI_TELEMETRY=true

или --telemetry on для установки через install.sh (при install или upgrade).

Отчёт уходит при запуске и потом раз в час — так установка, которая замолчала или начала сбоить, видна в тот же день. Чтобы отправлять отчёт в свой коллектор, а не к нам:

bash
KVALLI_TELEMETRY_ENDPOINT=https://collector.internal.acme.corp/kvalli

Пока KVALLI_TELEMETRY не задана, у установки с ключом нет ни таймера, ни файла идентификатора, ни запросов. Выключать нечего — ничего не запускается.

Посмотреть, что именно отправляется ​

В интерфейсе: Настройки → Администрирование → Телеметрия → Показать отчёт (на Enterprise то же есть на странице «Система»). Или через API:

bash
curl -H "Authorization: Bearer $TOKEN" https://kvalli.internal/api/admin/telemetry

Ответ — полный отчёт в том виде, в каком он был бы отправлен, а не его описание. Он доступен администратору установки на любом тарифе и работает независимо от того, включена ли телеметрия, — решение можно принять, прочитав сами байты.

POST /api/admin/telemetry/send отправляет один отчёт сразу, чтобы проверить, что коллектор доступен. При выключенной телеметрии отказывает.

Что в отчёте ​

ГруппаЧто в ней
installIdСлучайный UUID, не связанный ни с именем хоста, ни с лицензией. Записывается на диск, только когда телеметрия включена
buildВерсия и коммит работающего образа
licenseНепрозрачный id ключа, выданного нами, тариф, состояние, модули сверх тарифа (features) и модули, которые реально включены (modules)
runtimeВерсия Node, платформа, режим аутентификации, демо-режим, время работы в часах
scaleЧисло проектов, активных пользователей, тест-кейсов и прогонов
integrationsНастроены ли трекер, Confluence и репозиторий; какой вид репозитория и провайдера модели. tms — настроен ли токен Allure TestOps для импорта
agentsОбщие счётчики: запуски, успешные, предложенные кейсы и принятые без правок, разборы падений и подтверждения
healthЗдоровье за последние 24 часа: запросы, ошибки сервера по областям (testcases, runs, agents… — из фиксированного списка, никогда не путь), отклонённые запросы; задания агентов по типам и причинам неудач; каждое подключение (jira, youtrack, confluence, repo, llm) как working, failing или untested — никогда не адрес и не текст ошибки; вызовы модели и токены; отвечает ли база и сколько миграций не применено; заполненность диска данных в процентах

Отчёт целиком — около двух килобайт. Пример:

json
{
  "schema": 3,
  "installId": "3f7c…",
  "sentAt": "2026-09-18T10:00:00.000Z",
  "build": { "version": "v2.0.0", "commit": "0123456789ab" },
  "license": { "id": "lic-49b22dcb", "plan": "pro", "state": "licensed",
               "features": ["sso"],
               "modules": ["agents", "analytics", "ci", "repository", "runs", "sso"] },
  "runtime": { "node": "22.5.0", "platform": "linux", "authMode": "enforced",
               "demoMode": false, "uptimeHours": 72.4 },
  "scale": { "projects": 3, "activeUsers": 24, "testCases": 1840, "testRuns": 260 },
  "integrations": { "tms": true, "issueTracker": true, "confluence": false,
                    "repository": true, "repoProvider": "gitlab", "llmProvider": "ollama" },
  "agents": { "runsTotal": 412, "runsSucceeded": 395, "casesProposed": 1204,
              "casesAcceptedUnchanged": 806, "triageRuns": 88, "triageConfirmedByUser": 71 },
  "health": {
    "requests24h": 5210, "serverErrors24h": 2,
    "serverErrorsByArea": { "agents": 2, "testcases": 0, "runs": 0, "…": 0 },
    "clientErrors24h": 41, "unhandledRejections24h": 0, "countedHours": 24,
    "jobs24h": { "agent1_generate": { "completed": 18, "failed": 1,
                 "byReason": { "no_model": 1, "model_output": 0, "…": 0 } }, "…": {} },
    "integrations": { "jira": { "state": "working", "hoursSinceTest": 5 },
                      "repo": { "state": "failing", "hoursSinceTest": 1 },
                      "confluence": { "state": "untested", "hoursSinceTest": null }, "…": {} },
    "model24h": { "calls": 96, "tokens": 412000 },
    "database": { "reachable": true, "migrationsBehind": 0 },
    "diskUsedPct": 63
  }
}

Чего в отчёте нет никогда ​

Ни содержимого тест-кейсов, ни текста требований, ни кода, ни логов. Ни имён пользователей, ни email. Ни имён хостов, URL, названий репозиториев и проектов, ни учётных данных. Владелец лицензии в теле отчёта тоже не назван — лицензия обозначена непрозрачным id.

Так устроено с самого начала, а не вычищено фильтром: каждое поле отчёта записано явно, и каждое значение — число, булево значение или значение из фиксированного набора. Из конфигурации ничего не копируется, поэтому URL или токен, добавленные в настройки позже, в отчёт попасть не могут. Название провайдера вне известного набора отправляется как other.

Сам запрос несёт ещё одно: лицензионный ключ в заголовке X-Kvalli-License-Key. Это ключ, который выдали мы, и в нём только то, что мы туда положили, включая имя владельца лицензии, которое нам и так известно. Он доказывает, что отчёт пришёл от установки с этой лицензией: id не секретен, и любой, кто его знает, мог бы слать отчёты от её имени. Ключ не часть отчёта, поэтому в предпросмотре его нет, и отправляется он, только когда телеметрия включена.

Диагностический пакет (Enterprise) ​

Установка Enterprise с выключенной телеметрией всё равно может получить помощь: Настройки → Система → Скачать диагностический пакет создаёт файл, который отправляется в поддержку вручную. В нём отчёт выше, последние 50 ошибок сервера (время, метод, область, статус и id запроса — остальное есть в логе установки под этим id), недавние задания агентов по типам и исходам, состояние базы, диска и процесса. Никаких путей, текстов ошибок и содержимого; страница «Система» показывает файл до сохранения.

Телеметрия и поддержка ​

Поддерживаемая установка делает одно из двух: держит телеметрию включённой и направленной к нам или (на Enterprise) присылает диагностический пакет по запросу поддержки — чтобы неисправность можно было увидеть, а не пересказывать. Для работы Kvalli не нужно ни то ни другое: без них ничего не перестаёт работать, а обязательство относится к договору поддержки, а не к программе.

Сбои ​

Телеметрия не может ничего сломать. У отправки таймаут 10 секунд, ошибки пишутся в лог только на уровне debug, а недоступный, медленный или отсутствующий коллектор никак не влияет на работу Kvalli. Отчёты не копятся и не отправляются повторно: пропущенный час — это пропущенный час.

Документация описывает последний выпуск Kvalli.