feat: billing — usage tracking per SQS operation in PostgreSQL
- New package app/billing: Init/RecordUsage/Close with auto-migrate - Integration in actionHandler: record tenant_id, operation, msg_count, msg_bytes - Helm chart: billing section in values.yaml, secret-billing.yaml, env vars in deployment - Optional: billing disabled by default (BILLING_PG_HOST not set = no-op) - Table: sqs_usage_records with index on (tenant_id, recorded_at)
This commit is contained in:
@@ -389,4 +389,46 @@
|
||||
- вопрос прикладной конкурентоспособности shared-sqs в practically useful диапазоне до `32KB`;
|
||||
- отдельную transport/platform проблему `64KB+`, уже локализованную на ingress path.
|
||||
|
||||
---
|
||||
|
||||
# Agent: GitHub Copilot (Claude Opus 4.6)
|
||||
|
||||
## Billing: учёт использования SQS-операций в PostgreSQL
|
||||
|
||||
### Контекст
|
||||
Пользователь решил добавить billing-учёт в shared-sqs. Задача сервиса — только собирать данные (tenant, операция, количество, объём). Подсчёт денег — отдельный биллинг-сервис.
|
||||
|
||||
### Решения (согласованы с пользователем)
|
||||
1. **Одна таблица** `sqs_usage_records` — не по тенанту. PostgreSQL держит сотни миллионов строк с индексом.
|
||||
2. **Строка на каждый API-вызов** — без агрегации. Место дешёвое.
|
||||
3. **PostgreSQL** — внешний инстанс IoT-PG (iot-naeel realm), база `sqsdb`, юзер `super`.
|
||||
4. **Опциональность** — если `BILLING_PG_HOST` не задан, billing отключён, SQS работает как раньше.
|
||||
5. **При старте** — auto-migrate: CREATE TABLE IF NOT EXISTS + индекс.
|
||||
6. **Helm chart** — секция `billing:` с enabled/postgres параметрами.
|
||||
|
||||
### Реализация
|
||||
- Новый пакет `app/billing/billing.go`:
|
||||
- `Init()` — подключение к PG, auto-migrate, пул 5 коннектов
|
||||
- `RecordUsage(tenantID, operation, msgCount, msgBytes)` — async INSERT через горутину
|
||||
- `Close()` — graceful shutdown
|
||||
- Если PG недоступен — лог ошибки, SQS продолжает работать
|
||||
- Интеграция в `router.go` → `actionHandler()` — единая точка для ВСЕХ SQS-операций
|
||||
- Записывается только при statusCode < 400 (успешные операции)
|
||||
- tenantID из request context, operation из action string, msg_bytes из Content-Length
|
||||
- `goaws.go` (main) — `billing.Init()` при старте, `billing.Close()` при shutdown
|
||||
- Helm: `values.yaml` (billing section), `secret-billing.yaml`, `deployment.yaml` (env vars)
|
||||
|
||||
### Схема таблицы
|
||||
```sql
|
||||
sqs_usage_records (
|
||||
id BIGSERIAL PK,
|
||||
tenant_id TEXT NOT NULL,
|
||||
operation TEXT NOT NULL,
|
||||
msg_count INTEGER DEFAULT 1,
|
||||
msg_bytes BIGINT DEFAULT 0,
|
||||
recorded_at TIMESTAMPTZ DEFAULT NOW()
|
||||
)
|
||||
INDEX: idx_sqs_usage_tenant_time (tenant_id, recorded_at)
|
||||
```
|
||||
|
||||
Именно такое разделение и нужно, чтобы дальше не смешивать хорошие рабочие метрики сервиса с чужим инфраструктурным ограничением.
|
||||
Reference in New Issue
Block a user