<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Francisco das Chagas</title>
    <description>The latest articles on DEV Community by Francisco das Chagas (@francisco_daschagas).</description>
    <link>https://dev.to/francisco_daschagas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4155899%2Fcd054459-cacf-4bb6-9e01-7789345d03da.png</url>
      <title>DEV Community: Francisco das Chagas</title>
      <link>https://dev.to/francisco_daschagas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/francisco_daschagas"/>
    <language>en</language>
    <item>
      <title>Um terço da conta era para medir</title>
      <dc:creator>Francisco das Chagas</dc:creator>
      <pubDate>Thu, 22 Oct 2026 11:30:00 +0000</pubDate>
      <link>https://dev.to/francisco_daschagas/um-terco-da-conta-era-para-medir-2h57</link>
      <guid>https://dev.to/francisco_daschagas/um-terco-da-conta-era-para-medir-2h57</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fozvzcbvt3enr3bb2ebgb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fozvzcbvt3enr3bb2ebgb.png" alt="Dois monitores numa mesa diante de racks de servidores: à esquerda, o pool de nós a 18% de CPU; à direita, os containers a 104% de memória, com o aviso de que o autoscaling dispara por CPU e não por memória. Na prancheta, o relatório de rateio aponta a observabilidade como cerca de um terço da conta." width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fiz o rateio da conta de infraestrutura por domínio de negócio.&lt;/p&gt;

&lt;p&gt;O segundo maior item não era produto. Era observabilidade: cerca de um terço da conta, quase empatado com o produto principal.&lt;/p&gt;

&lt;p&gt;E o que esse terço comprava:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;85,6% dos logs de produção não podiam ser atribuídos a nenhum serviço;&lt;/li&gt;
&lt;li&gt;a ferramenta que media tudo não media a si mesma. Sem esse dado, o "um terço" podia ser 25% ou 44%, dependendo do tamanho real das máquinas dela.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No mesmo levantamento apareceu o outro lado:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;as máquinas estavam a 18% de CPU, enquanto os containers passavam de 100% do próprio limite;&lt;/li&gt;
&lt;li&gt;o autoscaling escalava por CPU um serviço que saturava por memória, então nunca acionou;&lt;/li&gt;
&lt;li&gt;quase metade do ambiente de desenvolvimento ficava ociosa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O gargalo não era falta de máquina. Era configuração, e corrigir configuração tem custo de licença zero.&lt;/p&gt;

&lt;p&gt;A economia de maior retorno que encontrei não era trocar de ferramenta. Era corrigir o único ponto que gerava aqueles logs sem dono, com um alvo estimado de 30% a 40% do custo de observabilidade, sem perder nenhum sinal que alguém usa.&lt;/p&gt;

&lt;p&gt;O que mudou a conversa com a gestão foi o custo por unidade de negócio. Todo negócio tem a sua: o pedido num e-commerce, a transação num banco, a consulta numa clínica, a entrega numa operação de logística, o aluno numa plataforma de ensino. "A infra custa X por mês" não leva a decisão nenhuma. "Cada unidade custa alguns centavos" leva. A pergunta "quanto custa atender mais um cliente?" passou a ter resposta.&lt;/p&gt;

&lt;p&gt;Quanto a sua observabilidade custa em relação ao produto que ela observa?&lt;/p&gt;

</description>
      <category>finops</category>
      <category>kubernetes</category>
      <category>observability</category>
      <category>sre</category>
    </item>
    <item>
      <title>O p99 foi para 60 s e nada ficou mais lento</title>
      <dc:creator>Francisco das Chagas</dc:creator>
      <pubDate>Tue, 20 Oct 2026 11:30:00 +0000</pubDate>
      <link>https://dev.to/francisco_daschagas/o-p99-foi-para-60-s-e-nada-ficou-mais-lento-4gm8</link>
      <guid>https://dev.to/francisco_daschagas/o-p99-foi-para-60-s-e-nada-ficou-mais-lento-4gm8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffnspyir402xvmy9rrogk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffnspyir402xvmy9rrogk.png" alt="Um quadro de vidro mostra " width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois de um deploy, o p99 de um serviço virou uma linha reta em 60 segundos.&lt;/p&gt;

