4

Como vocês monitoram erro/performance de aplicação nos seus SaaS/side-projects?

E ai pessoal, mantenho o Memorya, um SaaS de compartilhamento de fotos e vídeos para eventos provados.

A parte de infra eu sinto que é relativamente bem coberta. Servidor caiu? Container morreu? Disco enchendo? Tem um monte de ferramenta boa e conhecida pra isso: Zabbix, Uptime Kuma, Prometheus + Grafana, etc.

O que me preocupa mais no dia a dia é outra coisa: a aplicação e o pipeline.

Tipo:

  • uma mensagem fica presa numa fila e ninguém percebe;
  • um worker falha em silêncio processando um vídeo específico;
  • uma thumbnail não é gerada;
  • uma URL pré-assinada expira antes do esperado;
  • um job roda "com sucesso", mas deixa o usuário sem o resultado final.

Nada disso necessariamente derruba o serviço. O health check continua verde. O container está de pé. O uptime está lindo.

Só que a experiência de alguém quebrou.

E às vezes você só descobre porque o usuário reclamou no suporte, dias depois.

Queria entender como vocês lidam com isso na prática, principalmente com quem toca projeto sozinho ou em time pequeno:

Como vocês acompanham erro e estado de pipelines assíncronos hoje? Fila, worker, job, processamento de mídia, esse tipo de coisa.

Usam Sentry? Log estruturado? Dashboard próprio? Grep manual em log? Ou é mais na base do "se o usuário reclamar, eu vejo"... kkkk?

Isso já afetou vocês alguma vez? Algo ficou travado silenciosamente em produção por dias até alguém perceber?

Pra quem tentou montar APM/tracing com Elastic, Grafana Tempo, OpenTelemetry ou algo nessa linha: valeu o esforço? Ou virou só mais uma coisa pra configurar, manter e esquecer aberta numa aba?

E pra quem desistiu de observabilidade "de verdade" em projeto pequeno: qual foi a fricção?

Configuração demais? Custo? Ruído? Falta de tempo? Ferramenta grande demais pra problema pequeno?

Estou tentando entender onde está o ponto de equilíbrio. Porque monitorar CPU e uptime é fácil. Difícil mesmo é saber se o fluxo que importa para o usuário terminou como deveria.

Carregando publicação patrocinada...
2

Eu utilizo 2 coisas, new relic para projetos pequenos(EXTREMAMENTE facil de configurar e sem dor de cabeça)

e para saas maiores que ofereço eu tenho já um sistema inteiro de monitoramento igual o new relic para facilitar minha vida, perdi MUITO tempo configurando mas meu saas ja tem 14 meses e não teve um bug que eu "aceitei" que existia sem problemas, todos consegui trackear os logs e dados de query ou request ou fila pra poder fz a observabilidade

link pro github caso esteja interessado na ideia e precise de exemplos:

https://github.com/JulioVianaDev/telemetry-examples

para mim ter argumentos e dados para um pós mortem é excencial para contrapor um cliente irritado

1

Você já teve problemas com clientes devido a falta desses dados? Só por curiosidade, quanto tempo você levou configurando esse seu sistema de monitoramento? Eu utilizei o Jaeger no inicio mais acabei migrando para o grafana cloud para centralizar métricas e logs também.

1

Eu já tive vários problemas devido a faltas de logs e metricas, alguns que consigo lembrar:
1-servidor lento, por causa de código xpto q rodava em uma instancia e atrasava mt, consegui pegar com tempo de execução
2-falta de cache, agr sempre que uma api está sofrendo muito hit de request eu cacheio e tenho alertas de whatsapp para cpu, error rate mt alto seja por erro internal ou por exemplo caso o cliente esteja mandando muito erro que barra no dto, crio uma informação sobre como enviar etc
3- já tive problema de auditoria de como os dados do cliente eram tratados, os logs de observabilidade me trouxe tudo que eu enviava a cada integração externa.
4- consigo mensurar e rastrear cada request q entra no meu software e cada query rodada, consigo ignorar e caso piore eu sei o que piorou
5- já aconteceu de ter erros de bibliotecas terceiras exemplo groupmq perder uma mensagem e eu saber exatamente qual mensagem foi perdida(mensagens de vendas de 2k reais não se pode perder sobre hipotese nenhuma) fiz sistema de retry e corriji aquele código

cara e sendo sincero sobre o tempo implementar essa branch aqui foi 2 semanas:

https://github.com/JulioVianaDev/telemetry-examples/tree/crons-grafana-tempo-prometheus-loki-otel

porém o tempo de aprender a olhar telemetria e tratamento de dados foi o que demorou muito, foram anos passando perrengue debugando código etc com diversos clientes até ter esse fluxo que funciona pra mim. então hj em dia eu sempre vou de newrelic primeiro e depois migro pra essa stack que fiz, e agora com ia consigo até por o claude code pra debugar erros caso aconteça e me entregar mais facil seguindo os padrões.

