Тема
Телеметрия
Что отправляет установка, зависит от того, есть ли у неё лицензионный ключ:
| Установка | По умолчанию | KVALLI_TELEMETRY=false | KVALLI_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. Отчёты не копятся и не отправляются повторно: пропущенный час — это пропущенный час.