&lt;p&gt;Pânico? Não. Ninguém tinha reclamado, e nenhum erro tinha aparecido.&lt;/p&gt;

&lt;p&gt;O que aconteceu foi o seguinte: o deploy passou a instrumentar a espera da fila. O serviço fica escutando a fila por até 60 segundos e, se nada chega, volta a escutar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;99% dos spans de recebimento eram esperas vazias;&lt;/li&gt;
&lt;li&gt;eram cerca de 136 mil spans por dia só de "nada aconteceu";&lt;/li&gt;
&lt;li&gt;o processamento real continuava em 85 ms (p50) e 248 ms (p99).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A métrica não piorou. Ela passou a medir outra coisa.&lt;/p&gt;

&lt;p&gt;O mesmo erro já tinha aparecido semanas antes, numa regra compartilhada: uma conexão ociosa de longa duração fixava o p99 em 60 segundos para todos os serviços.&lt;/p&gt;

&lt;p&gt;A correção não exigiu deploy: bastou filtrar o span certo.&lt;/p&gt;

&lt;p&gt;Duas lições de custo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Mais instrumentação não é mais verdade. Cada span novo precisa responder a uma pergunta. Se não responde, é custo de ingestão sem retorno.&lt;/li&gt;
&lt;li&gt;Antes de acionar o time por causa de um gráfico, pergunte: "o que mudou na forma de medir?". Nem sempre foi o sistema que mudou.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Você sabe quanto da sua telemetria é espera ociosa?&lt;/p&gt;

</description>
      <category>observability</category>
      <category>opentelemetry</category>
      <category>performance</category>
      <category>finops</category>
    </item>
    <item>
      <title>Cada funcionalidade é uma forma nova de errar</title>
      <dc:creator>Francisco das Chagas</dc:creator>
      <pubDate>Thu, 15 Oct 2026 11:30:00 +0000</pubDate>
      <link>https://dev.to/francisco_daschagas/cada-funcionalidade-e-uma-forma-nova-de-errar-42cj</link>
      <guid>https://dev.to/francisco_daschagas/cada-funcionalidade-e-uma-forma-nova-de-errar-42cj</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo00i6z6j42bz6hv9s577.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo00i6z6j42bz6hv9s577.png" alt="Um monitor mostra " width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Um alerta notificou: "taxa de erro de 12,22%".&lt;/p&gt;

&lt;p&gt;Fiz a conta à mão: 3 falhas em 19 execuções dão 15,8%.&lt;/p&gt;

&lt;p&gt;O alerta não estava quebrado. Estava calculando outra coisa. A fórmula era avaliada minuto a minuto e depois tirava a média das razões. Com amostras pequenas, o número parece certo e é errado.&lt;/p&gt;

&lt;p&gt;Depois disso comecei a colecionar esses casos. Todos são funcionalidades, e todos erram em silêncio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pedir 30 ou 60 dias de dados devolvia os mesmos 21 dias, sem nenhum aviso.&lt;/li&gt;
&lt;li&gt;Uma consulta em lote devolveu resultados idênticos para filtros diferentes. O erro foi de 24 vezes.&lt;/li&gt;
&lt;li&gt;Um alerta de "reinício em loop" só dispararia com 3 reinícios no mesmo minuto. Nunca disparou, com 19 reinícios em 7 dias.&lt;/li&gt;
&lt;li&gt;Uma variável de dashboard sem valor padrão deixou 41 de 46 painéis em branco.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nenhum desses casos mostrou erro na tela. Todos devolveram um número plausível.&lt;/p&gt;