1

Acho que a estrutura geral que vai achar mais simples/poderosa (Não rápida) e pode ser construida do zero em projetos pequenos que vão se tornando grandes, é principalmente logs, voce precisa ser fanatico com logs, se o erro não for documentado não tem como ver simples assim. Padronize eles ao extremo, cubra tudo, coloque rotações para não explodir disco, depois que isso estiver estruturado, ai sim vem ferramentas, eu prefiro criar minhas proprias todas do zero, elas ja fazem parte da minha stack então eu apenas as reutilizo e incremento, mas a base toda é log bem feito. Eu fiz uma central de erros que alerta o tempo todo até via telegram, o nivel de visibilidade depende do que voce tem prioridade em acompanhar, logs de erros, segurança etc, voce decide. O trabalho ai é preparar o log em si, ele será o responsavel depois por gerar as informações da forma correta, integrando a uma base de dados para registrar não há problema de perda de log por rotatividade e seu disco agradece, no meu caso especifico cada erro ou problema é tratado como uma nova pendencia a ser resolvida e encaminhada ao lugar certo imediatamente, sem necessidade de ticket do cliente, mas ele tem essa opção claro. E um detalhe se você usa IA para codificar atenção redobrada, elas aprenderam com código humano e humano adora esconder erro pra mostrar que esta funcionando, elas amam colocar falbacks silenciosos, e erros sem resposta, por isso ainda mais atenção na padronização de logs, isso te tira dessa roubada.

1

Respsta gerada pelo claude com o contexto do meu projeto:

Cara, você descreveu exatamente o ponto cego que quase todo mundo tem. Infra é o problema fácil (binário: subiu/caiu, tem ferramenta boa pra caramba). O difícil é o que você listou: health check verde, container de pé — e mesmo assim o fluxo que importa não terminou.

Toco um SaaS de e-commerce de joia 3D (upload de STL, render, pagamento, nota, frete) — mesma família de dor: fila, worker, mídia, job assíncrono. O que virou a chave aqui foi parar de instrumentar infra e instrumentar desfecho de domínio. Dois sinais, e o segundo é o que pega o silêncio:

1. Contador de fluxo com outcome. Cada etapa emite evento_total{outcome="success|failed"}. Render, thumbnail, notificação, PDF — todos com taxa de falha visível. Pega "worker falhou num item específico".

2. Gauge de estado preso — o pulo do gato. Em vez de "o job rodou", eu meço "quantas coisas estão num estado não-terminal além do SLA" (ex.: presos_em_pending há +5 min). Alerta quando fica > 0. É exatamente o "job rodou com sucesso mas deixou o usuário sem resultado" — sucesso do job ≠ desfecho entregue. E o mesmo job de reconciliação que mede o preso também reprocessa, fechando o loop antes do usuário abrir ticket.

Os outros silêncios que você citou:

  • Dead-letter durável: mensagem envenenada não some — vai pro Postgres (outbox/inbox do Wolverine), com contador + alerta e reprocessável.
  • Fila sem consumer: alerta em queue_messages > 0 AND consumers == 0.
  • Trace correlacionado (trace_id no log): do alerta pulo direto pro trace daquele item. Sem grep.

O mapa do que roda:

graph LR
    API[API dotnet]
    WORKER[Worker dotnet]
    UI[UI browser Faro]

    ALLOY[Alloy coletor unico]

    PROM[Prometheus metricas]
    LOKI[Loki logs]
    TEMPO[Tempo traces]

    PGX[postgres-exporter]
    BB[blackbox-exporter]
    RMQ[RabbitMQ metricas]

    GRAF[Grafana dashboards e alertas]

    API -->|OTLP metricas e traces| ALLOY
    API -->|logs Serilog| LOKI
    WORKER -->|OTLP metricas e traces| ALLOY
    WORKER -->|logs Serilog| LOKI
    UI -->|Faro web vitals e erros| ALLOY

    ALLOY -->|metricas| PROM
    ALLOY -->|traces| TEMPO
    ALLOY -->|logs Faro| LOKI

    PGX --> PROM
    BB --> PROM
    RMQ --> PROM

    PROM --> GRAF
    LOKI --> GRAF
    TEMPO --> GRAF

