Платформа
Наблюдаемость
Логи, метрики и трейсы собираются рантаймом автоматически и связываются между
собой по trace_id. Отдельный агент ставить не нужно — телеметрия
идёт из sidecar-процесса, который живёт рядом с инстансом.
Логи
Всё, что сервис пишет в stdout и stderr, попадает в конвейер. Если строка — валидный JSON, её поля становятся индексируемыми атрибутами.
vlone logs --since 30m \
--filter 'status >= 500 and region == "msk1"' \
--fields ts,status,path,latency_ms,trace_id{
"ts": "2026-09-18T14:22:07.441Z",
"status": 502,
"path": "/api/v1/orders",
"latency_ms": 3021,
"trace_id": "9f1c4b2ae8d34c1f",
"region": "msk1",
"revision": "r184"
}Метрики
Базовый набор собирается всегда. Свои метрики отдаются в формате Prometheus
по пути /metrics — платформа снимает их раз в 15 секунд.
| Метрика | Тип | Описание |
|---|---|---|
vlone_requests_total | counter | Запросы по статусу, маршруту и региону |
vlone_request_duration_seconds | histogram | Латентность, бакеты до 10 с |
vlone_instance_cpu_ratio | gauge | Доля использования выделенного CPU |
vlone_instance_memory_bytes | gauge | RSS процесса |
vlone_queue_depth | gauge | Запросы, ожидающие обработки |
vlone_cold_starts_total | counter | Холодные старты инстансов |
Трейсы
Рантайм совместим с OpenTelemetry. Если приложение уже создаёт спаны, они подхватываются; если нет, платформа строит корневой спан на каждый HTTP-запрос.
import { trace } from '@opentelemetry/api';
const tracer = trace.getTracer('orders');
export async function createOrder(payload) {
return tracer.startActiveSpan('order.create', async (span) => {
span.setAttribute('order.items', payload.items.length);
try {
const order = await db.orders.insert(payload);
span.setAttribute('order.id', order.id);
return order;
} catch (error) {
span.recordException(error);
throw error;
} finally {
span.end();
}
});
}Алерты
Правила описываются в репозитории и применяются вместе с деплоем.
[[alert]]
name = "Рост 5xx"
expr = "rate(vlone_requests_total{status=~'5..'}[5m]) > 0.01"
for = "5m"
severity = "critical"
channels = ["telegram:ops", "email:oncall@example.com"]
[[alert]]
name = "Очередь растёт"
expr = "avg_over_time(vlone_queue_depth[10m]) > 50"
for = "10m"
severity = "warning"
channels = ["telegram:ops"]Алерт срабатывает, когда условие держится всё время for. Короткие всплески не будят дежурного, но остаются видимыми в графиках.
Хранение
| Данные | Free | Team | Scale |
|---|---|---|---|
| Логи | 24 часа | 14 дней | 90 дней |
| Метрики (сырые) | 7 дней | 30 дней | 90 дней |
| Метрики (5 мин) | 30 дней | 13 месяцев | 13 месяцев |
| Трейсы | — | 7 дней | 30 дней |