&lt;p&gt;Esse é o custo escondido das ferramentas cheias de recursos: cada recurso é mais uma forma de dar a resposta errada com cara de certa.&lt;/p&gt;

&lt;p&gt;O que resolveu foi aritmética de padaria. Depois da correção, o alerta mostrou 13,04%, e a conta à mão deu 3 de 23. Bateu exato.&lt;/p&gt;

&lt;p&gt;Minha regra hoje: número novo só vale depois de conferido por soma, com uma conta que dá para fazer no papel.&lt;/p&gt;

&lt;p&gt;Qual foi a última vez que você conferiu à mão um número que um dashboard te deu?&lt;/p&gt;

</description>
      <category>observability</category>
      <category>sre</category>
      <category>monitoring</category>
      <category>devops</category>
    </item>
    <item>
      <title>85% dos logs não diziam se eram erro</title>
      <dc:creator>Francisco das Chagas</dc:creator>
      <pubDate>Tue, 13 Oct 2026 11:30:00 +0000</pubDate>
      <link>https://dev.to/francisco_daschagas/85-dos-logs-nao-diziam-se-eram-erro-3kbg</link>
      <guid>https://dev.to/francisco_daschagas/85-dos-logs-nao-diziam-se-eram-erro-3kbg</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdfzc2lquqgrpzwmqa3rw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdfzc2lquqgrpzwmqa3rw.png" alt="Um funil de linhas de log translúcidas, com o rótulo " width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fiz a primeira linha de base completa da plataforma. O número que mais me incomodou:&lt;/p&gt;

&lt;p&gt;85% dos logs de produção chegavam sem severidade.&lt;/p&gt;

&lt;p&gt;São dezenas de milhões de linhas por dia sem dizer se eram informação, aviso ou erro. Qualquer alerta do tipo "me avise quando houver erro" enxergava só 15% da operação.&lt;/p&gt;

&lt;p&gt;Três achados do mesmo dia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;o ambiente de desenvolvimento consumia 47% de toda a ingestão de logs e não tinha nenhum alerta;&lt;/li&gt;
&lt;li&gt;cada consulta de 24 horas varria cerca de 13 GB;&lt;/li&gt;
&lt;li&gt;dois serviços respondiam por mais da metade do volume de produção.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A causa não era a ferramenta. Era uma linha de configuração: o log da aplicação saía no console, sem formato estruturado. Essa única causa gerava três sintomas: sem severidade, volume inflado (uma consulta SQL virava de 10 a 20 linhas) e nenhuma ligação com o trace.&lt;/p&gt;

&lt;p&gt;Eu pagava para guardar, pagava para consultar e não conseguia responder à pergunta mais básica.&lt;/p&gt;

&lt;p&gt;Mais volume não é mais visibilidade. Na maioria das vezes, é só mais custo.&lt;/p&gt;

&lt;p&gt;E aqui entra a IA. Ela lê log muito bem, mas não lê o que nunca foi registrado. Nenhum modelo recupera a severidade que a aplicação não escreveu.&lt;/p&gt;

&lt;p&gt;A correção certa não é filtrar volume. É consertar o que é emitido na origem.&lt;/p&gt;

&lt;p&gt;Que percentual dos seus logs chega com severidade preenchida? Alguém já mediu?&lt;/p&gt;

</description>
      <category>observability</category>
      <category>logging</category>
      <category>opentelemetry</category>
      <category>finops</category>
    </item>
    <item>
      <title>Poucos alertas, um trace, zero impacto</title>
      <dc:creator>Francisco das Chagas</dc:creator>
      <pubDate>Thu, 08 Oct 2026 11:30:00 +0000</pubDate>
      <link>https://dev.to/francisco_daschagas/poucos-alertas-um-trace-zero-impacto-556k</link>
      <guid>https://dev.to/francisco_daschagas/poucos-alertas-um-trace-zero-impacto-556k</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqi8s1qtxr27vnxwijyd2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqi8s1qtxr27vnxwijyd2.png" alt="Noite, com a lua na janela e um relógio marcando 21:30. No monitor, um trace teal liga o job noturno de coleta ao banco destacado em âmbar, com o pool de conexões saturado, 36 conexões recusadas e uma consulta N+1 detectada." width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Uma semana depois do incidente de 8h40, os alertas novos começaram a tocar, sempre por volta das 21:30.&lt;/p&gt;

