Observabilidade — Sentry/GlitchTip¶
Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-07-13
Recipe da casa: captura todo log ERROR (inclui exceção não-tratada) sem tocar o negócio,
via o SentryAppender do logback. Não há mais o plugin io.sentry.jvm.gradle (era inerte —
source context e auto-install desligados).
- Dependência:
io.sentry:sentry-logback(traz osentry-coretransitivo; a APIio.sentry.Sentrycontinua disponível para capturas explícitas/breadcrumbs). logback.xml: um<appender name="SENTRY" class="io.sentry.logback.SentryAppender">comminimumEventLevel=ERROR, referenciado no<root>. Sem<dsn>no appender de propósito.SentryInitializer.initFromEnvironment()faz oSentry.init()nomain(), ANTES deMicronaut.run— a partir deSENTRY_DSN, só em prod (não em dev/test, viaMICRONAUT_ENVIRONMENTS). Sem DSN → Sentry desabilitado → o appender vira no-op (não spamma). Inicializar antes do contexto é de propósito: um crash de startup (ex.: validação Flyway ao criar oDataSource) precisa sair com a tagcliente. Quando era um@EventListener(StartupEvent), esses erros iam ao GlitchTip sem a tag (oStartupEventsó dispara se o contexto sobe).
Assim, em produção com DSN todo log.error(...) (com a exceção anexada) vira evento no
GlitchTip; em dev/local não. Capturas explícitas (Sentry.captureException) seguem valendo (ex.:
XadmService reporta erros de origens conhecidas). Evite log.error displicente — vira ruído no
GlitchTip.
Projeto único + tag de cliente (multi-tenant)¶
O integrador roda um recurso Coolify por cliente, mas há um único projeto GlitchTip
(integrador, provisionado pela /xadm-setup — DSN público em docs/app.json
features.glitchtip.dsn). Para distinguir os eventos por cliente sem projetos separados, o
SentryInitializer marca toda ocorrência com a tag cliente (fonte: env CLIENTE). No
GlitchTip, filtre/agrupe por cliente para isolar o tenant.
- DSN é o mesmo para todos os deploys → configure o mesmo
SENTRY_DSNem cada recurso de cliente no Coolify (a provisão não injeta sozinha: o app não temproduction_urlúnico). CLIENTEjá existe noapplication.yml(${CLIENTE:Cliente}); sem ele, os eventos ficam sem a tag (ou com o placeholder), sinalizando recurso mal-configurado.
Código: src/main/resources/logback.xml, comum/SentryInitializer (método configure).