<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>rss.livelink.threads-in-node</title>
    <link>https://techcommunity.microsoft.com/t5/regional-blogs/ct-p/RegionalBlogs</link>
    <description>rss.livelink.threads-in-node</description>
    <pubDate>Fri, 07 Aug 2026 04:46:39 GMT</pubDate>
    <dc:creator>RegionalBlogs</dc:creator>
    <dc:date>2026-08-07T04:46:39Z</dc:date>
    <item>
      <title>Evoluindo a Resposta a Incidentes em AKS com Azure SRE Agent - Parte 1</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/evoluindo-a-resposta-a-incidentes-em-aks-com-azure-sre-agent/ba-p/4543906</link>
      <description>&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658630"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658689"&gt;&lt;/A&gt;Resumo executivo&lt;/H1&gt;
&lt;P&gt;Em aplicações executadas no &lt;EM&gt;Azure Kubernetes Services (AKS), &lt;/EM&gt;eventos &lt;EM&gt;OOMKilled&lt;/EM&gt; estão entre as causas recorrentes de reinicialização de contêineres e indisponibilidade intermitente em aplicações web. A observabilidade fornecida por &lt;EM&gt;Azure Monitor&lt;/EM&gt;, &lt;EM&gt;Container Insights&lt;/EM&gt;, &lt;EM&gt;Log Analytics&lt;/EM&gt; e métricas &lt;EM&gt;Prometheus&lt;/EM&gt; permite detectar o sintoma, registrar o evento e disparar o alerta. A detecção isolada, porém, ainda deixa para a equipe de plantão o trabalho mais caro: correlacionar métricas, logs, eventos, alterações recentes e limites de recursos até chegar a uma hipótese defensável.&lt;/P&gt;
&lt;P&gt;Sobre essa base de observabilidade, o Azure SRE Agent adiciona uma camada de raciocínio e execução governada. Ao receber o incidente, ele coleta evidências nas fontes conectadas, valida hipóteses e produz um diagnóstico explicável. Em seguida, recomenda a ação de menor risco e, conforme o modo de execução configurado, solicita aprovação humana ou executa uma remediação pré-autorizada. O resultado é um fluxo mais rápido e rastreável, sem eliminar os controles de acesso e aprovação.&lt;/P&gt;
&lt;P&gt;Este &lt;EM&gt;whitepaper&lt;/EM&gt; documenta o padrão em um laboratório reproduzível. No cenário, um &lt;EM&gt;pod&lt;/EM&gt; em &lt;EM&gt;CrashLoopBackOff&lt;/EM&gt; por limite de memória subdimensionado (20 Mi de limite, 10 Mi de solicitação) é investigado, diagnosticado e corrigido pelo agente sob aprovação humana, com verificação posterior e disparo automatizado por alerta do &lt;EM&gt;Azure Monitor&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;Além do passo a passo, o documento aprofunda a mecânica que sustenta o diagnóstico, &lt;EM&gt;cgroups v2&lt;/EM&gt;, o &lt;EM&gt;OOM killer&lt;/EM&gt; do &lt;EM&gt;kernel&lt;/EM&gt;, classes de &lt;EM&gt;QoS&lt;/EM&gt;, &lt;EM&gt;working set&lt;/EM&gt; versus &lt;EM&gt;RSS&lt;/EM&gt; e o comportamento de &lt;EM&gt;heap&lt;/EM&gt; dos &lt;EM&gt;runtimes&lt;/EM&gt;, porque a qualidade da resposta assistida depende diretamente da qualidade dos sinais que a alimentam.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658631"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658690"&gt;&lt;/A&gt;O que este documento entrega&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;A anatomia técnica de um evento &lt;EM&gt;OOMKilled&lt;/EM&gt; em AKS, do &lt;EM&gt;cgroup&lt;/EM&gt; ao status do &lt;EM&gt;pod&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI&gt;Consultas &lt;EM&gt;KQL&lt;/EM&gt; e &lt;EM&gt;PromQL&lt;/EM&gt; prontas para detecção e para o desenho da regra de alerta.&lt;/LI&gt;
&lt;LI&gt;O modelo operacional do Azure SRE Agent: fontes de contexto, modos de execução, permissões, &lt;EM&gt;hooks&lt;/EM&gt; e políticas de acesso a ferramentas.&lt;/LI&gt;
&lt;LI&gt;Um laboratório completo, do provisionamento do agente à recuperação verificada do &lt;EM&gt;workload&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI&gt;Um enquadramento de governança, auditoria e segurança para operações agênticas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658632"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658691"&gt;&lt;/A&gt;O que este documento não cobre&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;Disparo totalmente automatizado a partir do alerta e integração com o processo de gestão de incidentes, tema da Parte 2.&lt;/LI&gt;
&lt;LI&gt;Ajuste fino de capacidade em escala de frota (VPA/HPA em produção), tratado apenas como método.&lt;/LI&gt;
&lt;LI&gt;Valores de preço vigentes; o modelo de cobrança é descrito de forma qualitativa.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658633"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658692"&gt;&lt;/A&gt;1. Introdução&lt;/H1&gt;
&lt;P&gt;Aplicações nativas de nuvem distribuem o processamento entre &lt;EM&gt;pods&lt;/EM&gt;, serviços, dependências e nós. Essa elasticidade melhora a escala, mas amplia a complexidade da investigação quando uma falha ocorre. Em um incidente de memória, o primeiro sinal pode ser um &lt;EM&gt;pod&lt;/EM&gt; reiniciado, uma elevação de erros &lt;EM&gt;HTTP&lt;/EM&gt;, aumento de latência ou degradação parcial de uma jornada específica.&lt;/P&gt;
&lt;P&gt;O problema raramente é a ausência de dados. É o custo cognitivo de atravessar métricas, logs, eventos do Kubernetes, histórico de implantação e manifestos sob pressão de tempo, para só então formular uma hipótese. Esse custo é pago integralmente a cada incidente, e não se acumula como conhecimento reutilizável.&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658634"&gt;&lt;/A&gt;Este &lt;EM&gt;whitepaper&lt;/EM&gt; apresenta um padrão de resposta a incidentes em que o &lt;EM&gt;Azure Monitor&lt;/EM&gt; sustenta a detecção e a telemetria, enquanto o Azure SRE Agent converte sinais em contexto operacional acionável, preservando a decisão humana onde ela é necessária.&lt;/P&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658693"&gt;&lt;/A&gt;2. Contexto e desafio operacional&lt;/H1&gt;
&lt;P&gt;O cenário considera uma aplicação web em AKS instrumentada com &lt;EM&gt;Container Insights&lt;/EM&gt;, &lt;EM&gt;Log Analytics&lt;/EM&gt;, métricas &lt;EM&gt;Prometheus&lt;/EM&gt; e alertas do &lt;EM&gt;Azure Monitor&lt;/EM&gt;. O desafio não é apenas saber que um contêiner foi encerrado, é determinar por que a memória ultrapassou o limite, qual versão e qual carga estavam envolvidas, qual foi o impacto ao usuário e qual ação reduz risco sem ocultar a causa raiz. Ou seja, transformar sinais distribuídos em uma decisão defensável sobre pressão de tempo.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Telemetria distribuída entre métricas, logs, eventos e histórico de implantação.&lt;/LI&gt;
&lt;LI&gt;Pressão de tempo para restaurar o serviço antes da violação do &lt;EM&gt;SLO&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI&gt;Risco de reinicializações repetitivas que mascaram a ausência de correção estrutural.&lt;/LI&gt;
&lt;LI&gt;Necessidade de aprovação, rastreabilidade e segregação de funções em ambientes regulados.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658635"&gt;&lt;/A&gt;Há ainda um viés operacional relevante: sob pressão, o caminho mais curto, reiniciar o &lt;EM&gt;pod&lt;/EM&gt; ou ampliar o limite de memória, quase sempre funciona no curto prazo. Isso torna difícil distinguir, retrospectivamente, um limite subdimensionado de um vazamento de memória lento, porque a evidência que separaria os dois é descartada junto com o contêiner encerrado.&lt;/P&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658694"&gt;&lt;/A&gt;3. Anatomia técnica do evento &lt;EM&gt;OOMKilled&lt;/EM&gt;&lt;/H1&gt;
&lt;P&gt;Antes de delegar a investigação a um agente, é necessário estabelecer com precisão o que o sinal significa. Boa parte dos diagnósticos incorretos de memória em Kubernetes nasce da confusão entre três mecanismos distintos: o &lt;EM&gt;OOM killer&lt;/EM&gt; do &lt;EM&gt;kernel&lt;/EM&gt; atuando no &lt;EM&gt;cgroup&lt;/EM&gt; do contêiner, o despejo (&lt;EM&gt;eviction&lt;/EM&gt;) decidido pelo &lt;EM&gt;kubelet&lt;/EM&gt; por pressão no nó, e o encerramento por falha da aplicação.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658636"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658695"&gt;&lt;/A&gt;3.1 O caminho do &lt;EM&gt;kernel&lt;/EM&gt;: &lt;EM&gt;cgroups v2&lt;/EM&gt;, &lt;EM&gt;memory.max&lt;/EM&gt; e o &lt;EM&gt;OOM killer&lt;/EM&gt;&lt;/H2&gt;
&lt;P&gt;Quando um contêiner declara &lt;EM&gt;resources.limits.memory&lt;/EM&gt;, o &lt;EM&gt;kubelet&lt;/EM&gt; traduz esse valor para o controlador de memória do &lt;EM&gt;cgroup&lt;/EM&gt; correspondente. Em nós AKS com imagens baseadas em Ubuntu 22.04 ou superior e Azure Linux 3.0, padrão em versões recentes do Kubernetes, o &lt;EM&gt;runtime&lt;/EM&gt; opera sobre &lt;EM&gt;cgroup v2&lt;/EM&gt;, e o limite é materializado no arquivo &lt;EM&gt;memory.max&lt;/EM&gt; do &lt;EM&gt;cgroup&lt;/EM&gt; do contêiner.&lt;/P&gt;
&lt;P&gt;A partir daí, o comportamento é do &lt;EM&gt;kernel&lt;/EM&gt; Linux, não do Kubernetes. Quando as páginas anônimas do &lt;EM&gt;cgroup&lt;/EM&gt; não podem mais ser recuperadas e a alocação ultrapassaria &lt;EM&gt;memory.max&lt;/EM&gt;, o &lt;EM&gt;kernel&lt;/EM&gt; invoca o &lt;EM&gt;OOM killer&lt;/EM&gt; restrito àquele &lt;EM&gt;cgroup&lt;/EM&gt;, escolhe um processo e envia &lt;EM&gt;SIGKILL&lt;/EM&gt;. O contador correspondente é incrementado em &lt;EM&gt;memory.events&lt;/EM&gt;, no campo &lt;EM&gt;oom_kill&lt;/EM&gt;.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;# Dentro do nó, inspecionando o cgroup do contêiner (cgroup v2)&lt;/P&gt;
&lt;P&gt;cat /sys/fs/cgroup/.../memory.max&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # limite efetivo (bytes)&lt;/P&gt;
&lt;P&gt;cat /sys/fs/cgroup/.../memory.high&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # ponto de throttling por reclaim&lt;/P&gt;
&lt;P&gt;cat /sys/fs/cgroup/.../memory.current&amp;nbsp;&amp;nbsp;&amp;nbsp; # uso corrente&lt;/P&gt;
&lt;P&gt;cat /sys/fs/cgroup/.../memory.events&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # low / high / max / oom / oom_kill&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Vale distinguir dois campos frequentemente confundidos em &lt;EM&gt;memory.events&lt;/EM&gt;: &lt;EM&gt;max&lt;/EM&gt; conta quantas vezes a alocação esbarrou no teto e forçou &lt;EM&gt;reclaim&lt;/EM&gt;, enquanto &lt;EM&gt;oom_kill&lt;/EM&gt; conta quantos processos foram efetivamente encerrados. Um valor alto em &lt;EM&gt;max&lt;/EM&gt; com &lt;EM&gt;oom_kill&lt;/EM&gt; igual a zero indica um contêiner operando permanentemente no limite: degradado, porém vivo. É exatamente o estado que antecede o incidente e que raramente dispara alerta.&lt;/P&gt;
&lt;P&gt;Como o processo recebe &lt;EM&gt;SIGKILL&lt;/EM&gt; (sinal 9), o código de saída observado é 137, resultado da convenção &lt;EM&gt;POSIX&lt;/EM&gt; 128 + número do sinal. O &lt;EM&gt;kubelet&lt;/EM&gt; então registra o término e reinicia o contêiner conforme a &lt;EM&gt;restartPolicy&lt;/EM&gt;. É por isso que a evidência canônica não está no status corrente do &lt;EM&gt;pod&lt;/EM&gt;, mas no estado anterior do contêiner:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;kubectl get pod &amp;lt;pod&amp;gt; -n pets -o jsonpath='{.status.containerStatuses[0].lastState.terminated}' | jq&lt;/P&gt;
&lt;P&gt;# Saída esperada em um OOMKill:&lt;/P&gt;
&lt;P&gt;# {&lt;/P&gt;
&lt;P&gt;#&amp;nbsp;&amp;nbsp; "exitCode": 137,&lt;/P&gt;
&lt;P&gt;#&amp;nbsp;&amp;nbsp; "reason": "OOMKilled",&lt;/P&gt;
&lt;P&gt;#&amp;nbsp;&amp;nbsp; "startedAt": "...",&lt;/P&gt;
&lt;P&gt;#&amp;nbsp;&amp;nbsp; "finishedAt": "..."&lt;/P&gt;
&lt;P&gt;# }&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Reinícios sucessivos levam o&amp;nbsp;&lt;EM&gt;pod&lt;/EM&gt; a &lt;EM&gt;CrashLoopBackOff&lt;/EM&gt;, em que o &lt;EM&gt;kubelet&lt;/EM&gt; aplica um atraso exponencial entre tentativas, iniciando na ordem de dezenas de segundos e dobrando até um teto de poucos minutos, cujo valor padrão vem sendo revisado em versões recentes do Kubernetes. Esse atraso é o motivo pelo qual a indisponibilidade percebida cresce ao longo do incidente mesmo sem agravamento da causa raiz.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;3.2 &lt;EM&gt;OOMKilled&lt;/EM&gt; não é &lt;EM&gt;eviction&lt;/EM&gt;: dois mecanismos, duas correções&lt;/H2&gt;
&lt;P&gt;A distinção é operacionalmente decisiva porque as correções divergem: um &lt;EM&gt;OOMKill&lt;/EM&gt; se resolve no manifesto do &lt;EM&gt;workload&lt;/EM&gt;; um despejo se resolve na capacidade ou no agendamento do nó.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1045px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Dimensão&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;OOMKilled&lt;/EM&gt;&lt;/STRONG&gt;&lt;STRONG&gt; (&lt;EM&gt;cgroup&lt;/EM&gt;)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;Eviction&lt;/EM&gt;&lt;/STRONG&gt;&lt;STRONG&gt; (&lt;EM&gt;kubelet&lt;/EM&gt;)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Gatilho&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Alocação excede &lt;EM&gt;memory.max&lt;/EM&gt; do &lt;EM&gt;cgroup&lt;/EM&gt; do contêiner&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;memory.available do nó abaixo do limiar &lt;EM&gt;evictionHard&lt;/EM&gt;/&lt;EM&gt;evictionSoft&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Quem decide&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Kernel&lt;/EM&gt; Linux (&lt;EM&gt;OOM killer&lt;/EM&gt; restrito ao &lt;EM&gt;cgroup&lt;/EM&gt;)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;kubelet&lt;/EM&gt;, ordenando os &lt;EM&gt;pods&lt;/EM&gt; por &lt;EM&gt;QoS&lt;/EM&gt; e excesso sobre &lt;EM&gt;requests&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Escopo&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Um contêiner&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;O &lt;EM&gt;pod&lt;/EM&gt; inteiro, podendo atingir vários &lt;EM&gt;pods&lt;/EM&gt; do nó&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Sinal&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;SIGKILL&lt;/EM&gt; → exit code 137&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Encerramento do &lt;EM&gt;pod&lt;/EM&gt;; sem exit code 137 característico&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Evidência&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;lastState.terminated.reason&lt;/EM&gt; = &lt;EM&gt;OOMKilled&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;status.phase&lt;/EM&gt; = &lt;EM&gt;Failed&lt;/EM&gt;, reason = &lt;EM&gt;Evicted&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Objeto do &lt;EM&gt;pod&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Preservado; contêiner reinicia no mesmo &lt;EM&gt;pod&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Pod&lt;/EM&gt; permanece como registro de falha e é reagendado por seu controlador&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Correção típica&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Ajustar &lt;EM&gt;limits&lt;/EM&gt;/&lt;EM&gt;requests&lt;/EM&gt; ou o consumo da aplicação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Capacidade do nó, &lt;EM&gt;requests&lt;/EM&gt; coerentes, limiares de despejo, distribuição&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 189px" /&gt;&lt;col style="width: 429px" /&gt;&lt;col style="width: 426px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Nota. &lt;/STRONG&gt;Um terceiro caso é frequentemente confundido com ambos: o encerramento do processo principal por erro da aplicação, que produz códigos de saída próprios (1, 2, 143 para &lt;EM&gt;SIGTERM&lt;/EM&gt;). Verificar &lt;EM&gt;exitCode&lt;/EM&gt; e reason antes de concluir por memória evita corrigir o sintoma errado.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658638"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658697"&gt;&lt;/A&gt;3.3 Classes de &lt;EM&gt;QoS&lt;/EM&gt; e a ordem em que os &lt;EM&gt;pods&lt;/EM&gt; são sacrificados&lt;/H2&gt;
&lt;P&gt;O Kubernetes deriva a classe de &lt;EM&gt;Quality of Service&lt;/EM&gt; de cada &lt;EM&gt;pod&lt;/EM&gt; a partir da relação entre &lt;EM&gt;requests&lt;/EM&gt; e &lt;EM&gt;limits&lt;/EM&gt;. Essa classe não é apenas rótulo: ela determina a prioridade de despejo e influencia diretamente o valor de &lt;EM&gt;oom_score_adj&lt;/EM&gt; atribuído aos processos do contêiner.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1028px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Classe de &lt;EM&gt;QoS&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Condição&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Prioridade de despejo&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Guaranteed&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;requests&lt;/EM&gt; iguais a &lt;EM&gt;limits&lt;/EM&gt; para CPU e memória em todos os contêineres&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Última a ser despejada&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Burstable&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Pelo menos um &lt;EM&gt;request&lt;/EM&gt; ou &lt;EM&gt;limit&lt;/EM&gt; definido, sem igualdade entre eles&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Intermediária, proporcional ao excesso sobre o &lt;EM&gt;request&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;BestEffort&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Nenhum &lt;EM&gt;request&lt;/EM&gt; ou &lt;EM&gt;limit&lt;/EM&gt; definido&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Primeira a ser despejada&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 173px" /&gt;&lt;col style="width: 431px" /&gt;&lt;col style="width: 422px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Para &lt;EM&gt;pods&lt;/EM&gt; &lt;EM&gt;Burstable&lt;/EM&gt;, o &lt;EM&gt;kubelet&lt;/EM&gt; calcula &lt;EM&gt;oom_score_adj&lt;/EM&gt; em função da fração da memória do nó reservada pelo &lt;EM&gt;request&lt;/EM&gt;: quanto menor o &lt;EM&gt;request&lt;/EM&gt; em relação à capacidade do nó, maior o score e mais atraente o processo se torna para o &lt;EM&gt;OOM killer&lt;/EM&gt;. &lt;EM&gt;Pods&lt;/EM&gt; &lt;EM&gt;Guaranteed&lt;/EM&gt; recebem um valor fortemente negativo, e &lt;EM&gt;pods&lt;/EM&gt; &lt;EM&gt;BestEffort&lt;/EM&gt; recebem o valor máximo.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Aplicação ao laboratório&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O &lt;EM&gt;order-service&lt;/EM&gt; deste cenário declara &lt;EM&gt;requests&lt;/EM&gt; de 10 Mi e &lt;EM&gt;limits&lt;/EM&gt; de 20 Mi. A desigualdade entre os dois o classifica como &lt;EM&gt;Burstable&lt;/EM&gt;, e o &lt;EM&gt;request&lt;/EM&gt; muito baixo em relação à capacidade do nó eleva seu &lt;EM&gt;oom_score_adj&lt;/EM&gt;. O &lt;EM&gt;workload&lt;/EM&gt; é, portanto, simultaneamente o mais provável de estourar o próprio limite e um dos primeiros candidatos ao &lt;EM&gt;OOM killer&lt;/EM&gt; sob pressão do nó, combinação que o torna um caso de teste representativo.&lt;/P&gt;
&lt;P&gt;Há uma consequência de projeto pouco explorada: elevar apenas o &lt;EM&gt;limit&lt;/EM&gt; sem elevar o &lt;EM&gt;request&lt;/EM&gt; melhora a sobrevivência ao &lt;EM&gt;OOMKill&lt;/EM&gt; do &lt;EM&gt;cgroup&lt;/EM&gt;, mas mantém o &lt;EM&gt;pod&lt;/EM&gt; vulnerável em cenários de pressão do nó, porque o agendador continua reservando pouca memória para ele. Foi exatamente por isso que a recomendação do agente no laboratório ajustou os dois valores, e não apenas o limite.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658639"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658698"&gt;&lt;/A&gt;3.4 &lt;EM&gt;Working set&lt;/EM&gt;, &lt;EM&gt;RSS&lt;/EM&gt; e por que o &lt;EM&gt;dashboard&lt;/EM&gt; pode enganar&lt;/H2&gt;
&lt;P&gt;A métrica que melhor aproxima a decisão do &lt;EM&gt;OOM killer&lt;/EM&gt; é o &lt;EM&gt;working set&lt;/EM&gt;, e não o &lt;EM&gt;RSS&lt;/EM&gt;. Em cAdvisor, a fonte de &lt;EM&gt;container_memory_working_set_bytes&lt;/EM&gt; e da métrica &lt;EM&gt;memoryWorkingSetBytes&lt;/EM&gt; exposta pelo &lt;EM&gt;Container Insights&lt;/EM&gt;, o &lt;EM&gt;working set&lt;/EM&gt; corresponde ao uso total do &lt;EM&gt;cgroup&lt;/EM&gt; menos o &lt;EM&gt;page cache&lt;/EM&gt; inativo, isto é, a porção da memória que o &lt;EM&gt;kernel&lt;/EM&gt; não conseguiria liberar trivialmente sob pressão.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1045px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Métrica&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;O que representa&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Uso recomendado&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;container_memory_working_set_bytes&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Uso do &lt;EM&gt;cgroup&lt;/EM&gt; menos &lt;EM&gt;page cache&lt;/EM&gt; inativo&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Referência para alertas e para dimensionar &lt;EM&gt;limits&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;container_memory_rss&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Páginas anônimas residentes do processo&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Investigação de vazamento no &lt;EM&gt;heap&lt;/EM&gt; da aplicação&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;container_memory_usage_bytes&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Uso total, incluindo &lt;EM&gt;page cache&lt;/EM&gt; reclaimável&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Diagnóstico; superestima a pressão real&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;container_memory_cache&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Page cache&lt;/EM&gt; atribuído ao &lt;EM&gt;cgroup&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Explicar divergência entre usage e &lt;EM&gt;working set&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 296px" /&gt;&lt;col style="width: 365px" /&gt;&lt;col style="width: 383px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A armadilha prática: um painel construído sobre &lt;EM&gt;container_memory_usage_bytes&lt;/EM&gt; pode indicar uso próximo ao limite sem risco real, porque boa parte é &lt;EM&gt;cache&lt;/EM&gt; recuperável. Inversamente, um painel com média de 5 minutos pode mostrar 60% de uso e ainda assim o contêiner ser encerrado, porque o &lt;EM&gt;OOM killer&lt;/EM&gt; reage a um pico instantâneo que a agregação suavizou. Alertas de memória devem usar &lt;EM&gt;working set&lt;/EM&gt; e agregação por máximo, não por média.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658640"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658699"&gt;&lt;/A&gt;3.5 &lt;EM&gt;Heap&lt;/EM&gt; do &lt;EM&gt;runtime&lt;/EM&gt; versus limite do contêiner&lt;/H2&gt;
&lt;P&gt;Uma causa frequente de &lt;EM&gt;OOMKilled&lt;/EM&gt; não está no limite em si, mas no desalinhamento entre o limite do &lt;EM&gt;cgroup&lt;/EM&gt; e a política de &lt;EM&gt;heap&lt;/EM&gt; do &lt;EM&gt;runtime&lt;/EM&gt;. &lt;EM&gt;Runtimes&lt;/EM&gt; que dimensionam o &lt;EM&gt;heap&lt;/EM&gt; a partir da memória visível do host, e não do limite do &lt;EM&gt;cgroup&lt;/EM&gt;, planejam crescer muito além do que o contêiner pode alocar, e o &lt;EM&gt;kernel&lt;/EM&gt; encerra o processo antes que o coletor de lixo julgue necessário agir.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1054px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;Runtime&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Controle recomendado&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Observação&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Node.js&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;--max-old-space-size&lt;/EM&gt; (MB)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Fixar abaixo do limite do contêiner; o &lt;EM&gt;order-service&lt;/EM&gt; deste laboratório é &lt;EM&gt;Node.js&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;JVM&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;-XX:&lt;EM&gt;MaxRAMPercentage&lt;/EM&gt; com &lt;EM&gt;UseContainerSupport&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Reservar espaço para &lt;EM&gt;metaspace&lt;/EM&gt;, &lt;EM&gt;threads&lt;/EM&gt; e &lt;EM&gt;buffers&lt;/EM&gt; fora do &lt;EM&gt;heap&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;.NET&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;DOTNET_GCHeapHardLimitPercent&lt;/EM&gt;; avaliar &lt;EM&gt;Server GC&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Server GC&lt;/EM&gt; eleva o consumo por número de núcleos visíveis&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Go&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;GOMEMLIMIT&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Limite flexível: intensifica a coleta em vez de abortar&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Python&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Limitar &lt;EM&gt;workers&lt;/EM&gt; e pool de conexões&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Sem &lt;EM&gt;heap&lt;/EM&gt; gerenciado; o consumo escala com concorrência&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 203px" /&gt;&lt;col style="width: 407px" /&gt;&lt;col style="width: 443px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658641"&gt;&lt;/A&gt;Regra prática: o limite do contêiner deve acomodar o &lt;EM&gt;heap&lt;/EM&gt; máximo do &lt;EM&gt;runtime&lt;/EM&gt; somada a memória fora do &lt;EM&gt;heap&lt;/EM&gt;, pilhas de &lt;EM&gt;threads&lt;/EM&gt;, &lt;EM&gt;buffers&lt;/EM&gt; de &lt;EM&gt;I/O&lt;/EM&gt;, conexões, bibliotecas nativas e o próprio &lt;EM&gt;page cache&lt;/EM&gt; anônimo. Dimensionar o &lt;EM&gt;heap&lt;/EM&gt; igual ao limite do contêiner é uma causa clássica de &lt;EM&gt;OOMKilled&lt;/EM&gt; sob carga.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658700"&gt;&lt;/A&gt;3.6 Causas frequentes&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;Limite subdimensionado: o consumo legítimo da carga excede o valor configurado, como ocorre neste laboratório.&lt;/LI&gt;
&lt;LI&gt;Vazamento de memória: o processo retém memória de forma progressiva entre requisições.&lt;/LI&gt;
&lt;LI&gt;Pico de tráfego ou &lt;EM&gt;payload&lt;/EM&gt; atípico: a demanda transitória ultrapassa a capacidade provisionada.&lt;/LI&gt;
&lt;LI&gt;Concorrência excessiva: &lt;EM&gt;workers&lt;/EM&gt;, filas ou caches locais ampliam o &lt;EM&gt;working set&lt;/EM&gt; de forma não linear.&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Requests&lt;/EM&gt; e &lt;EM&gt;limits&lt;/EM&gt; incoerentes: o agendamento e a contenção não refletem o perfil real de consumo.&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;Heap&lt;/EM&gt; do &lt;EM&gt;runtime&lt;/EM&gt; maior que o limite do &lt;EM&gt;cgroup&lt;/EM&gt;: o processo planeja crescer além do permitido.&lt;/LI&gt;
&lt;LI&gt;Valores herdados de um dimensionamento anterior que nunca foi revisado após mudanças de código ou de carga.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658642"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658701"&gt;&lt;/A&gt;4. Impactos para aplicações web em AKS&lt;/H1&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 998px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Dimensão&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Impacto potencial&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Usuário&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Erros &lt;EM&gt;HTTP&lt;/EM&gt; &lt;EM&gt;5xx&lt;/EM&gt;, &lt;EM&gt;timeouts&lt;/EM&gt;, perda de sessão e latência elevada.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Aplicação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Interrupção de requisições em andamento, reprocessamento e perda de &lt;EM&gt;cache&lt;/EM&gt; local.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Plataforma&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;CrashLoopBackOff&lt;/EM&gt;, aumento de &lt;EM&gt;restarts&lt;/EM&gt; e pressão sobre outros &lt;EM&gt;pods&lt;/EM&gt; ou nós.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Negócio&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Violação de &lt;EM&gt;SLO&lt;/EM&gt;, risco à receita e degradação da experiência digital.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Operações&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Escalonamento de plantão, investigação manual e aumento do &lt;EM&gt;MTTR&lt;/EM&gt;.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 324px" /&gt;&lt;col style="width: 674px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Um agravante específico do &lt;EM&gt;OOMKilled&lt;/EM&gt; é o efeito em cascata: ao reiniciar, o contêiner reconstrói caches e refaz conexões, produzindo um pico de consumo de memória e CPU justamente no momento em que a capacidade agregada do serviço está reduzida. Isso pode encadear novos encerramentos em réplicas ainda saudáveis e transformar uma falha localizada em degradação do serviço.&lt;/P&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658643"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658702"&gt;&lt;/A&gt;5. Detecção: sinais, consultas e desenho do alerta&lt;/H1&gt;
&lt;P&gt;A qualidade da investigação assistida depende da qualidade dos sinais disponíveis. Esta seção consolida as consultas usadas para detectar &lt;EM&gt;OOMKilled&lt;/EM&gt; em AKS e o desenho da regra de alerta empregada no laboratório.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658644"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658703"&gt;&lt;/A&gt;5.1 Sinais canônicos&lt;/H2&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;
&lt;P&gt;&lt;STRONG&gt;# Estado atual e contagem de reinícios&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;kubectl get pods -n pets -o wide&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;# Razão do término anterior, a evidência decisiva&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;kubectl get pods -n pets -o custom-columns=\&lt;/P&gt;
&lt;P&gt;NAME:.metadata.name,\&lt;/P&gt;
&lt;P&gt;STATUS:.status.phase,\&lt;/P&gt;
&lt;P&gt;RESTARTS:.status.containerStatuses[0].restartCount,\&lt;/P&gt;
&lt;P&gt;REASON:.status.containerStatuses[0].lastState.terminated.reason,\&lt;/P&gt;
&lt;P&gt;EXIT:.status.containerStatuses[0].lastState.terminated.exitCode&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;# Limites efetivamente aplicados ao contêiner&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;kubectl get deployment order-service -n pets \&lt;/P&gt;
&lt;P&gt;&amp;nbsp; -o jsonpath='{.spec.template.spec.containers[0].resources}'&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;# Eventos correlatos na janela do incidente&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;kubectl get events -n pets --sort-by=.lastTimestamp&lt;/P&gt;
&lt;/DIV&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658645"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658704"&gt;&lt;/A&gt;5.2 Consultas &lt;EM&gt;KQL&lt;/EM&gt; no &lt;EM&gt;Log Analytics&lt;/EM&gt;&lt;/H2&gt;
&lt;P&gt;Com &lt;EM&gt;Container Insights&lt;/EM&gt; habilitado, o inventário de &lt;EM&gt;pods&lt;/EM&gt; carrega o estado anterior de cada contêiner em formato JSON, o que permite isolar terminações por &lt;EM&gt;OOMKilled&lt;/EM&gt; diretamente na consulta:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;
&lt;P&gt;&lt;STRONG&gt;// Contêineres encerrados por OOMKilled nas últimas 6 horas&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;KubePodInventory&lt;/P&gt;
&lt;P&gt;| where TimeGenerated &amp;gt; ago(6h)&lt;/P&gt;
&lt;P&gt;| where isnotempty(ContainerLastStatus)&lt;/P&gt;
&lt;P&gt;| extend LastStatus = parse_json(ContainerLastStatus)&lt;/P&gt;
&lt;P&gt;| where tostring(LastStatus.reason) == "OOMKilled"&lt;/P&gt;
&lt;P&gt;| project TimeGenerated, ClusterName, Namespace, Name,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ContainerName = ContainerName,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ExitCode = toint(LastStatus.exitCode),&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RestartCount = ContainerRestartCount,&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FinishedAt = todatetime(LastStatus.finishedAt)&lt;/P&gt;
&lt;P&gt;| summarize Ocorrencias = count(),&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ultima = max(FinishedAt),&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MaxRestarts = max(RestartCount)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by ClusterName, Namespace, ContainerName&lt;/P&gt;
&lt;P&gt;| order by Ocorrencias desc&lt;/P&gt;
&lt;/DIV&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Os eventos do Kubernetes oferecem uma segunda camada de confirmação, útil quando o intervalo de coleta do inventário perde uma terminação de curta duração:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;
&lt;P&gt;&lt;STRONG&gt;// Eventos de OOM e falhas de inicialização correlatas&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;KubeEvents&lt;/P&gt;
&lt;P&gt;| where TimeGenerated &amp;gt; ago(6h)&lt;/P&gt;
&lt;P&gt;| where Reason in ("OOMKilling", "OOMKilled", "BackOff", "Failed")&lt;/P&gt;
&lt;P&gt;| project TimeGenerated, ClusterName, Namespace, Name, Reason, Message&lt;/P&gt;
&lt;P&gt;| order by TimeGenerated desc&lt;/P&gt;
&lt;/DIV&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Para separar limite subdimensionado de vazamento, a consulta relevante é a tendência do &lt;EM&gt;working set&lt;/EM&gt; contra o limite declarado. Um platô estável junto ao teto sugere subdimensionamento; uma inclinação positiva sustentada entre reinícios sugere retenção progressiva:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;
&lt;P&gt;&lt;STRONG&gt;// Working set máximo por contêiner, em janelas de 5 minutos&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Perf&lt;/P&gt;
&lt;P&gt;| where TimeGenerated &amp;gt; ago(24h)&lt;/P&gt;
&lt;P&gt;| where ObjectName == "K8SContainer"&lt;/P&gt;
&lt;P&gt;| where CounterName == "memoryWorkingSetBytes"&lt;/P&gt;
&lt;P&gt;| summarize MaxWorkingSetMi = max(CounterValue) / 1024 / 1024&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; by bin(TimeGenerated, 5m), InstanceName&lt;/P&gt;
&lt;P&gt;| render timechart&lt;/P&gt;
&lt;/DIV&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658646"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658705"&gt;&lt;/A&gt;5.3 Equivalentes em &lt;EM&gt;PromQL&lt;/EM&gt;&lt;/H2&gt;
&lt;P&gt;Em clusters com &lt;EM&gt;Azure Monitor managed service for Prometheus&lt;/EM&gt;, os mesmos sinais ficam disponíveis como séries temporais, o que facilita alertas baseados em razão de utilização:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;
&lt;P&gt;&lt;STRONG&gt;# Razão entre working set e limite declarado, por pod&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;max by (namespace, pod, container) (&lt;/P&gt;
&lt;P&gt;&amp;nbsp; container_memory_working_set_bytes{namespace="pets", container!=""}&lt;/P&gt;
&lt;P&gt;)&lt;/P&gt;
&lt;P&gt;/&lt;/P&gt;
&lt;P&gt;max by (namespace, pod, container) (&lt;/P&gt;
&lt;P&gt;&amp;nbsp; kube_pod_container_resource_limits{namespace="pets", resource="memory"}&lt;/P&gt;
&lt;P&gt;)&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;# Contêineres cuja última terminação foi OOMKilled&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;kube_pod_container_status_last_terminated_reason{reason="OOMKilled"} == 1&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;# Taxa de reinícios na última hora&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;increase(kube_pod_container_status_restarts_total{namespace="pets"}[1h]) &amp;gt; 0&lt;/P&gt;
&lt;/DIV&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Nota. &lt;/STRONG&gt;Um alerta preventivo sobre a razão &lt;EM&gt;working set&lt;/EM&gt; / limite acima de 0,85 por vários minutos antecipa o incidente antes do primeiro &lt;EM&gt;OOMKill&lt;/EM&gt;, transformando uma interrupção em uma tarefa de dimensionamento planejada. Essa é a regra que mais reduz incidentes desta classe.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658647"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658706"&gt;&lt;/A&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H2&gt;5.4 Desenho da regra de alerta utilizada no laboratório&lt;/H2&gt;
&lt;P&gt;A regra empregada no cenário é uma Log Alert V2 sobre o &lt;EM&gt;workspace&lt;/EM&gt; do &lt;EM&gt;Log Analytics&lt;/EM&gt;, avaliando a consulta de &lt;EM&gt;OOMKilled&lt;/EM&gt; e disparando quando a contagem de resultados é maior que zero.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1073px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Parâmetro&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Valor no laboratório&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Consideração de produção&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Tipo&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Log search alert&lt;/EM&gt; (&lt;EM&gt;Log Alerts V2&lt;/EM&gt;)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Consultas sobre logs; considerar alerta de métrica para latência menor&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Escopo&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Workspace&lt;/EM&gt; do &lt;EM&gt;Log Analytics&lt;/EM&gt; do cluster&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Escopo por cluster ou por assinatura, conforme o modelo de plantão&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Lógica&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Contagem de resultados maior que 0&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Aumentar o limiar para tolerar reinícios isolados e evitar ruído&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Severidade&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;1, &lt;EM&gt;Error&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Alinhar à criticidade do serviço e à política de plantão&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Frequência / janela&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Avaliação periódica sobre janela curta&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Janela igual ou maior que a frequência, para não perder eventos&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Ação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Action group&lt;/EM&gt; com notificação por e-mail&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Encaminhar também a &lt;EM&gt;ITSM&lt;/EM&gt;/&lt;EM&gt;PagerDuty&lt;/EM&gt; e ao gatilho do agente&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Auto-resolução&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Padrão da regra&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Habilitar para incidentes transitórios; desabilitar se exigir baixa manual&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 196px" /&gt;&lt;col style="width: 360px" /&gt;&lt;col style="width: 515px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Latência esperada de ponta a ponta&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658648"&gt;&lt;/A&gt;No laboratório, o &lt;EM&gt;pod&lt;/EM&gt; entrou em &lt;EM&gt;OOMKilled&lt;/EM&gt; às 17h45 e a notificação chegou às 17h47. Esses dois minutos somam ingestão no &lt;EM&gt;Log Analytics&lt;/EM&gt;, período de avaliação da regra e entrega pelo &lt;EM&gt;action group&lt;/EM&gt;. Alertas baseados em log carregam essa latência por construção, um dado relevante ao definir &lt;EM&gt;SLOs&lt;/EM&gt; de detecção e ao decidir entre alerta de log e alerta de métrica.&lt;/P&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658707"&gt;&lt;/A&gt;6. O processo tradicional e seus limites&lt;/H1&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658649"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658708"&gt;&lt;/A&gt;6.1 Fluxo típico de resposta&lt;/H2&gt;
&lt;OL&gt;
&lt;LI&gt;O &lt;EM&gt;Azure Monitor&lt;/EM&gt; dispara o alerta e notifica o plantão.&lt;/LI&gt;
&lt;LI&gt;O plantonista abre o portal, os &lt;EM&gt;dashboards&lt;/EM&gt; e o &lt;EM&gt;Log Analytics&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI&gt;Executa comandos &lt;EM&gt;kubectl&lt;/EM&gt; para localizar o &lt;EM&gt;pod&lt;/EM&gt; e confirmar a razão do término.&lt;/LI&gt;
&lt;LI&gt;Compara consumo, limite, reinícios, eventos e alterações recentes.&lt;/LI&gt;
&lt;LI&gt;Formula uma hipótese, reinicia ou reimplanta o &lt;EM&gt;workload&lt;/EM&gt; e acompanha a recuperação.&lt;/LI&gt;
&lt;LI&gt;Registra evidências e ações no sistema &lt;EM&gt;ITSM&lt;/EM&gt;.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658650"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658709"&gt;&lt;/A&gt;6.2 Limitações do modelo reativo&lt;/H2&gt;
&lt;P&gt;Esse fluxo depende da experiência individual, exige alternância constante entre ferramentas e produz decisões inconsistentes entre plantonistas. Um &lt;EM&gt;restart&lt;/EM&gt; reduz o sintoma, mas não distingue vazamento de memória, limite inadequado ou pico legítimo de carga.&lt;/P&gt;
&lt;P&gt;Sob pressão, cresce também o risco de ampliar recursos sem validação, perder evidências ao encerrar o contêiner afetado ou executar ações privilegiadas fora do processo de mudança. O custo mais alto, porém, é invisível: o conhecimento produzido durante a investigação permanece no indivíduo e não fica disponível para o próximo incidente da mesma classe.&lt;/P&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658651"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658710"&gt;&lt;/A&gt;7. Azure SRE Agent: arquitetura e modelo operacional&lt;/H1&gt;
&lt;P&gt;O Azure SRE Agent é um agente de confiabilidade que conecta fontes de observabilidade, plataformas de incidente, repositórios de código e conhecimento operacional. Ele investiga causas prováveis, propõe mitigações e automatiza respostas orientadas por planos e &lt;EM&gt;runbooks&lt;/EM&gt;, dentro de &lt;EM&gt;guardrails&lt;/EM&gt; e fluxos de aprovação.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Princípio de arquitetura&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O &lt;EM&gt;Azure Monitor&lt;/EM&gt; permanece como fonte de detecção e evidência. O SRE Agent atua como camada de investigação, decisão e orquestração governada. O agente não substitui a observabilidade: ele consome e correlaciona o que ela produz.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658652"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658711"&gt;&lt;/A&gt;7.1 Fontes de contexto&lt;/H2&gt;
&lt;P&gt;A qualidade do diagnóstico é função direta das fontes conectadas. Durante a configuração, o agente solicita explicitamente a associação de quatro categorias de contexto.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1060px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Fonte&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;O que habilita&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Uso no cenário &lt;EM&gt;OOMKilled&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Recursos do Azure&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Consultar e operar recursos por meio da identidade do agente&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Ler o estado do cluster AKS e aplicar a mitigação aprovada&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Logs&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Consultar &lt;EM&gt;workspaces&lt;/EM&gt; do &lt;EM&gt;Log Analytics&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Correlacionar eventos, inventário de &lt;EM&gt;pods&lt;/EM&gt; e métricas de &lt;EM&gt;working set&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Código&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Acessar repositórios e artefatos de engenharia&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Relacionar o limite aplicado ao manifesto de origem&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Incidentes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Integrar &lt;EM&gt;Azure Monitor&lt;/EM&gt;, &lt;EM&gt;ServiceNow&lt;/EM&gt; e &lt;EM&gt;PagerDuty&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Receber o alerta e vincular a investigação ao incidente&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 166px" /&gt;&lt;col style="width: 455px" /&gt;&lt;col style="width: 438px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658653"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658712"&gt;&lt;/A&gt;7.2 Execução por ferramentas e classificação de risco&lt;/H2&gt;
&lt;P&gt;O agente não age por um canal opaco, cada passo é uma chamada de ferramenta explícita, um comando da &lt;EM&gt;CLI&lt;/EM&gt; do Azure, uma consulta &lt;EM&gt;KQL&lt;/EM&gt;, um comando &lt;EM&gt;kubectl&lt;/EM&gt;, apresentada na &lt;EM&gt;thread&lt;/EM&gt; com o comando exato e uma classificação de risco associada. No laboratório, comandos de leitura como az aks &lt;EM&gt;show&lt;/EM&gt; aparecem marcados como &lt;EM&gt;Safe&lt;/EM&gt;, enquanto operações como &lt;EM&gt;kubectl&lt;/EM&gt; &lt;EM&gt;get&lt;/EM&gt; &lt;EM&gt;deployments&lt;/EM&gt; e &lt;EM&gt;kubectl&lt;/EM&gt; &lt;EM&gt;patch&lt;/EM&gt; recebem a marcação &lt;EM&gt;Medium risk&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;Essa transparência tem duas consequências práticas. A primeira é auditoria: a &lt;EM&gt;thread&lt;/EM&gt; registra a sequência exata de comandos, permitindo reconstruir a investigação. A segunda é revisão: o operador avalia o comando concreto, não uma descrição em linguagem natural do que o agente pretende fazer.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658654"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658713"&gt;&lt;/A&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;H2&gt;7.3 Modos de execução (&lt;EM&gt;Run Modes&lt;/EM&gt;)&lt;/H2&gt;
&lt;P&gt;Os modos de execução controlam o fluxo de aprovação, isto é, se o agente pergunta antes de agir. É importante separar esse conceito das permissões, que controlam o acesso ao recurso. O agente precisa das duas condições satisfeitas para executar uma ação.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1039px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Modo&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Comportamento&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Indicação&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Review&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;O agente propõe a ação e aguarda &lt;EM&gt;Approve&lt;/EM&gt; ou &lt;EM&gt;Deny&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Produção, infraestrutura crítica, alertas de segurança&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Autonomous&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;O agente executa imediatamente e relata o que fez&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Ambientes de não produção e tarefas recorrentes confiáveis&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 215px" /&gt;&lt;col style="width: 418px" /&gt;&lt;col style="width: 405px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Três detalhes que mudam o desenho de governança&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Primeiro: o modo de execução é definido por plano de resposta e por tarefa agendada, não no nível do agente; a configuração do agente serve apenas como padrão de fallback. Segundo: os botões &lt;EM&gt;Approve&lt;/EM&gt; e &lt;EM&gt;Deny&lt;/EM&gt; aparecem para operações de infraestrutura do Azure; outras ações, como enviar e-mail, publicar no Teams ou consultar fontes externas, seguem a instrução do plano de resposta e exigem &lt;EM&gt;hooks&lt;/EM&gt; ou políticas de acesso a ferramentas para receber controle equivalente. Terceiro: apenas administradores do SRE Agent podem aprovar ações, o que materializa a segregação de funções.&lt;/P&gt;
&lt;P&gt;Uma observação de adoção relevante: os planos de resposta e as tarefas agendadas assumem &lt;EM&gt;Autonomous&lt;/EM&gt; como padrão, enquanto o agente é criado em &lt;EM&gt;Review&lt;/EM&gt;. Assumir que criar o agente em &lt;EM&gt;Review&lt;/EM&gt; protege automaticamente todos os fluxos é um erro de configuração fácil de cometer e caro de descobrir.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658655"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658714"&gt;&lt;/A&gt;7.4 Permissões, escopo e elevação sob demanda&lt;/H2&gt;
&lt;P&gt;O agente opera por meio de uma identidade gerenciada, e o que ele consegue fazer é delimitado pelas atribuições &lt;EM&gt;RBAC&lt;/EM&gt; dessa identidade e pelo escopo em que foram concedidas. Quando o agente não possui a permissão necessária para uma operação, ele solicita acesso temporário por meio do fluxo &lt;EM&gt;On-Behalf-Of&lt;/EM&gt; do &lt;EM&gt;Microsoft Entra&lt;/EM&gt;, em vez de falhar silenciosamente.&lt;/P&gt;
&lt;P&gt;Esse comportamento é arquiteturalmente importante: ele permite conceder à identidade do agente um conjunto mínimo e permanente de permissões de leitura, deixando as operações de escrita dependentes de uma elevação explícita e rastreável. É o oposto do padrão adotado no laboratório, que concede permissões amplas por conveniência de demonstração.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658656"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658715"&gt;&lt;/A&gt;7.5 &lt;EM&gt;Hooks&lt;/EM&gt; e políticas de acesso a ferramentas&lt;/H2&gt;
&lt;P&gt;&lt;EM&gt;Hooks&lt;/EM&gt; são pontos de verificação personalizados que validam, auditam ou bloqueiam o comportamento do agente em momentos específicos do fluxo. Eles complementam os modos de execução: enquanto os modos controlam quando o agente pode agir, os &lt;EM&gt;hooks&lt;/EM&gt; controlam o que acontece antes e depois de cada ação.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1044px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Evento&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Quando dispara&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Aplicações típicas&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;PostToolUse&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Após a execução de uma ferramenta&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Auditar o uso, bloquear ou sinalizar operações inseguras, injetar contexto adicional no resultado&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Stop&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Quando o agente vai devolver a resposta final&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Validar completude, exigir formato, rejeitar a resposta e forçar continuidade da investigação&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 201px" /&gt;&lt;col style="width: 371px" /&gt;&lt;col style="width: 472px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Tipos de execução: &lt;EM&gt;Prompt&lt;/EM&gt;, avaliado pelo modelo para verificações que exigem julgamento; e &lt;EM&gt;Command&lt;/EM&gt;, script determinístico para auditoria e aplicação de política.&lt;/LI&gt;
&lt;LI&gt;Escopos de configuração: no nível do agente, aplicando-se a todas as &lt;EM&gt;threads&lt;/EM&gt;; ou no nível de um agente personalizado. Quando ambos correspondem, os dois executam.&lt;/LI&gt;
&lt;LI&gt;Políticas de acesso a ferramentas complementam os &lt;EM&gt;hooks&lt;/EM&gt; ao restringir previamente quais ferramentas podem ser invocadas em cada contexto.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658657"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658716"&gt;&lt;/A&gt;7.6 Provedor de modelo e residência de dados&lt;/H2&gt;
&lt;P&gt;O provedor de modelo é escolhido na criação do agente e pode ser alterado depois, sem recriar o recurso. Há duas famílias disponíveis, com perfis distintos: modelos do &lt;EM&gt;Azure OpenAI&lt;/EM&gt; e modelos &lt;EM&gt;Anthropic Claude&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;Para organizações reguladas, essa escolha ultrapassa o critério de qualidade de raciocínio e entra no domínio de conformidade: os provedores diferem quanto à cobertura de requisitos de residência de dados, incluindo o &lt;EM&gt;EU Data Boundary&lt;/EM&gt;, e a disponibilidade varia por região. A recomendação é validar os requisitos de residência e a lista de regiões suportadas na documentação vigente antes de padronizar o provedor para cargas de produção.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658658"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658717"&gt;&lt;/A&gt;7.7 Modelo de consumo&lt;/H2&gt;
&lt;P&gt;O consumo do agente é medido em &lt;EM&gt;Azure Agent Units&lt;/EM&gt; e combina dois componentes: um fluxo contínuo, associado à existência do agente e ao monitoramento de base, e um fluxo ativo, proporcional aos &lt;EM&gt;tokens&lt;/EM&gt; processados durante investigações. Modelos com janelas de contexto maiores tendem a consumir mais no fluxo ativo.&lt;/P&gt;
&lt;P&gt;A implicação de &lt;EM&gt;FinOps&lt;/EM&gt; é direta: o custo escala com o volume de investigações e com a profundidade do contexto conectado, não com o número de recursos monitorados. Reduzir alertas ruidosos diminui o custo do agente pelo mesmo mecanismo que reduz a fadiga do plantão. Consulte a página de preços para os valores vigentes.&lt;/P&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658659"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658718"&gt;&lt;/A&gt;8. Processo de resposta com o SRE Agent&lt;/H1&gt;
&lt;OL&gt;
&lt;LI&gt;Receber e classificar: consumir o incidente do &lt;EM&gt;Azure Monitor&lt;/EM&gt; e aplicar filtros por severidade, serviço e título.&lt;/LI&gt;
&lt;LI&gt;Coletar evidências: consultar &lt;EM&gt;Log Analytics&lt;/EM&gt;, métricas, eventos do Kubernetes, estado do &lt;EM&gt;pod&lt;/EM&gt;, histórico de implantação e &lt;EM&gt;runbooks&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI&gt;Formar hipóteses: comparar limite versus uso, tendência temporal, &lt;EM&gt;payload&lt;/EM&gt;, versão implantada e eventos correlatos.&lt;/LI&gt;
&lt;LI&gt;Validar: sustentar cada hipótese com evidência observável e registrar as alternativas descartadas.&lt;/LI&gt;
&lt;LI&gt;Recomendar: apresentar ação imediata, correção estrutural, risco associado e critérios de rollback.&lt;/LI&gt;
&lt;LI&gt;Agir sob governança: executar apenas ações pré-autorizadas ou aguardar aprovação, conforme o modo de execução do plano.&lt;/LI&gt;
&lt;LI&gt;Verificar e aprender: confirmar a estabilidade, documentar o resultado e enriquecer a memória operacional.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;A etapa 4 é a que mais diferencia uma investigação assistida de uma sugestão genérica. Um diagnóstico útil não afirma apenas qual é a causa provável: registra qual evidência sustenta a conclusão, qual hipótese foi descartada e por quê. É esse registro que permite ao operador revisar a decisão em segundos, em vez de refazer a investigação.&lt;/P&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658660"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658719"&gt;&lt;/A&gt;9. Cenário do incidente&lt;/H1&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658661"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658720"&gt;&lt;/A&gt;9.1 Situação&lt;/H2&gt;
&lt;P&gt;O serviço &lt;EM&gt;order-service&lt;/EM&gt;, no &lt;EM&gt;namespace&lt;/EM&gt; pets, processa requisições de uma aplicação web de comércio eletrônico. Após aumento de tráfego e uso de &lt;EM&gt;payloads&lt;/EM&gt; maiores, as réplicas passam a reiniciar. O &lt;EM&gt;Azure Monitor&lt;/EM&gt; detecta a elevação na contagem de reinicializações e a ocorrência de eventos &lt;EM&gt;OOMKilled&lt;/EM&gt;.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658662"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658721"&gt;&lt;/A&gt;9.2 Linha de investigação&lt;/H2&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1078px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;#&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Evidência buscada&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Interpretação&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;1&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;reason igual a &lt;EM&gt;OOMKilled&lt;/EM&gt; e &lt;EM&gt;exitCode&lt;/EM&gt; 137 em &lt;EM&gt;lastState&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Encerramento pelo &lt;EM&gt;kernel&lt;/EM&gt; por ultrapassagem do limite do &lt;EM&gt;cgroup&lt;/EM&gt;, não falha da aplicação.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;2&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Working set&lt;/EM&gt; atingindo o limite declarado&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Distinguir limite inadequado de crescimento anômalo entre requisições.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;3&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Pico correlacionado a tráfego ou tamanho de &lt;EM&gt;payload&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Avaliar comportamento legítimo versus retenção progressiva de memória.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;4&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Implantação recente do &lt;EM&gt;workload&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Determinar se houve regressão em código ou em configuração de recursos.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;5&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Contagem de &lt;EM&gt;restarts&lt;/EM&gt; e erros &lt;EM&gt;HTTP&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Quantificar impacto ao usuário e urgência da mitigação.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;6&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Classe de &lt;EM&gt;QoS&lt;/EM&gt; e relação &lt;EM&gt;requests&lt;/EM&gt;/&lt;EM&gt;limits&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Avaliar exposição adicional a despejo por pressão no nó.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 160px" /&gt;&lt;col style="width: 408px" /&gt;&lt;col style="width: 509px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658663"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658722"&gt;&lt;/A&gt;9.3 Formato do diagnóstico assistido&lt;/H2&gt;
&lt;P&gt;O agente entrega um resumo com causa provável, grau de confiança, evidências que a sustentam, alternativas descartadas e plano de mitigação com critério de reversão. A estrutura importa tanto quanto o conteúdo: ela permite que a revisão humana seja auditoria, e não repetição do trabalho.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;O contêiner atingiu repetidamente o limite de memória durante o processamento de payloads acima do padrão histórico. Não há evidência suficiente de crescimento contínuo entre requisições; a hipótese principal é limite subdimensionado para a nova carga. Mitigação proposta: elevar limits e requests de memória, com verificação do consumo após a alteração.&lt;/EM&gt;&lt;/P&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658664"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658723"&gt;&lt;/A&gt;10. Implementação e validação do cenário no AKS&lt;/H1&gt;
&lt;P&gt;A seguir, o padrão conceitual é aplicado a um ambiente AKS de demonstração. O objetivo é conectar o cluster ao SRE Agent, conceder as permissões necessárias, integrar as fontes de observabilidade e validar o fluxo de diagnóstico e recuperação de um &lt;EM&gt;pod&lt;/EM&gt; afetado por &lt;EM&gt;OOMKilled&lt;/EM&gt;.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Preparar o ambiente: validar o cluster AKS, a aplicação de demonstração e o estado inicial do &lt;EM&gt;workload&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI&gt;Criar o SRE Agent: provisionar o agente e selecionar o provedor de modelo conforme os requisitos do ambiente.&lt;/LI&gt;
&lt;LI&gt;Conectar as fontes de dados: integrar o cluster, o &lt;EM&gt;Azure Monitor&lt;/EM&gt; e o &lt;EM&gt;Log Analytics&lt;/EM&gt; para disponibilizar alertas, logs e métricas.&lt;/LI&gt;
&lt;LI&gt;Conceder permissões: atribuir à identidade gerenciada do agente o acesso necessário para investigar e, no laboratório, executar a remediação aprovada.&lt;/LI&gt;
&lt;LI&gt;Validar diagnóstico e recuperação: provocar o evento &lt;EM&gt;OOMKilled&lt;/EM&gt;, acompanhar a investigação, aprovar a recomendação e confirmar a recuperação do &lt;EM&gt;pod&lt;/EM&gt;.&lt;/LI&gt;
&lt;/OL&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Escopo do laboratório&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;As permissões concedidas nesta seção são deliberadamente amplas para reduzir o atrito da demonstração. Elas não representam uma configuração recomendada para produção. A seção 10.5 apresenta o desenho de menor privilégio equivalente, e a seção 12 detalha as implicações de segurança.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658665"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658724"&gt;&lt;/A&gt;10.1 Ambiente e pré-requisitos&lt;/H2&gt;
&lt;P&gt;A aplicação utilizada é o &lt;EM&gt;AKS Store Demo&lt;/EM&gt;, exemplo de referência da Microsoft que representa uma loja de comércio eletrônico decomposta em microsserviços poliglotas. A tabela a seguir consolida a configuração do ambiente, para permitir a reprodução do cenário.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1047px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Componente&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Configuração no laboratório&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Cluster&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;AKS-SRE-Demo-Cluster, &lt;EM&gt;SKU Base&lt;/EM&gt;, &lt;EM&gt;tier Free&lt;/EM&gt;, 1 &lt;EM&gt;node pool&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Versão do Kubernetes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;1.35.6&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Região&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;East US 2&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Rede&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Azure CNI Overlay&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Observabilidade&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Container Insights&lt;/EM&gt; habilitado, enviando logs e métricas ao &lt;EM&gt;Log Analytics&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Aplicação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;AKS Store Demo&lt;/EM&gt;, &lt;EM&gt;namespace&lt;/EM&gt; pets, exposta por &lt;EM&gt;Service&lt;/EM&gt; do tipo &lt;EM&gt;LoadBalancer&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Workload&lt;/EM&gt; em falha&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;order-service&lt;/EM&gt; (&lt;EM&gt;Node.js&lt;/EM&gt;), &lt;EM&gt;requests&lt;/EM&gt; 10 Mi / &lt;EM&gt;limits&lt;/EM&gt; 20 Mi de memória&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Alerta&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Alert-OOMKilled-Pods&lt;/EM&gt;, &lt;EM&gt;Log Alerts V2&lt;/EM&gt;, severidade 1, &lt;EM&gt;Error&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Agente&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Azure SRE Agent provisionado no grupo de recursos Azure-SRE-RG&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 351px" /&gt;&lt;col style="width: 695px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A arquitetura da aplicação é relevante para o diagnóstico: o &lt;EM&gt;order-service&lt;/EM&gt; recebe pedidos do &lt;EM&gt;store-front&lt;/EM&gt; e os publica em uma fila &lt;EM&gt;RabbitMQ&lt;/EM&gt;, consumida pelo &lt;EM&gt;makeline-service&lt;/EM&gt;. Um serviço que faz buffer de mensagens antes de publicar é estruturalmente sensível ao tamanho do &lt;EM&gt;payload&lt;/EM&gt; e à concorrência, precisamente o perfil que torna um limite de 20 Mi insustentável sob carga.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658725"&gt;&lt;/A&gt;10.2 Arquitetura e estado inicial da aplicação&lt;/H2&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Figura 1: Arquitetura do AKS Store Demo. O store-front e o store-admin consomem o order-service (Node.js), o product-service (Rust), o makeline-service (Go) e o ai-service (Python), com RabbitMQ como broker de mensagens e MongoDB como armazenamento de estado.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 2: Página inicial da aplicação de demonstração, publicada por meio de um Service do tipo LoadBalancer. O endereço IP público foi suprimido.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 3: Visão geral do cluster AKS antes da investigação: Kubernetes 1.35.6, região East US 2, configuração de rede Azure CNI Overlay e um único node pool. Identificadores de assinatura e o endereço do servidor de API foram suprimidos.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A inspeção do &lt;EM&gt;namespace&lt;/EM&gt; revela o estado que servirá de referência para todo o exercício. O &lt;EM&gt;pod&lt;/EM&gt; do &lt;EM&gt;order-service&lt;/EM&gt; encontra-se em &lt;EM&gt;CrashLoopBackOff&lt;/EM&gt;, acumulando reinicializações sucessivas, o sintoma de superfície de um encerramento repetido pelo &lt;EM&gt;kernel&lt;/EM&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 4: Saída de kubectl get all -n pets. O pod do order-service aparece em CrashLoopBackOff com reinicializações acumuladas, enquanto os demais serviços do namespace permanecem íntegros. Endereços IP públicos foram suprimidos.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658667"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Nota. &lt;/STRONG&gt;Observe que apenas um serviço está afetado. Essa assimetria já elimina hipóteses de escopo mais amplo, pressão de memória no nó, falha do &lt;EM&gt;runtime&lt;/EM&gt; de contêiner ou problema de rede, e concentra a investigação na configuração ou no comportamento daquele &lt;EM&gt;workload&lt;/EM&gt; específico.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658726"&gt;&lt;/A&gt;10.3 Criação do agente e escolha do provedor de modelo&lt;/H2&gt;
&lt;P&gt;O agente é provisionado no portal do SRE Agent, em sre.azure.com.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 5: Portal do Azure SRE Agent. A criação inicia pela opção Create Agent.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;No formulário, define-se o grupo de recursos, o nome do agente e o provedor de modelo. É possível escolher entre &lt;EM&gt;Azure OpenAI&lt;/EM&gt;, com a família &lt;EM&gt;GPT-5&lt;/EM&gt;, e Anthropic, com a família &lt;EM&gt;Claude&lt;/EM&gt;, e alterar essa opção posteriormente sem recriar o recurso. Conforme discutido na seção 7.6, essa escolha deve considerar também os requisitos de residência de dados da organização.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 6: Formulário de criação do agente, com a seleção do grupo de recursos, do nome e do provedor de modelo.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 7: Revisão da configuração antes da confirmação. Nomes de assinatura foram suprimidos.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 8: Provisionamento do agente em andamento.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658668"&gt;&lt;/A&gt;&lt;EM&gt;Figura 9: Agente criado. A opção Set up your agent conduz à configuração das fontes de contexto.&lt;/EM&gt;&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658727"&gt;&lt;/A&gt;10.4 Conexão das fontes de contexto&lt;/H2&gt;
&lt;P&gt;O objetivo do agente é investigar as aplicações em execução no cluster AKS. Para isso, conecta-se primeiro o recurso do cluster.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 10: Associação do recurso do cluster AKS ao agente.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 11: Seleção do grupo de recursos onde o cluster AKS está provisionado.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 12: Confirmação do escopo selecionado. Nomes de assinatura foram suprimidos.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Neste laboratório, o agente receberá permissões ampliadas para executar tarefas específicas no cluster. Essa configuração é restrita ao ambiente de demonstração. Em produção, recomenda-se aplicar o princípio do menor privilégio, limitar o escopo das funções, exigir aprovação para ações de maior impacto e validar previamente operações autorizadas, como alterar um &lt;EM&gt;pod&lt;/EM&gt; ou recuperar um nó com estado desconhecido.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 13: Definição do nível de permissão concedido ao agente sobre os recursos conectados.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Em seguida, integra-se o agente ao &lt;EM&gt;Azure Monitor&lt;/EM&gt;, para que ele acesse os alertas configurados e inicie uma investigação quando o incidente correspondente for emitido.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 14: Integração com o Azure Monitor, habilitando o consumo de alertas como gatilho de investigação.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Além do &lt;EM&gt;Azure Monitor&lt;/EM&gt;, o agente pode ser integrado ao &lt;EM&gt;ServiceNow&lt;/EM&gt; e ao &lt;EM&gt;PagerDuty&lt;/EM&gt; para apoiar fluxos de investigação e gestão de incidentes, permitindo que a &lt;EM&gt;thread&lt;/EM&gt; da investigação seja correlacionada ao registro formal do incidente.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 15: Integrações disponíveis com plataformas de gestão de incidentes.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;O cluster tem o &lt;EM&gt;Container Insights&lt;/EM&gt; habilitado e envia logs e métricas ao &lt;EM&gt;workspace&lt;/EM&gt; do &lt;EM&gt;Log Analytics&lt;/EM&gt;. Conectar esse &lt;EM&gt;workspace&lt;/EM&gt; é o que permite ao agente executar as consultas &lt;EM&gt;KQL&lt;/EM&gt; apresentadas na seção 5 durante a investigação.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 16: Início da conexão com o Log Analytics.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 17: Seleção do workspace do Log Analytics associado ao cluster.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Figura 18: Preenchimento dos dados do workspace. Identificadores de assinatura foram suprimidos.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 19: Conclusão da conexão com o Log Analytics.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658669"&gt;&lt;/A&gt;&lt;EM&gt;Figura 20: Painel de configuração das fontes de contexto, consolidando código, logs, recursos do Azure e incidentes. A amplitude do contexto conectado determina diretamente a profundidade possível do diagnóstico.&lt;/EM&gt;&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658728"&gt;&lt;/A&gt;10.5 Identidade gerenciada e atribuições &lt;EM&gt;RBAC&lt;/EM&gt;&lt;/H2&gt;
&lt;P&gt;Neste ponto o agente já é funcional para investigação. Para que ele também possa executar a remediação no cluster, atribuem-se funções à sua identidade gerenciada. O primeiro passo é identificar essa identidade.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 21: Identidade gerenciada associada ao agente. Os identificadores de cliente, de principal e de assinatura foram suprimidos.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;No laboratório, foram atribuídas as funções &lt;EM&gt;Azure Kubernetes Service Cluster Admin Role&lt;/EM&gt; e &lt;EM&gt;Azure Kubernetes Service Contributor Role&lt;/EM&gt;, com escopo no grupo de recursos do cluster.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;az role assignment create `&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; --assignee "&amp;lt;uami-client-id&amp;gt;" `&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; --role "Azure Kubernetes Service Cluster Admin Role" `&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; --scope "/subscriptions/&amp;lt;subscription-id&amp;gt;/resourceGroups/Azure-SRE-RG"&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;az role assignment create `&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; --assignee "&amp;lt;uami-client-id&amp;gt;" `&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; --role "Azure Kubernetes Service Contributor Role" `&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; --scope "/subscriptions/&amp;lt;subscription-id&amp;gt;/resourceGroups/Azure-SRE-RG"&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 22: Resultado da atribuição da função Azure Kubernetes Service Cluster Admin Role. Identificadores de assinatura, de principal e da atribuição foram suprimidos.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 23: Resultado da atribuição da função Azure Kubernetes Service Contributor Role.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A confirmação é feita no painel Access control (IAM) do cluster, localizando as atribuições concedidas à identidade gerenciada do agente.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 24: Painel de controle de acesso do cluster, confirmando as duas atribuições à identidade gerenciada do agente (destacadas). Identificadores de objeto e nomes de entidades de serviço do locatário foram suprimidos.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Por que essa configuração não deve ir para produção&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;A função &lt;EM&gt;Azure Kubernetes Service Cluster Admin Role&lt;/EM&gt; autoriza a obtenção da credencial administrativa do cluster. Essa credencial é um certificado de cliente que opera fora da integração com o &lt;EM&gt;Microsoft Entra ID&lt;/EM&gt; e da autorização &lt;EM&gt;RBAC&lt;/EM&gt; do Kubernetes, ou seja, contorna exatamente os controles de identidade que a organização configurou no cluster. Some-se a isso a função Contributor no grupo de recursos, e a identidade do agente passa a acumular controle administrativo do plano de dados e amplo poder no plano de controle.&lt;/P&gt;
&lt;P&gt;O desenho equivalente sob menor privilégio troca esse par de funções por um conjunto mínimo, com escopo no cluster e não no grupo de recursos, apoiando-se no fluxo de elevação sob demanda descrito na seção 7.4 para as operações de escrita eventuais.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 972px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Necessidade&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Função recomendada&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Escopo&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Obter &lt;EM&gt;kubeconfig&lt;/EM&gt; respeitando o Entra ID&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Azure Kubernetes Service Cluster User Role&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Cluster&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Leitura no plano de dados do Kubernetes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Azure Kubernetes Service RBAC Reader&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Cluster ou &lt;EM&gt;namespace&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Escrita controlada no plano de dados&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Azure Kubernetes Service RBAC Writer&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Namespace&lt;/EM&gt; do &lt;EM&gt;workload&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Consultar métricas e logs&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Monitoring &lt;EM&gt;Reader&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Workspace&lt;/EM&gt; do &lt;EM&gt;Log Analytics&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Operações de infraestrutura do cluster&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Elevação sob demanda via fluxo &lt;EM&gt;On-Behalf-Of&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Por operação, com registro&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Nota. &lt;/STRONG&gt;As funções &lt;EM&gt;RBAC&lt;/EM&gt; do Kubernetes (&lt;EM&gt;Reader&lt;/EM&gt;, &lt;EM&gt;Writer&lt;/EM&gt;, &lt;EM&gt;Admin&lt;/EM&gt;) exigem que a autorização &lt;EM&gt;RBAC&lt;/EM&gt; do Azure para Kubernetes esteja habilitada no cluster. Escopar por &lt;EM&gt;namespace&lt;/EM&gt;, e não pelo cluster inteiro, reduz o raio de impacto de uma ação incorreta ao conjunto de &lt;EM&gt;workloads&lt;/EM&gt; sob responsabilidade daquele agente.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658670"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658729"&gt;&lt;/A&gt;10.6 Investigação assistida&lt;/H2&gt;
&lt;P&gt;A primeira interação é deliberadamente simples: uma pergunta aberta sobre a saúde do cluster, sem indicar o problema. O objetivo é avaliar se o agente chega ao &lt;EM&gt;workload&lt;/EM&gt; afetado por conta própria.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 25: Estado do pod do order-service imediatamente antes da investigação, usado como linha de base para validar diagnóstico e recuperação.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 26: O agente inicia a investigação executando comandos de inspeção. Cada chamada de ferramenta exibe o comando exato e a classificação de risco associada: Safe para az aks show e Medium risk para kubectl get deployments. Identificadores de assinatura foram suprimidos.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A Figura 26 concentra o que diferencia esse modelo de uma automação convencional. O agente não executa um &lt;EM&gt;runbook&lt;/EM&gt; fixo: ele escolhe o próximo comando a partir do resultado do anterior, e cada escolha fica registrada com o comando literal e sua classificação de risco. O operador acompanha a cadeia de raciocínio como uma sequência auditável de operações, não como uma caixa-preta que devolve uma conclusão.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 27: O agente identifica o pod do order-service em CrashLoopBackOff, com 13 reinicializações acumuladas.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A partir do estado do &lt;EM&gt;pod&lt;/EM&gt;, o agente correlaciona a razão do término com os limites declarados no manifesto e conclui que o limite de 20 Mi é insuficiente para a carga observada. A recomendação é elevar o limite para 128 Mi e a solicitação para 64 Mi, acompanhando o consumo após a alteração.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 28: Diagnóstico do agente: OOMKilled associado ao limite de 20 Mi e à solicitação de 10 Mi, com recomendação de elevação para 128 Mi e 64 Mi respectivamente.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 29: Continuação do diagnóstico, com o detalhamento das evidências e das alternativas consideradas.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Leitura crítica da recomendação&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658671"&gt;&lt;/A&gt;A recomendação ajusta &lt;EM&gt;requests&lt;/EM&gt; e &lt;EM&gt;limits&lt;/EM&gt; em conjunto, e não apenas o limite, o que, conforme a seção 3.3, preserva a classe &lt;EM&gt;Burstable&lt;/EM&gt; com uma reserva de memória compatível e reduz a exposição a despejo por pressão no nó. O agente também sinaliza que valores maiores, como 256 Mi, só devem ser adotados após análise de métricas, testes de carga e investigação de possível vazamento. Essa ressalva é o que separa uma mitigação de uma correção: o número proposto restabelece o serviço, mas ainda não é um dimensionamento validado.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658730"&gt;&lt;/A&gt;10.7 Mitigação aprovada e verificação&lt;/H2&gt;
&lt;P&gt;A recomendação é apresentada como uma ação concreta a ser aprovada. O comando exibido é exatamente o que será executado:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;kubectl patch deployment order-service -n pets --type='json' -p='[&lt;/P&gt;
&lt;P&gt;&amp;nbsp; {"op":"replace",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; "path":"/spec/template/spec/containers/0/resources/limits/memory",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; "value":"128Mi"},&lt;/P&gt;
&lt;P&gt;&amp;nbsp; {"op":"replace",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; "path":"/spec/template/spec/containers/0/resources/requests/memory",&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp; "value":"64Mi"}&lt;/P&gt;
&lt;P&gt;]'&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;O efeito é alterar os recursos de memória do &lt;EM&gt;deployment&lt;/EM&gt; &lt;EM&gt;order-service&lt;/EM&gt; no &lt;EM&gt;namespace&lt;/EM&gt; pets: o limite passa de 20 Mi para 128 Mi e a solicitação, de 10 Mi para 64 Mi. Como a alteração atinge o &lt;EM&gt;template&lt;/EM&gt; do &lt;EM&gt;pod&lt;/EM&gt;, o controlador executa um &lt;EM&gt;rollout&lt;/EM&gt;, substituindo as réplicas existentes.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 30: Proposta de alteração apresentada para revisão. A ação é classificada como Medium risk e apresenta os controles Approve action e Cancel, com a indicação de que as permissões do agente serão utilizadas para concluí-la.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Aprovada a ação, o agente a executa e passa espontaneamente à verificação, consultando o estado do novo &lt;EM&gt;pod&lt;/EM&gt; em vez de declarar sucesso pela ausência de erro no comando.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 31: Após aplicar o patch, o agente consulta o estado do novo pod e aguarda a conclusão do startup probe antes de concluir.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Esse detalhe merece destaque: o agente distingue a execução bem-sucedida de um comando da recuperação efetiva do serviço, e aguarda a passagem pelo &lt;EM&gt;startup probe&lt;/EM&gt; antes de afirmar que o problema foi resolvido. É a mesma disciplina que se espera de um operador experiente.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 32: Comparação entre o estado anterior e o posterior apresentada pelo agente, acompanhada da ressalva sobre reconciliação com a fonte da verdade quando o deployment é gerenciado por GitOps, Helm ou pipeline de IaC.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 756px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Dimensão&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Antes&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Depois&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Estado do &lt;EM&gt;pod&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;CrashLoopBackOff&lt;/EM&gt;, 13 reinicializações&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Running&lt;/EM&gt;, &lt;EM&gt;Ready&lt;/EM&gt;, 0 reinicializações&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Memória (&lt;EM&gt;request&lt;/EM&gt;/&lt;EM&gt;limit&lt;/EM&gt;)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;10 Mi / 20 Mi&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;64 Mi / 128 Mi&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Classe de &lt;EM&gt;QoS&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Burstable&lt;/EM&gt;, com reserva mínima&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Burstable&lt;/EM&gt;, com reserva compatível&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658672"&gt;&lt;/A&gt;&lt;EM&gt;Figura 33: Validação manual por kubectl: todos os objetos do namespace pets em execução, com o order-service estável e sem reinicializações.&lt;/EM&gt;&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658731"&gt;&lt;/A&gt;10.8 Reconciliação com a fonte da verdade&lt;/H2&gt;
&lt;P&gt;Um ponto levantado pelo próprio agente na Figura 32 merece tratamento explícito, porque é onde a maioria das remediações assistidas falha silenciosamente: a alteração foi aplicada diretamente ao objeto no cluster.&lt;/P&gt;
&lt;P&gt;Se o &lt;EM&gt;deployment&lt;/EM&gt; for gerenciado por &lt;EM&gt;GitOps&lt;/EM&gt;, &lt;EM&gt;Helm&lt;/EM&gt; ou qualquer &lt;EM&gt;pipeline&lt;/EM&gt; de infraestrutura como código, a fonte da verdade continua declarando 20 Mi. A próxima reconciliação do controlador, ou a próxima implantação, reverterá a correção e reintroduzirá o incidente, agora sem a memória do diagnóstico que o originou. O sintoma reaparece dias depois, aparentemente sem causa.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 952px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Modelo de gestão&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Efeito do &lt;EM&gt;kubectl&lt;/EM&gt; &lt;EM&gt;patch&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Ação obrigatória de fechamento&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Manifesto aplicado manualmente&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Persiste até a próxima aplicação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Atualizar o manifesto no repositório&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Helm&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Revertido no próximo &lt;EM&gt;upgrade&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Atualizar o &lt;EM&gt;values.yaml&lt;/EM&gt; e versionar o &lt;EM&gt;chart&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;GitOps&lt;/EM&gt; (&lt;EM&gt;Flux&lt;/EM&gt;/&lt;EM&gt;Argo CD&lt;/EM&gt;)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Revertido na próxima reconciliação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Abrir &lt;EM&gt;pull request&lt;/EM&gt; na fonte da verdade&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Pipeline&lt;/EM&gt; de &lt;EM&gt;IaC&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Revertido na próxima execução&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Atualizar o &lt;EM&gt;template&lt;/EM&gt; e o registro de mudança&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Regra operacional&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Toda mitigação aplicada diretamente ao cluster deve gerar um item de acompanhamento na fonte da verdade antes do encerramento do incidente. Um incidente cuja correção existe apenas no cluster não está resolvido: está agendado para reincidir.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658673"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658732"&gt;&lt;/A&gt;10.9 Do acionamento sob demanda ao disparo por alerta&lt;/H2&gt;
&lt;P&gt;Até aqui, o agente foi acionado sob demanda. A etapa seguinte valida o caminho automatizado: um alerta do &lt;EM&gt;Azure Monitor&lt;/EM&gt; configurado para disparar quando um &lt;EM&gt;pod&lt;/EM&gt; apresentar terminação por &lt;EM&gt;OOMKilled&lt;/EM&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 34: Regra de alerta configurada no Azure Monitor para detectar terminações por OOMKilled no cluster.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Para provocar o evento de forma controlada, utiliza-se uma aplicação local que gera carga sobre o &lt;EM&gt;order-service&lt;/EM&gt; até que o consumo ultrapasse o limite do &lt;EM&gt;cgroup&lt;/EM&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 35: Painel local de simulação, com o gatilho de geração de carga sobre o order-service e o acompanhamento de pods íntegros, terminações por OOMKilled e alertas disparados. Às 17h45, o pod entra em estado OOMKilled com código de saída 137.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 36: Confirmação do estado por kubectl, evidenciando a terminação por OOMKilled.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Dois minutos após o evento, a notificação do alerta chega ao destinatário configurado no &lt;EM&gt;action group&lt;/EM&gt;, intervalo que corresponde à soma da ingestão no &lt;EM&gt;Log Analytics&lt;/EM&gt;, do período de avaliação da regra e da entrega da notificação.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 37: Notificação recebida por e-mail às 17h47, referente à regra Alert-OOMKilled-Pods.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 38: Detalhe da notificação, indicando a condição atendida: contagem de resultados maior que zero, com o valor alcançado igual a 1.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;O disparo é então confirmado no portal do Azure, com a severidade e o tipo de sinal registrados.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 39: Alerta registrado no portal do Azure com estado Fired.&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figura 40: Detalhes do alerta: severidade 1, Error, tipo de sinal Log Alerts V2 e horário de disparo consistente com o evento observado no cluster.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Com esse alerta emitido e o agente integrado ao&amp;nbsp;&lt;EM&gt;Azure Monitor&lt;/EM&gt;, o gatilho necessário para a automação completa está validado. A Parte 2 tratará da transição do acionamento assistido para o fluxo disparado automaticamente pelo alerta, incluindo planos de resposta, modos de execução por plano e a integração com o processo de gestão de incidentes.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658674"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658733"&gt;&lt;/A&gt;10.10 Do restabelecimento ao dimensionamento correto&lt;/H2&gt;
&lt;P&gt;O laboratório encerra com o serviço estável, mas os valores aplicados são uma mitigação informada, não um dimensionamento validado. Fechar o ciclo exige um método, e esse método é independente do agente.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Estabelecer a linha de base: medir o &lt;EM&gt;working set&lt;/EM&gt; em percentil 95 e 99 sobre uma janela que cubra o ciclo completo de carga do serviço, incluindo picos previsíveis.&lt;/LI&gt;
&lt;LI&gt;Definir o &lt;EM&gt;request&lt;/EM&gt; pelo consumo típico: o percentil 95 do &lt;EM&gt;working set&lt;/EM&gt; em regime normal, valor que o agendador usará para reservar capacidade.&lt;/LI&gt;
&lt;LI&gt;Definir o &lt;EM&gt;limit&lt;/EM&gt; com folga sobre o pico: o percentil 99 acrescido de margem para transientes, tipicamente entre 25% e 50%, evitando folga excessiva que desperdiça capacidade do nó.&lt;/LI&gt;
&lt;LI&gt;Alinhar o &lt;EM&gt;runtime&lt;/EM&gt;: ajustar o &lt;EM&gt;heap&lt;/EM&gt; máximo conforme a seção 3.5, reservando espaço para memória fora do &lt;EM&gt;heap&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI&gt;Validar sob carga: reproduzir o cenário que originou o incidente e confirmar que o &lt;EM&gt;working set&lt;/EM&gt; permanece abaixo do limite com margem estável.&lt;/LI&gt;
&lt;LI&gt;Descartar vazamento: comparar a inclinação do consumo entre reinícios; crescimento sustentado sem correlação com a carga indica retenção progressiva, que nenhum aumento de limite resolve.&lt;/LI&gt;
&lt;LI&gt;Automatizar a revisão: usar o Vertical &lt;EM&gt;Pod&lt;/EM&gt; Autoscaler em modo recomendação para acompanhar a adequação dos valores ao longo do tempo, sem aplicação automática.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658675"&gt;&lt;/A&gt;&lt;STRONG&gt;Nota. &lt;/STRONG&gt;Elevar o limite de memória é uma resposta legítima quando a evidência aponta subdimensionamento, e ilegítima quando serve para adiar a investigação de um vazamento. A diferença entre as duas situações está na inclinação do consumo entre reinícios, um dado que só existe se a telemetria for retida além do ciclo de vida do contêiner.&lt;/P&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658734"&gt;&lt;/A&gt;11. Governança, aprovação e rastreabilidade&lt;/H1&gt;
&lt;P&gt;Esta seção separa deliberadamente dois planos: capacidades do produto, que podem ser verificadas na documentação, e recomendações de arquitetura, que cada organização deve validar e adaptar às próprias políticas.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Nota. &lt;/STRONG&gt;Nomenclaturas, opções e comportamentos evoluem. Antes de aplicar este padrão em produção, valide a documentação vigente, os controles disponíveis no ambiente e os requisitos internos de segurança, auditoria e mudança.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658676"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658735"&gt;&lt;/A&gt;11.1 O que foi observado no laboratório&lt;/H2&gt;
&lt;OL&gt;
&lt;LI&gt;O agente coletou métricas, eventos e o estado dos &lt;EM&gt;pods&lt;/EM&gt; para investigar o incidente, com cada comando registrado na &lt;EM&gt;thread&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI&gt;Identificou que os valores de memória estavam subdimensionados para a carga observada.&lt;/LI&gt;
&lt;LI&gt;Propôs um comando &lt;EM&gt;kubectl&lt;/EM&gt; &lt;EM&gt;patch&lt;/EM&gt; explícito, exibindo a alteração de 20 Mi para 128 Mi no limite e de 10 Mi para 64 Mi na solicitação.&lt;/LI&gt;
&lt;LI&gt;Apresentou a ação para revisão humana, classificada como &lt;EM&gt;Medium risk&lt;/EM&gt;, e aguardou aprovação antes de executar.&lt;/LI&gt;
&lt;LI&gt;Após a aprovação, executou a alteração e verificou a recuperação do &lt;EM&gt;pod&lt;/EM&gt; antes de concluir.&lt;/LI&gt;
&lt;LI&gt;Sinalizou espontaneamente o risco de reversão da correção em cenários gerenciados por &lt;EM&gt;GitOps&lt;/EM&gt; ou &lt;EM&gt;Helm&lt;/EM&gt;.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Esse comportamento reflete o cenário demonstrado e não estabelece regra universal para todas as ferramentas, comandos ou ambientes.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658677"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658736"&gt;&lt;/A&gt;11.2 Referência de governança para a organização&lt;/H2&gt;
&lt;P&gt;A tabela a seguir é uma recomendação de desenho, não uma matriz fixa nem garantia de comportamento do produto.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 864px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Categoria&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Exemplos&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Política sugerida&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Leitura&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;get&lt;/EM&gt;, &lt;EM&gt;list&lt;/EM&gt;, &lt;EM&gt;show&lt;/EM&gt;, &lt;EM&gt;describe&lt;/EM&gt;, consultas &lt;EM&gt;KQL&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Permitir quando escopo e &lt;EM&gt;RBAC&lt;/EM&gt; forem compatíveis com a investigação.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Escrita&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;patch&lt;/EM&gt;, &lt;EM&gt;update&lt;/EM&gt;, &lt;EM&gt;scale&lt;/EM&gt;, &lt;EM&gt;restart&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Exigir revisão humana em ambientes críticos por meio de &lt;EM&gt;Review Mode&lt;/EM&gt; no plano de resposta ou de &lt;EM&gt;hooks&lt;/EM&gt;.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Alto impacto&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;delete&lt;/EM&gt;, redução de capacidade, mudanças destrutivas&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Restringir por &lt;EM&gt;RBAC&lt;/EM&gt; e por política de acesso a ferramentas; submeter a processo formal de mudança ou negar conforme o risco.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A classificação de risco deve ser definida pela organização conforme o ambiente, o tipo de recurso, a criticidade do serviço e os requisitos regulatórios. A documentação do produto não deve ser interpretada como regra universal de que toda leitura é sempre permitida, toda escrita sempre exige aprovação ou todo &lt;EM&gt;delete&lt;/EM&gt; é sempre negado.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658678"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658737"&gt;&lt;/A&gt;11.3 Camadas de evidência para auditoria&lt;/H2&gt;
&lt;P&gt;Nenhuma fonte isolada reconstrói o incidente por completo. A rastreabilidade útil vem da correlação entre camadas com escopos distintos.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 966px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Camada&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;O que registra&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Limitação&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Thread&lt;/EM&gt; do agente&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Comandos executados, evidências, proposta e aprovação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Escopo da conversa; confirmar retenção e exportação no ambiente&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Telemetria de auditoria do agente&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Atividade do agente para acompanhamento e conformidade&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Confirmar granularidade e campos disponíveis no ambiente&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Log de auditoria do Kubernetes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Chamadas ao servidor de &lt;EM&gt;API&lt;/EM&gt; do cluster&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Requer habilitação e destino de coleta configurados&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Azure Activity Log&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Operações do plano de controle do Azure&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Não cobre alterações internas do Kubernetes&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Sistema de &lt;EM&gt;ITSM&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Registro formal de incidente e mudança&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Depende da integração e da disciplina de preenchimento&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Recomenda-se correlacionar, conforme disponibilidade: horário da proposta e da execução; a ação ou comando apresentado ao operador; o estado anterior e posterior do recurso; o resultado da ferramenta e mensagens de erro relevantes; os identificadores do agente, recurso, alerta, incidente e mudança; e as informações de aprovação expostas pelos mecanismos disponíveis.&lt;/P&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658679"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658738"&gt;&lt;/A&gt;11.4 Fluxo recomendado para este cenário&lt;/H2&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 968px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Etapa&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Aplicação no laboratório&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Controle recomendado&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;1. Diagnóstico e proposta&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;O agente consulta métricas, eventos e estado do cluster e apresenta a ação recomendada.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;RBAC&lt;/EM&gt; de menor privilégio, escopo por &lt;EM&gt;namespace&lt;/EM&gt; e evidências observáveis.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;2. Revisão humana&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Em &lt;EM&gt;Review Mode&lt;/EM&gt;, o operador analisa o comando, o impacto e o escopo antes da execução.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Critérios de aprovação e rollback definidos; aprovação restrita a administradores do agente.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;3. Execução controlada&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Após a aprovação, o agente executa a alteração dentro das permissões concedidas.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Identidade gerenciada, escopo mínimo, &lt;EM&gt;hooks&lt;/EM&gt; de &lt;EM&gt;PostToolUse&lt;/EM&gt; para auditoria.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;4. Verificação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;O agente valida a recuperação antes de concluir.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Critério de sucesso objetivo, baseado em estado observado e não em ausência de erro.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;5. Reconciliação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Não aplicável ao laboratório; a alteração permaneceu no cluster.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Atualizar a fonte da verdade e vincular ao registro de mudança.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;6. Registro&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;O resultado é apresentado na &lt;EM&gt;thread&lt;/EM&gt; do agente.&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Correlação entre telemetria, logs do cluster, registros do Azure e &lt;EM&gt;ITSM&lt;/EM&gt;.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Enquadramento&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Os modos de execução, os controles de acesso, os &lt;EM&gt;hooks&lt;/EM&gt; e a telemetria são capacidades do produto. A matriz de risco, as evidências exigidas, as convenções de repositório e as integrações de auditoria são decisões de governança da organização. Manter essa separação explícita evita transformar recomendações de arquitetura em garantias de produto.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658680"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658739"&gt;&lt;/A&gt;12. Considerações de segurança para operações agênticas&lt;/H1&gt;
&lt;P&gt;Introduzir um agente com capacidade de execução no caminho de resposta a incidentes altera o modelo de ameaças da plataforma. As considerações a seguir derivam diretamente da configuração demonstrada.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 986px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Consideração&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Risco&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Mitigação&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Privilégio excessivo&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Cluster Admin Role&lt;/EM&gt; concede credencial que contorna o Entra ID e o &lt;EM&gt;RBAC&lt;/EM&gt; do Kubernetes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Substituir por Cluster User + &lt;EM&gt;RBAC&lt;/EM&gt; &lt;EM&gt;Reader&lt;/EM&gt;/&lt;EM&gt;Writer&lt;/EM&gt; com escopo por &lt;EM&gt;namespace&lt;/EM&gt;; elevar sob demanda&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Escopo amplo demais&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Funções no grupo de recursos alcançam recursos não relacionados ao incidente&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Escopar no recurso, não no grupo de recursos&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Segregação de funções&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Quem opera aprova a própria ação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Restringir aprovação a administradores do agente distintos de quem aciona a investigação&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Conteúdo não confiável no contexto&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Logs e eventos podem carregar texto capaz de influenciar o raciocínio do agente&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;Hooks&lt;/EM&gt; de &lt;EM&gt;PostToolUse&lt;/EM&gt; e políticas de acesso a ferramentas; revisão humana para ações de escrita&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Raio de impacto&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Uma ação incorreta atinge o cluster inteiro&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Escopo por &lt;EM&gt;namespace&lt;/EM&gt;, janelas de mudança e critérios de rollback definidos previamente&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Residência de dados&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;O provedor de modelo determina onde o contexto é processado&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Selecionar o provedor conforme os requisitos regulatórios e as regiões suportadas&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Exposição em capturas e &lt;EM&gt;threads&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Identificadores e segredos aparecem em evidências compartilhadas&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Revisar artefatos antes de circular; suprimir identificadores, como feito neste documento&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;O item sobre conteúdo não confiável merece atenção particular. Durante a investigação, o agente lê logs e eventos produzidos pela aplicação, dados que, em última instância, podem ser influenciados por entradas de usuários. Tratar esse conteúdo como dado, e não como instrução, é responsabilidade compartilhada entre o produto e o desenho de governança: manter operações de escrita sob revisão humana em ambientes críticos é a defesa mais direta contra essa classe de risco.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 100%; height: 35px; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 35px;"&gt;&lt;td style="height: 35px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Princípio de composição&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Nenhum controle isolado é suficiente. A defesa em profundidade nesse modelo compõe quatro camadas independentes: &lt;EM&gt;RBAC&lt;/EM&gt; delimita o que a identidade alcança; os modos de execução determinam se há aprovação humana; a classificação de risco por chamada de ferramenta informa a decisão do revisor; e os &lt;EM&gt;hooks&lt;/EM&gt; aplicam política e auditoria antes e depois de cada ação. Remover qualquer uma delas transfere risco às demais.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658681"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658740"&gt;&lt;/A&gt;13. Métricas para avaliar a adoção&lt;/H1&gt;
&lt;P&gt;A adoção de resposta assistida deve ser avaliada por evidência, não por percepção. As métricas a seguir permitem comparar o antes e o depois de forma objetiva.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1062px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Métrica&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;O que mede&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Sinal de maturidade&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;MTTD&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Tempo entre o evento e a detecção&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Estável; limitado pela latência de ingestão e avaliação&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;MTTA&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Tempo entre o alerta e o início da investigação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Redução acentuada com investigação automática&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;EM&gt;MTTR&lt;/EM&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Tempo entre o alerta e a recuperação verificada&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Redução sustentada, sem aumento de reincidência&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Taxa de aprovação sem alteração&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Recomendações aprovadas sem ajuste pelo operador&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Crescente; habilita migração seletiva para modo autônomo&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Taxa de reincidência em 30 dias&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Incidentes da mesma classe que retornam&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Decrescente; indica correção estrutural e não apenas mitigação&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Aderência à reconciliação&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Mitigações refletidas na fonte da verdade&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Próxima de 100%; principal defesa contra reincidência&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Ações autônomas por classe de risco&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Distribuição entre leitura, escrita e alto impacto&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Crescimento apenas nas classes com histórico consistente&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A recomendação de adoção é conservadora e apoiada na própria documentação do produto: iniciar em &lt;EM&gt;Review Mode&lt;/EM&gt;, observar as recomendações por algumas semanas e migrar para modo autônomo apenas os gatilhos cujo padrão de aprovação já se mostrou consistente. A taxa de aprovação sem alteração é o indicador que sustenta essa decisão com dados.&lt;/P&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658682"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658741"&gt;&lt;/A&gt;14. Limitações e armadilhas observadas&lt;/H1&gt;
&lt;UL&gt;
&lt;LI&gt;A mitigação foi aplicada diretamente ao cluster. Em ambientes gerenciados por &lt;EM&gt;GitOps&lt;/EM&gt;, &lt;EM&gt;Helm&lt;/EM&gt; ou &lt;EM&gt;IaC&lt;/EM&gt;, a correção será revertida se a fonte da verdade não for atualizada.&lt;/LI&gt;
&lt;LI&gt;Os valores de 128 Mi e 64 Mi restabeleceram o serviço, mas constituem mitigação informada, não dimensionamento validado por testes de carga.&lt;/LI&gt;
&lt;LI&gt;As permissões concedidas no laboratório são amplas por conveniência de demonstração e contornam a integração com o Entra ID no plano de dados do cluster.&lt;/LI&gt;
&lt;LI&gt;Alertas baseados em log carregam latência de ingestão e de avaliação, dois minutos no laboratório, o que os torna inadequados para &lt;EM&gt;SLOs&lt;/EM&gt; de detecção mais agressivos.&lt;/LI&gt;
&lt;LI&gt;Um &lt;EM&gt;restart&lt;/EM&gt; bem-sucedido mascara a distinção entre limite subdimensionado e vazamento de memória; sem telemetria retida além do ciclo do contêiner, a diferença se perde.&lt;/LI&gt;
&lt;LI&gt;O modelo pode propor valores plausíveis, mas a validação por métricas e carga permanece responsabilidade da engenharia.&lt;/LI&gt;
&lt;LI&gt;O cenário cobre uma única classe de falha em um único &lt;EM&gt;workload&lt;/EM&gt;; a generalização para outras classes exige validação própria.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H1&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658683"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658742"&gt;&lt;/A&gt;15. Conclusão da Parte 1&lt;/H1&gt;
&lt;P&gt;O &lt;EM&gt;Azure Monitor&lt;/EM&gt; e o Azure SRE Agent transformaram um evento &lt;EM&gt;OOMKilled&lt;/EM&gt; em um fluxo governado de detecção, investigação, recomendação, aprovação e recuperação verificada. O resultado demonstra valor não apenas por restabelecer o &lt;EM&gt;pod&lt;/EM&gt;, mas por correlacionar evidências, manter a decisão explicável e executar a remediação dentro dos limites de acesso definidos.&lt;/P&gt;
&lt;P&gt;Três observações se destacam do exercício. A primeira é que a transparência por chamada de ferramenta, com o comando literal e sua classificação de risco, transforma a revisão humana em auditoria rápida em vez de repetição do trabalho. A segunda é que o agente verificou a recuperação antes de concluir, distinguindo execução bem-sucedida de serviço restabelecido. A terceira é que ele sinalizou o risco de reversão por &lt;EM&gt;GitOps&lt;/EM&gt;, armadilha que mais frequentemente converte uma correção em incidente recorrente.&lt;/P&gt;
&lt;P&gt;A conclusão arquitetural permanece: a observabilidade continua sendo a base. O agente amplifica o valor de uma telemetria bem construída, e amplifica igualmente as lacunas de uma telemetria pobre. Investir em sinais corretos, como &lt;EM&gt;working set&lt;/EM&gt; em vez de uso bruto, agregação por máximo em vez de média e retenção além do ciclo de vida do contêiner, é pré-requisito, não consequência.&lt;/P&gt;
&lt;P&gt;Na Parte 2, o fluxo evoluirá do acionamento assistido para o disparo automatizado por alertas, com planos de resposta, definição de modos de execução por plano, &lt;EM&gt;hooks&lt;/EM&gt; de auditoria e integração com o processo de gestão de incidentes.&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658684"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658743"&gt;&lt;/A&gt;&lt;/P&gt;
&lt;H1&gt;16. Referências&lt;/H1&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658685"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658744"&gt;&lt;/A&gt;Azure SRE Agent&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/sre-agent/" target="_blank" rel="noopener"&gt;Documentação do Azure SRE Agent&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/sre-agent/run-modes" target="_blank" rel="noopener"&gt;&lt;EM&gt;Run Modes in Azure SRE Agent&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/sre-agent/agent-hooks" target="_blank" rel="noopener"&gt;&lt;EM&gt;Agent Hooks in Azure SRE Agent&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/sre-agent/tutorial-agent-hooks" target="_blank" rel="noopener"&gt;&lt;EM&gt;Tutorial: Configure Agent Hooks&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/sre-agent/model-provider-selection" target="_blank" rel="noopener"&gt;&lt;EM&gt;Model Provider Selection in Azure SRE Agent&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/sre-agent/execute-mitigations" target="_blank" rel="noopener"&gt;&lt;EM&gt;Execute Mitigations in Azure SRE Agent&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/sre-agent/" target="_blank" rel="noopener"&gt;&lt;EM&gt;Set up ServiceNow incident indexing&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658686"&gt;&lt;/A&gt; &lt;A href="https://azure.microsoft.com/pricing/details/sre-agent/" target="_blank" rel="noopener"&gt;Azure SRE Agent: preços&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658745"&gt;&lt;/A&gt;&lt;EM&gt;Azure Monitor&lt;/EM&gt; e observabilidade de contêineres&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/azure-monitor/overview" target="_blank" rel="noopener"&gt;&lt;EM&gt;Azure Monitor overview&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/azure-monitor/alerts/alerts-overview" target="_blank" rel="noopener"&gt;&lt;EM&gt;Overview of Azure Monitor alerts&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-overview" target="_blank" rel="noopener"&gt;&lt;EM&gt;Container insights overview&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/azure-monitor/reference/queries/kubepodinventory" target="_blank" rel="noopener"&gt;Consultas de exemplo para &lt;EM&gt;KubePodInventory&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/azure-monitor/essentials/prometheus-metrics-overview" target="_blank" rel="noopener"&gt;&lt;EM&gt;Azure Monitor managed service for Prometheus&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658687"&gt;&lt;/A&gt;&lt;A class="lia-anchor" target="_blank" name="_Toc236658746"&gt;&lt;/A&gt;Kubernetes e AKS&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/" target="_blank" rel="noopener"&gt;&lt;EM&gt;Configure Quality of Service for Pods&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/" target="_blank" rel="noopener"&gt;&lt;EM&gt;Node-pressure Eviction&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/" target="_blank" rel="noopener"&gt;&lt;EM&gt;Resource Management for Pods and Containers&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/aks/concepts-identity" target="_blank" rel="noopener"&gt;&lt;EM&gt;Access and identity options for AKS&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/samples/azure-samples/aks-store-demo/aks-store-demo/" target="_blank" rel="noopener"&gt;&lt;EM&gt;AKS Store Demo&lt;/EM&gt;: code sample&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Tue, 04 Aug 2026 15:51:55 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/evoluindo-a-resposta-a-incidentes-em-aks-com-azure-sre-agent/ba-p/4543906</guid>
      <dc:creator>fabiodasilva</dc:creator>
      <dc:date>2026-08-04T15:51:55Z</dc:date>
    </item>
    <item>
      <title>Multithreading, GIL e paralelismo no Python</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/multithreading-gil-e-paralelismo-no-python/ba-p/4543925</link>
      <description>&lt;H2 id="concorr-ncia-vs-paralelismo"&gt;Concorrência vs. paralelismo&lt;/H2&gt;
&lt;P&gt;Os dois conceitos são parecidos, mas não são a mesma coisa:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Concorrência&lt;/STRONG&gt;: lidar com várias tarefas ao mesmo tempo, alternando entre elas. As tarefas &lt;EM&gt;progridem&lt;/EM&gt; de forma intercalada, mas não necessariamente executam no mesmo instante. É ideal para trabalho &lt;A href="https://en.wikipedia.org/wiki/I/O_bound" target="_blank" rel="noopener"&gt;I/O-bound&lt;/A&gt; (rede, disco, banco de dados), onde o programa passa a maior parte do tempo &lt;EM&gt;esperando&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Paralelismo&lt;/STRONG&gt;: executar várias tarefas &lt;EM&gt;literalmente ao mesmo tempo&lt;/EM&gt;, em múltiplos núcleos de CPU. É o que acelera trabalho &lt;A href="https://en.wikipedia.org/wiki/CPU-bound" target="_blank" rel="noopener"&gt;CPU-bound&lt;/A&gt; (cálculo pesado, compressão, hashing).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Resumindo: &lt;STRONG&gt;todo paralelismo é concorrência, mas nem toda concorrência é paralelismo.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Para concorrência de I/O sem threads, o Python oferece o &lt;A href="https://docs.python.org/3/library/asyncio.html" target="_blank" rel="noopener"&gt;&lt;CODE&gt;asyncio&lt;/CODE&gt;&lt;/A&gt;, baseado em uma única thread com um &lt;A href="https://docs.python.org/3/library/asyncio-eventloop.html" target="_blank" rel="noopener"&gt;event loop&lt;/A&gt; e a sintaxe &lt;A href="https://docs.python.org/3/library/asyncio-task.html" target="_blank" rel="noopener"&gt;&lt;CODE&gt;async&lt;/CODE&gt;/&lt;CODE&gt;await&lt;/CODE&gt;&lt;/A&gt;. Como ele não cria threads nem processos, é leve e eficiente para milhares de conexões simultâneas — mas &lt;STRONG&gt;não&lt;/STRONG&gt; oferece paralelismo de CPU.&lt;/P&gt;
&lt;H2 id="threads-e-o-gil-por-que-multithreading-n-o-paraleliza-cpu"&gt;Threads e o GIL: por que multithreading não paraleliza CPU&lt;/H2&gt;
&lt;P&gt;O módulo &lt;A href="https://docs.python.org/3/library/threading.html" target="_blank" rel="noopener"&gt;&lt;CODE&gt;threading&lt;/CODE&gt;&lt;/A&gt; permite criar threads reais do sistema operacional, mas o &lt;A href="https://docs.python.org/3/glossary.html#term-CPython" target="_blank" rel="noopener"&gt;CPython&lt;/A&gt; usa o &lt;A href="https://docs.python.org/3/glossary.html#term-global-interpreter-lock" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;GIL (Global Interpreter Lock)&lt;/STRONG&gt;&lt;/A&gt;: uma trava global que garante que &lt;STRONG&gt;apenas uma thread execute bytecode Python por vez&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Por que ele existe? O GIL simplifica o interpretador e torna o modelo de objetos (incluindo tipos como &lt;A href="https://docs.python.org/3/library/stdtypes.html#dict" target="_blank" rel="noopener"&gt;&lt;CODE&gt;dict&lt;/CODE&gt;&lt;/A&gt;) implicitamente seguro contra acesso concorrente, além de facilitar a integração com bibliotecas C. O preço é abrir mão de boa parte do paralelismo em máquinas multi-core.&lt;/P&gt;
&lt;P&gt;Na prática:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Tarefas I/O-bound se beneficiam de threads&lt;/STRONG&gt;, pois o GIL é liberado durante operações de I/O (e por extensões como &lt;CODE&gt;hashlib&lt;/CODE&gt;/&lt;CODE&gt;zlib&lt;/CODE&gt; em trechos pesados).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Tarefas CPU-bound não escalam com threads&lt;/STRONG&gt;: o GIL serializa a execução, e usar mais threads não deixa o programa mais rápido — às vezes até o deixa mais lento pelo overhead de troca de contexto.&lt;/LI&gt;
&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Desde o Python 3.13 existe um build experimental &lt;A href="https://docs.python.org/3/howto/free-threading-python.html" target="_blank" rel="noopener"&gt;&lt;EM&gt;free-threaded&lt;/EM&gt;&lt;/A&gt; (compilado com &lt;A href="https://docs.python.org/3/using/configure.html#cmdoption-disable-gil" target="_blank" rel="noopener"&gt;&lt;CODE&gt;--disable-gil&lt;/CODE&gt;&lt;/A&gt;, descrito na &lt;A href="https://peps.python.org/pep-0703/" target="_blank" rel="noopener"&gt;PEP 703&lt;/A&gt;) que permite desligar o GIL. Porém isso &lt;STRONG&gt;exige um interpretador compilado especificamente para isso&lt;/STRONG&gt; (&lt;CODE&gt;python3.14t&lt;/CODE&gt;); as compilações padrão não permitem desabilitá-lo.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H3 id="o-gil-n-o-dispensa-sincroniza-o"&gt;O GIL não dispensa sincronização&lt;/H3&gt;
&lt;P&gt;Mesmo com o GIL, &lt;STRONG&gt;ainda precisamos nos preocupar com sincronização&lt;/STRONG&gt;. O GIL garante que uma instrução de bytecode não seja interrompida no meio, mas operações de alto nível (como &lt;CODE&gt;contador += 1&lt;/CODE&gt;) envolvem &lt;EM&gt;várias&lt;/EM&gt; instruções de bytecode e podem sofrer &lt;A href="https://en.wikipedia.org/wiki/Race_condition" target="_blank" rel="noopener"&gt;race conditions&lt;/A&gt; se uma thread for interrompida no meio delas.&lt;/P&gt;
&lt;P&gt;Por isso o módulo &lt;CODE&gt;threading&lt;/CODE&gt; oferece primitivos de sincronização — todos usáveis com &lt;A href="https://docs.python.org/3/library/threading.html#using-locks-conditions-and-semaphores-in-the-with-statement" target="_blank" rel="noopener"&gt;&lt;CODE&gt;with&lt;/CODE&gt;&lt;/A&gt; para liberação automática:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://docs.python.org/3/library/threading.html#threading.Lock" target="_blank" rel="noopener"&gt;&lt;CODE&gt;Lock&lt;/CODE&gt;&lt;/A&gt; / &lt;A href="https://docs.python.org/3/library/threading.html#threading.RLock" target="_blank" rel="noopener"&gt;&lt;CODE&gt;RLock&lt;/CODE&gt;&lt;/A&gt; — exclusão mútua.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://docs.python.org/3/library/threading.html#threading.Semaphore" target="_blank" rel="noopener"&gt;&lt;CODE&gt;Semaphore&lt;/CODE&gt;&lt;/A&gt; — limita o número de acessos simultâneos.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://docs.python.org/3/library/threading.html#threading.Condition" target="_blank" rel="noopener"&gt;&lt;CODE&gt;Condition&lt;/CODE&gt;&lt;/A&gt; / &lt;A href="https://docs.python.org/3/library/threading.html#threading.Event" target="_blank" rel="noopener"&gt;&lt;CODE&gt;Event&lt;/CODE&gt;&lt;/A&gt; — coordenação entre threads.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="multiprocessing-paralelismo-real-com-processos"&gt;Multiprocessing: paralelismo real com processos&lt;/H2&gt;
&lt;P&gt;A saída para aplicações &lt;STRONG&gt;CPU-bound&lt;/STRONG&gt; é o módulo &lt;A href="https://docs.python.org/3/library/multiprocessing.html" target="_blank" rel="noopener"&gt;&lt;CODE&gt;multiprocessing&lt;/CODE&gt;&lt;/A&gt; (ou o &lt;A href="https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ProcessPoolExecutor" target="_blank" rel="noopener"&gt;&lt;CODE&gt;ProcessPoolExecutor&lt;/CODE&gt;&lt;/A&gt; do &lt;A href="https://docs.python.org/3/library/concurrent.futures.html" target="_blank" rel="noopener"&gt;&lt;CODE&gt;concurrent.futures&lt;/CODE&gt;&lt;/A&gt;). Em vez de threads, ele cria &lt;STRONG&gt;processos&lt;/STRONG&gt; separados, e cada processo tem seu &lt;STRONG&gt;próprio interpretador e seu próprio GIL&lt;/STRONG&gt;, permitindo paralelismo real em múltiplos núcleos.&lt;/P&gt;
&lt;P&gt;O custo intrínseco é que &lt;STRONG&gt;criar um novo processo cria também um interpretador Python inteiro&lt;/STRONG&gt;, o que é pesado em memória e no tempo de inicialização. Além disso, processos não compartilham memória: os dados precisam ser &lt;A href="https://docs.python.org/3/library/pickle.html" target="_blank" rel="noopener"&gt;serializados (via &lt;CODE&gt;pickle&lt;/CODE&gt;)&lt;/A&gt; e trocados por mecanismos de &lt;A href="https://docs.python.org/3/library/multiprocessing.html#exchanging-objects-between-processes" target="_blank" rel="noopener"&gt;comunicação entre processos&lt;/A&gt; como &lt;A href="https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Queue" target="_blank" rel="noopener"&gt;&lt;CODE&gt;Queue&lt;/CODE&gt;&lt;/A&gt; e &lt;A href="https://docs.python.org/3/library/multiprocessing.html#multiprocessing.Pipe" target="_blank" rel="noopener"&gt;&lt;CODE&gt;Pipe&lt;/CODE&gt;&lt;/A&gt;, ou por &lt;A href="https://docs.python.org/3/library/multiprocessing.shared_memory.html" target="_blank" rel="noopener"&gt;memória compartilhada&lt;/A&gt;. Isso torna a sincronização mais complexa e adiciona overhead de comunicação.&lt;/P&gt;
&lt;H2 id="benchmark-medindo-o-impacto-do-gil"&gt;Benchmark: medindo o impacto do GIL&lt;/H2&gt;
&lt;P&gt;Para comprovar o conceito, um pequeno script calcula muitos hashes SHA-256 encadeados (uma tarefa puramente &lt;STRONG&gt;CPU-bound&lt;/STRONG&gt;) e distribui esse trabalho de três formas, usando &lt;CODE&gt;concurrent.futures&lt;/CODE&gt;:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Sequencial&lt;/STRONG&gt; — executa tudo em uma única thread, servindo de baseline.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;CODE&gt;ThreadPoolExecutor&lt;/CODE&gt;&lt;/STRONG&gt; — divide o trabalho entre várias threads.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;CODE&gt;ProcessPoolExecutor&lt;/CODE&gt;&lt;/STRONG&gt; — divide o trabalho entre vários processos.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Cada abordagem é medida em &lt;STRONG&gt;tempo de execução&lt;/STRONG&gt; e &lt;STRONG&gt;memória&lt;/STRONG&gt; consumida. Rodando no Python 3.14.6 (16 núcleos), o resultado foi:&lt;/P&gt;
&lt;PRE class="language-text" tabindex="0" contenteditable="false" data-lia-code-value="Abordagem               Tempo  Speedup      Memória
------------------------------------------------------------
Sequencial              0.79s    1.00x       0.0 MB
ThreadPoolExecutor      0.80s    0.99x       0.2 MB
ProcessPoolExecutor     0.31s    2.56x     148.6 MB
"&gt;&lt;CODE&gt;Abordagem               Tempo  Speedup      Memória
------------------------------------------------------------
Sequencial              0.79s    1.00x       0.0 MB
ThreadPoolExecutor      0.80s    0.99x       0.2 MB
ProcessPoolExecutor     0.31s    2.56x     148.6 MB
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Interpretando os números:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;As &lt;STRONG&gt;threads não aceleraram&lt;/STRONG&gt; a tarefa (speedup ~1.0x, praticamente igual ao sequencial). O GIL serializou a execução do bytecode: mesmo com várias threads, apenas uma roda por vez, então não há ganho de paralelismo para trabalho de CPU.&lt;/LI&gt;
&lt;LI&gt;Os &lt;STRONG&gt;processos foram ~2.5x mais rápidos&lt;/STRONG&gt;. Como cada processo tem seu próprio interpretador e seu próprio GIL, o trabalho realmente rodou em paralelo em vários núcleos.&lt;/LI&gt;
&lt;LI&gt;Esse paralelismo cobra um &lt;STRONG&gt;custo de memória&lt;/STRONG&gt;: os 8 processos consumiram ~148 MB (~18,6 MB por interpretador novo), contra apenas ~0,2 MB das threads, que compartilham o mesmo processo. É o trade-off central entre &lt;CODE&gt;threading&lt;/CODE&gt; e &lt;CODE&gt;multiprocessing&lt;/CODE&gt;: velocidade real de CPU ao preço de duplicar o interpretador em memória.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="conclus-o-i-o-bound-ou-cpu-bound-"&gt;Conclusão: I/O-bound ou CPU-bound?&lt;/H2&gt;
&lt;P&gt;O GIL é a razão pela qual multithreading no CPython &lt;STRONG&gt;não&lt;/STRONG&gt; entrega paralelismo de CPU. A regra prática é:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;I/O-bound&lt;/STRONG&gt; → use &lt;A href="https://docs.python.org/3/library/threading.html" target="_blank" rel="noopener"&gt;&lt;CODE&gt;threading&lt;/CODE&gt;&lt;/A&gt; ou &lt;A href="https://docs.python.org/3/library/asyncio.html" target="_blank" rel="noopener"&gt;&lt;CODE&gt;asyncio&lt;/CODE&gt;&lt;/A&gt; (o GIL é liberado durante a espera).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;CPU-bound&lt;/STRONG&gt; → use &lt;A href="https://docs.python.org/3/library/multiprocessing.html" target="_blank" rel="noopener"&gt;&lt;CODE&gt;multiprocessing&lt;/CODE&gt;&lt;/A&gt;, aceitando o custo de memória e de comunicação entre processos.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;No futuro&lt;/STRONG&gt;, o build &lt;A href="https://docs.python.org/3/howto/free-threading-python.html" target="_blank" rel="noopener"&gt;&lt;EM&gt;free-threaded&lt;/EM&gt;&lt;/A&gt; (PEP 703) promete paralelismo real com threads e sem o custo de vários interpretadores — mas ainda depende de um interpretador compilado sem o GIL.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Escolher a ferramenta certa depende, antes de tudo, de entender se o gargalo é de &lt;STRONG&gt;I/O&lt;/STRONG&gt; ou de &lt;STRONG&gt;CPU&lt;/STRONG&gt;.&lt;/P&gt;</description>
      <pubDate>Tue, 04 Aug 2026 13:36:33 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/multithreading-gil-e-paralelismo-no-python/ba-p/4543925</guid>
      <dc:creator>ClaudioGodoy</dc:creator>
      <dc:date>2026-08-04T13:36:33Z</dc:date>
    </item>
    <item>
      <title>Alocação de memória - .NET</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aloca%C3%A7%C3%A3o-de-mem%C3%B3ria-net/ba-p/4526427</link>
      <description>&lt;H1 id="aloca-o-de-mem-ria-net"&gt;Alocação de memória - .NET&lt;/H1&gt;
&lt;P&gt;Há pouco tempo, memória RAM era um recurso escasso e os engenheiros de software precisavam dominar a utilização de recursos de seus programas. Caso contrário, provavelmente a aplicação não funcionaria apropriadamente.&lt;/P&gt;
&lt;P&gt;Atualmente, o cenário mudou: memória RAM é um recurso abundante. Entretanto, para aplicações críticas que processam volumes massivos de dados, o gerenciamento eficiente de memória nunca deixou de ser crucial, principalmente em sistemas distribuídos baseados em nuvem.&lt;/P&gt;
&lt;P&gt;Neste artigo, explorarei de forma prática aspectos importantes sobre gerenciamento de memória em aplicações &lt;A href="https://dotnet.microsoft.com/" target="_blank"&gt;.NET&lt;/A&gt;.&lt;/P&gt;
&lt;H2 id="sistemas-de-tipos"&gt;Sistemas de tipos&lt;/H2&gt;
&lt;P&gt;No &lt;A href="https://dotnet.microsoft.com/" target="_blank"&gt;.NET&lt;/A&gt; todos os tipos são classificados de duas formas:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/value-types" target="_blank"&gt;Tipos de valor&lt;/A&gt;: Em inglês &lt;STRONG&gt;&lt;EM&gt;Value Type&lt;/EM&gt;&lt;/STRONG&gt; são alocados na própria &lt;A href="#community--1-thread-stack" target="_blank"&gt;&lt;EM&gt;Thread Stack&lt;/EM&gt;&lt;/A&gt;. Também podem ser alocados em campos de valores de referência.&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/dotnet/csharp/language-reference/keywords/reference-types" target="_blank"&gt;Tipos de referência&lt;/A&gt;: Em inglês &lt;STRONG&gt;&lt;EM&gt;Reference Type&lt;/EM&gt;&lt;/STRONG&gt; são alocados na &lt;A href="#community--1-heap-gerenciada-e-gc" target="_blank"&gt;&lt;EM&gt;Heap&lt;/EM&gt; Gerenciada&lt;/A&gt;. O &lt;CODE&gt;operator new&lt;/CODE&gt; retorna um endereço de memória do objeto.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Por definição, toda &lt;A href="https://learn.microsoft.com/dotnet/csharp/fundamentals/tutorials/classes" target="_blank"&gt;Classe&lt;/A&gt; é um tipo de referência. Variáveis são como ponteiros, que dão ligação entre a &lt;A href="#community--1-thread-stack" target="_blank"&gt;&lt;EM&gt;Thread Stack&lt;/EM&gt;&lt;/A&gt; e a &lt;A href="#community--1-heap-gerenciada-e-gc" target="_blank"&gt;&lt;EM&gt;Heap&lt;/EM&gt; Gerenciada&lt;/A&gt;.&lt;/P&gt;
&lt;H3 id="exemplo-pr-tico"&gt;Exemplo prático&lt;/H3&gt;
&lt;PRE class="language-csharp" tabindex="0" contenteditable="false" data-lia-code-value="// Value Type - struct
struct Coordenada { public int X; }

// Reference Type - class  
class Ponto { public int X; }

// VALUE TYPE: Cria cópia independente
Coordenada c1 = new Coordenada { X = 10 };
Coordenada c2 = c1;
c2.X = 100;
Console.WriteLine(c1.X); // 10 (não mudou)

// REFERENCE TYPE: Compartilha a mesma instância
Ponto p1 = new Ponto { X = 10 };
Ponto p2 = p1;
p2.X = 100;
Console.WriteLine(p1.X); // 100 (mudou!)
"&gt;&lt;CODE&gt;// Value Type - struct
struct Coordenada { public int X; }

// Reference Type - class  
class Ponto { public int X; }

// VALUE TYPE: Cria cópia independente
Coordenada c1 = new Coordenada { X = 10 };
Coordenada c2 = c1;
c2.X = 100;
Console.WriteLine(c1.X); // 10 (não mudou)

// REFERENCE TYPE: Compartilha a mesma instância
Ponto p1 = new Ponto { X = 10 };
Ponto p2 = p1;
p2.X = 100;
Console.WriteLine(p1.X); // 100 (mudou!)
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;H2 id="thread-stack"&gt;Thread Stack&lt;/H2&gt;
&lt;P&gt;Computadores executam instruções de forma sequencial, seguindo o fluxo de chamadas de métodos. Para gerenciar essa execução, cada &lt;A href="https://learn.microsoft.com/archive/msdn-magazine/2008/december/clr-inside-out-thread-management-in-the-clr" target="_blank"&gt;&lt;EM&gt;thread&lt;/EM&gt;&lt;/A&gt; mantém sua própria &lt;STRONG&gt;&lt;EM&gt;stack&lt;/EM&gt;&lt;/STRONG&gt; (pilha), seguindo o método &lt;STRONG&gt;&lt;EM&gt;LIFO&lt;/EM&gt;&lt;/STRONG&gt; (&lt;EM&gt;Last In, First Out&lt;/EM&gt;).&lt;/P&gt;
&lt;P&gt;Quando um método é invocado, o &lt;EM&gt;runtime&lt;/EM&gt; cria um &lt;STRONG&gt;&lt;EM&gt;stack frame&lt;/EM&gt;&lt;/STRONG&gt; (quadro de pilha) contendo todas as variáveis locais e parâmetros daquele método. Esse &lt;EM&gt;frame&lt;/EM&gt; é empilhado no topo da &lt;EM&gt;stack&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;A alocação de objetos na &lt;EM&gt;stack&lt;/EM&gt; segue uma regra simples: &lt;STRONG&gt;tipos de valor&lt;/STRONG&gt; (&lt;EM&gt;structs&lt;/EM&gt;, primitivos) são armazenados diretamente no &lt;EM&gt;stack frame&lt;/EM&gt; com seu valor completo. Já &lt;STRONG&gt;tipos de referência&lt;/STRONG&gt; (&lt;EM&gt;classes&lt;/EM&gt;) "escapam" para a &lt;A href="#community--1-heap-gerenciada-e-gc" target="_blank"&gt;&lt;EM&gt;heap&lt;/EM&gt; gerenciada&lt;/A&gt;, o &lt;EM&gt;stack frame&lt;/EM&gt; armazena apenas um ponteiro (referência) de 8 &lt;EM&gt;bytes&lt;/EM&gt; (em sistemas 64-&lt;EM&gt;bit&lt;/EM&gt;) que aponta para o objeto real na &lt;EM&gt;heap&lt;/EM&gt;. Isso permite que objetos de tamanho dinâmico existam além do tempo de vida do método que os criou, enquanto a &lt;EM&gt;stack&lt;/EM&gt; mantém acesso rápido através das referências.&lt;/P&gt;
&lt;H3 id="exemplo-aloca-o-de-value-types-na-stack-"&gt;Exemplo: Alocação de &lt;EM&gt;Value Types&lt;/EM&gt; na &lt;EM&gt;Stack&lt;/EM&gt;&lt;/H3&gt;
&lt;P&gt;Vamos observar como a &lt;EM&gt;stack&lt;/EM&gt; gerencia as chamadas de métodos e suas variáveis locais:&lt;/P&gt;
&lt;PRE class="language-csharp" tabindex="0" contenteditable="false" data-lia-code-value="using System;

class Program
{
    static void Main()
    {
        int a = 10;
        int b = 20;
        int resultado = Somar(a, b);
    }

    static int Somar(int x, int y)
    {
        int soma = x + y;
        return soma;
    }
}
"&gt;&lt;CODE&gt;using System;

class Program
{
    static void Main()
    {
        int a = 10;
        int b = 20;
        int resultado = Somar(a, b);
    }

    static int Somar(int x, int y)
    {
        int soma = x + y;
        return soma;
    }
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;Pontos importantes:&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Cada método cria seu próprio &lt;STRONG&gt;&lt;EM&gt;stack frame&lt;/EM&gt;&lt;/STRONG&gt; com todas as variáveis locais e parâmetros&lt;/LI&gt;
&lt;LI&gt;Todas as variáveis (&lt;CODE&gt;a&lt;/CODE&gt;, &lt;CODE&gt;b&lt;/CODE&gt;, &lt;CODE&gt;resultado&lt;/CODE&gt;, &lt;CODE&gt;x&lt;/CODE&gt;, &lt;CODE&gt;y&lt;/CODE&gt;, &lt;CODE&gt;soma&lt;/CODE&gt;) são &lt;STRONG&gt;&lt;EM&gt;Value Types&lt;/EM&gt;&lt;/STRONG&gt; (&lt;EM&gt;int&lt;/EM&gt;/&lt;EM&gt;Int32&lt;/EM&gt;)&lt;/LI&gt;
&lt;LI&gt;Valores são &lt;STRONG&gt;copiados&lt;/STRONG&gt; ao passar parâmetros (Somar recebe cópias de &lt;CODE&gt;a&lt;/CODE&gt; e &lt;CODE&gt;b&lt;/CODE&gt;)&lt;/LI&gt;
&lt;LI&gt;Ao término de Somar, seu &lt;EM&gt;frame&lt;/EM&gt; é &lt;STRONG&gt;automaticamente removido&lt;/STRONG&gt; (desempilhado)&lt;/LI&gt;
&lt;LI&gt;Não há uso da &lt;A href="#community--1-heap-gerenciada-e-gc" target="_blank"&gt;&lt;EM&gt;heap&lt;/EM&gt; gerenciada&lt;/A&gt; neste exemplo, tudo permanece na &lt;EM&gt;stack&lt;/EM&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 id="-heap-gerenciada-e-gc"&gt;&lt;EM&gt;Heap&lt;/EM&gt; gerenciada e GC&lt;/H2&gt;
&lt;P&gt;Enquanto a &lt;A href="#community--1-thread-stack" target="_blank"&gt;&lt;EM&gt;Thread Stack&lt;/EM&gt;&lt;/A&gt; gerencia a execução e variáveis locais de forma automática e determinística, a &lt;STRONG&gt;&lt;EM&gt;heap&lt;/EM&gt; gerenciada&lt;/STRONG&gt; é responsável por armazenar objetos de tipos de referência que precisam existir além do escopo de um único método. A &lt;EM&gt;heap&lt;/EM&gt; é composta por dois componentes principais: o &lt;STRONG&gt;&lt;EM&gt;allocator&lt;/EM&gt;&lt;/STRONG&gt; (alocador) e o &lt;STRONG&gt;&lt;EM&gt;collector&lt;/EM&gt;&lt;/STRONG&gt; (coletor).&lt;/P&gt;
&lt;P&gt;O &lt;STRONG&gt;&lt;EM&gt;allocator&lt;/EM&gt;&lt;/STRONG&gt; é chamado sempre que criamos um objeto com &lt;CODE&gt;new&lt;/CODE&gt; (tipos de referência). Ele divide os objetos em duas categorias baseadas no tamanho: &lt;STRONG&gt;objetos pequenos&lt;/STRONG&gt; (&amp;lt; 85.000 &lt;EM&gt;bytes&lt;/EM&gt;) que são alocados na &lt;EM&gt;Small Object Heap&lt;/EM&gt; (SOH), e &lt;STRONG&gt;objetos grandes&lt;/STRONG&gt; (≥ 85.000 &lt;EM&gt;bytes&lt;/EM&gt;) que vão para a &lt;EM&gt;Large Object Heap&lt;/EM&gt; (LOH). Para otimizar &lt;EM&gt;performance&lt;/EM&gt;, o &lt;EM&gt;allocator&lt;/EM&gt; trabalha com &lt;STRONG&gt;&lt;EM&gt;allocation contexts&lt;/EM&gt;&lt;/STRONG&gt; (contextos de alocação), pequenas regiões de memória dedicadas a cada &lt;EM&gt;thread&lt;/EM&gt;, evitando a necessidade de &lt;EM&gt;locks&lt;/EM&gt; em cada alocação. Quando o orçamento de alocação (&lt;EM&gt;allocation budget&lt;/EM&gt;) é excedido ou não há mais espaço disponível, o &lt;EM&gt;allocator&lt;/EM&gt; aciona o coletor.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Atualmente threshold do LOH pode ser alterado nas &lt;A href="https://learn.microsoft.com/en-us/dotnet/core/runtime-config/garbage-collector#large-object-heap-threshold" target="_blank"&gt;configurações do runtime&lt;/A&gt;.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;O &lt;A href="https://learn.microsoft.com/dotnet/standard/garbage-collection/fundamentals" target="_blank"&gt;&lt;EM&gt;Garbage Collector&lt;/EM&gt; (GC)&lt;/A&gt; é um coletor geracional que organiza objetos em gerações baseadas em sua idade: &lt;STRONG&gt;&lt;EM&gt;Gen0&lt;/EM&gt;&lt;/STRONG&gt; (objetos recém-criados), &lt;STRONG&gt;&lt;EM&gt;Gen1&lt;/EM&gt;&lt;/STRONG&gt; (objetos que sobreviveram a uma coleta) e &lt;STRONG&gt;&lt;EM&gt;Gen2&lt;/EM&gt;&lt;/STRONG&gt; (objetos de longa duração). Essa divisão geracional se baseia na hipótese de que a maioria dos objetos tem vida curta. O GC coleta gerações mais jovens com maior frequência (mais barato) e &lt;EM&gt;Gen2&lt;/EM&gt; com menor frequência (mais caro). Objetos grandes na LOH formam a &lt;STRONG&gt;&lt;EM&gt;Gen3&lt;/EM&gt;&lt;/STRONG&gt; e são sempre coletados junto com &lt;EM&gt;Gen2&lt;/EM&gt; devido ao alto custo de compactação.&lt;/P&gt;
&lt;P&gt;A conexão entre &lt;EM&gt;stack&lt;/EM&gt; e &lt;EM&gt;heap&lt;/EM&gt; é simples: quando um método cria um objeto de tipo de referência (&lt;CODE&gt;new Ponto()&lt;/CODE&gt;), o &lt;STRONG&gt;&lt;EM&gt;allocator&lt;/EM&gt;&lt;/STRONG&gt; reserva espaço na &lt;EM&gt;heap&lt;/EM&gt; gerenciada e retorna o endereço de memória. Esse endereço (ponteiro/referência de 8 &lt;EM&gt;bytes&lt;/EM&gt; em sistemas 64-&lt;EM&gt;bit&lt;/EM&gt;) é armazenado no &lt;STRONG&gt;&lt;EM&gt;stack frame&lt;/EM&gt;&lt;/STRONG&gt; do método. Assim, a &lt;EM&gt;stack&lt;/EM&gt; mantém as referências enquanto os objetos reais vivem na &lt;EM&gt;heap&lt;/EM&gt;, permitindo que múltiplas referências na &lt;EM&gt;stack&lt;/EM&gt; apontem para o mesmo objeto na &lt;EM&gt;heap&lt;/EM&gt; e que objetos sobrevivam além do tempo de vida do método que os criou.&lt;/P&gt;
&lt;H2 id="conclus-o"&gt;Conclusão&lt;/H2&gt;
&lt;P&gt;O gerenciamento de memória em .NET equilibra eficiência e simplicidade através de dois mecanismos complementares: a &lt;STRONG&gt;&lt;EM&gt;stack&lt;/EM&gt;&lt;/STRONG&gt; oferece alocação ultrarrápida e determinística para tipos de valor e referências locais, enquanto a &lt;STRONG&gt;&lt;EM&gt;heap&lt;/EM&gt; gerenciada&lt;/STRONG&gt; com seu &lt;EM&gt;Garbage Collector&lt;/EM&gt; cuida automaticamente de objetos de vida longa. Compreender a distinção entre &lt;STRONG&gt;&lt;EM&gt;Value Types&lt;/EM&gt;&lt;/STRONG&gt; e &lt;STRONG&gt;&lt;EM&gt;Reference Types&lt;/EM&gt;&lt;/STRONG&gt;, e como a &lt;EM&gt;stack&lt;/EM&gt; e &lt;EM&gt;heap&lt;/EM&gt; trabalham juntas, é fundamental para escrever aplicações performáticas. O sistema geracional do GC otimiza coletas baseando-se na observação de que a maioria dos objetos tem vida curta, tornando o gerenciamento de memória eficiente sem exigir intervenção manual do desenvolvedor na maioria dos cenários.&lt;/P&gt;
&lt;H2 id="refer-ncias"&gt;Referências&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://www.amazon.com.br/CLR-Via-C-Jeffrey-Richter/dp/0735667454" target="_blank"&gt;CLR Via C#&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/dotnet/navigate/advanced-programming/" target="_blank"&gt;Advanced .NET programming&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://github.com/dotnet/runtime/blob/main/docs/design/coreclr/botr/README.md" target="_blank"&gt;The Runtime Book&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Wed, 22 Jul 2026 13:51:44 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aloca%C3%A7%C3%A3o-de-mem%C3%B3ria-net/ba-p/4526427</guid>
      <dc:creator>ClaudioGodoy</dc:creator>
      <dc:date>2026-07-22T13:51:44Z</dc:date>
    </item>
    <item>
      <title>GitHub Copilot Dev Days Online</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/github-copilot-dev-days-online/ba-p/4518608</link>
      <description>&lt;P&gt;After a series of in-person events, GitHub Copilot Dev Days is now going online, bringing developers from around the world together to explore modern AI-assisted software development in practice.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Through live sessions focused on agentic development, modern workflows, and hands-on learning in VS Code, attendees will learn how to use GitHub Copilot beyond autocomplete and apply it across real development scenarios.&lt;/P&gt;
&lt;H2 data-section-id="11zls3u" data-start="517" data-end="582"&gt;&lt;STRONG&gt;Register for the session that fits your language and community&lt;/STRONG&gt;&lt;/H2&gt;
&lt;H3 data-section-id="1ivtktk" data-start="971" data-end="1013"&gt;&lt;STRONG&gt;GitHub Copilot Dev Days LATAM [Spanish] - May 26&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="1015" data-end="1180"&gt;A hands-on session for Spanish-speaking developers across Latin America focused on building modern applications with GitHub Copilot, TypeScript, React, and Tailwind.&lt;/P&gt;
&lt;P data-start="1182" data-end="1330"&gt;Attendees will explore agentic workflows, context engineering, and practical ways to use GitHub Copilot as an active development partner in VS Code.&lt;/P&gt;
&lt;UL data-start="1332" data-end="1592"&gt;
&lt;LI data-section-id="1klv0sd" data-start="1332" data-end="1354"&gt;&lt;STRONG&gt;Date: May 26, 2026, 12 PM (Mexico City / CDMX)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-section-id="abynt6" data-start="1466" data-end="1592"&gt;&lt;STRONG&gt;Register: &lt;A class="lia-external-url" href="https://developer.microsoft.com/reactor/events/27094/" target="_blank" rel="noopener" data-start="1478" data-end="1592" data-lia-auto-title-active="0" data-lia-auto-title="GitHub Copilot Dev Days LATAM | Microsoft Reactor"&gt;GitHub Copilot Dev Days LATAM | Microsoft Reactor&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-section-id="1loccch" data-start="1594" data-end="1650"&gt;&lt;STRONG&gt;GitHub Copilot Dev Days Brazil [Portuguese] - May 25&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="1652" data-end="1788"&gt;This edition focuses on AI-assisted development with Python, FastAPI, and HTMX using GitHub Copilot throughout the development workflow.&lt;/P&gt;
&lt;P data-start="1790" data-end="1932"&gt;The session covers practical workflows for code generation, refactoring, debugging, and day-to-day development with GitHub Copilot in VS Code.&lt;/P&gt;
&lt;UL data-start="1934" data-end="2224"&gt;
&lt;LI data-section-id="1m9l41q" data-start="1934" data-end="1956"&gt;&lt;STRONG&gt;Date: May 25, 2026, 7 PM (Brasilia Time)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-section-id="19jysof" data-start="2098" data-end="2224"&gt;&lt;STRONG&gt;Register: &lt;A class="lia-external-url" href="https://developer.microsoft.com/reactor/events/27091/" target="_blank" rel="noopener" data-start="2110" data-end="2224" data-lia-auto-title-active="0" data-lia-auto-title="GitHub Copilot Dev Days Brasil | Microsoft Reactor"&gt;GitHub Copilot Dev Days Brasil | Microsoft Reactor&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-section-id="2qu2hq" data-start="2811" data-end="2851"&gt;&lt;STRONG&gt;GitHub Copilot Dev Days 中文版 [Simplified Chinese] - May 26&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2853" data-end="2989"&gt;This session explores how GitHub Copilot and GitHub Actions can work together to create intelligent and automated development workflows.&lt;/P&gt;
&lt;P data-start="2991" data-end="3155"&gt;Topics include ChatOps, automated summaries, syncing content into GitHub Issues, and agentic workflows designed to improve collaboration and engineering efficiency.&lt;/P&gt;
&lt;UL data-start="3157" data-end="3430"&gt;
&lt;LI data-section-id="1klv0sd" data-start="3157" data-end="3179"&gt;&lt;STRONG&gt;Date: May 26, 2026, 7:30 PM (China Standard Time - CST)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-section-id="1fdwxsq" data-start="3304" data-end="3430"&gt;&lt;STRONG&gt;Register: &lt;A class="lia-external-url" href="https://developer.microsoft.com/reactor/events/27114/" target="_blank" rel="noopener" data-start="3316" data-end="3430" data-lia-auto-title-active="0" data-lia-auto-title="GitHub Copilot Dev Days - 中文版 | Microsoft Reactor"&gt;GitHub Copilot Dev Days - 中文版 | Microsoft Reactor&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-section-id="1et0tch" data-start="2226" data-end="2262"&gt;&lt;STRONG&gt;GitHub Copilot Dev Days [English] - May 27&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2264" data-end="2390"&gt;An English-language workshop for developers who want to learn how to build modern applications with GitHub Copilot in VS Code.&lt;/P&gt;
&lt;P data-start="2392" data-end="2547"&gt;The session focuses on TypeScript, React, Tailwind, and Agent Mode workflows, showing how better context and prompting can improve AI-assisted development.&lt;/P&gt;
&lt;UL data-start="2549" data-end="2809"&gt;
&lt;LI data-section-id="1dag7ng" data-start="2549" data-end="2571"&gt;&lt;STRONG&gt;Date: May 27, 2026, 9 AM (PST)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-section-id="1y4gma0" data-start="2683" data-end="2809"&gt;&lt;STRONG&gt;Register: &lt;A class="lia-external-url" href="https://developer.microsoft.com/reactor/events/27096/" target="_blank" rel="noopener" data-start="2695" data-end="2809" data-lia-auto-title-active="0" data-lia-auto-title="GitHub Copilot Dev Days | Microsoft Reactor"&gt;GitHub Copilot Dev Days | Microsoft Reactor&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P data-start="3432" data-end="3624" data-is-last-node="" data-is-only-node=""&gt;All sessions are hosted through &lt;A class="lia-external-url" href="https://developer.microsoft.com/reactor/" target="_blank" rel="noopener" data-start="3464" data-end="3548"&gt;Microsoft Reactor&lt;/A&gt;. Check the registration pages for local times and additional event details.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;</description>
      <pubDate>Thu, 14 May 2026 13:38:38 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/github-copilot-dev-days-online/ba-p/4518608</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2026-05-14T13:38:38Z</dc:date>
    </item>
    <item>
      <title>APIM Circuit Breaker com Azure OpenAI</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/apim-circuit-breaker-com-azure-openai/ba-p/4514008</link>
      <description>&lt;H1 data-line="0"&gt;APIM Circuit Breaker com Azure OpenAI&lt;/H1&gt;
&lt;H2 data-line="9"&gt;Visão Geral&lt;/H2&gt;
&lt;P data-line="12"&gt;Ao consumir modelos do&amp;nbsp;&lt;STRONG&gt;Azure OpenAI&lt;/STRONG&gt;&amp;nbsp;em produção, depender de um único endpoint representa um risco real. Basta uma instância ficar indisponível ou atingir limites de throttling para que toda a aplicação seja impactada.&lt;/P&gt;
&lt;P data-line="14"&gt;Neste artigo, construímos uma arquitetura resiliente utilizando o&amp;nbsp;&lt;STRONG&gt;Azure API Management (APIM)&lt;/STRONG&gt;&amp;nbsp;como camada de proteção entre o cliente e os serviços de IA.&lt;/P&gt;
&lt;P data-line="16"&gt;O ponto de partida são&amp;nbsp;&lt;STRONG&gt;dois backends do Azure OpenAI&lt;/STRONG&gt;&amp;nbsp;(oiaws01&amp;nbsp;e&amp;nbsp;oiaws02), ambos configurados com&amp;nbsp;&lt;STRONG&gt;Managed Identity&lt;/STRONG&gt;. A partir deles, criamos um&amp;nbsp;&lt;STRONG&gt;Load Balancer Pool&lt;/STRONG&gt;&amp;nbsp;no APIM, distribuindo o tráfego em um modelo 50/50 entre os dois endpoints.&lt;/P&gt;
&lt;P data-line="18"&gt;Em seguida, habilitamos o&amp;nbsp;&lt;STRONG&gt;Circuit Breaker&lt;/STRONG&gt;, que detecta falhas consecutivas e "abre o circuito", impedindo que novas requisições sejam enviadas a um backend com problemas. Nesse estado, o APIM passa a responder com&amp;nbsp;&lt;STRONG&gt;503 – Service Unavailable&lt;/STRONG&gt;, incluindo o header&amp;nbsp;Retry-After, até que o backend se recupere.&lt;/P&gt;
&lt;P data-line="20"&gt;O ponto mais crítico está na&amp;nbsp;&lt;STRONG&gt;configuração das políticas XML&lt;/STRONG&gt;. Posicionar o&amp;nbsp;set-backend-service&amp;nbsp;&lt;STRONG&gt;dentro&lt;/STRONG&gt;&amp;nbsp;do bloco&amp;nbsp;&amp;lt;retry&amp;gt;&amp;nbsp;garante que cada tentativa seja roteada novamente pelo Load Balancer, evitando que as retentativas atinjam sempre o mesmo backend com falha.&lt;/P&gt;
&lt;P data-line="22"&gt;Todo o fluxo foi validado usando o&amp;nbsp;&lt;STRONG&gt;Trace do APIM&lt;/STRONG&gt;, onde é possível acompanhar, passo a passo:&lt;/P&gt;
&lt;UL data-line="24"&gt;
&lt;LI data-line="24"&gt;Seleção do backend no pool&lt;/LI&gt;
&lt;LI data-line="25"&gt;Autenticação via Managed Identity&lt;/LI&gt;
&lt;LI data-line="26"&gt;Fallback para o segundo endpoint&lt;/LI&gt;
&lt;LI data-line="27"&gt;Resposta final ao cliente&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="29"&gt;Por fim, exploramos a&amp;nbsp;&lt;STRONG&gt;camada de observabilidade&lt;/STRONG&gt;. Os eventos de abertura do Circuit Breaker são capturados e enviados para uma&amp;nbsp;&lt;STRONG&gt;Storage Queue&lt;/STRONG&gt;, de onde um&amp;nbsp;&lt;STRONG&gt;Logic App&lt;/STRONG&gt;&amp;nbsp;os exporta via HTTP POST para o&amp;nbsp;&lt;STRONG&gt;Elastic Observability&lt;/STRONG&gt;, permitindo monitoramento em tempo real de quando e por que os circuitos são abertos.&lt;/P&gt;
&lt;H2 data-line="17"&gt;Diagrama&lt;/H2&gt;
&lt;img&gt;Diagrama do fluxo da Requisição http, Load balancer falhas e Circuit Break&lt;/img&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-line="21"&gt;1. Criando os Backends para Azure OpenAI&lt;/H2&gt;
&lt;P data-line="26"&gt;O primeiro passo é registrar no APIM os endpoints que representam as instâncias do Azure OpenAI. Neste cenário, criamos dois backends apontando para:&lt;/P&gt;
&lt;UL data-line="28"&gt;
&lt;LI data-line="28"&gt;https://oiaws01.openai.azure.com/openai&lt;/LI&gt;
&lt;LI data-line="29"&gt;https://oiaws02.openai.azure.com/openai&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="31"&gt;Cada backend funciona como uma abstração dentro do APIM — ele encapsula a URL, as credenciais e as configurações de resiliência (como o Circuit Breaker) em um único recurso reutilizável.&lt;/P&gt;
&lt;P data-line="79"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;Dois backends registrados no APIM: openapi01-openai-endpoint e openapi02-openai-endpoint, apontando para os respectivos endpoints do Azure OpenAI.&lt;/img&gt;
&lt;H3 data-line="81"&gt;Configuração de Managed Identity&lt;/H3&gt;
&lt;P data-line="39"&gt;Para que o APIM consiga se autenticar nos backends sem expor chaves de API, configuramos&amp;nbsp;&lt;STRONG&gt;Managed Identity&lt;/STRONG&gt;. O Azure API Management pode apresentar credenciais ao backend utilizando cabeçalhos de autorização, parâmetros de consulta ou certificados de cliente — mas a abordagem mais segura e moderna é usar a identidade gerenciada.&lt;/P&gt;
&lt;P data-line="41"&gt;Com essa configuração, o APIM solicita um token OAuth ao Azure AD usando sua própria identidade (System Assigned), e o apresenta ao backend como um Bearer token. Não há segredos para rotacionar, não há chaves para vazar.&lt;/P&gt;
&lt;P data-line="90"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;Backend openia02-openai-endpoint configurado com Managed Identity (System Assigned) apontando para https://cognitiveservices.azure.com/.&lt;/img&gt;
&lt;P&gt;Em alguns cenários — especialmente quando a configuração via portal não é suficiente ou quando precisamos de controle granular — é necessário configurar a autenticação diretamente nas políticas XML do APIM:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="xml"&gt;&amp;lt;authentication-managed-identity resource="https://cognitiveservices.azure.com" output-token-variable-name="msi-access-token" /&amp;gt;
&amp;lt;!-- Add Authorization header with token --&amp;gt;
&amp;lt;set-header name="Authorization" exists-action="override"&amp;gt;
    &amp;lt;value&amp;gt;@("Bearer " + (string)context.Variables["msi-access-token"])&amp;lt;/value&amp;gt;
&amp;lt;/set-header&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;Essa abordagem é útil quando você precisa reutilizar o token em múltiplas policies ou quando o backend exige um formato específico de apresentação das credenciais.&lt;/P&gt;
&lt;H3 data-line="92"&gt;Teste Básico&lt;/H3&gt;
&lt;P&gt;Com os backends e a autenticação configurados, o próximo passo é validar que tudo funciona. Um teste simples direto no console do APIM confirma a conectividade:&lt;/P&gt;
&lt;P data-line="94"&gt;&lt;STRONG&gt;Parâmetros:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;deployment-id: o1
api-version: 2025-01-01-preview&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Request body:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;{
    "messages": [
        {
            "role": "user",
            "content": "I am going to Paris, what should I see?"
        }
    ],
    "max_completion_tokens": 40000,
    "model": "o1"
}&lt;/LI-CODE&gt;&lt;img&gt;Teste no console do APIM confirmando resposta 200 OK do Azure OpenAI (modelo o1) via Managed Identity.&lt;/img&gt;
&lt;H2 data-line="58"&gt;2. Criando o Load Balancer (LB)&lt;/H2&gt;
&lt;P data-line="92"&gt;Ter dois backends funcionando individualmente é um bom começo, mas não garante resiliência por si só. Se a API estiver apontada para um backend fixo e ele cair, o serviço para. É aqui que entra o&amp;nbsp;&lt;STRONG&gt;Load Balancer Pool&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-line="94"&gt;O Load Balancer Pool é um recurso do APIM que agrupa múltiplos backends e distribui o tráfego entre eles segundo regras configuráveis. Em vez de apontar a política set-backend-service para um backend individual, apontamos para o pool — e o APIM se encarrega de escolher para qual instância enviar cada requisição.&lt;/P&gt;
&lt;H3 data-line="122"&gt;Criação do Load Balancer Pool&lt;/H3&gt;
&lt;P data-line="98"&gt;Criamos um pool chamado&amp;nbsp;LB01&amp;nbsp;contendo os dois backends OpenAI. A distribuição foi configurada como&amp;nbsp;&lt;STRONG&gt;50/50 com pesos customizados&lt;/STRONG&gt;, o que significa que cada backend recebe metade do tráfego em condições normais.&lt;/P&gt;
&lt;P data-line="100"&gt;&lt;STRONG&gt;Benefícios imediatos:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-line="102"&gt;
&lt;LI data-line="102"&gt;&lt;STRONG&gt;Distribuição de carga&lt;/STRONG&gt;&amp;nbsp;— nenhum backend recebe 100% das requisições&lt;/LI&gt;
&lt;LI data-line="103"&gt;&lt;STRONG&gt;Alta disponibilidade&lt;/STRONG&gt;&amp;nbsp;— se um backend falhar, o outro absorve o tráfego (quando combinado com retry)&lt;/LI&gt;
&lt;LI data-line="104"&gt;&lt;STRONG&gt;Flexibilidade&lt;/STRONG&gt; — pesos e prioridades podem ser ajustados sem alterar código&lt;/LI&gt;
&lt;/UL&gt;
&lt;img&gt;Criação do Load Balancer Pool com os dois backends OpenAI, peso 50/50 e prioridades customizadas.&lt;/img&gt;
&lt;P&gt;Com o pool criado, qualquer política que referencia backend-id="LB01" passa automaticamente a ter balanceamento de carga. Mas distribuir tráfego não é suficiente — precisamos também&amp;nbsp;&lt;STRONG&gt;detectar e isolar falhas&lt;/STRONG&gt;. É o que o Circuit Breaker faz.&lt;/P&gt;
&lt;H2 data-line="75"&gt;3. Entendendo e Configurando o Circuit Breaker&lt;/H2&gt;
&lt;H3 data-line="116"&gt;O que é o Circuit Breaker?&lt;/H3&gt;
&lt;P data-line="118"&gt;O&amp;nbsp;&lt;STRONG&gt;Circuit Breaker&lt;/STRONG&gt;&amp;nbsp;é um padrão de resiliência para sistemas distribuídos, inspirado nos disjuntores elétricos. Assim como um disjuntor corta a energia quando detecta uma sobrecarga para proteger o circuito, o Circuit Breaker em software&amp;nbsp;&lt;STRONG&gt;interrompe temporariamente as chamadas a um serviço que está falhando&lt;/STRONG&gt;, evitando que falhas em cascata derrubem toda a aplicação.&lt;/P&gt;
&lt;P data-line="120"&gt;Sem Circuit Breaker, quando um backend começa a falhar, o sistema continua enviando requisições para ele — consumindo recursos, aumentando latência e potencialmente causando timeout em cadeia. Com o Circuit Breaker, o sistema "aprende" que aquele backend está com problemas e para de enviar tráfego até que ele se recupere.&lt;/P&gt;
&lt;H3 data-line="122"&gt;Os Três Estados do Circuit Breaker&lt;/H3&gt;
&lt;P data-line="124"&gt;O Circuit Breaker opera em três estados bem definidos:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Estado&lt;/th&gt;&lt;th&gt;Comportamento&lt;/th&gt;&lt;th&gt;Analogia&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Closed (Fechado)&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Tráfego flui normalmente para o backend. Falhas são contadas silenciosamente.&lt;/td&gt;&lt;td&gt;Disjuntor ligado — energia passa.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Open (Aberto)&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Todas as requisições são&amp;nbsp;&lt;STRONG&gt;imediatamente rejeitadas&lt;/STRONG&gt;&amp;nbsp;com&amp;nbsp;503 Service Unavailable&amp;nbsp;+ header&amp;nbsp;Retry-After. Nenhuma chamada chega ao backend.&lt;/td&gt;&lt;td&gt;Disjuntor desligado — energia cortada para proteger o circuito.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Half-Open (Meio-aberto)&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Após o&amp;nbsp;trip duration&amp;nbsp;expirar, o circuito permite&amp;nbsp;&lt;STRONG&gt;uma requisição de teste&lt;/STRONG&gt;. Se ela for bem-sucedida, volta para Closed. Se falhar, volta para Open.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;A transição entre os estados segue este fluxo:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-line="141"&gt;Por que isso importa para Azure OpenAI?&lt;/H3&gt;
&lt;P data-line="143"&gt;No contexto de IA generativa, uma chamada ao Azure OpenAI pode levar vários segundos. Se o backend está retornando erros (429 throttling, 500 internal error, 404 modelo não encontrado), cada tentativa desperdiça tempo precioso. O Circuit Breaker garante&amp;nbsp;&lt;STRONG&gt;fail-fast&lt;/STRONG&gt;: em vez de esperar 30 segundos por um timeout, o cliente recebe imediatamente um 503 com a informação de quando pode tentar novamente.&lt;/P&gt;
&lt;H3 data-line="145"&gt;Configuração no APIM&lt;/H3&gt;
&lt;img&gt;Configuração do Circuit Breaker: 1 falha dispara abertura, status codes 400–599, trip duration de 1 minuto e Retry-After habilitado.&lt;/img&gt;
&lt;P data-line="151"&gt;Os parâmetros configurados foram:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Parâmetro&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;th&gt;Significado&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Rule name&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;rulecb&lt;/td&gt;&lt;td&gt;Identificador da regra&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Failure count&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Basta 1 falha para abrir o circuito (agressivo, ideal para testes)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Failure interval&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;1 hora&lt;/td&gt;&lt;td&gt;Janela de tempo para contagem de falhas&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Failure status code range&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;400-599&lt;/td&gt;&lt;td&gt;Qualquer resposta 4xx ou 5xx conta como falha&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Failure error reason&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;BackendConnectionFailure&lt;/td&gt;&lt;td&gt;Tipo de erro que dispara o Circuit Breaker&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Trip duration&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;1 minuto&lt;/td&gt;&lt;td&gt;Tempo que o circuito permanece aberto antes de tentar Half-Open&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Check Retry-After header&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;True (Accept)&lt;/td&gt;&lt;td&gt;Respeita o header Retry-After do backend&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P data-line="163"&gt;&lt;STRONG&gt;Nota sobre o Failure Count:&lt;/STRONG&gt; Em produção, um valor de&amp;nbsp;1&amp;nbsp;é muito agressivo — uma única falha transitória abriria o circuito. Valores entre 3 e 5 são mais comuns. Para este artigo, usamos&amp;nbsp;1&amp;nbsp;para facilitar a demonstração.&lt;/P&gt;
&lt;H3 data-line="146"&gt;Comportamento Observado&lt;/H3&gt;
&lt;UL data-line="148"&gt;
&lt;LI data-line="148"&gt;Após falhas consecutivas, o APIM retorna&amp;nbsp;&lt;STRONG&gt;503 – Service Unavailable&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL data-line="148"&gt;
&lt;LI data-line="149"&gt;O Circuit Breaker aparece como &lt;STRONG&gt;aberto&lt;/STRONG&gt;&amp;nbsp;no portal do Azure&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL data-line="148"&gt;
&lt;LI data-line="150"&gt;O header &lt;STRONG&gt;Retry-After&lt;/STRONG&gt; é incluído na resposta&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-line="94"&gt;4. Configurando as Políticas para usar o LB&lt;/H2&gt;
&lt;P data-line="178"&gt;Com backends, Load Balancer e Circuit Breaker configurados, o último passo é garantir que as&amp;nbsp;&lt;STRONG&gt;políticas XML&lt;/STRONG&gt;&amp;nbsp;do APIM conectem tudo corretamente. Aqui estão os pontos que fazem toda a diferença entre uma configuração que funciona e uma que parece funcionar.&lt;/P&gt;
&lt;H3 data-line="180"&gt;Ponto Importante #1 — Apontar para o Pool, não para o Backend&lt;/H3&gt;
&lt;P data-line="182"&gt;A política&amp;nbsp;set-backend-service&amp;nbsp;deve referenciar o&amp;nbsp;&lt;STRONG&gt;Load Balancer Pool&lt;/STRONG&gt;, e não um backend individual:&lt;/P&gt;
&lt;LI-CODE lang="xml"&gt;&amp;lt;set-backend-service id="apim-generated-policy" backend-id="LB01" /&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;Se você apontar diretamente para openapi01-openai-endpoint, perde todo o benefício do balanceamento e do failover automático.&lt;/P&gt;
&lt;H3 data-line="190"&gt;Ponto Importante #2 — Buffer do Request Body&lt;/H3&gt;
&lt;P data-line="192"&gt;A política de retry deve usar forward-request com buffer-request-body="true". Sem isso, o body da requisição é consumido na primeira tentativa e não está disponível para retentativas:&lt;/P&gt;
&lt;LI-CODE lang="xml"&gt;&amp;lt;backend&amp;gt;
    &amp;lt;retry condition="@(context.Response.StatusCode == 404)" count="2" interval="1" first-fast-retry="true"&amp;gt;
        &amp;lt;forward-request buffer-request-body="true" /&amp;gt;
    &amp;lt;/retry&amp;gt;
&amp;lt;/backend&amp;gt;&lt;/LI-CODE&gt;
&lt;H3 data-line="202"&gt;Ponto Importante #3 — Retry balanceado pelo LB&lt;/H3&gt;
&lt;P data-line="204"&gt;Este é o ponto mais crítico e o que diferencia uma configuração robusta de uma ingênua. Se o&amp;nbsp;set-backend-service&amp;nbsp;estiver&amp;nbsp;&lt;STRONG&gt;fora&lt;/STRONG&gt;&amp;nbsp;do bloco&amp;nbsp;&amp;lt;retry&amp;gt;, o backend é selecionado uma única vez — e todas as retentativas vão para o mesmo endpoint. Se esse endpoint está falhando, todas as retentativas falham também.&lt;/P&gt;
&lt;P data-line="206"&gt;A solução é colocar o&amp;nbsp;set-backend-service&amp;nbsp;&lt;STRONG&gt;dentro&lt;/STRONG&gt; do&amp;nbsp;&amp;lt;retry&amp;gt;:&lt;/P&gt;
&lt;LI-CODE lang="xml"&gt;&amp;lt;backend&amp;gt;
    &amp;lt;retry condition="@(context.Response.StatusCode == 404)" count="2" interval="1" first-fast-retry="true"&amp;gt;
        &amp;lt;set-backend-service id="apim-generated-policy" backend-id="LB01" /&amp;gt;
        &amp;lt;forward-request buffer-request-body="true" /&amp;gt;
    &amp;lt;/retry&amp;gt;
&amp;lt;/backend&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;Com essa configuração, a cada tentativa o Load Balancer é consultado novamente e pode rotear para um backend diferente. O resultado prático: se oiaws02 falha, a retentativa vai para oiaws01 automaticamente.&lt;/P&gt;
&lt;H3 data-line="129"&gt;Explicação dos Elementos&lt;/H3&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Elemento&lt;/th&gt;&lt;th&gt;Descrição&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&amp;lt;retry&amp;gt;&lt;/td&gt;&lt;td&gt;Define lógica de repetição (retry) para chamadas a serviços de backend&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;condition="@(context.Response.StatusCode == 404)"&lt;/td&gt;&lt;td&gt;Condição para acionar a repetição: resposta HTTP 404 (Not Found)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;count="2"&lt;/td&gt;&lt;td&gt;Número máximo de tentativas adicionais (além da original)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;interval="1"&lt;/td&gt;&lt;td&gt;Intervalo de 1 segundo entre as tentativas&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;first-fast-retry="true"&lt;/td&gt;&lt;td&gt;A primeira repetição é imediata, sem aguardar o intervalo&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&amp;lt;forward-request /&amp;gt;&lt;/td&gt;&lt;td&gt;Envia a requisição ao serviço de backend&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2 data-line="142"&gt;5. Trace — Validação do Fluxo&lt;/H2&gt;
&lt;P data-line="235"&gt;onfiguração feita, é hora de validar. O&amp;nbsp;&lt;STRONG&gt;Trace do APIM&lt;/STRONG&gt;&amp;nbsp;permite acompanhar passo a passo o que acontece com cada requisição — desde a entrada até a resposta final ao cliente. É a ferramenta definitiva para confirmar que o Load Balancer, o Circuit Breaker e o retry estão funcionando em conjunto.&lt;/P&gt;
&lt;P data-line="237"&gt;No cenário de teste, o backend&amp;nbsp;oiaws02&amp;nbsp;&lt;STRONG&gt;não possui o modelo&amp;nbsp;o1&lt;/STRONG&gt;&amp;nbsp;deployado, então retorna&amp;nbsp;404. O Trace mostra exatamente como o APIM lida com isso:&lt;/P&gt;
&lt;OL&gt;
&lt;LI data-line="239"&gt;&lt;STRONG&gt; Backend selecionado no pool:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Backend '(, https://oiaws02.openai.azure.com/openai)' was selected in Backend pool 'LB01'.&lt;/LI-CODE&gt;
&lt;P data-line="212"&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI data-line="244"&gt;&lt;STRONG&gt; Autenticação via Managed Identity:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Managed identity token is added to Authorization header.&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="3"&gt;
&lt;LI data-line="249"&gt;&lt;STRONG&gt; Primeira tentativa — falha (oiaws02 não possui o modelo o1):&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Request sent to https://oiaws02.openai.azure.com/openai/deployments/o1/chat/completions → Response: 404 Not Found&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="4"&gt;
&lt;LI data-line="255"&gt;&lt;STRONG&gt; Retry com novo backend selecionado pelo LB:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Backend service URL was changed. oldBackendServiceUrl: https://oiaws02.openai.azure.com/openai newBackendServiceUrl: https://oiaws01.openai.azure.com/openai&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="5"&gt;
&lt;LI data-line="262"&gt;&lt;STRONG&gt; Segunda tentativa — sucesso:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Request sent to https://oiaws01.openai.azure.com/openai/deployments/o1/chat/completions → Response: 200 OK&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="6"&gt;
&lt;LI data-line="268"&gt;&lt;STRONG&gt; Resposta final ao cliente:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="json"&gt;Response has been sent to the caller in full&lt;/LI-CODE&gt;
&lt;P data-line="273"&gt;O cliente recebeu a resposta com sucesso, sem saber que houve uma falha nos bastidores. Isso é resiliência transparente.&lt;/P&gt;
&lt;H2 data-line="168"&gt;6. Events — Monitoramento do Circuit Breaker&lt;/H2&gt;
&lt;P&gt;Ter resiliência é essencial, mas &lt;STRONG&gt;saber quando ela está sendo acionada&lt;/STRONG&gt; é igualmente importante. Se o Circuit Breaker está abrindo com frequência, pode indicar um problema que precisa de atenção — um backend degradado, um modelo removido, ou limites de throttling sendo atingidos repetidamente.&lt;/P&gt;
&lt;H3 data-line="238"&gt;Captura de Eventos via Storage Queue&lt;/H3&gt;
&lt;P data-line="283"&gt;O APIM foi configurado para capturar eventos de abertura do Circuit Breaker e enviá-los para uma&amp;nbsp;&lt;STRONG&gt;Storage Queue&lt;/STRONG&gt;. Cada vez que um circuito abre, um evento é publicado com todos os detalhes relevantes.&lt;/P&gt;
&lt;P data-line="285"&gt;&lt;STRONG&gt;Observação:&lt;/STRONG&gt; Após essa configuração, a abertura do Circuit Breaker pode não aparecer mais no Trace, embora continue sendo registrada na fila.&lt;/P&gt;
&lt;img&gt;
&lt;P aria-live="polite"&gt;Criação da Event Subscription no Event Grid com os tipos "Circuit Breaker Opened" e "Circuit Breaker Closed" selecionados para capturar eventos de abertura e fechamento do circuito.&lt;/P&gt;
&lt;/img&gt;&lt;img&gt;Painel de Events do APIM mostrando 20 eventos publicados e entregues com sucesso à Storage Queue via subscription cbapim (Circuit Breaker Opened/Closed).&lt;/img&gt;
&lt;H3 data-line="244"&gt;Exemplo de Evento&lt;/H3&gt;
&lt;LI-CODE lang="json"&gt;{
    "id": "e5da5756-61b9-42cf-8097-f8a684f1b74c",
    "topic": "/subscriptions/.../resourceGroups/apimappgw/providers/Microsoft.ApiManagement/service/apimappgwws01",
    "subject": "/backends/openapi01-openai-endpoint/circuit-breaker/rules/cb01",
    "data": {
        "backendName": "openapi01-openai-endpoint",
        "circuitBreaker": {
            "rules": {
                "cb01": {
                    "tripDuration": "00:00:15"
                }
            }
        }
    },
    "eventType": "Microsoft.ApiManagement.CircuitBreaker.Opened",
    "dataVersion": "1.0",
    "metadataVersion": "1",
    "eventTime": "2025-08-14T15:41:30.948673Z"
}&lt;/LI-CODE&gt;
&lt;P&gt;O evento nos diz exatamente:&amp;nbsp;&lt;STRONG&gt;qual backend&lt;/STRONG&gt;&amp;nbsp;foi isolado (openapi01-openai-endpoint),&amp;nbsp;&lt;STRONG&gt;qual regra&lt;/STRONG&gt;&amp;nbsp;foi violada (cb01), e&amp;nbsp;&lt;STRONG&gt;por quanto tempo&lt;/STRONG&gt; o circuito ficará aberto (15 segundos).&lt;/P&gt;
&lt;H2 data-line="202"&gt;7. Export Events com Logic Apps → Elastic Observability&lt;/H2&gt;
&lt;P data-line="317"&gt;A Storage Queue resolve o problema de captura, mas para monitoramento em tempo real e dashboards operacionais, precisamos levar esses dados para uma plataforma de observabilidade. Neste caso, utilizamos o&amp;nbsp;&lt;STRONG&gt;Elastic Observability&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H3 data-line="319"&gt;Fluxo de Integração&lt;/H3&gt;
&lt;P data-line="321"&gt;O pipeline completo funciona assim:&lt;/P&gt;
&lt;OL data-line="323"&gt;
&lt;LI data-line="334"&gt;&lt;STRONG&gt;Circuit Breaker abre&lt;/STRONG&gt;&amp;nbsp;→ evento é publicado na Storage Queue&lt;/LI&gt;
&lt;LI data-line="335"&gt;&lt;STRONG&gt;Logic App&lt;/STRONG&gt;&amp;nbsp;é acionado pelo trigger da fila&lt;/LI&gt;
&lt;LI data-line="336"&gt;Logic App recupera a&amp;nbsp;&lt;STRONG&gt;API Key&lt;/STRONG&gt;&amp;nbsp;no&amp;nbsp;&lt;STRONG&gt;Key Vault&lt;/STRONG&gt;&amp;nbsp;(via Managed Identity — sem segredos hardcoded)&lt;/LI&gt;
&lt;LI data-line="337"&gt;Logic App envia os dados via&amp;nbsp;&lt;STRONG&gt;HTTP POST&lt;/STRONG&gt; para o Elastic Observability&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;H3 data-line="276"&gt;Exemplo de Chamada HTTP&lt;/H3&gt;
&lt;LI-CODE lang="http"&gt;POST https://apim-a5eaba.es.eastus.azure.elastic.cloud/apim/_doc
Content-Type: application/json
Authorization: ApiKey ...&lt;/LI-CODE&gt;
&lt;P data-line="284"&gt;&lt;STRONG&gt;Body:&lt;/STRONG&gt;&amp;nbsp;JSON do evento do Circuit Breaker.&lt;/P&gt;
&lt;H3 data-line="337"&gt;Configuração no Elastic&lt;/H3&gt;
&lt;P data-line="339"&gt;Para receber e visualizar os eventos, é necessário:&lt;/P&gt;
&lt;OL data-line="341"&gt;
&lt;LI data-line="352"&gt;&lt;STRONG&gt;Criar um índice&lt;/STRONG&gt;&amp;nbsp;(apim) para armazenar os documentos&lt;/LI&gt;
&lt;LI data-line="353"&gt;&lt;STRONG&gt;Criar uma API Key&lt;/STRONG&gt;&amp;nbsp;com permissão de escrita no índice&lt;/LI&gt;
&lt;LI data-line="354"&gt;&lt;STRONG&gt;Obter a URL do projeto&lt;/STRONG&gt;&amp;nbsp;Elastic Cloud&lt;/LI&gt;
&lt;LI data-line="355"&gt;&lt;STRONG&gt;Criar uma View/Dashboard&lt;/STRONG&gt;&amp;nbsp;para visualizar os eventos de abertura do Circuit Breaker&lt;/LI&gt;
&lt;/OL&gt;
&lt;P data-line="346"&gt;Com esse pipeline completo, a equipe de operações consegue responder rapidamente a perguntas como: "Quantas vezes o circuito abriu nas últimas 24 horas?", "Qual backend está mais instável?", "Os problemas coincidem com horários de pico?".&lt;/P&gt;
&lt;H2&gt;8. Troubleshooting — Event Grid em VNet com Forced Tunneling&lt;/H2&gt;
&lt;P&gt;Toda a configuração de eventos descrita na seção 6 funciona perfeitamente em ambientes com conectividade direta à internet. Porém, ao replicar essa arquitetura em um ambiente corporativo com&amp;nbsp;&lt;STRONG&gt;APIM em VNet (internal mode) e forced tunneling&lt;/STRONG&gt;, os eventos do Circuit Breaker simplesmente&amp;nbsp;&lt;STRONG&gt;não chegam à Storage Queue&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H3&gt;O Problema&lt;/H3&gt;
&lt;P&gt;O cenário é o seguinte:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;APIM está deployado em uma subnet com uma Route Table (UDR) configurada com rota default&amp;nbsp;0.0.0.0/0 → Virtual Appliance&amp;nbsp;(firewall corporativo)&lt;/LI&gt;
&lt;LI&gt;O Event Grid System Topic está criado e a Event Subscription configurada corretamente&lt;/LI&gt;
&lt;LI&gt;No portal, o painel de&amp;nbsp;&lt;STRONG&gt;Events&lt;/STRONG&gt;&amp;nbsp;não mostra nenhum evento publicado — mesmo com o Circuit Breaker abrindo e fechando normalmente&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A princípio, parece um problema de configuração do Event Grid. Mas a causa está na camada de rede.&lt;/P&gt;
&lt;H3&gt;Root Cause — Rota AzureEventGrid ausente&lt;/H3&gt;
&lt;P&gt;Quando o APIM publica um evento de Circuit Breaker, ele precisa alcançar o&amp;nbsp;&lt;STRONG&gt;Azure Event Grid&lt;/STRONG&gt;&amp;nbsp;via HTTPS (porta 443). Em ambientes com forced tunneling, todo o tráfego que não tem uma rota explícita é capturado pela rota default e enviado ao firewall/NVA.&lt;/P&gt;
&lt;P&gt;A maioria das documentações de APIM em VNet orienta a criação de rotas com service tags para as dependências conhecidas:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Service Tag&lt;/th&gt;&lt;th&gt;Uso&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Storage&lt;/td&gt;&lt;td&gt;Core dependency&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SQL&lt;/td&gt;&lt;td&gt;Core dependency&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AzureKeyVault&lt;/td&gt;&lt;td&gt;Core dependency&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;AzureMonitor&lt;/td&gt;&lt;td&gt;Diagnostics &amp;amp; metrics&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;EventHub&lt;/td&gt;&lt;td&gt;Log to Event Hubs policy&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;Porém,&amp;nbsp;&lt;STRONG&gt;AzureEventGrid&amp;nbsp;não está listado na documentação oficial&lt;/STRONG&gt;&amp;nbsp;como dependência obrigatória — porque só é necessário quando você utiliza o recurso de&amp;nbsp;&lt;STRONG&gt;Events/System Topics&lt;/STRONG&gt;&amp;nbsp;do APIM. Se a rota não existe, o tráfego é engolido pelo firewall e os eventos nunca são entregues.&lt;/P&gt;
&lt;H3&gt;A Solução&lt;/H3&gt;
&lt;P&gt;Adicionar uma rota na Route Table da subnet do APIM:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Propriedade&lt;/th&gt;&lt;th&gt;Valor&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Nome da rota&lt;/td&gt;&lt;td&gt;route-eventgrid-internet&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Destination type&lt;/td&gt;&lt;td&gt;Service Tag&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Service tag&lt;/td&gt;&lt;td&gt;AzureEventGrid&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Next hop type&lt;/td&gt;&lt;td&gt;Internet&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;Após aplicar a rota, os eventos começam a ser entregues imediatamente — sem necessidade de reiniciar o APIM ou recriar o System Topic.&lt;/P&gt;
&lt;H3&gt;Como Diagnosticar&lt;/H3&gt;
&lt;P&gt;Se você está enfrentando o mesmo problema, valide:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Route Table&lt;/STRONG&gt;&amp;nbsp;— Verifique se existe uma rota com service tag&amp;nbsp;AzureEventGrid&amp;nbsp;e next hop&amp;nbsp;Internet&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;NSG&lt;/STRONG&gt;&amp;nbsp;— Confirme que a regra&amp;nbsp;AllowInternetOutBound&amp;nbsp;(ou equivalente) não está bloqueando tráfego de saída na porta 443&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Event Grid → Metrics&lt;/STRONG&gt;&amp;nbsp;— No System Topic, verifique as métricas&amp;nbsp;Published Events&amp;nbsp;e&amp;nbsp;Delivery Succeeded. Se ambas estão zeradas, o problema é de publicação (rede), não de entrega&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Network Status&lt;/STRONG&gt;&amp;nbsp;— No APIM, vá em&amp;nbsp;&lt;EM&gt;Deployment + Infrastructure → Network → Network Status&lt;/EM&gt;. O Event Grid pode não aparecer como dependência explícita, mas falhas genéricas de conectividade podem indicar o problema&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;O que a Documentação diz&lt;/H3&gt;
&lt;P&gt;A documentação oficial de&amp;nbsp;APIM em VNet com forced tunneling&amp;nbsp;estabelece o princípio:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"Configure a user-defined route (UDR) for [service tags] with next hop type set to 'Internet', to steer traffic back to Azure."&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Embora o&amp;nbsp;AzureEventGrid&amp;nbsp;não esteja explicitamente listado na tabela de portas obrigatórias, o mesmo princípio se aplica:&amp;nbsp;&lt;STRONG&gt;qualquer serviço Azure que o APIM precise alcançar precisa de uma rota explícita quando há forced tunneling&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H2 data-line="350"&gt;Conclusão&lt;/H2&gt;
&lt;P data-line="352"&gt;A combinação de&amp;nbsp;&lt;STRONG&gt;Load Balancer + Circuit Breaker + Retry inteligente&lt;/STRONG&gt;&amp;nbsp;no APIM transforma uma arquitetura frágil em uma arquitetura resiliente — onde falhas em backends individuais são tratadas de forma transparente, sem impacto para o cliente.&lt;/P&gt;
&lt;P data-line="354"&gt;Os pontos-chave para levar:&lt;/P&gt;
&lt;OL data-line="356"&gt;
&lt;LI data-line="367"&gt;&lt;STRONG&gt;Nunca exponha um único endpoint&lt;/STRONG&gt;&amp;nbsp;de Azure OpenAI diretamente — use o APIM como abstração&lt;/LI&gt;
&lt;LI data-line="368"&gt;&lt;STRONG&gt;Managed Identity&lt;/STRONG&gt;&amp;nbsp;elimina o gerenciamento manual de segredos entre APIM e backends&lt;/LI&gt;
&lt;LI data-line="369"&gt;&lt;STRONG&gt;O&amp;nbsp;set-backend-service&amp;nbsp;deve estar dentro do&amp;nbsp;&amp;lt;retry&amp;gt;&lt;/STRONG&gt;&amp;nbsp;para que retentativas sejam distribuídas pelo Load Balancer&lt;/LI&gt;
&lt;LI data-line="370"&gt;&lt;STRONG&gt;Circuit Breaker protege contra falhas em cascata&lt;/STRONG&gt;&amp;nbsp;— fail-fast é melhor que timeout lento&lt;/LI&gt;
&lt;LI data-line="371"&gt;&lt;STRONG&gt;Observabilidade não é opcional&lt;/STRONG&gt; — se o circuito está abrindo, você precisa saber&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 data-line="229"&gt;Referências&lt;/H2&gt;
&lt;UL data-line="231"&gt;
&lt;LI data-line="231"&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/api-management/backends?tabs=portal" target="_blank" rel="noopener" data-href="https://learn.microsoft.com/en-us/azure/api-management/backends?tabs=portal"&gt;Azure API Management backends | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="232"&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/api-management/backends?tabs=portal#circuit-breaker" target="_blank" rel="noopener"&gt;Azure API Management Backends | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="232"&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker" target="_blank" rel="noopener"&gt;Circuit Breaker Pattern - Azure Architecture Center | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="232"&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/api-management/api-management-using-with-internal-vnet?tabs=stv2#force-tunnel-traffic-to-on-premises-firewall-using-expressroute-or-network-virtual-appliance" target="_blank"&gt;Deploy Azure API Management instance to internal VNet | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 22 May 2026 17:32:11 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/apim-circuit-breaker-com-azure-openai/ba-p/4514008</guid>
      <dc:creator>wdossantos</dc:creator>
      <dc:date>2026-05-22T17:32:11Z</dc:date>
    </item>
    <item>
      <title>Detectando Anomalias de Custo no Azure com FinOps Hub + SRE Agent</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/detectando-anomalias-de-custo-no-azure-com-finops-hub-sre-agent/ba-p/4513809</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Introdução&lt;/H1&gt;
&lt;P&gt;Um dos maiores desafios em ambientes cloud é manter a visibilidade sobre os custos. Picos inesperados podem passar despercebidos por dias e quando chegam na fatura, já é tarde demais.&lt;/P&gt;
&lt;P&gt;Neste artigo, vou mostrar como configurei uma &lt;STRONG&gt;análise automática diária de anomalias de custo&lt;/STRONG&gt; usando o &lt;STRONG&gt;Azure SRE Agent&lt;/STRONG&gt;, conectado ao &lt;STRONG&gt;FinOps Hub (Azure Data Explorer)&lt;/STRONG&gt;, com &lt;STRONG&gt;notificação automática no Microsoft Teams&lt;/STRONG&gt; quando algo fora do padrão é detectado.&lt;/P&gt;
&lt;H2&gt;🏗️ Arquitetura da Solução&lt;/H2&gt;
&lt;P&gt;FinOps Hub (ADX)&amp;nbsp; →&amp;nbsp; SRE Agent (Scheduled Task)&amp;nbsp; →&amp;nbsp; KQL Anomaly Detection&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ↓ anomalia detectada?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; SIM → Adaptive Card → Teams Channel&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NÃO → Log: 'custos dentro do esperado'&lt;/P&gt;
&lt;H1&gt;Pré-requisitos&lt;/H1&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Requisito&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Detalhe&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✅&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;FinOps Hub implantado&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Com dados de custo sendo ingeridos no Azure Data Explorer&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✅&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Azure SRE Agent configurado&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Com acesso à subscription onde o FinOps Hub está&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✅&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Canal no Microsoft Teams&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Onde as notificações serão postadas&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;✅&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Permissões adequadas&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Managed Identity com Viewer no database Hub do ADX&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Passo a Passo&lt;/H1&gt;
&lt;H2&gt;① Identificar o Cluster ADX do FinOps Hub&lt;/H2&gt;
&lt;P&gt;O primeiro passo é localizar o cluster Azure Data Explorer onde o FinOps Hub armazena os dados de custo. No Azure SRE Agent, usamos o Azure Resource Graph:&lt;/P&gt;
&lt;P&gt;az graph query -q "Resources | where type =~ 'Microsoft.Kusto/clusters'" --first 10 --subscription &amp;lt;subscription-id&amp;gt;&lt;/P&gt;
&lt;P&gt;No meu caso como exemplo, o cluster retornado foi:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Propriedade&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Valor&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Nome&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;finopshubadx&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;URI&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;https://finopshubadx.northcentralus.kusto.windows.net&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Database&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Hub&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;SKU&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Dev(No SLA)_Standard_D11_v2&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Região&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;North Central US&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;② Configurar Permissões (RBAC no ADX)&lt;/H2&gt;
&lt;P&gt;A managed identity do SRE Agent precisa de acesso &lt;STRONG&gt;Viewer&lt;/STRONG&gt; ao database &lt;STRONG&gt;Hub&lt;/STRONG&gt; do ADX. Sem isso, a query KQL falhará com erro 403.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Opção A — Azure CLI:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;az kusto database-principal-assignment create \&lt;BR /&gt;&amp;nbsp; --cluster-name finopshubadx \&lt;BR /&gt;&amp;nbsp; --database-name Hub \&lt;BR /&gt;&amp;nbsp; --resource-group &amp;lt;resource-group&amp;gt; \&lt;BR /&gt;&amp;nbsp; --subscription &amp;lt;subscription-id&amp;gt; \&lt;BR /&gt;&amp;nbsp; --principal-assignment-name "sre-agent-viewer" \&lt;BR /&gt;&amp;nbsp; --principal-id "&amp;lt;managed-identity-client-id&amp;gt;" \&lt;BR /&gt;&amp;nbsp; --principal-type App --role Viewer&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Opção B — Portal:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ADX → Cluster → Database Hub → Permissions → Add → Viewer → Selecionar managed identity&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Opção C — KQL (ADX Web UI):&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;.add database Hub viewers ('aadapp=&amp;lt;client-id&amp;gt;') 'SRE Agent'&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;③ A Query KQL de Detecção de Anomalias&lt;/H2&gt;
&lt;P&gt;Esta query utiliza &lt;STRONG&gt;series_decompose_anomalies&lt;/STRONG&gt; do Kusto para detectar padrões anômalos nos custos diários ao longo dos últimos 12 meses:&lt;/P&gt;
&lt;P&gt;let numberOfMonths = 12;&lt;BR /&gt;let start = startofmonth(ago(numberOfMonths * 30d));&lt;BR /&gt;let end = now();&lt;BR /&gt;let interval = 1d;&lt;BR /&gt;&lt;BR /&gt;Costs()&lt;BR /&gt;| where ChargePeriodStart between (start .. end)&lt;BR /&gt;| summarize DailyCost = sum(EffectiveCost)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; by bin(ChargePeriodStart, interval)&lt;BR /&gt;| make-series CostSeries = sum(DailyCost)&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; on ChargePeriodStart from start to end step interval&lt;BR /&gt;| extend anomalies = series_decompose_anomalies(CostSeries)&lt;BR /&gt;| project ChargePeriodStart, CostSeries, anomalies&lt;/P&gt;
&lt;H3&gt;💡 Como a query funciona&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Costs() → Função do FinOps Hub que retorna dados de custo consolidados&lt;/LI&gt;
&lt;LI&gt;make-series → Cria série temporal diária contínua (sem gaps)&lt;/LI&gt;
&lt;LI&gt;series_decompose_anomalies → Algoritmo ML nativo do Kusto que detecta spikes e drops usando decomposição sazonal + STL&lt;/LI&gt;
&lt;LI&gt;Score &amp;gt; 0 → custo acima do esperado | Score &amp;lt; 0 → abaixo do esperado&lt;/LI&gt;
&lt;LI&gt;Quanto maior o |score|, mais significativa a anomalia&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;④ Configurar Webhook no Microsoft Teams&lt;/H2&gt;
&lt;P&gt;Para receber notificações no Teams, criamos um &lt;STRONG&gt;Incoming Webhook via Power Automate Workflows&lt;/STRONG&gt; (método recomendado pela Microsoft):&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt; &lt;/STRONG&gt;No canal do Teams, clique nos 3 pontos (...) → Workflows&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; &lt;/STRONG&gt;Pesquise "Post to a channel when a webhook request is received"&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; &lt;/STRONG&gt;Selecione o Team e Channel desejados → Add workflow&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; &lt;/STRONG&gt;Copie a URL gerada (formato: https://prod-xx...logic.azure.com/...)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; &lt;/STRONG&gt;Ative o workflow no Power Automate (My flows → Turn on)&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;⚠️ Atenção: &lt;/STRONG&gt;O workflow pode ser criado com status 'Suspended'. Ative em: Power Automate → My flows → Turn on.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;⑤ Criar a Scheduled Task no SRE Agent&lt;/H2&gt;
&lt;P&gt;Agora a parte principal: criar a &lt;STRONG&gt;tarefa agendada (Scheduled Task)&lt;/STRONG&gt; no Azure SRE Agent. Basta pedir em linguagem natural:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"Crie uma tarefa diária para analisar anomalias de custo no FinOps Hub e me notificar pelo Teams quando houver anomalias detectadas."&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;O SRE Agent criará a task com os seguintes parâmetros:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Parâmetro&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Valor&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Nome&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Daily FinOps Cost Anomaly Analysis&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Schedule&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;0 8 * * * (diariamente às 08:00 UTC)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;ADX Cluster&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;https://finopshubadx.northcentralus.kusto.windows.net&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Database&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Hub&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Query&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;KQL com series_decompose_anomalies (12 meses)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Notificação&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Adaptive Card no Teams via webhook&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Escalação&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;HIGH se anomalias por 3+ dias consecutivos&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Idempotência&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Sem anomalia = 'custos dentro do esperado'&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;img /&gt;
&lt;P&gt;Task details:&lt;/P&gt;
&lt;P&gt;Obs: Modificar os campos na task para adequar seu ambiente&lt;/P&gt;
&lt;LI-CODE lang="markdown"&gt;Autonomous Scheduled Run - Daily FinOps Cost Anomaly Analysis

## Scope
- Subscription: xxxxxxx-xxxxxxx-xxxxxx-xxxx-xxxxx
- ADX Cluster: https://finopshub.northcentralus.kusto.windows.net
- Database: Hub
- Resource Group: finopshub-rg

## Goal
Detect cost anomalies in Azure spending using the FinOps Hub data. Run the KQL query against the ADX cluster, analyze results, and notify via Teams if anomalies are found.

## Step 1: Execute KQL Query
Use the KustoQuery subagent to run this query against the ADX cluster (https://finopshubadx.northcentralus.kusto.windows.net, database: Hub):

```kql
let numberOfMonths = 12;
let start = startofmonth(ago(numberOfMonths * 30d));
let end = now();
let interval = 1d;
Costs()
| where ChargePeriodStart between (start .. end)
| summarize DailyCost = sum(EffectiveCost) by bin(ChargePeriodStart, interval)
| make-series CostSeries = sum(DailyCost) on ChargePeriodStart from start to end step interval
| extend anomalies = series_decompose_anomalies(CostSeries)
| project ChargePeriodStart, CostSeries, anomalies
```

## Step 2: Analyze Results
- Parse the anomalies array from series_decompose_anomalies output
- Identify days where anomaly score is significantly positive (cost spike) or negative (unusual drop)
- For each anomaly found, calculate: the date, actual cost value, expected baseline, and percentage deviation
- Focus on the last 7 days of data for actionable anomalies, but use the full 12-month history for context

## Step 3: Generate Report
Create a summary with:
- Total anomalies detected in the last 7 days
- For each anomaly: date, cost value, deviation from expected, severity (high/medium/low)
- Trend analysis: whether costs are trending up, down, or stable
- Top recommendations (e.g., investigate specific resource groups, check for new deployments, review reserved instances)

## Step 4: Teams Notification (ONLY if anomalies detected in last 7 days)
If anomalies are found, send a notification to Microsoft Teams using the executing_code skill (ExecutePythonCode) to POST to this webhook URL:
https://839eace659ab424397eca5b8fcc104.e4.environment.api.powerplatform.com:443/powerautomate/automations/direct/workflows/88ec6b6c43014d8f8cb13999714dddd8/triggers/manual/paths/invoke?api-version=1&amp;amp;sp=%2Ftriggers%2Fmanual%2Frun&amp;amp;sv=1.0&amp;amp;sig=br2rNi4x1zKjWp6CgKWcajvEUW_7EUBkHrkbnp6Hk2g

Use Adaptive Card format for the Teams message with:
- Title: "⚠️ Azure Cost Anomaly Detected"
- Summary of anomalies (dates, values, deviations)
- Severity indicator
- Link back to this SRE Agent thread for details

Python code example for the webhook POST:
```python
import urllib.request
import json

webhook_url = "&amp;lt;colar-url-webhook-aqui&amp;gt;"

card = {
    "type": "message",
    "attachments": [{
        "contentType": "application/vnd.microsoft.card.adaptive",
        "content": {
            "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
            "type": "AdaptiveCard",
            "version": "1.4",
            "body": [
                {"type": "TextBlock", "text": "⚠️ Azure Cost Anomaly Detected", "weight": "Bolder", "size": "Large"},
                {"type": "TextBlock", "text": "&amp;lt;ANOMALY_SUMMARY_HERE&amp;gt;", "wrap": True},
                {"type": "FactSet", "facts": [
                    {"title": "Date", "value": "&amp;lt;DATE&amp;gt;"},
                    {"title": "Actual Cost", "value": "&amp;lt;COST&amp;gt;"},
                    {"title": "Expected", "value": "&amp;lt;EXPECTED&amp;gt;"},
                    {"title": "Deviation", "value": "&amp;lt;DEVIATION&amp;gt;%"},
                    {"title": "Severity", "value": "&amp;lt;SEVERITY&amp;gt;"}
                ]}
            ],
            "actions": [{"type": "Action.OpenUrl", "title": "View in SRE Agent", "url": "https://sre.azure.com/agents/subscriptions/&amp;lt;sua-subscricao&amp;gt;/resourceGroups/finopshub-rg/providers/Microsoft.App/agents/finopshub/views/thread/7314d219-77d6-4e12-a3fb-f30606d13077"}]
        }
    }]
}

req = urllib.request.Request(webhook_url, data=json.dumps(card).encode('utf-8'), headers={'Content-Type': 'application/json'}, method='POST')
response = urllib.request.urlopen(req)
```

## Step 5: Report in Thread
Always post a summary in this thread with:
- Whether anomalies were found or not
- Key metrics and trends
- If no anomalies: "No material cost anomalies detected. Daily costs within expected range."

## Constraints
- Read-only operations only against ADX
- Max 5 KQL queries per execution
- Do not modify any Azure resources

## Idempotence
If no anomalies detected in the last 7 days and costs are within normal thresholds, output: "No material cost anomalies detected. Daily costs within expected range."

## Escalation
If anomalies are detected for 3+ consecutive days, flag as HIGH severity in the Teams notification and recommend immediate investigation.&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;⑥ Notificação no Teams (Adaptive Card)&lt;/H2&gt;
&lt;P&gt;Quando anomalias são detectadas, o SRE Agent envia um Adaptive Card rico para o Teams:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;⚠️ AZURE COST ANOMALY DETECTED&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;🔴 HIGH — 2026-04-21&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Custo Real&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;$1,847.32&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Custo Esperado&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;$623.15&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Desvio&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;+196.5% (↑ $1,224.17)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Score Anomalia&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;4.7 (threshold: 1.5)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;🟡 MEDIUM — 2026-04-20&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Custo Real&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;$987.44&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Desvio&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;+59.5% (↑ $368.54)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;📊 Trend (7d)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;$601 → $615 → $622 → $619 → $987 → $1,847&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;EM&gt;Exemplo de Adaptive Card enviado ao canal do Teams&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;O card inclui botões: Ver Detalhes no SRE Agent e Abrir FinOps Hub (ADX) para investigação.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;⑦ Testar a Integração (Simular Anomalia)&lt;/H2&gt;
&lt;P&gt;Antes de confiar no agendamento, teste pedindo ao SRE Agent:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;"Simular uma anomalia de custo para eu receber no Teams"&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;O agente enviará um Adaptive Card de teste com dados simulados para validar que o webhook está funcionando.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Dica: &lt;/STRONG&gt;Se o webhook retornar erro 400 - WorkflowTriggerIsNotEnabled, ative o flow em: Power Automate → My flows → Turn on.&lt;/P&gt;
&lt;img /&gt;
&lt;H1&gt;Como Funciona no Dia a Dia&lt;/H1&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Horário&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Ação&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Resultado&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;08:00 UTC&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;SRE Agent executa query KQL no ADX&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Dados de custo (12 meses)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;08:01 UTC&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Análise de anomalias (últimos 7 dias)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Identifica spikes e drops&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;08:02 UTC&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Se anomalia → Teams notification&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Adaptive Card no canal&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;08:02 UTC&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Se normal → log no thread&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;"Custos dentro do esperado"&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Contínuo&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;3+ dias anomalia → escalação HIGH&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Investigação recomendada&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Gerenciamento da Task&lt;/H2&gt;
&lt;P&gt;Após criada, a tarefa pode ser gerenciada pelo SRE Agent:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt; Pausar: &lt;/STRONG&gt;"Pausar a tarefa de anomalia de custo"&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; Retomar: &lt;/STRONG&gt;"Retomar a tarefa"&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; Alterar horário: &lt;/STRONG&gt;"Mudar para executar às 10h UTC"&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; Ver histórico: &lt;/STRONG&gt;"Mostrar histórico de execuções"&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt; Cancelar: &lt;/STRONG&gt;"Cancelar a tarefa de anomalia"&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Conclusão&lt;/H1&gt;
&lt;P&gt;Com essa configuração, você tem um &lt;STRONG&gt;sistema inteligente de vigilância de custos&lt;/STRONG&gt; que:&lt;/P&gt;
&lt;P&gt;🔍 Analisa 12 meses de histórico para detectar padrões sazonais&lt;/P&gt;
&lt;P&gt;🤖 Usa ML nativo do Kusto — sem infraestrutura adicional&lt;/P&gt;
&lt;P&gt;📱 Notifica proativamente no Teams — só quando há anomalia&lt;/P&gt;
&lt;P&gt;📈 Escala automaticamente a severidade em anomalias persistentes&lt;/P&gt;
&lt;P&gt;💬 Mantém histórico completo no thread do SRE Agent&lt;/P&gt;
&lt;P&gt;🔧 É gerenciável por linguagem natural — sem YAML, sem pipelines&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;A combinação &lt;STRONG&gt;FinOps Hub + Azure SRE Agent + Teams&lt;/STRONG&gt; transforma a governança de custos de reativa (olhar dashboards) em &lt;STRONG&gt;proativa e automatizada&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;🚀 Quer implementar na sua organização?&lt;/H2&gt;
&lt;P&gt;Se você quer testar, o Azure SRE Agent está disponível como preview. Configure um agente na sua subscription e comece a conversar em linguagem natural.&lt;/P&gt;
&lt;P&gt;Já usa &lt;A class="lia-external-url" href="https://microsoft.github.io/finops-toolkit/hubs" target="_blank" rel="noopener"&gt;FinOps Hub&lt;/A&gt;? Conte nos comentários como você monitora anomalias de custo hoje!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;#FinOps&amp;nbsp; #Azure&amp;nbsp; #SREAgent&amp;nbsp; #CostManagement&amp;nbsp; #AzureDataExplorer&amp;nbsp; #CloudGovernance&amp;nbsp; #DevOps&amp;nbsp; #MicrosoftTeams&amp;nbsp; #AIOps&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 23 Apr 2026 12:59:25 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/detectando-anomalias-de-custo-no-azure-com-finops-hub-sre-agent/ba-p/4513809</guid>
      <dc:creator>arsilvan</dc:creator>
      <dc:date>2026-04-23T12:59:25Z</dc:date>
    </item>
    <item>
      <title>Uso de contextos no Entra ID</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/uso-de-contextos-no-entra-id/ba-p/4513725</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-line="8"&gt;Visão Geral&lt;/H2&gt;
&lt;P data-line="10"&gt;Com a crescente necessidade de segurança adaptativa, o Microsoft Entra ID oferece recursos avançados para aplicar políticas dinâmicas de acesso. Em cenários corporativos, autenticação e autorização tradicionais, baseadas apenas em roles e claims estáticos, nem sempre são suficientes. Imagine que um usuário já está logado e possui permissão para acessar uma API, mas você precisa garantir que, para uma operação crítica como deletar um registro, ele esteja dentro da rede corporativa, em um dispositivo gerenciado ou tenha assinado um termo de confidencialidade. É exatamente isso que os&amp;nbsp;&lt;STRONG&gt;contextos de autenticação do Microsoft Entra ID&lt;/STRONG&gt;&amp;nbsp;resolvem.&lt;/P&gt;
&lt;P data-line="12"&gt;Neste artigo vou detalhar todo o processo, desde a habilitação do&amp;nbsp;&lt;STRONG&gt;Continuous Access Evaluation (CAE)&lt;/STRONG&gt;, passando pela configuração dos contextos e das políticas de acesso condicional no portal do Entra ID, até a integração prática com uma aplicação .NET dividida em&amp;nbsp;&lt;STRONG&gt;frontend web&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;API de backend&lt;/STRONG&gt;. No código, veremos como o MSAL intercepta o fluxo, verifica se o token contém a claim&amp;nbsp;acrs&amp;nbsp;com o contexto exigido e, caso não contenha, dispara um&amp;nbsp;&lt;STRONG&gt;challenge&lt;/STRONG&gt;&amp;nbsp;que leva o usuário de volta ao Entra ID para cumprir o requisito adicional. Se o contexto já estiver satisfeito, o fluxo é transparente para o usuário.&lt;/P&gt;
&lt;P data-line="14"&gt;O objetivo é destacar a granularidade no controle de acesso, a estrutura de contexto, os desafios de implementação e potenciais aplicações práticas.&lt;/P&gt;
&lt;H2 data-line="210"&gt;Diagrama de Arquitetura&lt;/H2&gt;
&lt;img /&gt;
&lt;H2 data-line="18"&gt;1. Caso de Uso&lt;/H2&gt;
&lt;P data-line="63"&gt;Para exemplificar, utilizamos uma aplicação&amp;nbsp;&lt;STRONG&gt;.NET&lt;/STRONG&gt;&amp;nbsp;simples, dividida em dois componentes:&lt;/P&gt;
&lt;UL data-line="65"&gt;
&lt;LI data-line="65"&gt;&lt;STRONG&gt;API de backend&lt;/STRONG&gt;, que expõe endpoints protegidos&lt;/LI&gt;
&lt;LI data-line="66"&gt;&lt;STRONG&gt;Aplicação web frontend&lt;/STRONG&gt;, que consome a API via tokens&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-line="25"&gt;Fluxo Básico&lt;/H3&gt;
&lt;OL data-line="70"&gt;
&lt;LI data-line="70"&gt;A aplicação web é protegida pelo&amp;nbsp;&lt;STRONG&gt;Entra ID&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI data-line="71"&gt;Ao iniciar, o&amp;nbsp;&lt;STRONG&gt;MSAL&lt;/STRONG&gt;&amp;nbsp;(SDK de identidade da Microsoft) verifica se o usuário está autenticado&lt;/LI&gt;
&lt;LI data-line="72"&gt;Se não estiver, solicita a autenticação&lt;/LI&gt;
&lt;LI data-line="73"&gt;Após autenticado, a aplicação armazena um&amp;nbsp;&lt;STRONG&gt;token&lt;/STRONG&gt;&amp;nbsp;para consumir a API&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3 data-line="32"&gt;O Diferencial&lt;/H3&gt;
&lt;P data-line="77"&gt;&lt;STRONG&gt;Não basta um token de acesso convencional&lt;/STRONG&gt;&amp;nbsp;para consumir um endpoint específico da API. É necessário um token com uma&amp;nbsp;&lt;STRONG&gt;claim especial&lt;/STRONG&gt;&amp;nbsp;(acrs), contendo exatamente o valor do&amp;nbsp;&lt;STRONG&gt;contexto esperado&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H2 data-line="38"&gt;2. Configuração do Entra ID&lt;/H2&gt;
&lt;H3 data-line="40"&gt;App Registration e Contextos&lt;/H3&gt;
&lt;P data-line="85"&gt;O processo inicia com o registro das aplicações (cliente e API) no Entra ID, mantendo as etapas tradicionais de permissionamento e definição de escopos.&lt;/P&gt;
&lt;P data-line="87"&gt;A novidade está na&amp;nbsp;&lt;STRONG&gt;configuração de contextos&lt;/STRONG&gt;, que são pares chave-valor criados no Entra ID e utilizados em políticas de acesso condicional.&lt;/P&gt;
&lt;P data-line="89"&gt;&lt;STRONG&gt;Pré-requisito:&lt;/STRONG&gt;&amp;nbsp;Licença&amp;nbsp;&lt;STRONG&gt;Entra ID P1&lt;/STRONG&gt;&amp;nbsp;para uso de acesso condicional.&lt;/P&gt;
&lt;P data-line="91"&gt;O contexto é configurado em uma aba específica dentro das&amp;nbsp;&lt;STRONG&gt;políticas de acesso condicional&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Ao criar um novo contexto, define-se o nome, descrição e o ID sequencial (ex:&amp;nbsp;c1). O checkbox&amp;nbsp;&lt;STRONG&gt;"Publish to apps"&lt;/STRONG&gt; torna o contexto disponível para as aplicações consumirem:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-line="50"&gt;Estrutura e Limitações dos Contextos&lt;/H3&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Aspecto&lt;/th&gt;&lt;th&gt;Detalhe&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Identificação&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Número sequencial (ex:&amp;nbsp;c1,&amp;nbsp;c2, até&amp;nbsp;c99)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Limite&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Vinculado ao número máximo de regras de acesso condicional (&lt;STRONG&gt;195&lt;/STRONG&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Composição&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Nome + Descrição&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Utilidade&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Depende da implementação na aplicação&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3 data-line="59"&gt;Aplicação Prática dos Contextos&lt;/H3&gt;
&lt;P data-line="104"&gt;O contexto permite&amp;nbsp;&lt;STRONG&gt;granularidade adicional&lt;/STRONG&gt;&amp;nbsp;além das tradicionais roles e claims do token JWT:&lt;/P&gt;
&lt;UL data-line="106"&gt;
&lt;LI data-line="106"&gt;&lt;STRONG&gt;Rede corporativa&lt;/STRONG&gt;: restringir acesso a uma área apenas para usuários dentro da rede interna&lt;/LI&gt;
&lt;LI data-line="107"&gt;&lt;STRONG&gt;Dispositivos gerenciados&lt;/STRONG&gt;: exigir que o dispositivo esteja em compliance&lt;/LI&gt;
&lt;LI data-line="108"&gt;&lt;STRONG&gt;Assinatura de termos&lt;/STRONG&gt;: exigir ações adicionais (ex: NDA) antes do acesso a dados sensíveis, mesmo que o token permita o acesso&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Por fim, o contexto é vinculado a uma&amp;nbsp;&lt;STRONG&gt;política de acesso condicional&lt;/STRONG&gt;. No exemplo abaixo, a policy "Teste - C10" associa o contexto "Teste WebApp" como target resource:&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="69"&gt;3. Implementação no Código&lt;/H2&gt;
&lt;H3 data-line="71"&gt;3.1 Configuração no Cliente (Startup.cs)&lt;/H3&gt;
&lt;P data-line="116"&gt;No processo de inicialização, utiliza-se o método&amp;nbsp;AddMicrosoftIdentityWebAppAuthentication&amp;nbsp;para configurar a autenticação, incluindo o parâmetro&amp;nbsp;&lt;STRONG&gt;ClientCapabilities&lt;/STRONG&gt;, que habilita o uso de contexto.&lt;/P&gt;
&lt;P data-line="118"&gt;Além disso, é adicionado o handler&amp;nbsp;MicrosoftIdentityConsentAndConditionalAccessHandler&amp;nbsp;para gerenciar o fluxo de acesso condicional.&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;// Habilita autenticação com suporte a contexto e acesso condicional
services.AddMicrosoftIdentityWebAppAuthentication(Configuration)
    .EnableTokenAcquisitionToCallDownstreamApi(
        Configuration.GetSection("TodoList:Scopes").Get&amp;lt;string[]&amp;gt;()
    )
    .AddInMemoryTokenCaches();

// Handler para gerenciar challenge de acesso condicional
services.AddScoped&amp;lt;MicrosoftIdentityConsentAndConditionalAccessHandler&amp;gt;();&lt;/LI-CODE&gt;
&lt;H3 data-line="89"&gt;3.2 Configuração (appsettings.json)&lt;/H3&gt;
&lt;P data-line="134"&gt;O ponto-chave é o&amp;nbsp;&lt;STRONG&gt;ClientCapabilities: ["cp1"]&lt;/STRONG&gt;, que habilita o suporte a Continuous Access Evaluation:&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "Domain": "cyber.meudominio.com.br",
    "TenantId": "...-8888-4400-8c9c-...",
    "ClientId": "...-e635-...-bb9f-...",
    "CallbackPath": "/signin-oidc",
    "SignedOutCallbackPath": "/signout-oidc",
    "ClientCapabilities": [ "cp1" ],
    "ClientSecret": "XHm8Q~6_rNy_ib-....~KbcvF"
  }
}&lt;/LI-CODE&gt;
&lt;P data-line="151"&gt;A classe&amp;nbsp;Configuration, passada para&amp;nbsp;AddMicrosoftIdentityWebAppAuthentication, localiza e carrega automaticamente a seção&amp;nbsp;AzureAd&amp;nbsp;do arquivo de configuração.&lt;/P&gt;
&lt;H3 data-line="110"&gt;3.3 Método Crítico: Validação do Contexto&lt;/H3&gt;
&lt;P data-line="155"&gt;No endpoint crítico (ex: deletar item), o código verifica se o token do usuário contém a claim&amp;nbsp;acrs&amp;nbsp;com o valor do contexto exigido:&lt;/P&gt;
&lt;LI-CODE lang="csharp"&gt;// GET: TodoList/Delete/5
public async Task&amp;lt;ActionResult&amp;gt; DeleteItem(int id)
{
    string requiredAuthContextId = "c10";
    string acrsClaimType = "acrs";

    // Construção do claimsChallenge
    var claimsChallengeObj = new
    {
        id_token = new
        {
            acrs = new
            {
                essential = true,
                value = requiredAuthContextId
            }
        }
    };
    string claimsChallenge = System.Text.Json.JsonSerializer.Serialize(claimsChallengeObj);

    // Verifica se o usuário possui o claim necessário
    Claim acrsClaim = User.FindAll(acrsClaimType)
        .FirstOrDefault(x =&amp;gt; x.Value == requiredAuthContextId);

    if (acrsClaim?.Value != requiredAuthContextId)
    {
        // Dispara challenge para cumprir o contexto exigido
        _consentHandler.ChallengeUser(
            new[]
            {
                "api://ce845259-3c67-43c1-9816-43f82f4d7704/ToDoList.Read",
                "api://ce845259-3c67-43c1-9816-43f82f4d7704/ToDoList.ReadWrite"
            },
            claimsChallenge
        );
    }

    try
    {
        var todo = await _downstreamApi.GetForUserAsync&amp;lt;Todo&amp;gt;(
            "TodoList",
            options =&amp;gt; options.RelativePath = $"api/todolist/{id}");

        if (todo == null) return NotFound();
        return View(todo);
    }
    catch (Exception)
    {
        return RedirectToAction("Index");
    }
}&lt;/LI-CODE&gt;
&lt;H3 data-line="168"&gt;Lógica do Fluxo&lt;/H3&gt;
&lt;OL data-line="213"&gt;
&lt;LI data-line="213"&gt;&lt;STRONG&gt;Claim presente e válida&lt;/STRONG&gt;: a operação é permitida normalmente&lt;/LI&gt;
&lt;LI data-line="214"&gt;&lt;STRONG&gt;Claim ausente&lt;/STRONG&gt;: o&amp;nbsp;&lt;STRONG&gt;ChallengeUser()&lt;/STRONG&gt;&amp;nbsp;abre a tela do Entra ID para o usuário cumprir o requisito (ex: MFA, assinatura de termo)&lt;/LI&gt;
&lt;LI data-line="215"&gt;&lt;STRONG&gt;Contexto já satisfeito&lt;/STRONG&gt;: o fluxo é transparente para o usuário&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 data-line="176"&gt;4. Fluxo de Challenge e Resposta&lt;/H2&gt;
&lt;H3 data-line="178"&gt;Do lado da API (Backend)&lt;/H3&gt;
&lt;P data-line="223"&gt;Quando o contexto&amp;nbsp;&lt;STRONG&gt;não é atendido&lt;/STRONG&gt;, a API retorna:&lt;/P&gt;
&lt;UL data-line="225"&gt;
&lt;LI data-line="225"&gt;&lt;STRONG&gt;401 Unauthorized&lt;/STRONG&gt;&amp;nbsp;com headers customizados&lt;/LI&gt;
&lt;LI data-line="226"&gt;Informações sobre o contexto exigido no corpo/headers da resposta&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-line="185"&gt;Do lado do Cliente (Frontend)&lt;/H3&gt;
&lt;OL data-line="230"&gt;
&lt;LI data-line="230"&gt;O cliente captura exceções específicas (WebApiMsalUiRequiredException)&lt;/LI&gt;
&lt;LI data-line="231"&gt;Extrai informações do header da resposta&lt;/LI&gt;
&lt;LI data-line="232"&gt;Executa o fluxo de challenge conforme necessário&lt;/LI&gt;
&lt;LI data-line="233"&gt;Após cumprido o requisito, o token é renovado com a claim&amp;nbsp;acrs&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 data-line="194"&gt;5. Considerações Finais&lt;/H2&gt;
&lt;UL data-line="239"&gt;
&lt;LI data-line="239"&gt;O uso de contextos no Entra ID&amp;nbsp;&lt;STRONG&gt;amplia as possibilidades&lt;/STRONG&gt;&amp;nbsp;de controle de acesso, permitindo requisitos dinâmicos e contextuais além das roles tradicionais&lt;/LI&gt;
&lt;LI data-line="240"&gt;A implementação exige&amp;nbsp;&lt;STRONG&gt;integração cuidadosa&lt;/STRONG&gt;&amp;nbsp;entre backend e frontend, além de testes para garantir o correto tratamento dos fluxos de challenge e resposta&lt;/LI&gt;
&lt;LI data-line="241"&gt;A&amp;nbsp;&lt;STRONG&gt;documentação limitada&lt;/STRONG&gt;&amp;nbsp;reforça a importância de compartilhar experiências e boas práticas para fomentar o uso do recurso&lt;/LI&gt;
&lt;LI data-line="242"&gt;Requer&amp;nbsp;&lt;STRONG&gt;licença Entra ID P1&lt;/STRONG&gt;&amp;nbsp;para acesso condicional&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-line="203"&gt;Referências&lt;/H2&gt;
&lt;UL data-line="248"&gt;
&lt;LI data-line="248"&gt;&lt;A href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/concept-continuous-access-evaluation" target="_blank" rel="noopener" data-href="https://learn.microsoft.com/en-us/entra/identity/conditional-access/concept-continuous-access-evaluation"&gt;Continuous Access Evaluation in Microsoft Entra - Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-line="249"&gt;&lt;A href="https://learn.microsoft.com/en-us/entra/identity-platform/v2-overview" target="_blank" rel="noopener" data-href="https://learn.microsoft.com/en-us/entra/identity-platform/v2-overview"&gt;Visão geral da plataforma de identidade da Microsoft - Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Thu, 23 Apr 2026 12:53:59 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/uso-de-contextos-no-entra-id/ba-p/4513725</guid>
      <dc:creator>wdossantos</dc:creator>
      <dc:date>2026-04-23T12:53:59Z</dc:date>
    </item>
    <item>
      <title>FinOps Hub Privado: Implementação Manual em Ambientes Corporativos</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/finops-hub-privado-implementa%C3%A7%C3%A3o-manual-em-ambientes/ba-p/4509993</link>
      <description>&lt;P&gt;&lt;STRONG&gt;O que é o FinOps Hub?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O FinOps Hub é uma solução open source da Microsoft, parte do FinOps Toolkit, que fornece uma base escalável e extensível para análise, governança e otimização de custos em nuvem. A solução centraliza dados de custos por meio de recursos de armazenamento e pipelines de dados, permitindo que as organizações padronizem a forma como analisam seus gastos na nuvem, adotando o modelo de dados FOCUS definido pela FinOps Foundation.&lt;/P&gt;
&lt;P&gt;Além de disponibilizar relatórios e dashboards prontos, o FinOps Hub expõe os dados de custos de forma estruturada por meio do Azure Data Explorer ou do Microsoft Fabric, possibilitando a criação de relatórios customizados no Power BI e o desenvolvimento de soluções internas sob medida, de acordo com as necessidades do negócio.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Objetivo&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Esse artigo visa orientar a implementação manual do acesso privado ao FinOps Hub após uma implementação pública, sem usar diretamente a opção de implementação privada oferecida pelo template.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Por que implementar o FinOps Hub com acesso privado de forma manual?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O &lt;A href="https://learn.microsoft.com/en-gb/cloud-computing/finops/toolkit/hubs/deploy?tabs=azure-portal%2Cadx-dashboard#deploy-the-finops-hub-template" target="_blank" rel="noopener"&gt;template&lt;/A&gt; disponibilizado para a implementação do FinOps Hub permite que selecionemos&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-gb/cloud-computing/finops/toolkit/hubs/private-networking#comparing-network-access-options" target="_blank" rel="noopener"&gt;duas formas de implementação&lt;/A&gt;:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Pública: forma de implementação mais simples e comum. Os recursos são provisionados com acesso público habilitado, sendo acessados por meio de seus endpoints públicos padrões do Azure. O controle de acesso é feito exclusivamente via permissões RBAC.&lt;/LI&gt;
&lt;LI&gt;Privada: forma de implementação mais segura. Os recursos são provisionados com acesso público desabilitado e expostos apenas por meio de private endpoints, ficando acessíveis somente através de redes privadas que possuem conectividade com a rede onde esses endpoints estão implementados.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Embora a comunicação privada traga ganhos significativos de segurança, sua habilitação através do template do FinOps Hub introduz algumas implicações importantes no processo de implantação. O template, de forma automática, tenta:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Criar uma rede virtual (/26);&lt;/LI&gt;
&lt;LI&gt;Provisionar Private DNS Zones;&lt;/LI&gt;
&lt;LI&gt;Criar os registros DNS associados aos private endpoints;&lt;/LI&gt;
&lt;LI&gt;Configurar os links entre as VNets e as zonas DNS.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Em muitas organizações, esse tipo de configuração é restrito por políticas internas. A criação de redes, zonas DNS e seus respectivos vínculos costuma ser responsabilidade de times especializados, que garantem a padronização e a aderência às diretrizes arquiteturais definidas pela empresa.&lt;/P&gt;
&lt;P&gt;Em cenários onde a organização adota, por exemplo, uma topologia Hub &amp;amp; Spoke, com landing zones bem definidas para workloads e conectividade, é fundamental considerar alguns pontos adicionais:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Garantir que a rede criada para os private endpoints não tenha sobreposição (overlap) com outras redes existentes;&lt;/LI&gt;
&lt;LI&gt;Assegurar que exista peering com a VNet de hub;&lt;/LI&gt;
&lt;LI&gt;Integrar os registros DNS dos novos private endpoints às Private DNS Zones centralizadas;&lt;/LI&gt;
&lt;LI&gt;Configurar corretamente os VNet links;&lt;/LI&gt;
&lt;LI&gt;Garantir que a resolução de nomes esteja funcional no ambiente on-premises, permitindo o acesso ao FinOps Hub por meio de VPN, ExpressRoute ou outras formas de conectividade híbrida.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Esses fatores explicam por que, em muitos casos, o uso do template com configuração privada se torna inviável quando utilizado de forma isolada. Isso ocorre porque, frequentemente, o time de FinOps não é o mesmo time responsável por redes e DNS, possuindo permissão para implantar apenas parte dos recursos necessários.&lt;/P&gt;
&lt;P&gt;Nesses cenários, a implementação privada exige a orquestração entre diferentes times, cada um atuando dentro de suas responsabilidades. Como resultado, algumas etapas que o template tenta executar automaticamente precisam ser realizadas manualmente, conforme descrito nas próximas seções.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Passo a Passo para Implementação&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Faça a implementação do template &lt;A href="https://learn.microsoft.com/en-gb/cloud-computing/finops/toolkit/hubs/deploy?tabs=azure-portal%2Cadx-dashboard#deploy-the-finops-hub-template" target="_blank" rel="noopener"&gt;seguindo o tutorial documentado&lt;/A&gt;, com “Networking” em modo público.&lt;/LI&gt;
&lt;LI&gt;Assim que o template é implementado, alguns scripts de configuração são executados. Aguarde até que esses scripts sejam executados, ou seja, desapareçam do grupo de recursos onde o FinOps Hub foi implementado para seguir com os próximos passos. Exemplos dos “Deployment Scripts” que desaparecerão:&lt;/LI&gt;
&lt;/OL&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;Crie uma rede de tamanho mínimo /26 – valide com o time de infraestrutura o espaçamento que pode ser utilizado. Dentro dessa rede implemente uma subrede:
&lt;UL&gt;
&lt;LI&gt;private-endpoint-subnet (/28) – subrede para os private endpoints.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Garanta a existência das Private DNS Zones: se seu ambiente possui zonas de DNS privadas centralizadas pré-configuradas. Garanta que as seguintes zonas já existam na subscription padrão para os seus recursos de rede:
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;privatelink.blob.core.windows.net&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;– para o Data Explorer e storage&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;privatelink.dfs.core.windows.net&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;– para o Data Explorer and o data lake hospedando os dados de FinOps data e configuração das pipelines&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;privatelink.table.core.windows.net&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;– para Data Explorer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;privatelink.queue.core.windows.net&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;– para o Data Explorer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;privatelink.{location}.kusto.windows.net&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;– para Data Explorer&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Configurando a Storage Account com Acesso Privado&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;O primeiro recurso que a ser configurado será a Storage Account.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;A configuração a seguir deve ser realizada duas vezes uma para o target sub-resource “blob” e outra para o target sub-resource “dfs”.
&lt;UL&gt;
&lt;LI&gt;Acesse “Networking” e a aba “Private Endpoints”&lt;/LI&gt;
&lt;LI&gt;Na aba “Basics” defina:
&lt;UL&gt;
&lt;LI&gt;Subscription: mesma que o FinOps Hub foi implementado&lt;/LI&gt;
&lt;LI&gt;Resource Group: mesmo que o FinOps Hub foi implementado&lt;/LI&gt;
&lt;LI&gt;Name: use um nome que remeta ao recurso criado (private endpoint) e o sub recurso que ele fará exposição (blob/dfs). Exemplo: pe-storageaccount-blob/ pe-storageaccount-dfs&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Na aba “Resource” defina o target sub-resource para o qual a configuração está sendo feita. No caso, primeiro foi feito para “blob” e depois “dfs”.&lt;/LI&gt;
&lt;LI&gt;Na aba “Virtual Network”, deve-se selecionar a rede criada para os private endpoints bem como a subrede (private-endpoint-subnet).&lt;/LI&gt;
&lt;LI&gt;Na aba “DNS” selecione a private DNS zone na qual são realizados os registros do seus private endpoints. Quando estiver configurando o private endpoint para blob será &lt;STRONG&gt;privatelink.blob.core.windows.net&lt;/STRONG&gt; e para dfs &lt;STRONG&gt;privatelink.dfs.core.windows.net&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Adicione Tags caso seja necessário.&lt;/LI&gt;
&lt;LI&gt;Clique em “Review + create”.&lt;/LI&gt;
&lt;LI&gt;Ao final, dois private endpoints devem estar criados para a storage account:&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;Agora será necessário configurar o private endpoint usado pelo Data Factory para acessar a Storage Account.
&lt;UL&gt;
&lt;LI&gt;Acesse o Data Factory e clique em "Launch Studio".&lt;/LI&gt;
&lt;LI&gt;No menu lateral, selecione a opção "Manage" -&amp;gt; "Linked services":&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Selecione o serviço correspondente ao Azure Data Lake Storage Gen2.&lt;/LI&gt;
&lt;LI&gt;Em “Connect via integration runtime” substitua “AutoResolveIntegrationRuntime” por New+:&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Em “Integration runtime setup” selecione “Azure” -&amp;gt; Botão “Continue”:&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Na aba “Settings”, apenas altere o campo “Name”. Use algo como “ManagedIntegrationRuntime”. Os demais campos, mantenha como estão:&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Na aba “Virtual Network”, configure conforme a imagem abaixo:&lt;img /&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Por fim, na aba “Data flow runtime”, use as configurações abaixo:&lt;/LI&gt;
&lt;LI&gt;Clique em “Create”.&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Agora, voltando a página “Edit linked Service”, adicione o “Managed Private Endpoint”. Ele ficará em estado “Pending”.&lt;/LI&gt;
&lt;LI&gt;Clique em “Save”.&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Além disso, use a managed identity fornecida na página “Edit linked Service”, e lhe dê os seguintes acessos na storage account:
&lt;UL&gt;
&lt;LI&gt;Reader&lt;/LI&gt;
&lt;LI&gt;Storage Account Contributor&lt;/LI&gt;
&lt;LI&gt;Storage Blob Data Contributor&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Por fim, acesse a seção “Networking” da Storage Account novamente, selecione o private endpoint criado pelo Data Factory e clique no botão “Approve”.&amp;nbsp;&lt;img /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Configurando o Linked Service ftkRepo no Data Factory&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Voltando na seção “Manage” do Azure Data Factory, será necessário editar o serviço “ftkRepo”. Nele, o único campo a ser alterado é o “Connect via integration runtime” usando o “ManagedIntegrationRuntime” criado na etapa de configuração da storage account.&lt;/LI&gt;
&lt;/OL&gt;
&lt;img /&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;Clique em “Save”.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Configurando o Azure Data Explorer com Acesso Privado&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Acesse a seção “Networking” cluster do Data Explorer criado pelo script do FinOps Hub e acesse a aba “Private Endpoint Connections”&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Clique em “+ Private Endpoint”.&lt;/LI&gt;
&lt;LI&gt;Em “Basics” inclua um nome para o private endpoint e garanta que a região selecionada é a de implementação do seu FinOps Hub e da vnet criada para ele.&lt;/LI&gt;
&lt;LI&gt;Na aba “Virtual Network” selecione a rede e subrede criadas para os private endpoints.&lt;/LI&gt;
&lt;LI&gt;Na aba “DNS”, associar cada configuração a sua private DNS zone correspondente. Se essas zonas já existirem no ambiente e forem utilizadas de forma centralizada, usar as existentes. Caso contrário, a configuração poderá criar private DNS zones novas:&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Novamente será preciso configurar o private endpoint gerenciado pelo Data Factory. Para isso, acesse “Managed” -&amp;gt; “Linked Services” e selecione o serviço referente ao Azure Data Explorer.&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Nessa seção, o único campo a ser editado é o “Connect via integration runtime” usando o “ManagedIntegrationRuntime” criado na etapa de configuração da storage account.&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Agora ainda em “Manage” no Data Factory, selecione a opção “Managed Private Endpoints”. Clique em “+New” -&amp;gt; “Azure Data Explorer (Kusto)”&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Forneça um nome para o private endpoint, marque a subscription na qual o Data Explorer foi implementado e em "Cluster" selecione o recurso implementado via template do FinOps Hub:&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;Ao final, deve-se ter dois private endpoints configurados no Azure Data Explorer:&lt;img /&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Ajustes Finais e Validações de Conectividade&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Tanto para a Storage Account quanto para o Data Explorer, acesse as configurações de rede e altere o Public network access para “Disabled”.&lt;/LI&gt;
&lt;LI&gt;Por fim, no seu servidor local de DNS, crie o registro para o Data Explorer apontando para o forwarder correto no Azure seja ele uma máquina virtual ou o inbound endpoint do Azure Private Resolver. Não use o domínio com privatelink, mas sim o padrão, no caso do Data Explorer a forma geral é &amp;lt;localização&amp;gt;.kusto.windows.net conforme o exemplo abaixo:&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;UL&gt;
&lt;LI&gt;Ao configurar os apontamentos corretamente, será possível configurar os dashboards em máquinas locais/on-premises que tenham acesso privado ao ambiente Azure. Os dashboards precisam ser capazes de resolver a URL do cluster Data Explorer que é apontado como parâmetro do Dashboard em PowerBI.&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Se desejar validar a comunicação antes de configurar o dashboard de Power BI, teste da sua máquina local a resolução da URI do Data Explorer implementado para o FinOps Hub, usando nslookup conforme o exemplo abaixo.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 10 Apr 2026 16:51:20 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/finops-hub-privado-implementa%C3%A7%C3%A3o-manual-em-ambientes/ba-p/4509993</guid>
      <dc:creator>carolinamelo</dc:creator>
      <dc:date>2026-04-10T16:51:20Z</dc:date>
    </item>
    <item>
      <title>Segurança Corporativa no Azure VMware Solution (AVS): Como Inspecionar o Tráfego com Firewall NVA</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/seguran%C3%A7a-corporativa-no-azure-vmware-solution-avs-como/ba-p/4501226</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Muitas vezes faz sentido usar uma NVA (Network Virtual Appliance) como firewall dentro do AVS, porque permite&lt;STRONG&gt; reaproveitar a solução de firewall já existente &lt;/STRONG&gt;(Palo Alto, Check Point, etc..) e manter a proficiência do time de segurança, evita parte da&lt;STRONG&gt; complexidade de roteamento&lt;/STRONG&gt; que pode surgir ao forçar o tráfego passar por um firewall “fora” do AVS . Além disso, administrar esse firewall dentro do AVS continua familiar para quem já opera VMware, e você ganha acesso a &lt;STRONG&gt;recursos avançados de inspeção &lt;/STRONG&gt;do fabricante (como filtragem por aplicação em camada 7 e inspeção SSL/TLS), que são muito úteis para controle de tráfego outbound e políticas corporativas.&lt;/P&gt;
&lt;P&gt;Neste artigo eu demonstro e um laboratório prático de inspeção de tráfego &lt;STRONG&gt;Norte-Sul e Leste-Oeste&lt;/STRONG&gt;, fazendo isolamento por ambiente (DEV/PRD) dentro do &lt;STRONG&gt;Azure VMware Solution (AVS) &lt;/STRONG&gt;usando&lt;STRONG&gt; NSX-T (Tier-0/Tier-1)&lt;/STRONG&gt; e um &lt;STRONG&gt;Firewall NVA (pfSense)&lt;/STRONG&gt; implantado no SDDC. Também serão demonstradas as &lt;STRONG&gt;principais configurações no NSX&lt;/STRONG&gt; (criação/associação de segments, gateways T0/T1 e ajustes de roteamento necessários para forçar o tráfego a passar pela NVA).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Arquitetura&lt;/H3&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Informações do Laboratório&lt;/STRONG&gt;&lt;/H4&gt;
&lt;H5&gt;&lt;STRONG&gt;Segmentos de Trânsito&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Transit_Outside &amp;nbsp; | CIDR: 192.168.30.0/24 | GW: 192.168.30.1&lt;/LI&gt;
&lt;LI&gt;Transit_PRD&amp;nbsp; | CIDR: 192.168.21.0/24 | GW: 192.168.21.1&lt;/LI&gt;
&lt;LI&gt;Transit_DEV&amp;nbsp; | CIDR: 192.168.22.0/24 | GW: 192.168.22.1&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Segmentos de Workloads&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;PRD_WEB | CIDR: 192.168.70.0/24 | GW: 192.168.70.1&lt;/LI&gt;
&lt;LI&gt;PRD_DATA | CIDR: 192.168.71.0/24 | GW: 192.168.71.1&lt;/LI&gt;
&lt;LI&gt;DEV_WEB | CIDR: 192.168.80.0/24 | GW: 192.168.80.1&lt;/LI&gt;
&lt;LI&gt;DEV_DATA | CIDR: 192.168.81.0/24&amp;nbsp; | GW: 192.168.81.1&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Interfaces da NVA (pfSense)&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Transit_Outside: 192.168.30.5&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Transit_PRD: 192.168.21.5&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Transit_DEV: 192.168.22.5&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;Configuração do Azure VMware Solution&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Na configuração &lt;STRONG&gt;Internet connectivity (egress/ingress) &lt;/STRONG&gt;do &lt;STRONG&gt;Azure VMware Solution (AVS) &lt;/STRONG&gt;irei utilizar a opção &lt;STRONG&gt;"Connect using Public IP down to the NSX Edge"&lt;/STRONG&gt;. Isso permite usar o NSX Data Center para criar regras de &lt;STRONG&gt;outbound e inbound&lt;/STRONG&gt; (DNAT/SNAT) usando esses IPs públicos diretamente no Edge do AVS.&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Configuração de SNAT e NoSnat no NSX&lt;/STRONG&gt;&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Regras “No SNAT”&lt;/STRONG&gt; : Define que não deve haver tradução de origem quando o tráfego vai para redes privadas RFC1918. Isso preserva o IP original de origem para comunicação interna (ex.: on-prem, Azure, spoke VNets/rotas privadas), evita quebra de roteamento/retorno.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Regra “SNAT”&lt;/STRONG&gt;: Aplica tradução de origem para o restante do tráfego (Internet). Ou seja, quando uma VM com IP privado sai para fora, o NSX troca o IP de origem pelo IP público configurado ( 20.20.138.0/32).&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Criação dos Gateways TIER-1 (PRD e DEV).&lt;/STRONG&gt;&lt;/H4&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&amp;nbsp;&lt;/H5&gt;
&lt;H5&gt;&amp;nbsp;&lt;/H5&gt;
&lt;H5&gt;&lt;STRONG&gt;Importante: Estes gateway são "Isolados", portando não serão conectados ao TIER-0&lt;/STRONG&gt;&lt;/H5&gt;
&lt;H5&gt;T1_PRD_Isolado&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;T1_DEV_Isolado&lt;/H5&gt;
&lt;img /&gt;
&lt;H4&gt;Resultado&lt;/H4&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Criação dos Segmentos de Trânsito PRD e DEV&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Importante: Estes Segmentos estarão conectados ao Tier-1 Gateway PRD (T1_PRD_Isolado) e DEV ( T1_DEV_Isolado) respectivamente criados na etapa anterior&lt;/P&gt;
&lt;img /&gt;
&lt;H5&gt;TRANSIT_PRD&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;TRANSIT_DEV&lt;/H5&gt;
&lt;img /&gt;
&lt;H3&gt;&lt;STRONG&gt;Criação do Segmento PRD WEB e DATA&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Importante: Estes Segmentos estarão conectados ao Tier-1 Gateway PRD (T1_PRD_isolado) e DEV ( T1_DEV_Isolado) respectivamente criados na etapa anterior&lt;/P&gt;
&lt;img /&gt;
&lt;H5&gt;PRD_WEB&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;PRD_DATA&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;DEV_WEB&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;DEV_DATA&lt;/H5&gt;
&lt;img /&gt;
&lt;H5&gt;Visão Geral dos Segmentos&lt;/H5&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&amp;nbsp;&lt;/H4&gt;
&lt;H4&gt;&lt;STRONG&gt;Configuração de Rotas&lt;/STRONG&gt;&lt;/H4&gt;
&lt;H4&gt;&lt;STRONG&gt;Rotas no Gateway T1 Default&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;No Gateway T1 Default que está conectado ao T0 , irei configurar rotas para todos os segmentos com Next Hop ao ip da interface Outside do meu PFsense (192.168.30.5) .&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;obs: o nome do gateway T1 é diferente em cada AVS SDDC, no meu ambiente é "TNT13-T1"&lt;/STRONG&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Informei o CIDR da Rede , neste caso é para o segmento TRANSIT_PRD&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Next Hop aqui é o ip da interface Outside do PFsense ( 192.168.30.5) , que está conectada diretamente a este GW T1.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Repeti os mesmos passos para todos os outros Segmentos, sempre com next hop para 192.168.30.5.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H4&gt;&amp;nbsp;&lt;/H4&gt;
&lt;H4&gt;&lt;STRONG&gt;Interfaces Firewall Pfsense&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Neste cenário o Firewall possui apenas &lt;STRONG&gt;três interfaces.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Deve ser configurada a rota default ( 0.0.0.0/0) para o gateway do Segmento Transit Outside ( 192.168.30.1)&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Interfaces do Pfsense&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Rotas no Gateways de Transito : T1_PRD_isolado&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Estarei criado uma rota default ( 0.0.0.0/0 ) , com next hop para a interface do Inside do PFsense (192.168.21.5 ) conectada ao Gateway T1 PRD. Devido a limitações do NSX, é necessário "quebrar" em duas:&amp;nbsp; 0.0.0.0/1 e 128.0.0.1/1&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Configuração da Rodas default&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Next Hop para ip da Interface Inside PFsense.&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Rotas no Gateways de Transito : T1_DEV_Isolado&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Estarei criado uma rota default ( 0.0.0.0/0 ) , com next hop para a interface do Inside do PFsense (192.168.22.5 ) conectada ao Gateway T1 PRD. Devido a limitações do NSX, é necessário "quebrar" em duas:&amp;nbsp; 0.0.0.0/1 e 128.0.0.1/1&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Configuração da Rodas default&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Next Hop para ip da Interface Inside PFsense.&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Teste de Acesso&lt;/STRONG&gt;&lt;/H4&gt;
&lt;H5&gt;&lt;STRONG&gt;Tráfego Norte-Sul ( Saída Internet)&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;Para comprovar que conseguimos agora ter o tráfego Norte-Sul, pelo NVA PFense , irei fazer um teste a partir da máquina no segmento PRD_WEB , com ip 192.168.70.1&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;É possivel observar que o ip públlico de saída é do AVS&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Agora vou criar uma regra no Pfsense bloqueando a porta 443 , mas deixando liberada as outras portas.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Podemos comprovar que o tráfego está sendo inspersionado fazendo um teste de conexão na porta 53 e outro teste https.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;No Pfsense podemos ver o bloqueio&lt;/P&gt;
&lt;img /&gt;
&lt;H5&gt;&lt;STRONG&gt;Tráfego Leste-Oeste&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;Para testar o tráfego leste oeste entre os Segmentos PRD_WEB ( VM 192.168.70.10 )&amp;nbsp; e DEV_WEB&amp;nbsp; ( VM 192.168.80.10) , irei deixar ICMP liberado e bloquear a porta 3389 ( RDP)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Fazendo o teste a partir da máquina 192.168.70.10&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Verificando no PFsense o &lt;STRONG&gt;bloqueio da porta 3389&lt;/STRONG&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;H4&gt;&lt;STRONG&gt;Resumo&lt;/STRONG&gt;&lt;/H4&gt;
&lt;P&gt;Neste laboratório demonstrei como integrar uma NVA ao Azure VMware Solution usando NSX-T com Tier-0/Tier-1, criando T1s isolados para DEV e PRD, segments de trânsito e a configuração de SNAT/NoSNAT no NSX para controlar o egress. Também mostrei o ajuste de rotas&amp;nbsp; para garantir que o tráfego siga pelo caminho de inspeção no firewall. Validei a arquitetura com testes práticos de tráfego Norte-Sul (saída para Internet com IP público do AVS) e Leste-Oeste (controle entre DEV e PRD), comprovando a inspeção via logs e bloqueios aplicados no pfSense. Como próximos passos para produção, recomenda-se padronizar regras, logging, e revisar resiliência/HA do firewall e rotas para reduzir pontos únicos de falha.&lt;/P&gt;
&lt;H4&gt;&lt;STRONG&gt;Referências&lt;/STRONG&gt;&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://techcommunity.microsoft.com/blog/azuremigrationblog/firewall-integration-in-azure-vmware-solution/2254961" target="_blank" rel="noopener"&gt;Firewall integration in Azure VMware Solution | Microsoft Community Hub&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://www.youtube.com/watch?v=ycbZmdI9TMQ&amp;amp;t=4s" target="_blank" rel="noopener"&gt;AVS How-to: 3rd Party Firewalls in Azure VMware Solution&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Wed, 11 Mar 2026 14:50:40 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/seguran%C3%A7a-corporativa-no-azure-vmware-solution-avs-como/ba-p/4501226</guid>
      <dc:creator>LeandroBarbosa</dc:creator>
      <dc:date>2026-03-11T14:50:40Z</dc:date>
    </item>
    <item>
      <title>Anonimização de Dados Sensíveis com a plataforma de IA do Azure</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anonimiza%C3%A7%C3%A3o-de-dados-sens%C3%ADveis-com-a-plataforma-de-ia-do-azure/ba-p/4481313</link>
      <description>&lt;P&gt;A&amp;nbsp;&lt;A href="https://www.planalto.gov.br/ccivil_03/_ato2015-2018/2018/lei/l13709.htm" target="_blank" rel="noopener"&gt;Lei Geral de Proteção de Dados (LGPD)&lt;/A&gt; estabelece padrões rigorosos para o tratamento de dados pessoais e sensíveis no Brasil. Dados pessoais incluem informações que identificam diretamente um indivíduo, como nome, endereço, telefone, CPF, RG e data de nascimento. Já os dados sensíveis abrangem categorias especiais, como origem racial ou étnica, crenças religiosas, opiniões políticas, dados de saúde ou genéticos, biometria, orientação sexual e filiação sindical. Esses dados exigem cuidados adicionais, pois impactam diretamente a privacidade e os direitos dos titulares.&lt;/P&gt;
&lt;P&gt;No contexto do processamento e compartilhamento de documentos — especialmente em setores como o público e o médico — é essencial reconhecer e classificar corretamente esses tipos de dados. Documentos oficiais ou registros de saúde frequentemente contêm tanto informações pessoais quanto dados altamente sensíveis, tornando a anonimização uma necessidade prática além de uma exigência legal.&lt;/P&gt;
&lt;H2 id="proposta-de-arquitetura"&gt;Proposta de Arquitetura&lt;/H2&gt;
&lt;P&gt;Para atender à demanda de anonimização de dados sensíveis em documentos, soluções modernas de inteligência artificial, como Azure Document Intelligence e Azure Language Service, oferecem capacidade para detectar e classificar automaticamente informações pessoais. Esses serviços aceleram o processo de proteção de dados, mas seus modelos genéricos podem não abranger totalmente todas as categorias previstas pela LGPD — especialmente aquelas mais complexas ou dependentes de contexto, como opiniões políticas, crenças religiosas ou informações específicas de saúde.&lt;/P&gt;
&lt;P&gt;Um caso simbólico pode ilustrar esse cenário: imagine uma plataforma responsável pelo armazenamento e compartilhamento de documentos administrativos. Para garantir que conteúdos sensíveis possam ser divulgados sem violar a privacidade das pessoas citadas, é possível implementar uma solução de anonimização baseada em IA. Ao utilizar modelos genéricos dos serviços de linguagem do Azure, conseguimos cobrir aproximadamente metade das classes previstas na LGPD, mas essas já abrangem a maior parte das classes determinísticas da legislação.&lt;/P&gt;
&lt;P&gt;Abaixo, a arquitetura sugerida é detalhada de forma segmentada:&lt;/P&gt;
&lt;img /&gt;
&lt;H3 id="-azure-document-intelligence-https-learn-microsoft-com-azure-ai-services-document-intelligence-"&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/document-intelligence/" target="_blank" rel="noopener"&gt;Azure Document Intelligence&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;O Azure Document Intelligence compõe a primeira camada do processamento, responsável por extrair texto, estrutura e coordenadas dos elementos presentes nos documentos — como tabelas, formulários, assinaturas e marcações visuais. Essa leitura estrutural permite compreender não apenas o que está escrito, mas onde cada informação se encontra.&lt;/P&gt;
&lt;P&gt;A escolha por esse serviço se deve à sua capacidade de fornecer OCR avançado, interpretar layouts complexos e identificar elementos adicionais, como códigos de barras e QR Codes, que muitas vezes carregam metadados sensíveis. Esse mapeamento preciso é essencial para aplicar anonimização diretamente nas regiões corretas, preservando a integridade visual do documento.&lt;/P&gt;
&lt;H3 id="-azure-language-service-pii-e-classifica-o-https-learn-microsoft-com-azure-ai-services-language-service-"&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/language-service/" target="_blank" rel="noopener"&gt;Azure Language Service — PII e Classificação&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;Nesta segunda etapa, o Azure Language Service é utilizado para identificar automaticamente informações pessoalmente identificáveis (PII), como nomes, endereços, dados de contato e números de documentos. O modelo analisa o conteúdo com foco semântico, classificando entidades conforme categorias previstas na LGPD.&lt;/P&gt;
&lt;P&gt;A motivação para empregá-lo está em sua capacidade de fornecer uma base abrangente e pronta para uso, permitindo detectar rapidamente grande parte dos dados sensíveis encontrados em documentos reais. Isso reduz a necessidade de regras manuais e acelera o processo de anonimização.&lt;/P&gt;
&lt;H3 id="-azure-language-service-modelos-personalizados-custom-ner-https-learn-microsoft-com-azure-ai-services-language-service-named-entity-recognition-"&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/ai-services/language-service/named-entity-recognition/overview" target="_blank" rel="noopener"&gt;Azure Language Service — Modelos Personalizados (Custom NER)&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;Embora os modelos genéricos atendam a boa parte dos cenários, documentos reais costumam conter entidades específicas do domínio — expressões próprias da instituição, cargos incomuns, nomes de sistemas internos, termos de contexto ou siglas não previstas pelo modelo padrão.&lt;/P&gt;
&lt;P&gt;Para suprir essas lacunas, são usados modelos personalizados de Reconhecimento de Entidades Nomeadas (NER). Eles permitem treinar novas categorias sensíveis e adaptar o processamento à realidade da organização. A motivação principal é reduzir falsos positivos/negativos e garantir maior precisão nos casos de uso mais complexos.&lt;/P&gt;
&lt;H3 id="-azure-computer-vision-https-learn-microsoft-com-azure-cognitive-services-computer-vision-"&gt;&lt;A href="https://learn.microsoft.com/azure/cognitive-services/computer-vision/" target="_blank" rel="noopener"&gt;Azure Computer Vision&lt;/A&gt;&lt;/H3&gt;
&lt;P&gt;Quando documentos incluem imagens, fotografias ou capturas de telas, a anonimização precisa ir além do texto. O Azure Computer Vision é utilizado para detectar rostos e outras características visuais que possam identificar indivíduos.&lt;/P&gt;
&lt;P&gt;Sua inclusão no processamento permite aplicar desfocagem ou mascaramento diretamente nos elementos encontrados, garantindo proteção também em conteúdo multimídia. Isso se torna especialmente relevante em documentos digitalizados que podem conter retratos, crachás, assinaturas digitalizadas ou imagens que exponham a identidade de terceiros.&lt;/P&gt;
&lt;H3 id="orchestrator-python-l-gica-de-anonimiza-o-baseada-em-coordenadas"&gt;Orchestrator Python — Lógica de Anonimização Baseada em Coordenadas&lt;/H3&gt;
&lt;P&gt;A última camada da solução é desenvolvida em Python, responsável por orquestrar os serviços de IA e aplicar a anonimização final no documento. Com base nas coordenadas extraídas pelo Document Intelligence e nas entidades classificadas pelo Language Service, o componente Redaction realiza o mascaramento diretamente sobre a área correspondente.&lt;/P&gt;
&lt;P&gt;A escolha pelo Python se justifica pela sua flexibilidade, ampla disponibilidade de bibliotecas para manipulação de PDFs e imagens, e facilidade para integrar diferentes serviços do Azure em um único fluxo. Além disso, permite criar filtros adicionais — como evitar mascarar nomes de organizações ou estruturas fixas — garantindo precisão e consistência no resultado final.&lt;/P&gt;
&lt;H2 id="recomenda-es"&gt;Recomendações&lt;/H2&gt;
&lt;P&gt;Veja o repositório de uma demonstração simplificada com arquivos fictícios: &lt;A href="https://github.com/anaritakrs/document-anonymization" target="_blank" rel="noopener"&gt;Repo&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Se você deseja implantar essa solução, pode utilizar o código disponível no repositório e adaptá-lo aos seus filtros e regras específicas. A estratégia recomendada é empacotar a aplicação em contêineres para facilitar a escalabilidade e a integração com diferentes ambientes.&lt;/P&gt;
&lt;P&gt;Além disso, é possível consumir os serviços do Azure diretamente via APIs, garantindo flexibilidade na arquitetura e integração com outras aplicações. Todas essas informações, incluindo exemplos e orientações detalhadas, estão disponíveis na documentação oficial dos serviços Azure.&lt;/P&gt;
&lt;P&gt;Essa abordagem integrada garante que documentos públicos possam ser compartilhados de forma segura, respeitando a legislação e protegendo a privacidade das pessoas. A evolução para modelos personalizados representa um salto importante, permitindo identificar e anonimizar dados que hoje passam despercebidos pelos modelos padrão, elevando o nível de conformidade e confiança no tratamento de dados sensíveis.&lt;/P&gt;
&lt;H2 id="agradecimentos"&gt;Agradecimentos&lt;/H2&gt;
&lt;P&gt;Agradeço especialmente ao Gilberto Santos, meu colega Cloud Solution Architect &lt;A href="https://www.linkedin.com/in/gilbertossoares/" target="_blank" rel="noopener"&gt;Linkedin&lt;/A&gt;, pela generosidade em compartilhar sua expertise sobre os serviços do Azure e pelo apoio essencial no desenvolvimento desta arquitetura.&lt;/P&gt;
&lt;P&gt;Também registro meu agradecimento ao Alexandre Teoi, Cloud Solution Architect &lt;A href="https://www.linkedin.com/in/ateoi/" target="_blank" rel="noopener"&gt;Linkedin&lt;/A&gt;, pela revisão criteriosa e pelas contribuições valiosas para o aprimoramento deste artigo.&lt;/P&gt;</description>
      <pubDate>Fri, 26 Dec 2025 17:51:22 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anonimiza%C3%A7%C3%A3o-de-dados-sens%C3%ADveis-com-a-plataforma-de-ia-do-azure/ba-p/4481313</guid>
      <dc:creator>anaritak</dc:creator>
      <dc:date>2025-12-26T17:51:22Z</dc:date>
    </item>
    <item>
      <title>Protegendo Máquinas no Azure VMware Solution com Azure Firewall</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/protegendo-m%C3%A1quinas-no-azure-vmware-solution-com-azure-firewall/ba-p/4462359</link>
      <description>&lt;P&gt;O&amp;nbsp; Azure VMware Solution oferece três opções principais de conectividade &lt;STRONG&gt;outbound para a Internet&lt;/STRONG&gt;.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A primeira é o &lt;STRONG&gt;Managed SNAT&lt;/STRONG&gt;, opção padrão e totalmente gerenciada pela plataforma, em que o próprio AVS realiza a tradução de endereços (SNAT) para permitir o acesso à Internet. Essa abordagem é simples e não requer configuração adicional, porém não oferece controle sobre os endereços IP públicos utilizados.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A segunda opção é o uso de &lt;STRONG&gt;Public IPs no NSX-T Edge&lt;/STRONG&gt;, onde o administrador atribui endereços públicos diretamente ao edge do ambiente AVS. Com isso, o tráfego de saída das máquinas virtuais utiliza esses IPs específicos, permitindo maior controle, ideal para cenários em que é necessário manter IPs fixos ou previamente autorizados em listas de acesso externas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Por fim, há a opção de &lt;STRONG&gt;rotear o tráfego via rede Azure&lt;/STRONG&gt; (ou Azure Virtual WAN), em que uma rota padrão é anunciada por meio do ExpressRoute, direcionando o tráfego de saída para uma rede Azure que contém NVAs, Azure Firewall ou proxies. Essa abordagem oferece o maior nível de controle e segurança, pois permite aplicar inspeção, políticas e NAT centralizados, de forma integrada à arquitetura de rede do cliente.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Neste artigo será demonstrado em um ambiente de laboratório como utilizar o &lt;STRONG&gt;Virtual Wan com Azure Firewall &lt;/STRONG&gt;para inspeção do tráfego de saída das Vms em um &lt;STRONG&gt;segmento do AVS&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;A arquitetura do laboratório.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Virtual Wan com Azure Firewall&lt;/LI&gt;
&lt;LI&gt;ER Gateway conectado ao Express Route do Azure VMware Solution&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Os passos necessários são:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Configuração da opção de Internet Connectivity do AVS&lt;/LI&gt;
&lt;LI&gt;Habilitar a propagação da Rota no Vwan&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Configuração do Routing Intent&lt;/LI&gt;
&lt;/OL&gt;
&lt;H4&gt;Configuração do Azure VMware Solution.&lt;/H4&gt;
&lt;P&gt;Acesse o Private Cloud no portal do Azure e certifique que a opção abaixo esteja selecionada.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Fazendo um "dump" das rotas no T0 do NSX, é possível verificar que não temos a rota default sendo propagada.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Portanto não temos conectividade para internet a partir da máquina VM1 que está no AVS.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&amp;nbsp;&lt;/H2&gt;
&lt;H2&gt;&amp;nbsp;&lt;/H2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Habilitando a propagação da Rota default no Virtual Wan&lt;/H4&gt;
&lt;P&gt;Devemos agora habilitar a propagação da rota default pelo Virtual Wan , e para isso é necessário editar a conexão do Express Route do AVS, conectado ao Hub do Vwan .&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Habilite a propagação da Rota default&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&amp;nbsp;Routing Intent&lt;/H4&gt;
&lt;P&gt;O &lt;STRONG&gt;Routing Intent&lt;/STRONG&gt; no &lt;STRONG&gt;Azure Virtual WAN&lt;/STRONG&gt; é um recurso que &lt;STRONG&gt;simplifica e automatiza o roteamento de tráfego&lt;/STRONG&gt; dentro do hub do Virtual WAN. Ele define &lt;STRONG&gt;como o tráfego entre redes (VNets, branches, e Internet)&lt;/STRONG&gt; deve ser direcionado, sem necessidade de configurar manualmente tabelas de rotas complexas&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Observação:&lt;/STRONG&gt; Em geral, no Brasil, caso já exista um Express Route On-premises, o Routing Intent já deve estar ativado para permitir o tráfego na comunicação com o Express Route do AVS, devido a não disponibilidade na região do Brasil do Express Route Global Reach&lt;/P&gt;
&lt;P&gt;&amp;nbsp;Nas configurações do HUB, habilite o &lt;STRONG&gt;Routing Intent.&lt;/STRONG&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Fazendo um novo "dump"das rotas BGP no NSX, agora é possível observar a rota default sendo propagada.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Testando a partir da VM no AVS&lt;/H4&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Conforme esperado é o mesmo IP público do meu Firewall no Vwan&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Nos Logs do Azure Firewall, comprovamos que o tráfego da VM (10.145.0.10) realmente está passando pelo Azure Firewall&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Referências: &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/azure-vmware/disable-internet-access" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/azure/azure-vmware/disable-internet-access&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Oct 2025 20:49:10 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/protegendo-m%C3%A1quinas-no-azure-vmware-solution-com-azure-firewall/ba-p/4462359</guid>
      <dc:creator>LeandroBarbosa</dc:creator>
      <dc:date>2025-10-17T20:49:10Z</dc:date>
    </item>
    <item>
      <title>Alta Disponibilidade e Resiliência com App Gateway e Múltiplos APIMs: Uma Arquitetura Estratégica</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/alta-disponibilidade-e-resili%C3%AAncia-com-app-gateway-e-m%C3%BAltiplos/ba-p/4451312</link>
      <description>&lt;H2 data-selectable-paragraph=""&gt;Resiliência como Pilar do Azure Well-Architected Framework&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;A&amp;nbsp;&lt;STRONG&gt;resiliência&lt;/STRONG&gt;&amp;nbsp;é um dos pilares fundamentais do&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/architecture/framework/" target="_blank" rel="noopener"&gt;WAF&lt;/A&gt;&amp;nbsp;e desempenha papel crítico na construção de arquiteturas modernas em nuvem. Este artigo explora o design de&amp;nbsp;&lt;STRONG&gt;alta disponibilidade (HA)&lt;/STRONG&gt;&amp;nbsp;utilizando a oferta&amp;nbsp;&lt;STRONG&gt;Premium Tier do Azure API Management (APIM)&lt;/STRONG&gt;&amp;nbsp;em cenários&amp;nbsp;&lt;STRONG&gt;multi-região&lt;/STRONG&gt;&amp;nbsp;ou mesmo&amp;nbsp;&lt;STRONG&gt;intra-região&lt;/STRONG&gt;, com foco na aplicação de&amp;nbsp;&lt;STRONG&gt;Availability Zones&lt;/STRONG&gt;&amp;nbsp;— uma prática recomendada no&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/principles" target="_blank" rel="noopener"&gt;pilar de Confiabilidade&lt;/A&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A configuração Premium permite que as regiões primária e secundária compartilhem a mesma instância de APIM. No entanto, dependendo dos requisitos de negócio e tolerância a falhas, pode ser estratégico operar com&amp;nbsp;&lt;STRONG&gt;duas instâncias separadas&lt;/STRONG&gt;, garantindo&amp;nbsp;&lt;STRONG&gt;continuidade de serviço mesmo diante de falhas regionais ou em uma das instâncias&lt;/STRONG&gt;. Essa abordagem está alinhada ao modelo de&amp;nbsp;&lt;STRONG&gt;DR Ativo-Ativo&lt;/STRONG&gt;, promovendo&amp;nbsp;&lt;STRONG&gt;tolerância a falhas&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;escalabilidade horizontal&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;resiliência operacional&lt;/STRONG&gt;, conforme descrito no&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/maturity-model" target="_blank" rel="noopener"&gt;modelo de maturidade de confiabilidade&lt;/A&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A imagem acima representa os componentes do APIM nas regiões primária e secundária. Em cenários com instâncias separadas, esses componentes também estariam presentes em cada região. Já em uma configuração com Availability Zones, os elementos podem escalar dentro da mesma região, conforme a demanda — prática que também se conecta ao pilar de&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/operational-excellence/" target="_blank" rel="noopener"&gt;excelência operacional&lt;/A&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/operational-excellence/overview," target="_blank" rel="noopener"&gt;,&lt;/A&gt;&amp;nbsp;ao permitir automação e monitoramento contínuo.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O fluxo de comunicação entre a API e os serviços de backend pode ocorrer por rotas diretas ou por meio de&amp;nbsp;&lt;STRONG&gt;balanceadores de carga&lt;/STRONG&gt;, dependendo do caso de uso. Essa arquitetura inspirou uma&amp;nbsp;&lt;STRONG&gt;solução personalizada&lt;/STRONG&gt;&amp;nbsp;para um de nossos clientes, que buscava&amp;nbsp;&lt;STRONG&gt;alta disponibilidade com baixa latência&lt;/STRONG&gt;, mesmo em cenários de falha regional.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Configuração do APIM como gateway de saída para o cluster de aplicações&lt;/H3&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P data-selectable-paragraph=""&gt;Em alguns casos, por questões de compliance, não é possível operar fora de um regions específica . Ainda assim, essa arquitetura já proporciona ganhos significativos mesmo dentro da mesma região, como maior resiliência, escalabilidade e eficiência operacional.&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Visão Geral da Arquitetura&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Componentes principais:&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Usuário&lt;/STRONG&gt;: Inicia a requisição.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;WAF&lt;/STRONG&gt;: Protege contra ameaças e ataques na borda.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;AKS&lt;/STRONG&gt;: Gerencia APIs e aplicações containerizadas.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;App Gateway (AppGW)&lt;/STRONG&gt;: Roteia o tráfego para os APIMs.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;APIM001 e APIM002&lt;/STRONG&gt;: Instâncias do Azure API Management, com IPs distintos e potencialmente em regiões diferentes.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Sistemas legados (kubernets / VMS)&lt;/STRONG&gt;: Integração com sistemas on-premises.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Essa arquitetura é interessante, pois, neste caso de uso, o APIM atua como ponto de saída do cluster de aplicações — exatamente o caminho crítico que queremos proteger&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Com duas instâncias de APIM atrás do AppGW, é possível:&lt;/H3&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Realizar&amp;nbsp;&lt;STRONG&gt;manutenções planejadas&lt;/STRONG&gt;&amp;nbsp;em uma instância sem impactar os usuários.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Redirecionar o tráfego automaticamente para a instância saudável.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Garantir&amp;nbsp;&lt;STRONG&gt;zero downtime&lt;/STRONG&gt;, mesmo durante atualizações críticas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Essa abordagem é especialmente útil em ambientes com alta exigência de SLA, como bancos, governo e telecom.&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Testes Blue-Green com Segurança e Controle&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;A arquitetura permite implementar&amp;nbsp;&lt;STRONG&gt;estratégias Blue-Green&lt;/STRONG&gt;&amp;nbsp;com facilidade:&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Uma instância do APIM pode representar o ambiente “Blue” (produção atual).&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;A outra instância representa o ambiente “Green” (nova versão).&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;O AppGW pode direcionar parte do tráfego para o ambiente Green para testes controlados.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após validação, o tráfego pode ser totalmente migrado para o Green, promovendo a nova versão com segurança.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Isso reduz riscos de regressão e permite&amp;nbsp;&lt;STRONG&gt;deploys mais confiáveis&lt;/STRONG&gt;&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Redução de Riscos em Caminhos Críticos&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Ao distribuir o tráfego entre dois APIMs:&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Reduz-se o risco de&amp;nbsp;&lt;STRONG&gt;ponto único de falha&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;A arquitetura se torna mais resiliente a falhas regionais ou de serviço.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Em caso de falha de uma instância, o AppGW garante continuidade do serviço.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;Essa redundância é essencial para&amp;nbsp;&lt;STRONG&gt;caminhos críticos de negócio&lt;/STRONG&gt;, como autenticação, transações financeiras ou integrações com sistemas legados.&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Outros Benefícios Estratégicos&lt;/H2&gt;
&lt;H2 data-selectable-paragraph=""&gt;✅ Disaster Recovery Ativo-Ativo&lt;/H2&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;As duas instâncias do APIM funcionam simultaneamente em modo &lt;STRONG data-start="225" data-end="240"&gt;ativo-ativo&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Em caso de falha em uma das instâncias, o tráfego é &lt;STRONG data-start="298" data-end="331"&gt;automaticamente redirecionado&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Reduz significativamente o &lt;STRONG data-start="364" data-end="371"&gt;RTO&lt;/STRONG&gt; e assegura a &lt;STRONG data-start="385" data-end="414"&gt;continuidade dos serviços&lt;/STRONG&gt;..&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;✅ Mitigação de Esgotamento de IPs&lt;/H2&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;O uso de múltiplas instâncias permite &lt;STRONG data-start="504" data-end="535"&gt;distribuir o consumo de IPs&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Evita &lt;STRONG data-start="547" data-end="567"&gt;gargalos de rede&lt;/STRONG&gt; e problemas de &lt;STRONG data-start="583" data-end="608"&gt;limitação de recursos&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;✅ Escalabilidade Regional&lt;/H2&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;A arquitetura possibilita &lt;STRONG data-start="678" data-end="720"&gt;escalabilidade horizontal simplificada&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Suporta o crescimento de demanda em &lt;STRONG data-start="762" data-end="784"&gt;diferentes regiões&lt;/STRONG&gt; de forma eficiente.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;Como configurar o APPGW para uma POC de balanceamento entre dois APIMs&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;O&amp;nbsp;&lt;STRONG&gt;Azure Application Gateway&lt;/STRONG&gt;&amp;nbsp;é um balanceador de carga de&amp;nbsp;&lt;STRONG&gt;camada 7 (HTTP/HTTPS)&lt;/STRONG&gt;&amp;nbsp;que permite gerenciar o tráfego de aplicações web com&amp;nbsp;&lt;STRONG&gt;inteligência, segurança e escalabilidade&lt;/STRONG&gt;. Ele opera com base em um conjunto de configurações como Listeners, Routing Rules, Backend Targets entre outras.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Além disso, o Application Gateway oferece recursos avançados como&amp;nbsp;&lt;STRONG&gt;WAF (Web Application Firewall)&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;SSL offloading&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;redirecionamento baseado em caminho&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;afinidade de sessão&lt;/STRONG&gt;, tornando-o ideal para cenários que exigem alta disponibilidade e proteção contra ameaças web.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;📦 Descrição de cada componente do diagrama&lt;/H2&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Listener (porta 80):&lt;/STRONG&gt;&amp;nbsp;Detecta conexões de entrada na porta especificada (ex: 80 para HTTP). É o ponto inicial onde o tráfego chega ao gateway.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Routing Rule:&lt;/STRONG&gt;&amp;nbsp;Define como o tráfego será roteado com base em critérios como URL, cabeçalhos ou métodos. É o cérebro da decisão de encaminhamento.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Backend Targets:&lt;/STRONG&gt;&amp;nbsp;Especifica os destinos finais para o tráfego, como VMs, instâncias de App Service ou containers. 🔁 Relação com Backend Pools:&amp;nbsp;&lt;STRONG&gt;1 para N&lt;/STRONG&gt;&amp;nbsp;— uma regra pode apontar para vários destinos.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Backend Setting:&lt;/STRONG&gt;&amp;nbsp;Configurações aplicadas ao tráfego, como tempo de timeout, protocolo (HTTP/HTTPS), e afinidade de sessão. 🔁 Relação com Health Probes:&amp;nbsp;&lt;STRONG&gt;1 para 1&lt;/STRONG&gt;&amp;nbsp;— cada configuração tem uma sonda associada.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Backend Pools:&lt;/STRONG&gt;&amp;nbsp;Agrupamento lógico dos destinos (targets). Permite distribuir carga entre múltiplas instâncias. 🔁 Relação com Backend Targets:&amp;nbsp;&lt;STRONG&gt;1 para N&lt;/STRONG&gt;&amp;nbsp;— um pool pode conter vários destinos.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Health Probes (path:/status-0123456789abcdef)&lt;/STRONG&gt;&lt;BR /&gt;Verifica a saúde dos destinos usando um caminho específico. Se um destino estiver inativo, ele é automaticamente removido do balanceador.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3 data-selectable-paragraph=""&gt;Vamos apresentar algumas telas de configuração e destacar pontos de atenção no&amp;nbsp;&lt;STRONG&gt;Application Gateway (AppGW)&lt;/STRONG&gt;.&lt;/H3&gt;
&lt;P data-selectable-paragraph=""&gt;Um detalhe importante que acabei não mencionando:&amp;nbsp;&lt;STRONG&gt;à frente do Listener existe uma configuração de Frontend IP&lt;/STRONG&gt;, que define se o IP do AppGW será&amp;nbsp;&lt;STRONG&gt;público ou privado&lt;/STRONG&gt;. Para facilitar os testes iniciais, recomendo começar com o&amp;nbsp;&lt;STRONG&gt;Frontend IP público&lt;/STRONG&gt;,alem disso mantenha o Listener configurado na porta 80. Isso evita complicações com certificados SSL durante os testes.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Observe a imagem abaixo:&lt;/STRONG&gt;&amp;nbsp;o&amp;nbsp;&lt;STRONG&gt;Frontend IP&lt;/STRONG&gt;&amp;nbsp;está corretamente vinculado ao&amp;nbsp;&lt;STRONG&gt;Listener1&lt;/STRONG&gt;, como indicado. Essa associação é essencial para garantir que o tráfego seja direcionado corretamente, conforme a configuração do IP público ou privado definida no Frontend.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O&amp;nbsp;&lt;STRONG&gt;Listener1&lt;/STRONG&gt;, configurado na&amp;nbsp;&lt;STRONG&gt;porta 80&lt;/STRONG&gt;, está associado à&amp;nbsp;&lt;STRONG&gt;Rule1&lt;/STRONG&gt;, que define como o tráfego será roteado para o backend correspondente.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A&amp;nbsp;&lt;STRONG&gt;Rule1&lt;/STRONG&gt;&amp;nbsp;está associada às configurações de&amp;nbsp;&lt;STRONG&gt;Backend Settings&lt;/STRONG&gt;, que definem como o tráfego será encaminhado para os recursos de backend — incluindo o pool de servidores, o protocolo, a porta e os critérios de saúde.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;As&amp;nbsp;&lt;STRONG&gt;Backend Settings&lt;/STRONG&gt;&amp;nbsp;do Application Gateway incluem configurações importantes, como&amp;nbsp;&lt;STRONG&gt;“Pick host name from backend target”&lt;/STRONG&gt;&amp;nbsp;e a associação a um&amp;nbsp;&lt;STRONG&gt;Custom Probe&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Por padrão, o AppGW encaminha ao backend o mesmo cabeçalho HTTP&amp;nbsp;Host&amp;nbsp;recebido do cliente. No entanto, se o serviço ou aplicação no backend exigir um valor específico para o cabeçalho&amp;nbsp;Host, é possível sobrescrevê-lo utilizando essa configuração. Com isso, o Application Gateway passa a usar o&amp;nbsp;&lt;STRONG&gt;host do backend&lt;/STRONG&gt;&amp;nbsp;para resolver o balanceamento e validar o&amp;nbsp;&lt;STRONG&gt;probe de integridade&lt;/STRONG&gt;, garantindo compatibilidade com serviços que dependem de hostname específico para funcionar corretamente.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Perceba que o Health Probe também está vinculado às Backend Settings&lt;/STRONG&gt;, e utiliza a configuração&amp;nbsp;&lt;STRONG&gt;“Pick host name from backend settings”&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Essa associação é fundamental para garantir que o probe de integridade seja executado corretamente, especialmente em cenários onde o backend exige um cabeçalho&amp;nbsp;Host&amp;nbsp;específico. Ao ativar essa opção, o Application Gateway passa a usar o&amp;nbsp;&lt;STRONG&gt;hostname do backend&lt;/STRONG&gt;&amp;nbsp;tanto para o roteamento quanto para a validação do probe, assegurando compatibilidade com serviços que dependem dessa configuração.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Esse endereço /status-0123456789abcdef é o endereço de sondagem do apim (helth cehck) do APIM&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Voltando à Rule1&lt;/STRONG&gt;, podemos observar que ela também define o&amp;nbsp;&lt;STRONG&gt;Backend Target&lt;/STRONG&gt;, que neste caso aponta para o&amp;nbsp;&lt;STRONG&gt;serviço de backend do APIM (Azure API Management)&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Essa configuração é essencial para garantir que o tráfego roteado pelo Application Gateway seja direcionado corretamente ao endpoint do APIM, respeitando as regras de roteamento, cabeçalhos e probes definidos nas Backend Settings.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Nos&amp;nbsp;&lt;STRONG&gt;Backend Pools&lt;/STRONG&gt;, temos o&amp;nbsp;&lt;STRONG&gt;pool de backend do APIM&lt;/STRONG&gt;, que contém&amp;nbsp;&lt;STRONG&gt;duas instâncias do serviço Azure API Management&lt;/STRONG&gt;. Essa configuração permite distribuir o tráfego entre as instâncias, garantindo alta disponibilidade e escalabilidade para os serviços expostos via AppGW.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Do lado do APIM&lt;/H3&gt;
&lt;P data-selectable-paragraph=""&gt;Para observar o processo de&amp;nbsp;&lt;STRONG&gt;balanceamento entre instâncias do APIM&lt;/STRONG&gt;&amp;nbsp;(por exemplo, APIM A e APIM B), podemos criar uma&amp;nbsp;&lt;STRONG&gt;API de mock&lt;/STRONG&gt;&amp;nbsp;que responda de forma simples, identificando qual instância está respondendo.&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Principais Objetos do APIM&lt;/H3&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Políticas&lt;/STRONG&gt;: São regras aplicadas às requisições HTTP, permitindo manipulações como transformação de payloads, controle de acesso, limitação de chamadas (rate limiting), entre outras.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;API&lt;/STRONG&gt;: Representa um conjunto de operações agrupadas sob um único endpoint. Cada API pode conter múltiplas operações.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Operações&lt;/STRONG&gt;: São as ações HTTP específicas, como os verbos&amp;nbsp;GET,&amp;nbsp;POST,&amp;nbsp;PUT,&amp;nbsp;DELETE, etc. Cada operação define o comportamento de uma rota dentro da API.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-selectable-paragraph=""&gt;Como criar um mock no Azure API Management (APIM)&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Adicionar uma nova API&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Acesse o menu lateral e clique em&amp;nbsp;&lt;STRONG&gt;“Add API”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Selecione a opção para&amp;nbsp;&lt;STRONG&gt;criar uma API manualmente&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Na caixa de diálogo exibida, preencha os dados necessários (nome, URL base, etc.).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;eu criei uma APIA, com sufixo apim&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Definir o response da operação&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Clique em “add operation” e preencha o verbo como get a url como /moq&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após criar a operação desejada, clique na aba&amp;nbsp;&lt;STRONG&gt;“Responses”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Clique em&amp;nbsp;&lt;STRONG&gt;“Add response”&lt;/STRONG&gt;&amp;nbsp;e selecione o código&amp;nbsp;&lt;STRONG&gt;200&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Em&amp;nbsp;&lt;STRONG&gt;Content type&lt;/STRONG&gt;, escolha&amp;nbsp;&lt;STRONG&gt;application/json&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;No campo&amp;nbsp;&lt;STRONG&gt;Sample&lt;/STRONG&gt;, insira um JSON de exemplo para identificar a instância, como:&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;JSON&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-selectable-paragraph=""&gt;{&lt;BR /&gt;"name": "APIMA"&lt;BR /&gt;}&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Adicionar a política de mock&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Vá para a aba&amp;nbsp;&lt;STRONG&gt;“Design”&lt;/STRONG&gt;&amp;nbsp;da operação.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Na seção&amp;nbsp;&lt;STRONG&gt;Inbound processing&lt;/STRONG&gt;, clique em&amp;nbsp;&lt;STRONG&gt;“Add policy”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Selecione a política&amp;nbsp;&lt;STRONG&gt;“Mock response”&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-selectable-paragraph=""&gt;&lt;STRONG&gt;Verificação&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI data-selectable-paragraph=""&gt;Após salvar, o pipeline da requisição exibirá uma&amp;nbsp;&lt;STRONG&gt;tarja amarela&lt;/STRONG&gt;, indicando que o mock está ativo.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Repita esse processo para a instância dois. Agora já podemos testar o balanceamento de carga pelo Application Gateway&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 data-selectable-paragraph=""&gt;Sincronização das Instâncias com o API OPS&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Conforme mencionado no início deste artigo, a arquitetura “by the book” foi projetada para utilizar o recurso nativo de&amp;nbsp;&lt;STRONG&gt;multi-região do Azure API Management (APIM)&lt;/STRONG&gt;, o que elimina a necessidade de esforços adicionais para sincronizar configurações entre instâncias.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;No entanto, ao optarmos por manter&amp;nbsp;&lt;STRONG&gt;duas instâncias separadas na mesma região&lt;/STRONG&gt;, com o objetivo de obter os benefícios citados anteriormente, passamos a ter o desafio de&amp;nbsp;&lt;STRONG&gt;manter ambas sincronizadas&lt;/STRONG&gt;&amp;nbsp;— ou seja, com as mesmas APIs, endpoints e políticas.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Para atender a essa necessidade de sincronização, utilizaremos o&amp;nbsp;&lt;A href="https://learn.microsoft.com/pt-br/azure/architecture/example-scenario/devops/automated-api-deployments-apiops" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;API Ops&lt;/STRONG&gt;&lt;/A&gt;, que automatiza o processo de publicação e atualização das configurações entre as instâncias, garantindo consistência e reduzindo o risco de divergências operacionais.&lt;/P&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Resumo do Fluxo de API Ops para Sincronização com o APIM&lt;/H3&gt;
&lt;P&gt;Press enter or click to view image in full size&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Operadores de API&lt;/STRONG&gt;&amp;nbsp;executam o pipeline de extração para sincronizar o repositório Git com a instância do API Management, populando o repositório com os objetos no formato necessário.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Se houver alterações detectadas na instância do APIM, é criado um&amp;nbsp;&lt;STRONG&gt;Pull Request (PR)&lt;/STRONG&gt;&amp;nbsp;para revisão. Após aprovação, os operadores fazem o merge das mudanças no repositório.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;STRONG&gt;Desenvolvedores de API&lt;/STRONG&gt;&amp;nbsp;clonam o repositório, criam uma branch e definem as APIs usando especificações OpenAPI ou ferramentas de sua preferência.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Quando um desenvolvedor envia alterações para o repositório, um novo PR é gerado para revisão.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;O PR pode ser&amp;nbsp;&lt;STRONG&gt;aprovado automaticamente&lt;/STRONG&gt;&amp;nbsp;ou&amp;nbsp;&lt;STRONG&gt;revisado manualmente&lt;/STRONG&gt;, conforme o nível de controle exigido.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após a aprovação e o merge, o&amp;nbsp;&lt;STRONG&gt;pipeline de publicação&lt;/STRONG&gt;&amp;nbsp;implanta as alterações na instância do API Management.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Os operadores também podem criar ou modificar políticas, diagnósticos, produtos e outros objetos relevantes, e então&amp;nbsp;&lt;STRONG&gt;comitar&lt;/STRONG&gt;&amp;nbsp;essas alterações.&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;Após o merge, o pipeline publica as mudanças usando o processo de definição de APIs.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 data-selectable-paragraph=""&gt;Conclusão&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;A adoção de uma arquitetura com&amp;nbsp;&lt;STRONG&gt;App Gateway à frente de múltiplos APIMs&lt;/STRONG&gt;, integrada com&amp;nbsp;&lt;STRONG&gt;Akamai WAF&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;Azure Functions&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;Key Vault&lt;/STRONG&gt;&amp;nbsp;e&amp;nbsp;&lt;STRONG&gt;sistemas legados&lt;/STRONG&gt;, oferece uma solução robusta, segura e altamente disponível. Essa abordagem não apenas melhora a experiência do usuário, mas também reduz riscos operacionais e facilita a evolução contínua da plataforma.&lt;/P&gt;
&lt;H3 data-selectable-paragraph=""&gt;Referencias&lt;/H3&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/" target="_blank" rel="noopener"&gt;Estrutura de Well-Architected do Azure — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/principles" target="_blank" rel="noopener"&gt;Princípios de design de confiabilidade — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/reliability/maturity-model?tabs=level1" target="_blank" rel="noopener"&gt;Modelo de maturidade de confiabilidade — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/well-architected/operational-excellence/" target="_blank" rel="noopener"&gt;Links rápidos de excelência operacional — Microsoft Azure Well-Architected Framework | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/azure/architecture/example-scenario/devops/automated-api-deployments-apiops" target="_blank" rel="noopener"&gt;Implantações de API automatizadas usando APIOps — Azure Architecture Center | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;/OL&gt;</description>
      <pubDate>Tue, 09 Sep 2025 18:54:23 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/alta-disponibilidade-e-resili%C3%AAncia-com-app-gateway-e-m%C3%BAltiplos/ba-p/4451312</guid>
      <dc:creator>wdossantos</dc:creator>
      <dc:date>2025-09-09T18:54:23Z</dc:date>
    </item>
    <item>
      <title>AKS - Problemas de desempenho do NGINX Ingress Controller Gerenciado</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aks-problemas-de-desempenho-do-nginx-ingress-controller/ba-p/4447419</link>
      <description>&lt;P&gt;O&amp;nbsp;&lt;A href="https://learn.microsoft.com/azure/aks/app-routing" target="_blank"&gt;NGINX ingress controller gerenciado&lt;/A&gt; é um complemento de roteamento que permite direcionar tráfego HTTP e HTTPS para aplicações executando em um cluster &lt;A href="https://learn.microsoft.com/azure/aks/" target="_blank"&gt;Azure Kubernetes Service (AKS)&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;Em problemas relacionados à performance, o sistema de roteamento pode ser a causa raiz. Este artigo fornece um guia passo a passo para solucionar problemas de performance do NGINX ingress controller.&lt;/P&gt;
&lt;H2 id="pr-requisitos"&gt;Pré-requisitos&lt;/H2&gt;
&lt;P&gt;Antes de começar, certifique-se de ter as seguintes ferramentas instaladas:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Kubernetes CLI (&lt;CODE&gt;kubectl&lt;/CODE&gt;)&lt;/STRONG&gt;: Use o Azure CLI para instalar executando o comando &lt;CODE&gt;az aks install-cli&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="sintomas-comuns"&gt;Sintomas Comuns&lt;/H2&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Sintoma&lt;/th&gt;&lt;th&gt;Descrição&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Erros de Gateway HTTP&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Códigos de erro como 502, 504 podem indicar um problema de exaustão do NGINX.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Alta Diferença no Tempo de Resposta&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Diferença significativa entre o tempo de resposta do seu serviço e o tempo de resposta fim a fim. Existe uma latência comum adicionada pelo NGINX, mas quando é muito grande, pode indicar exaustão do NGINX.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2 id="passo-1-verifique-o-comportamento-do-hpa"&gt;Passo 1: Verifique o Comportamento do HPA&lt;/H2&gt;
&lt;P&gt;A razão mais comum para problemas de performance no NGINX é exaustão de CPU. Durante picos de carga no sistema, uma boa abordagem é observar o comportamento do &lt;A href="https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/" target="_blank"&gt;HPA&lt;/A&gt;. Por padrão, o plugin de roteamento cria um &lt;A href="https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/" target="_blank"&gt;namespace&lt;/A&gt; chamado &lt;CODE&gt;app-routing-system&lt;/CODE&gt;.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Obtenha o nome do HPA&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;get&lt;/SPAN&gt; hpa -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Observe o comportamento do HPA&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;get&lt;/SPAN&gt; hpa &lt;SPAN class="hljs-symbol"&gt;&amp;lt;HPA_NAME&amp;gt;&lt;/SPAN&gt; -n app-routing-&lt;SPAN class="hljs-built_in"&gt;system&lt;/SPAN&gt; -&lt;SPAN class="hljs-keyword"&gt;w&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Avalie o resultado&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; $ kubectl get hpa &amp;lt;HPA_NAME&amp;gt; -n app-routing-system -w&lt;BR /&gt;
 NAME    REFERENCE          TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
 nginx   Deployment/nginx   cpu: 83%/70%  &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;         77m
 nginx   Deployment/nginx   cpu: 83%/70%  &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;         77m
 nginx   Deployment/nginx   cpu: 106%/70%       &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;         79m
 nginx   Deployment/nginx   cpu: 133%/70%       &lt;SPAN class="hljs-number"&gt; 1 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;       &lt;SPAN class="hljs-number"&gt; 2 &lt;/SPAN&gt;         80m
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;A coluna &lt;STRONG&gt;TARGETS&lt;/STRONG&gt; mostra o limite de CPU onde o &lt;CODE&gt;HPA&lt;/CODE&gt; irá acionar o aumento de replicas. Você deve interpretar esse comportamento. Existem algumas possibilidades:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;O &lt;CODE&gt;HPA&lt;/CODE&gt; atingiu o número máximo de pods.&lt;/LI&gt;
&lt;LI&gt;Não há &lt;A href="https://kubernetes.io/docs/concepts/architecture/nodes" target="_blank"&gt;nodes&lt;/A&gt; disponíveis para agendar os pods.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="passo-2-procure-por-pods-em-estado-pending"&gt;Passo 2: Procure por Pods em Estado Pending&lt;/H2&gt;
&lt;P&gt;Se no passo anterior você viu que o &lt;CODE&gt;NGINX HPA&lt;/CODE&gt; não atingiu o número máximo de pods, o &lt;A href="https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/#kube-scheduler" target="_blank"&gt;kube-scheduler&lt;/A&gt; pode estar tendo dificuldades para encontrar nodes disponíveis para agendar os pods do &lt;CODE&gt;NGINX&lt;/CODE&gt;.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Obtenha Pods em Pending&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-meta"&gt;get&lt;/SPAN&gt; pod --&lt;SPAN class="hljs-meta"&gt;field&lt;/SPAN&gt;-&lt;SPAN class="hljs-keyword"&gt;selector=status.phase=Pending &lt;/SPAN&gt;-n app-routing-system
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Se houver pods em Pending, o cluster provavelmente está enfrentando um problema de exaustão de recursos. Nesse caso, consulte&amp;nbsp;&lt;A href="https://learn.microsoft.com/troubleshoot/azure/azure-kubernetes/availability-performance/troubleshoot-pod-scheduler-errors" target="_blank"&gt;Solucionar erros do agendador de pods no Azure Kubernetes Service&lt;/A&gt;.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H2 id="passo-3-verifique-se-existem-limites-aplicados-ao-deployment-do-nginx"&gt;Passo 3: Verifique se Existem Limites Aplicados ao Deployment do NGINX&lt;/H2&gt;
&lt;P&gt;Qualquer configuração incorreta nos &lt;A href="https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/" target="_blank"&gt;limites ou requests de recursos&lt;/A&gt; do &lt;CODE&gt;NGINX&lt;/CODE&gt; pode fazer com que o &lt;CODE&gt;HPA&lt;/CODE&gt; escale mais pods do que o necessário.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Descreva o Deployment do NGINX&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;describe&lt;/SPAN&gt; deploy nginx -n app-routing-&lt;SPAN class="hljs-built_in"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Verifique Requests e Limits&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; $ kubectl describe deploy nginx -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
 Name:                   nginx
 ....
 Selector:               app=nginx
 ....
 Pod Template:
 ....
 Containers:
 controller:
     ...
     Limits:
     ...
     Requests:
     ...
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;H2 id="solu-o"&gt;Solução&lt;/H2&gt;
&lt;P&gt;Por padrão, a versão atual do NGINX ingress controller não define limites para os pods do NGINX e define requests &lt;CODE&gt;500m&lt;/CODE&gt; de CPU, que é usado pelo &lt;CODE&gt;HPA&lt;/CODE&gt;. Não é recomendado alterar esses valores diretamente na definição do deployment.&lt;/P&gt;
&lt;P&gt;Se o seu &lt;CODE&gt;HPA&lt;/CODE&gt; está atingindo o número máximo de pods e os requests e limits do deployment permanecem inalterados, você deve configurar o &lt;A href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/" target="_blank"&gt;custom resource definition (CRD)&lt;/A&gt; chamado &lt;A href="https://github.com/Azure/aks-app-routing-operator/blob/main/config/crd/bases/approuting.kubernetes.azure.com_nginxingresscontrollers.yaml" target="_blank"&gt;NginxIngressController&lt;/A&gt;.&lt;/P&gt;
&lt;H3 id="op-es-de-configura-o"&gt;Opções de Configuração&lt;/H3&gt;
&lt;P&gt;As opções de configuração abaixo impactam diretamente o comportamento do &lt;CODE&gt;HPA&lt;/CODE&gt;:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Propriedade&lt;/th&gt;&lt;th&gt;Tipo&lt;/th&gt;&lt;th&gt;Descrição&lt;/th&gt;&lt;th&gt;Obrigatório&lt;/th&gt;&lt;th&gt;Padrão&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;scaling&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;objeto&lt;/td&gt;&lt;td&gt;Configuração para escalonamento do controller. Contém propriedades aninhadas.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;maxReplicas&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;inteiro&lt;/td&gt;&lt;td&gt;Limite superior de réplicas.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;minReplicas&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;inteiro&lt;/td&gt;&lt;td&gt;Limite inferior de réplicas.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;CODE&gt;threshold&lt;/CODE&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;Limite de escalonamento definindo quão agressivo será o scaling. Opções: &lt;CODE&gt;rapid&lt;/CODE&gt;, &lt;CODE&gt;steady&lt;/CODE&gt;, &lt;CODE&gt;balanced&lt;/CODE&gt;.&lt;/td&gt;&lt;td&gt;Não&lt;/td&gt;&lt;td&gt;balanced&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3 id="como-aplicar-a-configura-o"&gt;Como Aplicar a Configuração&lt;/H3&gt;
&lt;P&gt;Siga os passos abaixo para aplicar a configuração:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Edite o CRD NginxIngressController&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-keyword"&gt;edit&lt;/SPAN&gt; nginxingresscontroller -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Adicione ou modifique a configuração de scaling&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-yaml"&gt;&lt;SPAN class="hljs-symbol"&gt; spec:&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;   scaling:&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;     maxReplicas:&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;10&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;     minReplicas:&lt;/SPAN&gt; &lt;SPAN class="hljs-number"&gt;2&lt;/SPAN&gt;
&lt;SPAN class="hljs-symbol"&gt;     threshold:&lt;/SPAN&gt; &lt;SPAN class="hljs-string"&gt;"balanced"&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Salve e saia&lt;/STRONG&gt; do editor para aplicar as alterações.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Verifique as alterações&lt;/STRONG&gt;:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-console"&gt; kubectl &lt;SPAN class="hljs-built_in"&gt;get&lt;/SPAN&gt; hpa -n app-routing-&lt;SPAN class="hljs-keyword"&gt;system&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;O HPA será atualizado automaticamente com base na nova configuração, e o NGINX ingress controller irá escalar conforme os parâmetros especificados.&lt;/P&gt;
&lt;H2 id="recursos-adicionais"&gt;Recursos adicionais&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com//azure/aks/best-practices" target="_blank"&gt;Saiba mais sobre boas práticas do Azure Kubernetes Service (AKS)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/azure-monitor/containers/container-insights-analyze" target="_blank"&gt;Monitore a performance do seu cluster Kubernetes com Container insights&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://github.com/kubernetes/ingress-nginx" target="_blank"&gt;NGINX ingress controller&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Fri, 05 Sep 2025 13:44:38 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/aks-problemas-de-desempenho-do-nginx-ingress-controller/ba-p/4447419</guid>
      <dc:creator>ClaudioGodoy</dc:creator>
      <dc:date>2025-09-05T13:44:38Z</dc:date>
    </item>
    <item>
      <title>Zonas de Disponibilidade no Azure: Entendendo a Diferença entre Zonas Lógicas e Físicas</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/zonas-de-disponibilidade-no-azure-entendendo-a-diferen%C3%A7a-entre/ba-p/4447134</link>
      <description>&lt;P&gt;&lt;STRONG&gt;O que é o mapeamento de zonas do Azure (Zona Lógica vs Zona Física)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;No Azure, as Zonas de Disponibilidade (AZs) são agrupamentos de datacenters fisicamente separados dentros de uma mesma região. Cada zona possui infraestrutura independente - energia, refrigeração e rede - garantindo alta disponibilidade e resiliência.&lt;/P&gt;
&lt;P&gt;Porém, há uma distinção entre:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Tipo de Zona&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Definição&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Zona Lógica&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Identificador exibido no portal do Azure (AZ1, AZ2, AZ3).&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Zona Física&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Grupo real de datacenters. O mapeamento entre lógica e física varia por assinatura&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;O mapeamento entre zonas lógicas e físicas não é fixo. Isso significa que:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;AZ1 na assinatura A pode ser fisicamente igual à AZ3 na assinatura B.&lt;/LI&gt;
&lt;LI&gt;Sem verificação, você pode estar executando produção e DR na mesma infraestrutura física, anulando os benefícios da separação.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Esse comportamento é intencional e inspirado no modelo da AWS, que também não garante consistência entre zonas lógicas em diferentes contas.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Qual o objetivo desse design?&lt;/STRONG&gt;&lt;BR /&gt;A motivação por trás desse mapeamento dinâmico é:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Distribuir a carga de consumo de forma mais eficiente entre os datacenters.&lt;/LI&gt;
&lt;LI&gt;Evitar hotspots e garantir resiliência operacional.&lt;/LI&gt;
&lt;LI&gt;Permitir flexibilidade de alocação conforme a capacidade física disponível.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Esse modelo ajuda a balancear o uso da infraestrutura global, sem expor diretamente a topologia física aos clientes — o que também reforça a segurança e abstração da plataforma.&lt;/P&gt;
&lt;P&gt;Essa distinção é essencial: a zona lógica AZ1 em uma assinatura pode, na prática, ser a mesma zona física que a AZ3 em outra. Sem uma verificação adequada, o cliente pode acabar executando cargas de produção e de DR (Disaster Recovery) na mesma infraestrutura física, o que anula os benefícios esperados da separação entre zonas.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Exemplo prático de risco&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Vamos considerar o seguinte cenário de um cliente:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Produção: AZ1 e AZ2 em uma assinatura A&lt;/LI&gt;
&lt;LI&gt;DR: AZ3 em outra assinatura B, na mesma região&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;O cliente acredita estar distribuindo suas cargas entre três zonas distintas. No entanto, ao verificar o mapeamento real, encontra a seguinte saída:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 93.4259%; height: 239px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr style="height: 239px;"&gt;&lt;td style="height: 239px;"&gt;
&lt;P&gt;[&lt;/P&gt;
&lt;P&gt;&amp;nbsp;{ "logicalZone": "1", "physicalZone": "brazilsouth-az3" },&lt;/P&gt;
&lt;P&gt;&amp;nbsp;{ "logicalZone": "2", "physicalZone": "brazilsouth-az1" },&lt;/P&gt;
&lt;P&gt;&amp;nbsp;{ "logicalZone": "3", "physicalZone": "brazilsouth-az2" }&lt;/P&gt;
&lt;P&gt;]&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;Neste exemplo, a AZ3 lógica está mapeada para a AZ2 física, que já está sendo usada na produção. Ou seja, não há separação física real.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Como verificar o mapeamento de zonas?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Para evitar esse problema, é essencial verificar o mapeamento entre zonas lógicas e físicas em cada assinatura. Use o seguinte comando via Azure CLI:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 93.7037%; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;az rest --method get \&lt;/P&gt;
&lt;P&gt;&amp;nbsp;--uri "/subscriptions/&amp;lt;subscription-id&amp;gt;/locations?api-version=2022-12-01" \&lt;/P&gt;
&lt;P&gt;&amp;nbsp;--query "value[?name=='&amp;lt;region-name&amp;gt;'].{displayName: displayName,name: name,availabilityZoneMappings: availabilityZoneMappings }" \&lt;/P&gt;
&lt;P&gt;&amp;nbsp;-o json&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Substitua &amp;lt;subscription-id&amp;gt; e &amp;lt;region-name&amp;gt; (ex: brazilsouth) conforme necessário.&lt;/P&gt;
&lt;P&gt;Veja abaixo um exemplo de saída obtida no meu ambiente de laboratório, onde tenho duas assinaturas. Vou executar o mapeamento de zonas entre elas para a região Brazil South.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Na primeira subscription 1 temos o seguinte mapeamento.&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Zona lógica: 1 &amp;nbsp;– Zona Física: &amp;nbsp;brazilsouth-az1&lt;/LI&gt;
&lt;LI&gt;Zona lógica: 2 – Zona Física: brazilsouth-az2&lt;/LI&gt;
&lt;LI&gt;Zona lógica: 3 &amp;nbsp;– Zona Física: brazilsouth-az3&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Na segunda subscription 2 temos o seguinte mapeamento.&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Zona lógica: 1 &amp;nbsp;– Zona Física: &amp;nbsp;brazilsouth-az3&lt;/LI&gt;
&lt;LI&gt;Zona lógica: 2 – Zona Física: brazilsouth-az1&lt;/LI&gt;
&lt;LI&gt;Zona lógica: 3 &amp;nbsp;– Zona Física: brazilsouth-az2&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Resumindo:&lt;/STRONG&gt; Se minha estratégia de DR envolve o uso das zonas lógicas 1 e 2 na subscription 1, pois elas estão mapeadas fisicamente para as zonas AZ1 e AZ2, então, na subscription 2 destinada ao DR, devo utilizar a zona lógica 1 — já que, nessa assinatura, ela está mapeada fisicamente para a AZ3.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Boas práticas&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Sempre verifique o mapeamento entre zonas lógicas e físicas antes de definir sua estratégia de DR.&lt;/LI&gt;
&lt;LI&gt;Evite assumir que AZ1, AZ2 e AZ3 representam zonas físicas distintas entre diferentes assinaturas.&lt;/LI&gt;
&lt;LI&gt;Considere utilizar regiões diferentes para DR quando a separação física for um requisito crítico.&lt;/LI&gt;
&lt;LI&gt;Documente e compartilhe o mapeamento com sua equipe de arquitetura e operações para garantir alinhamento e evitar riscos.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Referência oficial&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Para mais detalhes, consulte a documentação oficial da Microsoft:&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/availability-zones/az-overview" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/azure/availability-zones/az-overview&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/architecture/aws-professional/regions-zones" target="_blank"&gt;Comparing AWS and Azure regions and zones - Azure Architecture Center | Microsoft Learn&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 26 Aug 2025 13:17:42 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/zonas-de-disponibilidade-no-azure-entendendo-a-diferen%C3%A7a-entre/ba-p/4447134</guid>
      <dc:creator>fabiodasilva</dc:creator>
      <dc:date>2025-08-26T13:17:42Z</dc:date>
    </item>
    <item>
      <title>Anatomia de um serviço ASP.NET Core</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anatomia-de-um-servi%C3%A7o-asp-net-core/ba-p/4423980</link>
      <description>&lt;P&gt;O ecossistema do &lt;A href="https://learn.microsoft.com/dotnet/" target="_blank" rel="noopener"&gt;.NET&lt;/A&gt; é uma plataforma de desenvolvimento de software criada pela Microsoft. Ele inclui ferramentas, bibliotecas e frameworks para a criação de aplicações desktop, web, mobile, serviços e muito mais. Desde sua unificação, o &lt;CODE&gt;.NET Core&lt;/CODE&gt; e o &lt;CODE&gt;.NET Framework&lt;/CODE&gt; passaram a ser conhecidos apenas como &lt;CODE&gt;.NET&lt;/CODE&gt;.&lt;/P&gt;
&lt;P&gt;O &lt;A href="https://learn.microsoft.com/dotnet/core/sdk" target="_blank" rel="noopener"&gt;.NET SDK (Software Development Kit)&lt;/A&gt; fornece as ferramentas necessárias para criar, compilar, depurar e publicar aplicações &lt;CODE&gt;.NET&lt;/CODE&gt;. Ele inclui o compilador &lt;A href="https://en.wikipedia.org/wiki/C_Sharp_(programming_language" target="_blank" rel="noopener"&gt;C#&lt;/A&gt;), bibliotecas de classes como &lt;A href="https://dotnet.microsoft.com/learn/aspnet/what-is-aspnet-core" target="_blank" rel="noopener"&gt;ASP.NET Core&lt;/A&gt; e &lt;A href="https://learn.microsoft.com/ef/core/" target="_blank" rel="noopener"&gt;Entity Framework Core&lt;/A&gt;, além de utilitários como o &lt;A href="https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild" target="_blank" rel="noopener"&gt;MSBuild&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;O ambiente de execução &lt;CODE&gt;.NET&lt;/CODE&gt; (&lt;A href="https://learn.microsoft.com/dotnet/standard/clr" target="_blank" rel="noopener"&gt;Common Language Runtime ou CLR&lt;/A&gt;) gerencia a execução de programas &lt;CODE&gt;.NET&lt;/CODE&gt;, oferecendo serviços como gerenciamento de memória, coleta de lixo e controle de exceções.&lt;/P&gt;
&lt;H2 id="tipos-de-aplica-es-net"&gt;Tipos de Aplicações .NET&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://dotnet.microsoft.com/apps/aspnet/apis" target="_blank" rel="noopener"&gt;Web API&lt;/A&gt;&lt;/STRONG&gt;: Aplicações que fornecem serviços e endpoints &lt;A href="https://learn.microsoft.com/azure/architecture/best-practices/api-design" target="_blank" rel="noopener"&gt;RESTful&lt;/A&gt; para interação com clientes.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/aspnet/core/blazor/components/class-libraries-and-static-server-side-rendering?view=aspnetcore-9.0" target="_blank" rel="noopener"&gt;Razor com SSR (Server-Side Rendering)&lt;/A&gt;&lt;/STRONG&gt;: Ideal para aplicações que precisam de SEO e renderização eficiente.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/dotnet/core/tutorials/with-visual-studio-code" target="_blank" rel="noopener"&gt;Console Application&lt;/A&gt;&lt;/STRONG&gt;: Útil para tarefas automatizadas e scripts.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://dotnet.microsoft.com/apps/maui" target="_blank" rel="noopener"&gt;MAUI (Multi-platform App UI)&lt;/A&gt;&lt;/STRONG&gt;: Permite o desenvolvimento de aplicativos multiplataforma.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/dotnet/standard/class-libraries" target="_blank" rel="noopener"&gt;Libraries (.NET Standard/Core Libraries)&lt;/A&gt;&lt;/STRONG&gt;: Conjuntos de código reutilizável para funcionalidades específicas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 id="asp-net-core-webapi"&gt;ASP.NET Core WebAPI&lt;/H2&gt;
&lt;P&gt;Uma WebAPI segue o estilo arquitetural &lt;A href="https://learn.microsoft.com/azure/architecture/best-practices/api-design" target="_blank" rel="noopener"&gt;REST (Representational State Transfer)&lt;/A&gt;, utilizando o protocolo &lt;A href="https://www.rfc-editor.org/rfc/rfc2616" target="_blank" rel="noopener"&gt;HTTP&lt;/A&gt; para comunicação.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Protocolo HTTP:&lt;/STRONG&gt; Define métodos como GET, POST, PUT e DELETE para manipulação de recursos.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;REST API:&lt;/STRONG&gt; Utiliza URIs para identificar recursos e métodos HTTP para operações CRUD.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A href="https://martinfowler.com/articles/richardsonMaturityModel.html" target="_blank" rel="noopener"&gt;Modelo de Richardson&lt;/A&gt;:&lt;/STRONG&gt; Estabelece níveis de maturidade em APIs REST.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;O foco principal do artigo está na WebAPI, devido à sua relevância na criação de serviços modernos.&lt;/P&gt;
&lt;H2 id="demo"&gt;Demo&lt;/H2&gt;
&lt;P&gt;Para criar uma &lt;CODE&gt;webapi&lt;/CODE&gt;, com o &lt;A href="https://dotnet.microsoft.com/download" target="_blank" rel="noopener"&gt;dotnet sdk&lt;/A&gt; instalado, rode o comando:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-sh"&gt;dotnet &lt;SPAN class="hljs-keyword"&gt;new&lt;/SPAN&gt; &lt;SPAN class="hljs-type"&gt;webapi&lt;/SPAN&gt; -n MinhaApi
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Após executar o comando, será gerada uma estrutura básica de projeto contendo:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Controllers&lt;/STRONG&gt;: Arquivos para definir os endpoints da API.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Program.cs&lt;/STRONG&gt;: Configuração inicial da aplicação.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;appsettings.json&lt;/STRONG&gt;: Arquivo de configuração.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Você pode iniciar o servidor com:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-sh"&gt;&lt;SPAN class="hljs-built_in"&gt;cd&lt;/SPAN&gt; MinhaApi
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;PRE&gt;&lt;CODE class="lang-sh"&gt;dotnet &lt;SPAN class="hljs-keyword"&gt;run&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;H2 id="ciclo-de-vida-de-uma-requisi-o-http-em-aplica-es-asp-net-core"&gt;Ciclo de vida de uma requisição HTTP em aplicações ASP.NET Core&lt;/H2&gt;
&lt;H3 id="server"&gt;Server&lt;/H3&gt;
&lt;P&gt;Uma aplicação &lt;A href="https://learn.microsoft.com/aspnet/core/introduction-to-aspnet-core?view=aspnetcore-8.0" target="_blank" rel="noopener"&gt;ASP.NET Core&lt;/A&gt; é executada com uma implementação de servidor &lt;CODE&gt;HTTP in-process&lt;/CODE&gt;. Esse servidor escuta por requisições HTTP e as disponibiliza para a aplicação através do &lt;A href="https://learn.microsoft.com/dotnet/api/system.web.httpcontext?view=netframework-4.8.1" target="_blank" rel="noopener"&gt;HttpContext&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;As responsabilidades do servidor incluem:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Escutar em uma porta específica para receber solicitações HTTP.&lt;/LI&gt;
&lt;LI&gt;Processar as requisições e encaminhá-las para os middlewares configurados.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 id="middlewares"&gt;Middlewares&lt;/H3&gt;
&lt;P&gt;Os middlewares são componentes que processam requisições e respostas. Eles podem:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Autenticar usuários.&lt;/LI&gt;
&lt;LI&gt;Registrar logs.&lt;/LI&gt;
&lt;LI&gt;Manipular erros.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Exemplo de configuração de middleware:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-csharp"&gt;app.UseRouting()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
app.UseAuthentication()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
app.UseAuthorization()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
app.UseEndpoints(endpoints =&amp;gt;
{
    endpoints.MapControllers()&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
})&lt;SPAN class="hljs-comment"&gt;;&lt;/SPAN&gt;
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;H3 id="controllers"&gt;Controllers&lt;/H3&gt;
&lt;P&gt;Os controllers são responsáveis por definir os endpoints da API. Um exemplo básico:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class="lang-csharp"&gt;[ApiController]
[Route(&lt;SPAN class="hljs-string"&gt;"api/[controller]"&lt;/SPAN&gt;)]
&lt;SPAN class="hljs-keyword"&gt;public&lt;/SPAN&gt; &lt;SPAN class="hljs-class"&gt;&lt;SPAN class="hljs-keyword"&gt;class&lt;/SPAN&gt; &lt;SPAN class="hljs-title"&gt;MinhaController&lt;/SPAN&gt; : &lt;SPAN class="hljs-type"&gt;ControllerBase&lt;/SPAN&gt;&lt;/SPAN&gt;
{
    [HttpGet]
    &lt;SPAN class="hljs-keyword"&gt;public&lt;/SPAN&gt; IActionResult Get()
    {
        &lt;SPAN class="hljs-keyword"&gt;return&lt;/SPAN&gt; Ok(&lt;SPAN class="hljs-string"&gt;"Hello World"&lt;/SPAN&gt;);
    }
}
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;H3 id="resumo"&gt;Resumo&lt;/H3&gt;
&lt;P&gt;O ciclo de vida de uma requisição HTTP envolve o servidor, middlewares e controllers, garantindo que cada etapa seja processada de forma eficiente e escalável.&lt;/P&gt;
&lt;H3 id="conclus-o"&gt;Conclusão&lt;/H3&gt;
&lt;P&gt;O &lt;STRONG&gt;ASP.NET Core&lt;/STRONG&gt; é uma plataforma poderosa e flexível que permite o desenvolvimento de aplicações modernas, robustas e escaláveis. Desde sua arquitetura modular com middlewares até a configuração do pipeline de requisições, ele fornece ferramentas essenciais para criar soluções otimizadas e adaptadas a diferentes necessidades, seja para web, APIs RESTful ou sistemas distribuídos.&lt;/P&gt;
&lt;P&gt;Ao longo deste artigo, exploramos desde os fundamentos do &lt;CODE&gt;.NET&lt;/CODE&gt; e a ampla gama de tipos de aplicativos que podem ser criados, até os detalhes do ciclo de vida de uma requisição HTTP e a importância dos servidores Kestrel e HTTP.sys. Com uma compreensão clara do pipeline de requisições e dos middlewares, é possível projetar sistemas que não apenas atendem aos requisitos técnicos, mas também oferecem excelente desempenho e uma experiência de usuário consistente.&lt;/P&gt;
&lt;P&gt;Dominar o ecossistema do &lt;STRONG&gt;ASP.NET Core&lt;/STRONG&gt; é essencial para desenvolvedores que desejam se destacar no desenvolvimento de serviços e aplicações web de alto desempenho.&lt;/P&gt;</description>
      <pubDate>Mon, 30 Jun 2025 00:39:17 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/anatomia-de-um-servi%C3%A7o-asp-net-core/ba-p/4423980</guid>
      <dc:creator>ClaudioGodoy</dc:creator>
      <dc:date>2025-06-30T00:39:17Z</dc:date>
    </item>
    <item>
      <title>Participe da 2ª edição do GitHub Copilot Global Bootcamp</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/participe-da-2%C2%AA-edi%C3%A7%C3%A3o-do-github-copilot-global-bootcamp/ba-p/4417042</link>
      <description>&lt;P data-start="202" data-end="593"&gt;O &lt;STRONG&gt;GitHub Copilot Global Bootcamp&lt;/STRONG&gt; começou em fevereiro como uma jornada totalmente virtual de aprendizado — e foi um sucesso. Mais de &lt;STRONG&gt;60 mil desenvolvedores&lt;/STRONG&gt; participaram da primeira edição, em vários idiomas e regiões. Agora, estamos empolgados em lançar a &lt;STRONG&gt;segunda edição&lt;/STRONG&gt; — maior e melhor — &lt;STRONG&gt;com workshops virtuais e presenciais,&lt;/STRONG&gt; organizados por comunidades de tecnologia ao redor do mundo.&lt;/P&gt;
&lt;P data-start="595" data-end="747"&gt;Essa nova edição chega logo após os anúncios do &lt;STRONG&gt;Microsoft Build 2025&lt;/STRONG&gt;, onde as equipes do GitHub e do Visual Studio Code revelaram novidades empolgantes:&lt;/P&gt;
&lt;UL data-start="749" data-end="1067"&gt;
&lt;LI data-start="749" data-end="845"&gt;A&lt;STRONG&gt; extensão GitHub Copilot Chat será open source,&lt;/STRONG&gt; reforçando a transparência e a colaboração.&lt;/LI&gt;
&lt;LI data-start="846" data-end="976"&gt;A IA está sendo profundamente integrada ao &lt;STRONG&gt;Visual Studio Code&lt;/STRONG&gt;, que agora está evoluindo para um editor de IA de código aberto.&lt;/LI&gt;
&lt;LI data-start="977" data-end="1067"&gt;Novas APIs e ferramentas estão tornando mais fácil do que nunca construir com IA e LLMs.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-start="1069" data-end="1276"&gt;Este bootcamp é a sua oportunidade de explorar essas novas ferramentas, entender como usar o GitHub Copilot de forma eficaz e fazer parte da crescente conversa global sobre IA no desenvolvimento de software.&lt;/P&gt;
&lt;P data-start="1283" data-end="1314"&gt;👩‍💻 &lt;STRONG data-start="1289" data-end="1314"&gt;Quem pode participar?&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-start="1316" data-end="1599"&gt;Seja você um(a) desenvolvedor(a) iniciante, estudante ou profissional experiente em tecnologia, este bootcamp foi feito para você. Você aprenderá casos de uso práticos do GitHub Copilot e como aumentar sua produtividade usando IA — em um formato acessível e prático.&lt;/P&gt;
&lt;H3 data-start="1606" data-end="1641"&gt;&lt;STRONG data-start="1610" data-end="1641"&gt;Participe da edição virtual&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="1643" data-end="1725"&gt;Não importa onde você esteja, é possível participar online e aprender com a gente:&lt;/P&gt;
&lt;P data-start="1727" data-end="1760"&gt;&lt;STRONG data-start="1727" data-end="1758"&gt;Português (Brasil – UTC -3)&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL data-start="1761" data-end="1922"&gt;
&lt;LI style="font-weight: bold;" data-start="1761" data-end="1833"&gt;&lt;STRONG&gt;24 de junho, 19h: &lt;A class="lia-external-url" href="https://developer.microsoft.com/en-us/reactor/events/25931/" target="_blank" rel="noopener"&gt;&lt;EM data-start="1781" data-end="1831"&gt;Boas práticas para dominar o GitHub Copilot Chat&lt;/EM&gt;&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI style="font-weight: bold;" data-start="1834" data-end="1922"&gt;&lt;STRONG&gt;25 de junho, 19h: &lt;A class="lia-external-url" href="https://developer.microsoft.com/en-us/reactor/events/25932/" target="_blank" rel="noopener"&gt;&lt;EM data-start="1854" data-end="1920"&gt;Integrações práticas com MCP Servers no VS Code e GitHub Copilot&lt;/EM&gt;&lt;/A&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 data-start="2314" data-end="2346"&gt;&lt;STRONG data-start="2318" data-end="2344"&gt;Aprenda na sua cidade!&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P data-start="2347" data-end="2479"&gt;Estamos em parceria com comunidades locais de desenvolvedores para levar workshops presenciais a diversas cidades ao redor do mundo.&lt;/P&gt;
&lt;P data-start="2722" data-end="2758"&gt;&lt;STRONG data-start="2722" data-end="2758"&gt;Sessões presenciais confirmadas no Brasil:&lt;/STRONG&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 94.8529%; height: 187.6px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr style="height: 26.8px;"&gt;&lt;th style="height: 26.8px; border-width: 1px;"&gt;Data&lt;/th&gt;&lt;th style="height: 26.8px; border-width: 1px;"&gt;Cidade&lt;/th&gt;&lt;th style="height: 26.8px; border-width: 1px;"&gt;Inscrições&lt;/th&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;17 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Brasília, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://forms.office.com/r/rUNtTWNndV" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;17 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Pato de Minas, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://forms.office.com/r/tXXP6Ce7Xq" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;21 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Mogi das Cruzes, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://cloudexpertschool.com.br/github-copilot-global-bootcamp/" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 26.8px;"&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;26 de Junho&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;Recife, Brasil&lt;/td&gt;&lt;td style="height: 26.8px; border-width: 1px;"&gt;&lt;A class="lia-external-url" href="https://forms.office.com/r/yFqWJfY2iW" target="_blank" rel="noopener"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 1px;"&gt;27 de Junho&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;Rio de Janeiro, Brasil&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;&lt;A href="https://capsula.rj.senac.br/github2025/" target="_blank"&gt;Registre-se agora!&lt;/A&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;img /&gt;
&lt;P data-start="4355" data-end="4697"&gt;O&amp;nbsp;&lt;STRONG data-start="4357" data-end="4385"&gt;Microsoft Applied Skills&lt;/STRONG&gt; é um programa de credenciamento criado para validar sua capacidade de realizar tarefas técnicas específicas do mundo real. Diferente das certificações tradicionais que costumam abranger cargos amplos, o Applied Skills foca em habilidades práticas e cenários reais, diretamente aplicáveis a desafios de negócios.&lt;/P&gt;
&lt;P data-start="4699" data-end="4917"&gt;&lt;STRONG data-start="4699" data-end="4743"&gt;E a melhor parte? É totalmente gratuito!&lt;/STRONG&gt;&lt;BR data-start="4743" data-end="4746" /&gt;Você demonstra suas habilidades por meio de avaliações interativas, baseadas em tarefas, em um ambiente simulado — sem perguntas de múltipla escolha, apenas trabalho real.&lt;/P&gt;
&lt;P data-start="4919" data-end="5131"&gt;Uma das adições mais recentes é o &lt;STRONG data-start="4953" data-end="4988"&gt;Applied Skill do GitHub Copilot&lt;/STRONG&gt;, que comprova sua habilidade de aproveitar a IA para aumentar a produtividade no desenvolvimento de software e melhorar a qualidade do código:&lt;/P&gt;
&lt;P data-start="5135" data-end="5204" data-is-last-node=""&gt;&lt;A class="lia-external-url" href="https://aka.ms/appliedskills/github-copilot" target="_blank" rel="noopener"&gt;&lt;STRONG data-start="5135" data-end="5204" data-is-last-node=""&gt;Acelere o desenvolvimento de aplicativos usando o GitHub Copilot.&lt;/STRONG&gt;&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 06 Jun 2025 14:19:57 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/participe-da-2%C2%AA-edi%C3%A7%C3%A3o-do-github-copilot-global-bootcamp/ba-p/4417042</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-06-06T14:19:57Z</dc:date>
    </item>
    <item>
      <title>Crie seu Primeiro Agente de IA com JavaScript e Azure AI Agent Service!</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/crie-seu-primeiro-agente-de-ia-com-javascript-e-azure-ai-agent/ba-p/4411651</link>
      <description>&lt;H2 data-line="4"&gt;&lt;STRONG&gt;Introdução: A Era dos Agentes de IA em JavaScript&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="8"&gt;Durante o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://developer.microsoft.com/en-us/reactor/events/25323/" data-href="https://developer.microsoft.com/en-us/reactor/events/25323/" target="_blank"&gt;AI Agents Hackathon&lt;/A&gt;&lt;/STRONG&gt;, uma das sessões mais aguardadas foi apresentada por&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://www.linkedin.com/in/wassimchegham/" data-href="https://www.linkedin.com/in/wassimchegham/" target="_blank"&gt;Wassim Chegham&lt;/A&gt;&lt;/STRONG&gt;, que é Senior AI Developer Advocate em JavaScript na Microsoft. O tema?&amp;nbsp;&lt;STRONG&gt;"Como Criar seu Primeiro Agente de IA com JavaScript e Azure AI Agent Service?"&lt;/STRONG&gt;&amp;nbsp;- uma ferramenta poderosa e pensada para desenvolvedores modernos que desejam criar aplicações AI-first com segurança, escabilidade e produtividade.&lt;/P&gt;
&lt;P data-line="10"&gt;E, nesse artigo, vamos explorar os principais pontos abordados na sessão, com um foco especial em como você pode criar seu próprio agente de IA utilizando JavaScript e o Azure AI Agent Service.&lt;/P&gt;
&lt;P data-line="12"&gt;A proposta do vídeo é clara: mostrar o passo a passo de como qualquer pessoa pode criar agentes de IA com JavaScript e TypeScript, utilizando&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Foundry&lt;/A&gt;&lt;/STRONG&gt;, e explicar todos os conceitos essenciais para dominar esse novo paradigma de desenvolvimento.&lt;/P&gt;
&lt;img /&gt;
&lt;P data-line="12"&gt;Se você perdeu a sessão, não se preocupe! Você pode assistir a gravação:&lt;/P&gt;
&lt;P data-line="12"&gt;&amp;nbsp;&lt;/P&gt;
&lt;div data-video-id="https://www.youtube.com/watch?v=RNphlRKvmJQ/1746638815221" data-video-remote-vid="https://www.youtube.com/watch?v=RNphlRKvmJQ/1746638815221" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FRNphlRKvmJQ%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DRNphlRKvmJQ&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FRNphlRKvmJQ%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;H2 data-line="20"&gt;&lt;STRONG&gt;O que são Agentes de IA?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="22"&gt;Wassim inicia a sessão com um panorama histórico: desde os chatbots tradicionais até os agentes inteligentes e autônomos que conhecemos hoje. Ele destacou:&lt;/P&gt;
&lt;UL data-line="24"&gt;
&lt;LI data-line="24"&gt;&lt;STRONG&gt;Agentes baseados em LLMs (Large Language Models)&lt;/STRONG&gt;&amp;nbsp;que entendem a linguagem natural.&lt;/LI&gt;
&lt;LI data-line="26"&gt;&lt;STRONG&gt;Agentes com ferramentas (tools)&lt;/STRONG&gt;&amp;nbsp;que executam ações no mundo real, como chamadas de API, buscas, execução de código etc.&lt;/LI&gt;
&lt;LI data-line="28"&gt;&lt;STRONG&gt;Sistemas multiagentes&lt;/STRONG&gt;, que coordenam vários agentes para resolver tarefas complexas.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P class="lia-clear-both"&gt;O diferencial do Azure AI Agent Service é simplificar tudo isso, oferecendo uma plataforma gerenciada que cuida da orquestração, segurança, rastreamento e execução dos agentes.&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="36"&gt;&lt;STRONG&gt;Arquitetura de Soluções com Azure AI Agent Service&lt;/STRONG&gt;&lt;/H2&gt;
&lt;img /&gt;
&lt;P data-line="40"&gt;Durante a sessão, Wassim apresentou uma visão clara da arquitetura típica de uma aplicação de agente de IA desenvolvida com JavaScript. Ele explicou que, embora seja possível ter uma interface gráfica (FrontEnd) usando frameworks como Angular ou React, isso não é obrigatório - a aplicação pode muito bem funcionar num terminal, como foi o caso das demonstrações feitas ao vivo.&lt;/P&gt;
&lt;P data-line="42"&gt;No BackEnd, o foco recai sobre o uso de Node.js, que pode ser combinado com frameworks como&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://expressjs.com/" data-href="https://expressjs.com/" target="_blank"&gt;Express.js&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;ou&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://fastify.dev/" data-href="https://fastify.dev/" target="_blank"&gt;Fastify&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;para expor APIs que comunicam com os agentes. Essa camada de API atua como ponte entre o usuário e a lógica do agente, coordenando mensagens, execuções e chamadas de ferramentas.&lt;/P&gt;
&lt;P data-line="44"&gt;O próprio agente é criado e gerenciado com o SDK&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/ai-projects, que fornece uma API simples e direta para registrar agentes, definir instruções, anexar ferramentas e controlar execuções. Wassim destacou o quanto essa abordagem reduz a complexidade em comparação a outros frameworks de agentes, que exigem configuração manual de estado, orquestração e controle de contexto.&lt;/P&gt;
&lt;P data-line="46"&gt;Além disso, há uma camada de ferramentas integradas ao serviço que ampliam significamente as capacidades do agente. São elas:&lt;/P&gt;
&lt;UL data-line="48"&gt;
&lt;LI data-line="48"&gt;&lt;STRONG&gt;Code Interpreter&lt;/STRONG&gt;: para execução de código Python em sandbox&lt;/LI&gt;
&lt;LI data-line="49"&gt;&lt;STRONG&gt;Function Calling&lt;/STRONG&gt;: para chamadas de funções definidas pelo usuário&lt;/LI&gt;
&lt;LI data-line="50"&gt;&lt;STRONG&gt;Azure AI Search&lt;/STRONG&gt;: para buscas vetoriais e RAG (Retrieval-Augmented Generation)&lt;/LI&gt;
&lt;LI data-line="51"&gt;&lt;STRONG&gt;Bing Search&lt;/STRONG&gt;: para grounding com dados em tempo real&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;Todas essas ferramentas são disponibilizadas de forma plug-and-play pela infraestrutura do&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service&lt;/A&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Toda essa arquitetura é gerenciada por uma instância do Azure AI Foundry, que centraliza o controle de modelos, ferramentas, conexões e dados, proporcionando uma base robusta, segura e escalável para criar aplicações AI-first. Wassim fez questão de frisar que o agente é o verdadeiro "cérebro" da aplicação - recebendo instruções, raciocionando sobre elas e coordenando a execução de tarefas com auxílio de ferramentas externas, tudo isso com o poucos comandos em JavaScript.&lt;/P&gt;
&lt;H2 data-line="61"&gt;&lt;STRONG&gt;Criando seu primeiro agente: Hands-on com JavaScript&lt;/STRONG&gt;&lt;/H2&gt;
&lt;img /&gt;
&lt;P&gt;Durante a demonstração prática, Wassim conduz os participantes por todas as etapas necessárias para criar um agente de IA funcional com JavaScript, utilizando o Azure AI Agent Service. Ele começa destacando que todo o código utilizado está disponível publicamente num repositório no GitHub, o que permite que qualquer pessoa possa clonar, rodar e adaptar os exemplos para seus próprios projetos.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;gt; Link do repositório:&amp;nbsp;&lt;A href="http://aka.ms/azure-ai-agents-javascript" data-href="http://aka.ms/azure-ai-agents-javascript" target="_blank"&gt;Azure AI Agent Service - Demonstration&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-line="69"&gt;A primeira etapa envolve a instalação dos pacotes essenciais. O principal deles é o SDK&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/ai-projects&amp;nbsp;(&lt;STRONG&gt;&lt;A href="https://www.npmjs.com/package/@azure/ai-projects" data-href="https://www.npmjs.com/package/@azure/ai-projects" target="_blank"&gt;pacote npm - aqui&lt;/A&gt;&lt;/STRONG&gt;), responsável por toda a interação com o serviço de agentes. Também é necessário instalar o&amp;nbsp;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/identity, que permite autenticar de forma segura com as credenciais da Azure sem precisar lidar com chaves ou tokens diretamente — utilizando, por exemplo, o&amp;nbsp;DefaultAzureCredential.&lt;/P&gt;
&lt;P data-line="71"&gt;Após configurar o ambiente com as dependências, Wassim mostra como criar uma instância do cliente de agente a partir de uma string de conexão obtida no&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://ai.azure.com/" data-href="https://ai.azure.com/" target="_blank"&gt;portal do Azure Foundry&lt;/A&gt;&lt;/STRONG&gt;. Essa string é armazenada em um arquivo&amp;nbsp;.env, e permite que o código se conecte de forma segura ao serviço para criar e gerenciar agentes.&lt;/P&gt;
&lt;P data-line="73"&gt;Com o cliente em mãos, o próximo passo é criar o agente propriamente dito. Para isso, é necessário definir o nome, o modelo de linguagem a ser usado (como o GPT-4) e fornecer instruções claras sobre o comportamento desejado para o agente — seja para realizar cálculos, responder perguntas, interpretar dados ou interagir com ferramentas externas.&lt;/P&gt;
&lt;P data-line="75"&gt;Na sequência, Wassim introduz o conceito de&amp;nbsp;&lt;EM&gt;thread&lt;/EM&gt;, que funciona como um espaço de conversa entre o agente e o usuário. É nesse thread que as mensagens são armazenadas, as execuções são iniciadas e o histórico de interações é mantido. Ele mostra como criar um thread, enviar uma mensagem e iniciar uma&amp;nbsp;&lt;EM&gt;run&lt;/EM&gt;, ou seja, uma execução do agente a partir da mensagem fornecida.&lt;/P&gt;
&lt;P data-line="77"&gt;A sessão então avança para demonstrar o uso de ferramentas. No primeiro exemplo, o agente resolve uma equação simples apenas com seu conhecimento interno, sem recorrer a ferramentas externas — um exemplo clássico para mostrar como o modelo pode raciocinar com base nas instruções fornecidas. Em seguida, Wassim mostra como ativar uma chamada de função personalizada: o agente acessa uma função que retorna o uso da CPU da máquina local, demonstrando a capacidade de executar ações no ambiente do usuário.&lt;/P&gt;
&lt;P data-line="79"&gt;Outro exemplo impressionante é o uso do&amp;nbsp;&lt;STRONG&gt;Code Interpreter&lt;/STRONG&gt;, uma ferramenta que permite executar código Python remotamente e com segurança. Wassim fornece um arquivo CSV contendo dados de vendas de carros, e o agente não só processa os dados, como também gera visualizações gráficas em tempo real.&lt;/P&gt;
&lt;P data-line="81"&gt;Além disso, ele demonstra como o agente pode utilizar o&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Bing Grounding&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;para buscar informações atualizadas diretamente da internet, como cotações do mercado de ações. E, por fim, mostra a integração com o Azure AI Search, onde um índice vetorial previamente carregado com informações sobre planos de saúde é consultado para responder perguntas específicas, com direito a citações precisas da fonte utilizada — um ótimo exemplo do padrão RAG (Retrieval-Augmented Generation) em ação.&lt;/P&gt;
&lt;P data-line="83"&gt;Esses exemplos mostram que, mesmo com poucos comandos em JavaScript, é possível criar agentes sofisticados, capazes de interagir com dados, ferramentas e usuários de maneira fluida, segura e produtiva.&lt;/P&gt;
&lt;img /&gt;
&lt;H2 data-line="87"&gt;&lt;STRONG&gt;Entendendo a mecânica interna: Como um agente funciona?&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="89"&gt;Wassim explica os conceitos fundamentais do ciclo de vida de um agente:&lt;/P&gt;
&lt;UL data-line="91"&gt;
&lt;LI data-line="91"&gt;&lt;EM&gt;Agent&lt;/EM&gt;: configurado com modelo e instruções.&lt;/LI&gt;
&lt;LI data-line="93"&gt;&lt;EM&gt;Thread&lt;/EM&gt;: representa a conversa (contexto).&lt;/LI&gt;
&lt;LI data-line="95"&gt;&lt;EM&gt;Run&lt;/EM&gt;: execução de uma tarefa.&lt;/LI&gt;
&lt;LI data-line="97"&gt;&lt;EM&gt;Run Steps&lt;/EM&gt;: etapas da execução.&lt;/LI&gt;
&lt;LI data-line="99"&gt;&lt;EM&gt;Tools&lt;/EM&gt;: definidas com schemas e acionadas conforme necessário.&lt;/LI&gt;
&lt;LI data-line="101"&gt;&lt;EM&gt;Events&lt;/EM&gt;: eventos emitidos durante a execução (streaming, tool-call, resposta, erro, etc).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P data-line="103"&gt;Além disso, ele demonstra um projeto pessoal: uma ferramenta de tracing visual para acompanhar em tempo real cada etapa do agente, o que facilita o entendimento e o debug.&lt;/P&gt;
&lt;H2 data-line="105"&gt;&lt;STRONG&gt;Um pouco sobre as tecnologias utilizadas no projeto&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="107"&gt;Para quem está curioso sobre as tecnologias utilizadas no projeto, Wassim fez questão de destacar algumas delas:&lt;/P&gt;
&lt;UL data-line="109"&gt;
&lt;LI data-line="109"&gt;📦 SDK utilizado
&lt;UL data-line="110"&gt;
&lt;LI data-line="110"&gt;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/ai-projects@2.0.0-beta.4&lt;/LI&gt;
&lt;LI data-line="111"&gt;&lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="73893" data-lia-user-login="azure" class="lia-mention lia-mention-user"&gt;azure&lt;/a&gt;/identity&amp;nbsp;para autenticação com credenciais seguras.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-line="113"&gt;🔧 Ferramentas integradas
&lt;UL data-line="114"&gt;
&lt;LI data-line="114"&gt;Function Calling: executa funções com base na entrada do LLM.&lt;/LI&gt;
&lt;LI data-line="115"&gt;Code Interpreter: executa código Python remotamente com segurança.&lt;/LI&gt;
&lt;LI data-line="116"&gt;Azure AI Search: busca vetorial e full-text com RAG.&lt;/LI&gt;
&lt;LI data-line="117"&gt;Bing Search Grounding: informações em tempo real da web.&lt;/LI&gt;
&lt;LI data-line="118"&gt;File Search (em breve): busca em arquivos carregados.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI data-line="120"&gt;⚙️ Segurança e compliance
&lt;UL data-line="121"&gt;
&lt;LI data-line="121"&gt;Autenticação sem chaves (keyless)&lt;/LI&gt;
&lt;LI data-line="122"&gt;Private Networking (VNet)&lt;/LI&gt;
&lt;LI data-line="123"&gt;Content Filtering&lt;/LI&gt;
&lt;LI data-line="124"&gt;Tracing e logs para evitar alucinações&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2 data-line="126"&gt;&lt;STRONG&gt;Conclusão: O Futuro dos Agentes de IA com JavaScript&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P data-line="128"&gt;A sessão de Wassim Chegham no&amp;nbsp;&lt;STRONG&gt;&lt;A href="https://developer.microsoft.com/en-us/reactor/events/25323/" data-href="https://developer.microsoft.com/en-us/reactor/events/25323/" target="_blank"&gt;AI Agents Hackathon&lt;/A&gt;&lt;/STRONG&gt;&amp;nbsp;foi uma verdadeira aula sobre como criar agentes de IA com JavaScript e Azure AI Agent Service. Ele não só apresentou os conceitos fundamentais, mas também mostrou na prática como é fácil e rápido desenvolver aplicações inteligentes utilizando essa nova abordagem.&lt;/P&gt;
&lt;P data-line="130"&gt;Novamente se você perdeu a sessão, não se preocupe! Você pode assistir a gravação&amp;nbsp;&lt;A href="https://www.youtube.com/watch?v=RNphlRKvmJQ" data-href="https://www.youtube.com/watch?v=RNphlRKvmJQ" target="_blank"&gt;aqui&lt;/A&gt;.&lt;/P&gt;
&lt;P data-line="132"&gt;E, claro , não deixe de conferir o repositório no GitHub com todos os exemplos e códigos utilizados durante a apresentação:&amp;nbsp;&lt;STRONG&gt;&lt;A href="http://aka.ms/azure-ai-agents-javascript" data-href="http://aka.ms/azure-ai-agents-javascript" target="_blank"&gt;Azure AI Agent Service - Demonstration&lt;/A&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P data-line="134"&gt;E, no final, Wassim deixou uma mensagem clara: o futuro dos agentes de IA é promissor, e com as ferramentas certas, qualquer desenvolvedor pode criar soluções inovadoras e impactantes. Então, não perca tempo! Comece a explorar o Azure AI Agent Service e crie seu próprio agente de IA hoje mesmo!&lt;/P&gt;
&lt;H2 data-line="136"&gt;&lt;STRONG&gt;Links úteis&lt;/STRONG&gt;&lt;/H2&gt;
&lt;UL data-line="138"&gt;
&lt;LI data-line="138"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service&lt;/A&gt;&lt;/STRONG&gt;: Documentação oficial do serviço de agentes de IA da Azure.&lt;/LI&gt;
&lt;LI data-line="139"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-foundry/?WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Foundry&lt;/A&gt;&lt;/STRONG&gt;: Plataforma para criar e gerenciar agentes de IA.&lt;/LI&gt;
&lt;LI data-line="140"&gt;&lt;STRONG&gt;&lt;A href="http://aka.ms/azure-ai-agents-javascript" data-href="http://aka.ms/azure-ai-agents-javascript" target="_blank"&gt;Azure AI Agent Service - Demonstration&lt;/A&gt;&lt;/STRONG&gt;: Repositório GitHub com exemplos e códigos utilizados na sessão.&lt;/LI&gt;
&lt;LI data-line="141"&gt;&lt;STRONG&gt;&lt;A href="https://developer.microsoft.com/en-us/reactor/events/25323/" data-href="https://developer.microsoft.com/en-us/reactor/events/25323/" target="_blank"&gt;AI Agents Hackathon&lt;/A&gt;&lt;/STRONG&gt;: Evento que reuniu desenvolvedores para explorar o potencial dos agentes de IA.&lt;/LI&gt;
&lt;LI data-line="142"&gt;&lt;STRONG&gt;&lt;A href="https://www.linkedin.com/in/wassimchegham/" data-href="https://www.linkedin.com/in/wassimchegham/" target="_blank"&gt;Wassim Chegham&lt;/A&gt;&lt;/STRONG&gt;: LinkedIn do apresentador da sessão.&lt;/LI&gt;
&lt;LI data-line="143"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-foundry/quickstarts/get-started-playground" data-href="https://learn.microsoft.com/azure/ai-foundry/quickstarts/get-started-playground" target="_blank"&gt;Azure AI Foundry - Getting Started&lt;/A&gt;&lt;/STRONG&gt;: Guia para começar a usar o Azure AI Foundry.&lt;/LI&gt;
&lt;LI data-line="144"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/quickstart?WT.mc_id=javascript-00000-gllemos&amp;amp;pivots=programming-language-typescript" data-href="https://learn.microsoft.com/azure/ai-services/agents/quickstart?WT.mc_id=javascript-00000-gllemos&amp;amp;pivots=programming-language-typescript" target="_blank"&gt;Azure AI Agent Service - Quickstart&lt;/A&gt;&lt;/STRONG&gt;: Tutorial rápido para criar seu primeiro agente de IA.&lt;/LI&gt;
&lt;LI data-line="145"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/overview" data-href="https://learn.microsoft.com/azure/ai-services/agents/overview" target="_blank"&gt;Azure AI Agent Service - Tools&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre as ferramentas disponíveis no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="146"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/function-calling?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/function-calling?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Function Calling&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre chamadas de função no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="147"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/code-interpreter?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/code-interpreter?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Code Interpreter&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre o interpretador de código no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="148"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/azure-ai-search?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/azure-ai-search?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Azure AI Search&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre o Azure AI Search no serviço de agentes de IA.&lt;/LI&gt;
&lt;LI data-line="149"&gt;&lt;STRONG&gt;&lt;A href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" data-href="https://learn.microsoft.com/azure/ai-services/agents/how-to/tools/bing-grounding?tabs=python&amp;amp;pivots=overview&amp;amp;WT.mc_id=javascript-00000-gllemos" target="_blank"&gt;Azure AI Agent Service - Bing Search&lt;/A&gt;&lt;/STRONG&gt;: Documentação sobre o Bing Search no serviço de agentes de IA.&lt;/LI&gt;
&lt;/UL&gt;</description>
      <pubDate>Wed, 07 May 2025 17:37:50 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/crie-seu-primeiro-agente-de-ia-com-javascript-e-azure-ai-agent/ba-p/4411651</guid>
      <dc:creator>Glaucia_Lemos</dc:creator>
      <dc:date>2025-05-07T17:37:50Z</dc:date>
    </item>
    <item>
      <title>Conectando o Azure Vmware Solution (AVS) com VPN Site to Site em topologia Hub Spoke.</title>
      <link>https://techcommunity.microsoft.com/t5/azure-infragurus/conectando-o-azure-vmware-solution-avs-com-vpn-site-to-site-em/ba-p/4410454</link>
      <description>&lt;P&gt;A conexão de VPN entre AVS e o ambiente On-premises na maioria das vezes é realizada através do Virtual WAN, conforme descrito em: &lt;U&gt;https://learn.microsoft.com/en-us/azure/azure-vmware/configure-site-to-site-vpn-gateway&lt;/U&gt;.&lt;/P&gt;
&lt;P&gt;Contudo, caso necessário utilizar em uma topologia Hub-Spoke, existem componentes adicionais que devem ser considerados para permitir o trânsito entre o ExpressRoute do AVS e o VPN Gateway, bem como a propagação das rotas para o ambiente On-premises, assim como é feito por padrão com o Virtual WAN.&lt;/P&gt;
&lt;P&gt;Nesta topologia, o Azure Route Server deve ser integrado para habilitar esse trânsito (propagação de rotas)&amp;nbsp;&lt;/P&gt;
&lt;P&gt;O objetivo deste artigo é demonstrar em um ambiente de laboratório como conectar um ambiente On-premises com o Azure VMware Solution (AVS) através de uma VPN Site-to-Site em topologia Hub-Spoke.&lt;/P&gt;
&lt;P&gt;Arquitetura do Laboratório com topologia Hub-Spoke.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Componentes Azure.&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Vnet 10.90.0.0/16 com 3 Subnets.
&lt;UL&gt;
&lt;LI&gt;Gateway Subnet - 10.90.0.0/24&lt;/LI&gt;
&lt;LI&gt;RouteServerSubnet - 10.90.1.0/24&lt;/LI&gt;
&lt;LI&gt;VmSubnet : 10.90.2.0/24&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Virtual Network Gateway - VPN&lt;/LI&gt;
&lt;LI&gt;Virtual Network Gateway - Express Route&lt;/LI&gt;
&lt;LI&gt;Azure Route Server&lt;/LI&gt;
&lt;LI&gt;Azure Vm Linux Ubuntu&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Componentes On-premises&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Firewall VPN PfSense - 192.168.90.0/24 , 192.168.200.0/22 , 192.168.92.0/24&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Componetes Azure Vmware Solution&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;VMware SDDC&lt;/LI&gt;
&lt;LI&gt;Circuito Express Route&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;*Este laboratório presume que os componentes como o Azure Vmware Solution e ambiente On-premises com Pfsense ou qualquer outro equipamento esteja presente.&lt;/P&gt;
&lt;H5&gt;1. Deploy componentes Azure&lt;/H5&gt;
&lt;LI-CODE lang="bash"&gt;# 1. Variáveis - Altere conforme necessário
RESOURCE_GROUP="rg-avs-lab"
LOCATION="eastus2"
VNET_NAME="vnet-avs-lab"
VNET_ADDRESS_PREFIX="10.90.0.0/16"
SUBNET_GATEWAY_PREFIX="10.90.0.0/24"
SUBNET_ROUTE_SERVER_PREFIX="10.90.1.0/24"
SUBNET_GATEWAY_NAME="GatewaySubnet"
SUBNET_ROUTE_SERVER_NAME="RouteServerSubnet"

EXPRESSROUTE_GW_NAME="er-avs-lab"
VPN_GW_NAME="vpn-avs-lab"
VPN_GW_IP1_NAME="vpn-gw-ip1"
VPN_GW_IP2_NAME="vpn-gw-ip2"
VPN_GW_ASN=65515

EXPRESSROUTE_IP_NAME="er-ip"
LOCAL_NETWORK_GATEWAY_NAME="local-gw-avs-lab"
BGP_PEER_IP="192.168.90.1"
ASN_LOCAL=65503

ROUTE_SERVER_NAME="rserver-avs-lab"

# Variáveis para subnet e VM
SUBNET_VM_NAME="subnet-vm"
SUBNET_VM_PREFIX="10.90.5.0/24"
VM_NAME="vm-ubuntu"
VM_ADMIN_USERNAME='azureuser'
VM_ADMIN_PASSWORD='P@ssword123!' # Use um método seguro em produção
VM_NIC_NAME="vm-ubuntu-nic"
VM_IMAGE="Canonical:0001-com-ubuntu-server-focal:20_04-lts:latest"
VM_SIZE="Standard_B2ms"

# 2. Criar grupo de recursos
az group create --name $RESOURCE_GROUP --location $LOCATION

# 3. Criar VNet e subnets
az network vnet create \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --name $VNET_NAME \
  --address-prefixes $VNET_ADDRESS_PREFIX \
  --subnet-name $SUBNET_GATEWAY_NAME \
  --subnet-prefix $SUBNET_GATEWAY_PREFIX

az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --vnet-name $VNET_NAME \
  --name $SUBNET_ROUTE_SERVER_NAME \
  --address-prefix $SUBNET_ROUTE_SERVER_PREFIX

# Criar subnet para a VM
az network vnet subnet create \
  --resource-group $RESOURCE_GROUP \
  --vnet-name $VNET_NAME \
  --name $SUBNET_VM_NAME \
  --address-prefix $SUBNET_VM_PREFIX

# 4. Criar IP público para ExpressRoute
az network public-ip create \
  --resource-group $RESOURCE_GROUP \
  --name $EXPRESSROUTE_IP_NAME \
  --sku Standard \
  --allocation-method Static

# 5. Criar Gateway ExpressRoute
az network vnet-gateway create \
  --resource-group $RESOURCE_GROUP \
  --name $EXPRESSROUTE_GW_NAME \
  --location $LOCATION \
  --vnet $VNET_NAME \
  --public-ip-addresses $EXPRESSROUTE_IP_NAME \
  --gateway-type ExpressRoute \
  --sku Standard 

# 6. Criar IPs públicos para VPN Gateway ativo-ativo
az network public-ip create \
  --resource-group $RESOURCE_GROUP \
  --name $VPN_GW_IP1_NAME \
  --sku Standard \
  --allocation-method Static

az network public-ip create \
  --resource-group $RESOURCE_GROUP \
  --name $VPN_GW_IP2_NAME \
  --sku Standard \
  --allocation-method Static

# 7. Criar VPN Gateway 
az network vnet-gateway create \
  --resource-group $RESOURCE_GROUP \
  --name $VPN_GW_NAME \
  --location $LOCATION \
  --vnet $VNET_NAME \
  --public-ip-addresses $VPN_GW_IP1_NAME $VPN_GW_IP2_NAME \
  --gateway-type Vpn \
  --vpn-type RouteBased \
  --sku VpnGw1

# Após a criação, configurar ativo-ativo e BGP
az network vnet-gateway update \
  --resource-group $RESOURCE_GROUP \
  --name $VPN_GW_NAME \
  --set activeActive=true enableBgp=true bgpSettings.asn=$VPN_GW_ASN

# 8. Criar Local Network Gateway com BGP e ASN
az network local-gateway create \
  --resource-group $RESOURCE_GROUP \
  --name $LOCAL_NETWORK_GATEWAY_NAME \
  --gateway-ip-address $BGP_PEER_IP \
  --local-address-prefixes "192.168.90.0/24" \
  --asn $ASN_LOCAL \
  --bgp-peering-address $BGP_PEER_IP \
  --location $LOCATION

# 9. Criar conexão VPN entre o Gateway de VPN e o Local Network Gateway
az network vpn-connection create \
  --resource-group $RESOURCE_GROUP \
  --name vpn-s2s-connection \
  --vnet-gateway1 $VPN_GW_NAME \
  --local-gateway2 $LOCAL_NETWORK_GATEWAY_NAME \
  --shared-key 'teste@123' \
  --enable-bgp


# 10. Criar NIC para a VM 
az network nic create \
  --resource-group $RESOURCE_GROUP \
  --name $VM_NIC_NAME \
  --vnet-name $VNET_NAME \
  --subnet $SUBNET_VM_NAME

# 12. Criar VM com Ubuntu
az vm create \
  --resource-group $RESOURCE_GROUP \
  --name $VM_NAME \
  --nics $VM_NIC_NAME \
  --image $VM_IMAGE \
  --admin-username $VM_ADMIN_USERNAME \
  --admin-password $VM_ADMIN_PASSWORD \
  --size $VM_SIZE \
  --location $LOCATION&lt;/LI-CODE&gt;
&lt;H5&gt;2. Conectando o Express Route do AVS no VPN Gateway da Hub.&lt;/H5&gt;
&lt;P&gt;No Virtual Network Gateway de ER , adicione uma conexão&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Defina o connection type como ExpressRoute&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;No AVS, copie o authorization key e o ExpressRoute ID&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Para este cenário será utilizado o modelo de resiliência standard, o Virtual network gateway, informe um nome para conexão, insira a "authorization key" e "ExpressRoute ID" (per cirtuit URI) copiados nos passos acima e execute o deploy.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Verificando que a conexão foi estabelecida com sucesso.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Verificando as rotas na Vm de teste.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Ao verificar as rotas do Pfsense ( onprem) ,&amp;nbsp; é possível observar que não temos as rotas do AVS, somente da Vnet do Azure.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Para habilitar o trânsito e troca de rotas entre o Express Route do AVS e o VPN gateway precisamos inserir o Azure Route Server.&lt;/P&gt;
&lt;H5&gt;3. Deploy do Azure Route Server.&lt;/H5&gt;
&lt;LI-CODE lang="bash"&gt;
#Criar Azure Route Server 
#Cria Public IP para o Route Server
az network public-ip create --resource-group $RESOURCE_GROUP --name routeserver-pip --sku Standard --allocation-method Static

# Identifica o ID da Subnet do Route Server
SUBNET_ID=$(az network vnet subnet list --resource-group $RESOURCE_GROUP --vnet-name $VNET_NAME --query "[?name=='$SUBNET_ROUTE_SERVER_NAME'].id" --output tsv)

# Cria o Route Server
az network routeserver create \
  --resource-group $RESOURCE_GROUP \
  --name $ROUTE_SERVER_NAME \
  --hosted-subnet $SUBNET_ID \
  --location $LOCATION \
  --public-ip-address routeserver-pip&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Após criado habilitamos a opção Branch-to-Branch&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Podemos verificar que agora as rotas do AVS (172.30.0.0/22), agora foram propagadas para o Pfsense.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Validando acesso ao Vcenter do AVS.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Referências:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/route-server/overview" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/azure/route-server/overview&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/architecture/networking/architecture/hub-spoke" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/azure/architecture/networking/architecture/hub-spoke&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 05 May 2025 14:46:04 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-infragurus/conectando-o-azure-vmware-solution-avs-com-vpn-site-to-site-em/ba-p/4410454</guid>
      <dc:creator>LeandroBarbosa</dc:creator>
      <dc:date>2025-05-05T14:46:04Z</dc:date>
    </item>
    <item>
      <title>Migração de Aplicações Full Framework para Azure AKS e .NET Core</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/migra%C3%A7%C3%A3o-de-aplica%C3%A7%C3%B5es-full-framework-para-azure-aks-e-net-core/ba-p/4408306</link>
      <description>&lt;H2 data-selectable-paragraph=""&gt;Criando e Abrindo um projeto 4.7.2&lt;/H2&gt;
&lt;P data-selectable-paragraph=""&gt;Vou criar o projeto no Visual Studio 2015, usando a versão FULL Framework&amp;nbsp; .NET 4.7 escolhi o template de uma aplicação ASP.NET Web Application. Este é um projeto pequeno, desses que já nascem prontos, vai servir bem para testar as ferramentas de migração.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Depois de criado o projeto, e é importante habilitar essa versão .NET Core no Visual Studio 2022, pois precisaremos abrir o projeto nessa IDE para usar as extensões. Caso você tenha algum projeto pronto em uma versão mais antiga do dotnet então basta usá-lo&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Depois de ter o projeto que vamos migrar, precisei instar o dotnet-appcat conforme essa doc &lt;A href="https://learn.microsoft.com/en-us/azure/migrate/appcat/dotnet" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment for .NET — Azure Migrate | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A documentação pende a instalando dessa extensão no visual studio &lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.appcat" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment — Visual Studio Marketplace&lt;/A&gt; depois disso podemos abri o projeto pelo Visual Studio 2022 e já e vamos encontrar a opção &lt;STRONG&gt;re-plataform to Azure&lt;/STRONG&gt; clicando com botão direito no projeto ou na solution.&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Se escolhermos clicar na solution o item &lt;STRONG&gt;re-plataform to Azure&amp;nbsp;&lt;/STRONG&gt;disponibilizara&amp;nbsp;a opção new report&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Então vamos escolher para qual o tipo de computação a aplicação vai ser migrada&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;E como escolhemos a solution, agora vamos selecionar os projetos que queremos analisar&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Um relatório com as issues será apresentado&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;entramos na issue e podemos ver a opção de perguntar para o copilot&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Resposta do copilot para um issue especifica&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;E é isso basta ir resolvendo as issues, com essa ferramenta você pode verificar o código-fonte, configurações e binários da sua aplicação para encontrar oportunidades de migração para o Azure. Ele vai ajudar a identificar problemas ao mover sua aplicação para o Azure e melhora o desempenho, escalabilidade e segurança, sugerindo soluções modernas e nativas da nuvem.&lt;/P&gt;
&lt;H1 data-selectable-paragraph=""&gt;NET Upgrade Assistant&lt;/H1&gt;
&lt;P data-selectable-paragraph=""&gt;Agora vamos pensar na migração do código, antigamente eu utilizava um cara chamado Portability Analyzer &lt;A href="https://learn.microsoft.com/pt-br/dotnet/standard/analyzers/portability-analyzer" target="_blank" rel="noopener"&gt;O .NET Portability Analyzer — .NET — .NET | Microsoft Learn&lt;/A&gt;, mas ele foi descontinuado e no lugar agora temos o &lt;STRONG&gt;Assistente de Atualização do .NET&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Vou escolher um projeto por vez, clicando com o botão direito sobre o projeto e selecionando a opção 'update'. Esse método, em vez de gerar um relatório com as issues, tenta uma conversão direta de código. Na maioria das vezes, ele apenas faz o retarget, mas mesmo assim ajuda&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;No caso de um projeto WEB, a melhor opção é criar um novo projeto, pois ele vai criar uma espécie de proxy para permitir a migração paralela dos controllers&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Selecionar o framework para 8&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O assistente vai criar o projeto .net core, mas apenas uma casca, sem ter migrado ó código de fato&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;A partir disso, precisamos voltar ao projeto original onde começamos a migração e clicar novamente em '&lt;STRONG&gt;update&lt;/STRONG&gt;' usando o botão direito sobre esse projeto. Então, será possível migrar controller por controller. Cada controller migrada leva consigo suas dependência&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Escolher a solution&lt;/STRONG&gt;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Também podemos escolher a solution que contém vários projetos. Nesse caso, vou clicar na solution e não no projeto. Veja que agora, em vez de converter, ele me dá a opção de criar um relatório.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;e então ele analisa projeto por projeto e gera as issues para serem corrigidas&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;aqui também consegui pedir ajuda do copilot paras as issues, e assim fica muito mais prático do que o Portability Analyzer&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;O Assistente de Atualização do .NET ajuda a atualizar projetos para versões mais recentes do .NET e analisa seu código para detectar e corrigir possíveis incompatibilidades. Um foco da ferramenta é ajudar a migrar um projeto do .NET Framework, .NET Core ou .NET para a versão mais recente do .NET. Você usa a extensão ou a ferramenta para atualizar projetos inteiros do .NET ou algum aspecto do projeto, como a migração de um arquivo de configuração de um tipo mais antigo para um tipo mais recente.&lt;/P&gt;
&lt;H1 data-selectable-paragraph=""&gt;Podemos utilizar a CLI&lt;/H1&gt;
&lt;LI-CODE lang="powershell"&gt;upgrade-assistant --help&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;para iniciar o assistente use o comando&lt;/P&gt;
&lt;LI-CODE lang="powershell"&gt;upgrade-assistant upgrade&lt;/LI-CODE&gt;
&lt;P data-selectable-paragraph=""&gt;&amp;nbsp;&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;Script para fazer vários projetos&lt;/P&gt;
&lt;P data-selectable-paragraph=""&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="powershell"&gt;upgrade-assistant upgrade# Defina o diretório raiz $rootDir = "..." $destDir = "..." # Obtenha todos os arquivos .csproj no diretório raiz e subdiretórios $csprojFiles = Get-ChildItem -Path $rootDir -Recurse -Filter *.csproj # Execute o comando upgrade-assistant para cada arquivo .csproj foreach ($file in $csprojFiles) { Write-Host "Executando upgrade-assistant para $($file.FullName)" Start-Process -FilePath "upgrade-assistant" -ArgumentList "upgrade $($file.FullName) --operation Inplace --targetFramework net8.0 --destination ${destDir} " -Wait }&lt;/LI-CODE&gt;
&lt;H2 data-selectable-paragraph=""&gt;Referência&lt;/H2&gt;
&lt;OL&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/migrate/appcat/dotnet" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment for .NET — Azure Migrate | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://dotnet.microsoft.com/pt-br/download/dotnet-framework" target="_blank" rel="noopener"&gt;Baixar .NET Framework | Downloads oficiais gratuitos&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/pt-br/dotnet/standard/analyzers/portability-analyzer" target="_blank" rel="noopener"&gt;O .NET Portability Analyzer — .NET — .NET | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://learn.microsoft.com/en-us/dotnet/core/porting/upgrade-assistant-overview" target="_blank" rel="noopener"&gt;.NET Upgrade Assistant Overview — .NET Core | Microsoft Learn&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.upgradeassistant" target="_blank" rel="noopener"&gt;.NET Upgrade Assistant — Visual Studio Marketplace&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.appcat" target="_blank" rel="noopener"&gt;Azure Migrate application and code assessment — Visual Studio Marketplace&lt;/A&gt;&lt;/LI&gt;
&lt;LI data-selectable-paragraph=""&gt;&lt;A href="https://wilsonsantosnet.medium.com/migra%C3%A7%C3%A3o-net-core-2-2-3-1-d92f67d71d73" target="_blank" rel="noopener"&gt;Migração dotnet core 2.2 para 3.1 | by Wilson Santos | Medium&lt;/A&gt;&lt;/LI&gt;
&lt;/OL&gt;</description>
      <pubDate>Mon, 28 Apr 2025 12:18:09 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/migra%C3%A7%C3%A3o-de-aplica%C3%A7%C3%B5es-full-framework-para-azure-aks-e-net-core/ba-p/4408306</guid>
      <dc:creator>wdossantos</dc:creator>
      <dc:date>2025-04-28T12:18:09Z</dc:date>
    </item>
    <item>
      <title>Destaques do VS Code Live: Agent Mode Day</title>
      <link>https://techcommunity.microsoft.com/t5/desenvolvedores-br/destaques-do-vs-code-live-agent-mode-day/ba-p/4406750</link>
      <description>&lt;div data-video-id="https://www.youtube.com/watch?v=HNly8eNtCtA/1745347578164" data-video-remote-vid="https://www.youtube.com/watch?v=HNly8eNtCtA/1745347578164" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FHNly8eNtCtA%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DHNly8eNtCtA&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FHNly8eNtCtA%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P&gt;&lt;STRONG&gt;🎙️ Palestrantes:&amp;nbsp;&lt;/STRONG&gt;&lt;A href="https://x.com/OliviaGuzzardo" target="_blank" rel="noopener"&gt;Olivia McVicker&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/cassidoo" target="_blank" rel="noopener"&gt;Cassidy Williams&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/burkeholland" target="_blank" rel="noopener"&gt;Burke Holland&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/digitarald" target="_blank" rel="noopener"&gt;Harald Kirschner&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/toby" target="_blank" rel="noopener"&gt;Toby Padilla&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/roblourens" target="_blank" rel="noopener"&gt;Rob Lourens&lt;/A&gt;,&amp;nbsp;&lt;A href="https://www.linkedin.com/in/timrogers1/" target="_blank" rel="noopener"&gt;Tim Rogers&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/JamesMontemagno" target="_blank" rel="noopener"&gt;James Montemagno&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/donjayamanne" target="_blank" rel="noopener"&gt;Don Jayamanne&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/BrigitMurtaugh" target="_blank" rel="noopener"&gt;Brigit Murtaugh&lt;/A&gt;,&amp;nbsp;&lt;A href="https://x.com/geektrainer" target="_blank" rel="noopener"&gt;Chris Harrison&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;O que é o Agent Mode?&lt;/H2&gt;
&lt;P&gt;O Agent Mode no VS Code representa um avanço além da tradicional sugestão de código por IA. Em vez de apenas sugerir trechos de código, o Agent Mode permite que a IA:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Escreva, edite e itere sobre o código&lt;/LI&gt;
&lt;LI&gt;Execute comandos no terminal de forma autônoma&lt;/LI&gt;
&lt;LI&gt;Corrija seus próprios erros durante o fluxo de trabalho&lt;/LI&gt;
&lt;LI&gt;Interaja com ferramentas externas, APIs e serviços&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Isso cria um parceiro de codificação mais dinâmico e “agente”, capaz de automatizar tarefas complexas, reduzir intervenções manuais e manter o desenvolvedor no fluxo. O Agent Mode está disponível diretamente no VS Code e se integra perfeitamente ao GitHub Copilot, tornando recursos avançados de IA acessíveis a desenvolvedores de todos os níveis.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;1. Model Context Protocol (MCP)&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;O MCP é um protocolo aberto que padroniza como aplicações fornecem contexto para Modelos de Linguagem de Grande Escala (LLMs). Ele serve como uma ponte, permitindo que agentes de IA no VS Code se conectem de forma segura a um vasto ecossistema de ferramentas, APIs e recursos internos — muito além do que está disponível nativamente.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Principais pontos sobre o MCP:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Abordagem de ecossistema: permite conectar Copilot e outros agentes a tudo que for necessário — documentação interna, bancos de dados, ferramentas de design como Figma, etc.&lt;/LI&gt;
&lt;LI&gt;Aberto e extensível: qualquer pessoa pode criar e compartilhar novas integrações, com milhares de servidores MCP já disponíveis.&lt;/LI&gt;
&lt;LI&gt;Encadeamento de ferramentas: servidores MCP podem ser combinados, permitindo que a IA automatize fluxos de trabalho que envolvem múltiplas ferramentas.&lt;/LI&gt;
&lt;LI&gt;Seguro e em evolução: o protocolo está evoluindo para suportar autenticação mais segura e facilitar a descoberta e instalação de integrações.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;&lt;STRONG&gt;2. Next Edit Suggestions (NES)&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;O Next Edit Suggestions (NES) é um recurso projetado para aprimorar a experiência de edição, oferecendo recomendações contextuais para mudanças no código. O NES auxilia desenvolvedores sugerindo edições relevantes com base no contexto atual, apoiando tarefas como refatoração, correção de bugs e adição de funcionalidades. Ele permite aceitar, desfazer ou iterar rapidamente sobre mudanças sugeridas pela IA, mantendo o controle total sobre o código.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;3. Bring Your Own Key (BYOK): Integração de Modelos de IA Personalizados&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;O BYOK permite que usuários conectem suas próprias chaves de API para modelos de IA personalizados, incluindo OpenAI, Anthropic ou até modelos locais. Com o BYOK, desenvolvedores podem escolher entre vários modelos, integrar soluções locais ou em nuvem por motivos de privacidade, custo ou desempenho, e adaptar a experiência da IA às suas necessidades específicas.&lt;/P&gt;
&lt;H2&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;4. &lt;/STRONG&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;O Futuro Agente&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Uma prévia do “Project Padawan” mostrou que fluxos de trabalho agentes poderão rodar de forma assíncrona na nuvem. Será possível delegar tarefas ao Copilot (como resolver issues do GitHub), que criará pull requests, executará testes e iterará sobre feedbacks de forma autônoma, enquanto o desenvolvedor foca em outras atividades.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;&lt;STRONG&gt;GitHub Copilot Skills Challenge&lt;BR /&gt;&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;Quer aprender e experimentar o Agent Mode do GitHub Copilot enquanto conquista um Selo Digital? Participe do GitHub Copilot Skills Challenge — uma experiência prática de aprendizado no Microsoft Learn, onde você construirá um aplicativo Python usando o Agent Mode por meio de um tutorial guiado. Complete o desafio até 30 de abril de 2025 para ganhar seu selo!&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Confira as regras oficiais:&amp;nbsp;&lt;A href="https://aka.ms/csc/terms" target="_blank" rel="noopener"&gt;https://aka.ms/csc/terms&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Inscreva-se no Desafio: &lt;A href="https://aka.ms/csc/githubcopilot" target="_blank" rel="noopener"&gt;https://aka.ms/csc/githubcopilot&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Solicite seu selo em: &lt;A href="https://aka.ms/getyourbadge" target="_blank" rel="noopener"&gt;https://aka.ms/getyourbadge&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Como começar&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://aka.ms/AAvrhq0" target="_blank"&gt;Ative o Agent Mode &lt;/A&gt;— disponível nas versões estável e insiders do VS Code — para experimentar esses recursos avançados de IA. Explore integrações MCP navegando pela lista de servidores ou criando o seu próprio com os SDKs disponíveis.&lt;/P&gt;
&lt;P&gt;Quer ver essas funcionalidades em ação? Assista ao stream completo para demonstrações ao vivo, dicas de especialistas e marque a data para o próximo episódio da nossa série VS Code Live: &lt;A class="lia-external-url" href="https://aka.ms/VSCode/Live" target="_blank"&gt;https://aka.ms/VSCode/Live&lt;/A&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Happy coding!&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 22 Apr 2025 19:04:13 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/desenvolvedores-br/destaques-do-vs-code-live-agent-mode-day/ba-p/4406750</guid>
      <dc:creator>cynthiazanoni</dc:creator>
      <dc:date>2025-04-22T19:04:13Z</dc:date>
    </item>
  </channel>
</rss>