&lt;p&gt;O pool de conexões do banco subiu noite após noite: 90%, 89%, 94,8%. Na terceira noite, 36 conexões recusadas.&lt;/p&gt;

&lt;p&gt;Era a mesma falha daquele incidente, em formação. Só que desta vez sabíamos três noites antes.&lt;/p&gt;

&lt;p&gt;O diagnóstico não veio de uma ferramenta cara. Veio de duas coisas simples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;um alerta de conexões que tocou antes do impacto;&lt;/li&gt;
&lt;li&gt;um trace, na janela do alerta, que ligou um job noturno de um serviço à saturação do banco de outro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O job fazia uma consulta por ponto de medição. A leitura no banco chegava a 12 vezes o normal, com a escrita parada. Era o padrão N+1, conhecido de qualquer livro.&lt;/p&gt;

&lt;p&gt;Do primeiro erro ao diagnóstico, levou menos de um dia útil. O impacto em cliente foi zero.&lt;/p&gt;

&lt;p&gt;No mesmo dia, corrigi dois alertas que davam falso positivo. Menos ruído é o que faz o time acreditar no próximo alerta.&lt;/p&gt;

&lt;p&gt;A lição para quem gere risco: detectar cedo é barato. Poucos alertas certos e uma forma de ligar a causa ao sintoma valem mais que cem painéis.&lt;/p&gt;

&lt;p&gt;Spoiler: a correção do job ainda não saiu. Detectar não é corrigir, e isso é assunto de outro post.&lt;/p&gt;

&lt;p&gt;No seu time, o último incidente foi detectado pelo alerta ou pelo cliente?&lt;/p&gt;

</description>
      <category>observability</category>
      <category>sre</category>
      <category>postgres</category>
      <category>tracing</category>
    </item>
    <item>
      <title>Antes de criar, eu apaguei</title>
      <dc:creator>Francisco das Chagas</dc:creator>
      <pubDate>Tue, 06 Oct 2026 11:30:00 +0000</pubDate>
      <link>https://dev.to/francisco_daschagas/antes-de-criar-eu-apaguei-1624</link>
      <guid>https://dev.to/francisco_daschagas/antes-de-criar-eu-apaguei-1624</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6uvhaakbrhei4eon1lrg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6uvhaakbrhei4eon1lrg.png" alt="Uma pilha de dashboards genéricos, em cinza, voa para fora da mesa, enquanto cinco painéis essenciais brilham em teal: orçamento de erro dos 24 serviços, delta do lag de replicação, latência p99, visão do SLO e causa raiz por trace. No caderno aberto, o inventário inicial marca o que foi cortado." width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depois do incidente de 8h40, a tentação era criar dezenas de alertas e painéis.&lt;/p&gt;

&lt;p&gt;Fiz o contrário. Comecei pelo inventário:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10 dashboards, 8 deles templates importados no mesmo dia, e nenhum sobre os nossos serviços;&lt;/li&gt;
&lt;li&gt;15 "visões salvas" que ninguém abria;&lt;/li&gt;
&lt;li&gt;4 alertas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A meta que escrevi foi cortar: 5 dashboards, 4 visões de investigação, uns 11 alertas.&lt;/p&gt;

