// Package billing — слой записи статистики вызовов функций. // // Независим от типа БД: снаружи виден только интерфейс Store. // Если BILLING_DSN не задан — работает NoopStore (тихо, не крашит). package billing import "time" // TriggerType описывает источник вызова. const ( TriggerHTTP = "http" // вызов через /fn/... снаружи TriggerCron = "cron" // вызов по расписанию TriggerConsole = "console" // вызов через кнопку «Вызов» в UI TriggerEvent = "event" // lifecycle: create/delete/clone/update ) // Invocation — одна запись о вызове или событии функции. type Invocation struct { Namespace string // пользовательский namespace (= пользователь) FunctionName string // имя функции TriggerType string // TriggerHTTP / TriggerCron / TriggerConsole / TriggerEvent Route string // HTTP маршрут (/abc123/my-func), пусто для event HTTPMethod string // GET/POST/... пусто для event StartedAt time.Time // время начала DurationMS int64 // длительность в миллисекундах (0 для event) StatusCode int // HTTP статус ответа (0 для event) ColdStart bool // true = первый вызов после создания/простоя RequestBytes int64 // размер тела запроса ResponseBytes int64 // размер тела ответа ErrorMsg string // сообщение об ошибке, пусто если успех RecordedBy string // "console" | "router" EventType string // для TriggerEvent: "create" | "delete" | "clone" | "update" | "invoke" } // Store — интерфейс записи статистики. // Реализации: pgStore (PostgreSQL через pgx), NoopStore (заглушка). type Store interface { // RecordInvocation записывает одно событие асинхронно (fire-and-forget). RecordInvocation(inv Invocation) // Close освобождает ресурсы (пул соединений и т.д.). Close() }