Формат длинный: одна строка = одно измерение. Так его одинаково удобно
читать и pandas, и обычным grep, и он не ломается, когда добавляется новый
оператор, цель или сервис.
data/daily/<YYYY-MM-DD>.csv, data/latest.csv| поле | тип | что означает |
|---|---|---|
date |
YYYY-MM-DD |
дата сборки снапшота (UTC) |
generated_at |
ISO 8601 | точное время сборки снапшота |
window_hours |
целое | окно агрегации: за сколько часов взяты замеры |
region |
eu / sib / ea |
европейская часть, Сибирь, Дальний Восток |
kind |
vpn / direct |
через туннель или напрямую, без него |
service |
строка | название сервиса; для direct — базовая линия |
service_slug |
строка | идентификатор для связи со страницей обзора |
protocol |
строка | семейство протокола: xray, wireguard, openvpn, … |
provider |
строка | оператор связи, через которого шёл замер |
provider_type |
mobile / wired |
мобильный интернет или проводной |
target |
строка | что проверяли: youtube_home, telegram_org, … |
status |
строка | результат проверки, см. ниже |
statusok — цель открылась.data/summary-latest.jsonСводка по последнему снапшоту: доля ok для каждой пары «регион × оператор»
по VPN-строкам. Читается глазами, не открывая CSV.
{
"generated_at": "...",
"window_hours": 24,
"measurements": 780,
"by_region_provider": [
{ "region": "eu", "provider": "Beeline", "ok": 65, "total": 65, "ok_share": 1.0 }
]
}
direct — не мусор, а точка отсчётаkind = direct означает проверку без туннеля, напрямую через оператора.
Без неё цифры VPN не с чем сравнивать: если цель недоступна и напрямую, и через
туннель, это может быть проблемой самой цели, а не блокировки.