Платформа

Наблюдаемость

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

Логи

Всё, что сервис пишет в stdout и stderr, попадает в конвейер. Если строка — валидный JSON, её поля становятся индексируемыми атрибутами.

vlone logs --since 30m \
  --filter 'status >= 500 and region == "msk1"' \
  --fields ts,status,path,latency_ms,trace_id

Метрики

Базовый набор собирается всегда. Свои метрики отдаются в формате Prometheus по пути /metrics — платформа снимает их раз в 15 секунд.

МетрикаТипОписание
vlone_requests_totalcounterЗапросы по статусу, маршруту и региону
vlone_request_duration_secondshistogramЛатентность, бакеты до 10 с
vlone_instance_cpu_ratiogaugeДоля использования выделенного CPU
vlone_instance_memory_bytesgaugeRSS процесса
vlone_queue_depthgaugeЗапросы, ожидающие обработки
vlone_cold_starts_totalcounterХолодные старты инстансов

Трейсы

Рантайм совместим с 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. Короткие всплески не будят дежурного, но остаются видимыми в графиках.

Хранение

ДанныеFreeTeamScale
Логи24 часа14 дней90 дней
Метрики (сырые)7 дней30 дней90 дней
Метрики (5 мин)30 дней13 месяцев13 месяцев
Трейсы7 дней30 дней