Métricas de uso
Declare métricas no manifesto, registre consumo em lote com outbox resiliente e bloqueie operações quando o limite do plano for atingido.
Apps comercializados na Plataforma podem medir consumo — pedidos emitidos, documentos processados, mensagens enviadas — e a Central de Ativações usa esses números para planos, limites e excedentes.
1. Declare as métricas
{
"usageMetrics": [
{
"code": "pedidos",
"name": "Pedidos emitidos",
"unit": "pedido",
"description": "Cada pedido enviado ao fornecedor.",
"defaults": {
"included": 500,
"onLimit": "block",
"overage": { "mode": "unit", "priceMinor": 50 }
}
}
]
}
Até 10 métricas. GET /core/usage-metrics publica a lista para a Central pré-preencher os limites do plano.
defaults |
Valores |
|---|---|
included |
Inteiro ≥ 0 incluído no ciclo |
onLimit |
block (recusa) ou auto_addon |
overage.mode |
unit ou block (com blockSize) |
overage.priceMinor |
Preço em centavos |
2. Registre o consumo
const { usage } = require("@oondemand/oon-core-back");
usage.record("pedidos", 1, { tenantId: req.accessContext.tenantId });
record acumula em memória e envia a cada OON_USAGE_FLUSH_MS (padrão 15 s) um lote com ID único. O lote passa pela outbox oon_usage_outbox no MongoDB do App: sobrevive a reinício, qualquer réplica reenvia (lease de 30 s, backoff, até 20 tentativas) e a Central conta cada ID uma vez. O encerramento do processo grava o que estiver em memória.
3. Bloqueie no limite
// Confere antes de uma operação cara
await usage.assertAvailable("pedidos", { tenantId: req.accessContext.tenantId });
Recusa com 423 USAGE_LIMIT_REACHED quando o plano bloqueia ao atingir o incluído, somando o estado da Central (cache de 60 s) e o consumo ainda não enviado. Sem resposta da Central, a operação segue.
Em uma rota privada, confira antes e registre depois do sucesso:
const { defineRoutes, usage } = require("@oondemand/oon-core-back");
defineRoutes("/pedidos-envio", (router) => {
router.private.post("/:id/enviar", { permission: "pedidos.write" }, async (req, res) => {
await usage.assertAvailable("pedidos", { tenantId: req.accessContext.tenantId });
// ... envia
usage.record("pedidos", 1, { tenantId: req.accessContext.tenantId });
res.json({ ok: true });
});
});
usage.limit(metric) também existe como middleware Express (confere o limite e registra 1 uso nas respostas 2xx) para composições fora de router.private.
Erros
| Código | Status | Causa |
|---|---|---|
USAGE_METRIC_INVALID |
422 | Código fora do padrão |
USAGE_QUANTITY_INVALID |
422 | Quantidade não inteira ou < 1 |
USAGE_LIMIT_REACHED |
423 | Limite do ciclo atingido |
No runtime local nada é enviado ({ recorded: false, reason: "local" }).