Direto ao que você perguntou:

  • Sentry vs OTel? Não é ou-ou. Sozinho, começa com Sentry pra exceção (10 min, já mata "falha silenciosa"). A parte de pipeline (fila, estado preso, backlog) ele não pega bem — aí entra métrica+alerta.
  • Valeu o OTel/Tempo/Grafana? Valeu — mas só porque instrumentei desfecho de negócio. Se subir a stack e só olhar latência HTTP e CPU, vira a aba esquecida que você citou. O ROI tá nos 4-5 alertas de fluxo, não no LGTM completo.
  • A fricção real: não é subir o Grafana, é manter a instrumentação viva dentro do código de domínio. Isso morre num sidecar longe do código. Regra: mexeu numa transição de estado, mexe na métrica junto, faz parte do PR.
  • Ponto de equilíbrio pra time pequeno (80% dos silêncios com 20% do trabalho): (1) outcome em cada etapa; (2) gauge de "presos > X min" + job que reprocessa; (3) dead-letter que persiste; (4) alerta em fila sem consumer. Roda num Prometheus + Alertmanager modestos. Tracing e RUM são o passo 2.

Numa frase: pare de alertar em "o job rodou" e comece a alertar em "o resultado que o usuário esperava existe". O primeiro fica verde enquanto a experiência de alguém está quebrada.


A stack de observabilidade é o LGTM da Grafana + exporters, num perfil Docker separado. O que cada peça faz:

Instrumentação (dentro dos apps)

AppFunção
OpenTelemetry SDK (.NET)Gera métricas + traces da API e do Worker (AspNetCore, HttpClient, EF Core, runtime, Wolverine, Quartz, RateLimiting + um meter próprio Ourivus). Exporta via OTLP pro Alloy.
SerilogLogs estruturados; escreve direto no Loki (não passa pelo Alloy — a redação de dado sensível é feita no app).
Grafana Faro (browser/UI)RUM: web-vitals, erros JS, fetch/navegação do cliente. Manda pro Alloy no endpoint Faro.

Coleta

AppFunção
Grafana AlloyColetor único. Recebe OTLP do backend (:4317/:4318) e Faro do browser (:9123), redige dados sensíveis (chaves, CPF, query strings, tokens) e roteia: traces → Tempo, métricas → Prometheus (remote-write), logs Faro → Loki.

Armazenamento

AppFunção
PrometheusTSDB de métricas (retenção 30d, exemplars). Também raspa os exporters e roda recording rules/alertas.
LokiArmazena logs (backend + browser). Um ruler converte logs do Faro em métricas faro_*.
TempoArmazena traces. Gera span-metrics e service graph. Correlacionado aos logs por trace_id.

Exporters / probes

AppFunção
postgres-exporterMétricas do Postgres do produto (role read-only com pg_monitor).
blackbox-exporterLiveness/TLS dos apps via probe HTTP em /health/live (os apps não são raspados — métrica chega por push OTLP).
RabbitMQ (plugin nativo)Expõe métricas de fila (rabbitmq_queue_*) em :15692; o Prometheus raspa.

Visualização

AppFunção
GrafanaDashboards (Overview/SLO, API-RED, Worker/Filas, Negócio, RUM, Postgres/RabbitMQ/PDF, Host) + alertas de fluxo (5xx, p99, backlog, dead-letter, NFe presa, render falhando…), com datasources provisionados.

node-exporter / cAdvisor são infra de host compartilhada — as métricas node_*/container_* vêm de um Prometheus HOST, adicionado ao Grafana como datasource Prometheus HOST. Os dashboards de infra apontam pra ele.


OBS: toda essa stack roda num único docker-compose no mesmo servidor da aplicação

1

Daqui vou falar minha experiência passando por empresas e startups: Penso que uma das vantagens que você tem é conseguir entregar uma exmperiencia muito melhor que grandes empresas, onde cada pequena melhoria na experiencia ou correção tem que passar por 4 squads e alinhar os 4 roadmaps e só chegam pro user no próximo cycle (em 2 meses). Uma startup, solo founder ou pet projects você consegue e deve se atentar muito a estes pequenos problemas que degradam a experiência.

Então sem muito mais delongas, penso que Elastic + Graphana, Prometheus, ou mesmo um free tier de data dog ou New Relic seriam minhas opções. Penso que a observabilidade e monitoria sempre devem ser levadas a serio.

Eu sempre coloco bastante logs, principalmemnte de erros, faults/warnings.
A maior parte dos tollings de observabilidade trabalham com eventos custom, por exemplo o job rodou ok e processou video x, um job falhou no video y, eventos de mensagens processadas e mensagens que falharam, com info de qual usuario, e assim por diante, cobrindo principalmente os fluxos chaves do seu business.

Com estes logs, metricas, custom events e os traces padrao, crio varios dashboards, um focado em um overview geral tecnico, um overview de business, um focado em falhas e erros.

Ao menos esta é minha stack de observabilidade básica que penso que qualquer projeto que esteja em produção nas mão de usuários tira bastante vantagem. E muitas vezes a depender da escala vai demorar precisar sair do free tier.