&lt;p&gt;Três regras saíram desse dia e valem para qualquer time:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Uma regra bem agrupada cobre tudo. Um único alerta de taxa de erro, agrupado por serviço, cobre os 24 serviços. Não são necessários 24 alertas.&lt;/li&gt;
&lt;li&gt;Nunca suba o limite global para acomodar um serviço doente. Trate o doente.&lt;/li&gt;
&lt;li&gt;Alerta que disparou sem ninguém agir é ajustado ou apagado na mesma semana. Alerta ignorado duas vezes é apagado.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Antes de ligar qualquer coisa, testei com dado real. Se medisse por span, e não por requisição, 6 serviços teriam disparado no primeiro dia. Seria ruído desde a estreia.&lt;/p&gt;

&lt;p&gt;E o registro honesto: um mês depois, 6 dos templates "consolidados" ainda estavam lá, duplicados. O custo de ter demais é esse: ninguém apaga.&lt;/p&gt;

&lt;p&gt;Ferramenta rica em funcionalidade é convite para acumular. Gestão é dizer não.&lt;/p&gt;

&lt;p&gt;Quantos dashboards o seu time tem, e quantos alguém abriu nos últimos 30 dias?&lt;/p&gt;

</description>
      <category>sre</category>
      <category>observability</category>
      <category>devops</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>8h40 com todos os dados e nenhum aviso</title>
      <dc:creator>Francisco das Chagas</dc:creator>
      <pubDate>Fri, 02 Oct 2026 11:30:00 +0000</pubDate>
      <link>https://dev.to/francisco_daschagas/8h40-com-todos-os-dados-e-nenhum-aviso-2gd0</link>
      <guid>https://dev.to/francisco_daschagas/8h40-com-todos-os-dados-e-nenhum-aviso-2gd0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg351x8vnwqw9ess03sit.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg351x8vnwqw9ess03sit.png" alt="Mesa de plantão de madrugada: um monitor mostra as escritas no primário em alta, outro avisa que a réplica está 8h40 atrasada e que os dados do cliente estão desatualizados, e um relógio marca 00:34. Na mesa, um laptop com timeout ao ler a réplica e um rascunho de post-mortem." width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;00:34. Uma manutenção automática do provedor de nuvem reciclou os dois servidores do banco de produção, com 6 minutos de intervalo entre eles.&lt;/p&gt;

&lt;p&gt;O failover funcionou em 4 segundos. A segunda reciclagem derrubou o novo primário no meio da ressincronização, e a réplica travou.&lt;/p&gt;

&lt;p&gt;Ficamos 8h40 operando sem cópia de segurança do banco. Ninguém soube.&lt;/p&gt;

&lt;p&gt;Quem avisou foi o negócio, pelo impacto, horas depois.&lt;/p&gt;

&lt;p&gt;A parte mais incômoda veio depois: reconstruímos o incidente inteiro, minuto a minuto. Os logs estavam lá. As métricas estavam lá.&lt;/p&gt;

&lt;p&gt;E a métrica de saúde da réplica marcou "saudável" durante as 8h40.&lt;/p&gt;

&lt;p&gt;Três lições que eu levo desse dia:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Telemetria sem alerta é arqueologia. O MTTR não veio de falta de dado, veio de falta de detecção.&lt;/li&gt;
&lt;li&gt;Métrica de status mente. O que mostrou o problema foi a diferença entre o que o primário escreveu e o que a réplica aplicou, uma conta simples.&lt;/li&gt;
&lt;li&gt;Um aviso num card do chat não acorda ninguém às 00:34.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Em gestão de risco, a pergunta certa não é "temos o dado?". É "quanto tempo levamos para saber?". Naquele dia, a resposta foi 8 horas.&lt;/p&gt;

&lt;p&gt;Esse incidente virou o caso de negócio de tudo o que veio depois.&lt;/p&gt;

&lt;p&gt;Se o seu banco perdesse a réplica agora, em quanto tempo você saberia?&lt;/p&gt;

