feat: tarefas agendadas (resumo diario N16, eliminacao P6.3) no molde e nos 4 tenants; expurgo semanal P6.4 na plataforma; regra de alerta da nota fiscal N18

This commit is contained in:
deploy
2026-09-29 17:23:46 +00:00
parent ae615ad1b8
commit 15b3ae7e95
12 changed files with 1324 additions and 0 deletions
@@ -0,0 +1,141 @@
# =============================================================================
# N18 — Alerta de nota fiscal travada.
#
# DESTINO NO GITOPS: platform/monitoring/athleticmap-rules-nota-fiscal.yaml
# (repositorio athletic-map-deploy do servidor). O app `atm-platform` le
# `platform/` com recurse, entao basta o arquivo estar la — nao precisa mexer
# no `athleticmap-rules.yaml` nem no `application.yaml`.
#
# De onde vem: `MetricasDasNotasFiscais` e `ProcessarNotasPendentes`, no
# servico-financeiro (dentro do runtime-operacao nos tenants consolidados). As
# metricas `atm_*` ja estao na lista de keep dos tres ServiceMonitors
# (runtimes, servicos, tenants), entao chegam sem mudar a coleta.
#
# Procedimento manual: docs/runbook-nota-fiscal-travada.md (repo nova-atm).
#
# ── POR QUE ESTES LIMITES ───────────────────────────────────────────────────
#
# 6 HORAS para nota que devia estar andando (PENDENTE_EMISSAO / EMITINDO):
# - no normal, a varredura roda de hora em hora (:15) e o provedor emite em
# ate 15 min: uma nota passa menos de 1h30 pendente;
# - a NFS-e nacional cai e volta sozinha, em geral em minutos ou poucas
# horas, e o provedor tenta de novo sem ninguem pedir — alertar em 1-2h
# seria e-mail para algo que se resolve sozinho (e a caixa dos alertas e a
# mesma dos avisos aos clientes, com cota);
# - 6h sao seis rodadas da varredura: nao e mais soluco. E ainda da tempo de
# agir no mesmo dia, bem antes do fim da competencia.
# 24 HORAS vira critical (mesmo nome de alerta: o Alertmanager cala o warning
# quando o critical dispara — inhibit_rules com equal [namespace, alertname]).
# Um dia inteiro sem nota e pagante perguntando, e a virada de mes chegando.
#
# ERRO: 1 hora. Nota em ERRO NAO e reenviada sozinha — ninguem mexendo, ela
# fica la para sempre. O `for` so segura a rajada de uma rodada ruim, para o
# e-mail sair uma vez com o total, e nao nota a nota.
#
# PENDENTE_DADOS: 72 horas. Nao e instabilidade: e cadastro (configuracao
# fiscal ou dado do tomador faltando), resolvido pela escolinha ou pelo
# contador, em dia util. 72h atravessa um fim de semana sem alarme. O "mais
# brando" esta no PRAZO, e nao na severidade: `info` nao e usado na
# plataforma (scripts/test_regras_de_alerta.py so aceita warning/critical) e,
# no desenho do chart, info existe para ser calado pelo InfoInhibitor.
# =============================================================================
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: athleticmap-rules-nota-fiscal
namespace: monitoring
labels:
release: monitoring # o Prometheus so carrega regras com este label
spec:
groups:
- name: athleticmap.nota-fiscal
rules:
# `max by (namespace, situacao)`: com duas replicas do runtime, as duas
# publicam o mesmo numero (a conta vem do banco do tenant). O max junta.
- alert: AthleticMapNotaFiscalTravada
expr: |
max by (namespace, situacao) (
atm_nota_fiscal_pendente_mais_antiga_segundos{situacao=~"PENDENTE_EMISSAO|EMITINDO"}
) > 6 * 3600
for: 15m
labels:
severity: warning
annotations:
summary: "{{ $labels.namespace }}: nota fiscal parada em {{ $labels.situacao }} ha mais de 6h"
description: >-
A nota mais antiga em {{ $labels.situacao }} esta parada ha
{{ $value | humanizeDuration }}. EMITINDO = ja esta no provedor (Asaas)
esperando a prefeitura: quase sempre e a NFS-e nacional instavel —
confira o status da NFS-e nacional e o painel do Asaas (Notas fiscais)
antes de mexer; o provedor tenta de novo sozinho. PENDENTE_EMISSAO = a
varredura de hora em hora nao levou a nota: veja o CronJob
financeiro-notas (kubectl -n {{ $labels.namespace }} get jobs
-l job-name --sort-by=.metadata.creationTimestamp). NAO emita a nota
por fora sem cancelar a do provedor: sai em dobro. Procedimento:
docs/runbook-nota-fiscal-travada.md.
- alert: AthleticMapNotaFiscalTravada
expr: |
max by (namespace, situacao) (
atm_nota_fiscal_pendente_mais_antiga_segundos{situacao=~"PENDENTE_EMISSAO|EMITINDO"}
) > 24 * 3600
for: 15m
labels:
severity: critical
annotations:
summary: "{{ $labels.namespace }}: nota fiscal parada em {{ $labels.situacao }} ha mais de 24h"
description: >-
Um dia inteiro sem a nota sair ({{ $value | humanizeDuration }}). Se a
NFS-e nacional continua fora, avise a escolinha (a nota sai atrasada,
com a data do servico) e acompanhe; se voltou e a nota nao andou, use
"sincronizar" em cada nota e, se o provedor disser erro, "reabrir".
Emissao manual so seguindo o runbook, na ordem, para nao duplicar:
docs/runbook-nota-fiscal-travada.md.
- alert: AthleticMapNotaFiscalEmErro
expr: max by (namespace) (atm_nota_fiscal_pendentes{situacao="ERRO"}) > 0
for: 1h
labels:
severity: warning
annotations:
summary: "{{ $labels.namespace }}: {{ $value }} nota(s) fiscal(is) em ERRO"
description: >-
O provedor ou a prefeitura recusou, e nota em ERRO NAO e reenviada
sozinha. Veja o motivo de cada uma (GET /api/financeiro/notas?situacao=ERRO,
campo erroMensagem). Se foi a NFS-e nacional fora, espere ela voltar
e use POST /api/financeiro/notas/{id}/reabrir — a proxima varredura
manda de novo. Se foi dado errado, corrija antes de reabrir.
Procedimento: docs/runbook-nota-fiscal-travada.md.
- alert: AthleticMapNotaFiscalSemDadosFiscais
expr: |
max by (namespace) (
atm_nota_fiscal_pendente_mais_antiga_segundos{situacao="PENDENTE_DADOS"}
) > 72 * 3600
for: 1h
labels:
severity: warning
annotations:
summary: "{{ $labels.namespace }}: notas sem emitir por falta de dado fiscal ha mais de 3 dias"
description: >-
Nao e instabilidade: falta configuracao fiscal da escolinha (codigo de
servico municipal, aliquotas, emissao desligada) ou dado do tomador
(CPF/CNPJ, endereco). O motivo esta em erroMensagem ("faltam: ...") em
GET /api/financeiro/notas?situacao=PENDENTE_DADOS. Fale com a escolinha
ou o contador; depois de corrigir, "reabrir" cada nota.
# Silencio nao e "nenhuma nota parada": se a conta nao roda, as metricas
# acima ficam no ultimo valor (ou em zero, se nunca mediram). Com a
# validade de 2 min, ~30 tentativas por hora por replica.
- alert: AthleticMapNotaFiscalSemMedicao
expr: max by (namespace) (increase(atm_nota_fiscal_medicao_falhou_total[30m])) > 5
for: 30m
labels:
severity: warning
annotations:
summary: "{{ $labels.namespace }}: ha 1h nao se consegue contar as notas fiscais paradas"
description: >-
O alerta de nota travada esta cego neste tenant. Quase sempre e o banco
do financeiro fora ou sem conexao. Log: kubectl -n {{ $labels.namespace }}
logs deploy/runtime-operacao | grep 'nao consegui contar as pendentes'
(no escolinha-prod e no plataforma-prod o deploy e o servico-financeiro).