</description>
      <category>sre</category>
      <category>postgres</category>
      <category>observability</category>
      <category>postmortem</category>
    </item>
    <item>
      <title>Migrar para o Envoy Gateway não é trocar YAML</title>
      <dc:creator>Francisco das Chagas</dc:creator>
      <pubDate>Thu, 01 Oct 2026 22:48:32 +0000</pubDate>
      <link>https://dev.to/francisco_daschagas/migrar-para-o-envoy-gateway-nao-e-trocar-yaml-2l02</link>
      <guid>https://dev.to/francisco_daschagas/migrar-para-o-envoy-gateway-nao-e-trocar-yaml-2l02</guid>
      <description>&lt;p&gt;O ingress-nginx não recebe patch de segurança desde março de 2026.&lt;br&gt;
Ele continua funcionando, e é por isso que o risco passa despercebido.&lt;/p&gt;

&lt;p&gt;A saída recomendada pelo próprio Kubernetes é a Gateway API, e o Envoy Gateway é uma das implementações dela. A tentação é tratar a migração como tradução: pegar cada anotação e reescrever no formato novo. Só que a migração não se resume a trocar YAML.&lt;/p&gt;

&lt;p&gt;No nginx, cada app levava a própria regra de IP numa anotação. No Envoy, a regra sobe para uma SecurityPolicy no Gateway compartilhado. Ela muda de dono: sai do time da app e vai para a plataforma. Um erro, que antes afetava uma app, agora afeta todas as rotas.&lt;/p&gt;

&lt;p&gt;Ela também muda de camada. A allowlist por IP é uma decisão de L3 tomada em L7. O proxy filtra o IP que ele acredita ser o do cliente. Se houver SNAT no caminho, todo mundo vira o IP do node. Se o X-Forwarded-For for aceito sem critério, qualquer um escreve o próprio IP.&lt;/p&gt;

&lt;p&gt;Abaixo, os pontos que a documentação confirma e que eu teria errado se só traduzisse as anotações: SNAT, precedência por substituição, CIDR largo copiado e o API gateway que vira o único cliente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkvupl68vk7vcdk7ozq5t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkvupl68vk7vcdk7ozq5t.png" alt="Slide 1: Migrar para o Envoy Gateway não é trocar YAML. A regra de acesso muda de dono e de camada." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F501vz7rg7ige5obpfbax.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F501vz7rg7ige5obpfbax.png" alt="Slide 2: A regra mudou de dono. No Envoy, a SecurityPolicy fica no Gateway compartilhado e um erro afeta todas as rotas." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe4s2atgpw32gj5uoxc7b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe4s2atgpw32gj5uoxc7b.png" alt="Slide 3: IP só é prova onde não pode ser forjado. Em L7, o IP é um dado que alguém informou, o X-Forwarded-For." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh5bj5hmywhwvjqx97bne.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh5bj5hmywhwvjqx97bne.png" alt="Slide 4: SNAT apaga o cliente. Com externalTrafficPolicy Cluster, o IP do cliente vira o IP do node." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F17n24dg6a2wglwz37acb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F17n24dg6a2wglwz37acb.png" alt="Slide 5: A política da rota substitui a do Gateway. Sem mergeType, quem chega com token passa de qualquer IP." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvn0btf044oc1e3sla710.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvn0btf044oc1e3sla710.png" alt="Slide 6: A faixa /8 que devia ser /16. 255 blocos /16 de terceiros liberados por uma lista antiga." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi60n8m7a0efp5aqiah52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fi60n8m7a0efp5aqiah52.png" alt="Slide 7: Com um API gateway na frente, o cliente é ele. Liberar esse IP libera todo mundo que passa por ele." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56412q4csfp0vji5pb7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F56412q4csfp0vji5pb7c.png" alt="Slide 8: Checklist de validação antes do canário." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qual regra de acesso sumiu, ou abriu demais, numa migração que parecia só de ferramenta no seu ambiente?&lt;/p&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/blog/2025/11/11/ingress-nginx-retirement/" rel="noopener noreferrer"&gt;Kubernetes Blog, aposentadoria do Ingress NGINX (11/11/2025)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway-api.sigs.k8s.io/" rel="noopener noreferrer"&gt;Gateway API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway.envoyproxy.io/docs/tasks/security/restrict-ip-access/" rel="noopener noreferrer"&gt;Envoy Gateway, restringir acesso por IP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway.envoyproxy.io/docs/tasks/traffic/client-traffic-policy/" rel="noopener noreferrer"&gt;Envoy Gateway, Client Traffic Policy (X-Forwarded-For, Proxy Protocol)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway.envoyproxy.io/docs/concepts/gateway_api_extensions/security-policy" rel="noopener noreferrer"&gt;Envoy Gateway, SecurityPolicy (precedência e mergeType)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gateway.envoyproxy.io/docs/api/extension_types/" rel="noopener noreferrer"&gt;Envoy Gateway, API extension types&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/" rel="noopener noreferrer"&gt;ingress-nginx, Annotations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/" rel="noopener noreferrer"&gt;Kubernetes, preservar o IP de origem do cliente&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/en-us/azure/aks/load-balancer-standard" rel="noopener noreferrer"&gt;Microsoft Learn, Standard Load Balancer no AKS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>devops</category>
      <category>sre</category>
      <category>security</category>
    </item>
    <item>
      <title>Três ferramentas, nenhuma resposta</title>
      <dc:creator>Francisco das Chagas</dc:creator>
      <pubDate>Thu, 01 Oct 2026 22:48:29 +0000</pubDate>
      <link>https://dev.to/francisco_daschagas/tres-ferramentas-nenhuma-resposta-1og4</link>
      <guid>https://dev.to/francisco_daschagas/tres-ferramentas-nenhuma-resposta-1og4</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6qy5poxukeutl9zpqpp7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6qy5poxukeutl9zpqpp7.png" alt="Mesa dividida: à esquerda, três telas com alertas críticos e anotações soltas; à direita, uma única plataforma de observabilidade com métricas, traces e logs" width="800" height="1071"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hoje toda conversa de operação termina em "qual IA a gente coloca aqui?".&lt;/p&gt;

&lt;p&gt;Vou começar esta série por outra pergunta: quantas das suas ferramentas você consegue provar que funcionam?&lt;/p&gt;

&lt;p&gt;Nós tínhamos três. Logs numa, métricas em outra, APM numa terceira.&lt;/p&gt;

&lt;p&gt;Quando alguma coisa quebrava, a resposta não estava em nenhuma delas.&lt;/p&gt;

&lt;p&gt;Não faltava ferramenta. Faltava garantia:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a aplicação parava de mandar log para o cluster e ninguém percebia;&lt;/li&gt;
&lt;li&gt;quando o log chegava, não trazia a informação necessária;&lt;/li&gt;
&lt;li&gt;a retenção dependia de uma rotina de limpeza configurada à mão, e nem sempre funcionava: guardávamos meses de dados quando o combinado eram semanas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eram três lugares para procurar e nenhum dono. Em gestão de risco, isso tem nome: controle que só existe no papel. A auditoria marca "temos monitoramento", mas no dia do incidente ninguém confia nele.&lt;/p&gt;

&lt;p&gt;A saída não foi comprar uma quarta ferramenta. Foi juntar logs, métricas e traces num lugar só (open source, com OpenTelemetry) e usar menos coisa, não mais.&lt;/p&gt;

&lt;p&gt;Nos próximos posts, vou contar o que isso revelou, com números: o que funcionou, o que custou, onde a IA ajudou e onde errou.&lt;/p&gt;

&lt;p&gt;Comece pela pergunta do início: das ferramentas de observabilidade que você paga hoje, quantas você já testou num incidente real?&lt;/p&gt;

</description>
      <category>sre</category>
      <category>observability</category>
      <category>devops</category>
      <category>opentelemetry</category>
    </item>
  </channel>
</rss>
