<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ramon Domingos Blog</title>
	<atom:link href="https://ramondomingos.com.br/feed/" rel="self" type="application/rss+xml" />
	<link>https://ramondomingos.com.br/</link>
	<description>Conteúdo sobre tecnologia e engenharia de software.</description>
	<lastBuildDate>Sat, 04 Apr 2026 15:41:11 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://ramondomingos.com.br/wp-content/uploads/2023/09/cropped-Logotipo_bold_minimalista_amarelo_para_blog__1_-removebg-preview-32x32.png</url>
	<title>Ramon Domingos Blog</title>
	<link>https://ramondomingos.com.br/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Além do Código e dos Dados: O que o Mestrado me ensinou sobre a Vida (e sobre mim)</title>
		<link>https://ramondomingos.com.br/alem-do-codigo-e-dos-dados-o-que-o-mestrado-me-ensinou-sobre-a-vida-e-sobre-mim/</link>
					<comments>https://ramondomingos.com.br/alem-do-codigo-e-dos-dados-o-que-o-mestrado-me-ensinou-sobre-a-vida-e-sobre-mim/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Sat, 04 Apr 2026 15:41:10 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=291</guid>

					<description><![CDATA[<p>Muitas vezes este blog é um espaço de tutoriais, atualizações de frameworks e resoluções de bugs. Mas hoje, o commit é diferente. Recentemente, fechei um dos ciclos mais intensos da minha trajetória acadêmica e profissional: defendi meu mestrado. Se você me perguntasse há alguns meses como eu estava, a resposta técnica seria, processamento em 100%&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/alem-do-codigo-e-dos-dados-o-que-o-mestrado-me-ensinou-sobre-a-vida-e-sobre-mim/">Além do Código e dos Dados: O que o Mestrado me ensinou sobre a Vida (e sobre mim)</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Muitas vezes este blog é um espaço de tutoriais, atualizações de frameworks e resoluções de bugs. Mas hoje, o <em>commit</em> é diferente. Recentemente, fechei um dos ciclos mais intensos da minha trajetória acadêmica e profissional: <strong>defendi meu mestrado.</strong></p>



<p>Se você me perguntasse há alguns meses como eu estava, a resposta técnica seria, processamento em 100% de CPU, com vazamento de memória constante, pod em CrashLoopBackOff, <em>race conditions</em> , <em>deadlocks</em>  e <em>resource exhaustion</em>;  Mas a resposta humana é mais profunda. Olhar para a ata de defesa assinada não foi apenas o recebimento de um título; foi o momento em que o silêncio finalmente venceu o barulho mental de anos de cobrança.</p>



<h4 class="wp-block-heading">A Síndrome do Impostor: O Bug no Sistema</h4>



<p>No mundo técnico, somos treinados para ter respostas. No mestrado, a primeira lição é aceitar que não sabemos quase nada. E é aí que a <strong>Síndrome do Impostor</strong> se instala.</p>



<p>Em muitas noites, enquanto eu revisava o capítulo de teoria sobre <strong>Middleware, processamento distribuído</strong>, uma voz no fundo da mente dizia: <em>&#8220;Em algum momento, a banca vai perceber que eu não sou tão bom quanto pareço, passar na seleção foi pura sorte&#8221;</em>.</p>



<p>A verdade que aprendi é que a síndrome do impostor não é um erro de sistema; ela é uma consequência de estar na fronteira do conhecimento. Se você sente que não sabe tudo, é porque finalmente chegou onde ninguém mais pisou exatamente do seu jeito. O título não cura a síndrome, mas te ensina que você é capaz de entregar resultados mesmo quando não se sente um &#8220;expert&#8221;.</p>



<h4 class="wp-block-heading">Atalhos que são, na verdade, Labirintos &#8211; DICA PARA QUEM TA COMEÇANDO NA PESQUISA! </h4>



<p>Para quem está entrando agora no mestrado ou começando uma pesquisa, o instinto de desenvolvedor, o de otimizar processos, pode ser perigoso. No mestrado, <strong>atalhos raramente funcionam</strong>. </p>



<p>RETIRE SEU CHAPEUZINHO DE DEV <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f9e2.png" alt="🧢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> E BOTE O DE PESQUISADOR<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f3a9.png" alt="🎩" class="wp-smiley" style="height: 1em; max-height: 1em;" />.</p>



<ul class="wp-block-list">
<li><strong>O atalho da leitura rápida:</strong> Tentar escrever sua fundamentação sem ler os artigos clássicos a fundo é como construir um sistema em cima de uma biblioteca que você não entende. Mais cedo ou mais tarde, o código quebra e você terá que refazer tudo do zero.</li>



<li><strong>Confie no processo</strong>: O seu orientador(a) ja fez isso várias vezes, ele/a sabe a ordem dos passos, se perder faz parte do processo, uma hora voce encontra o seu caminho.</li>



<li><strong>O atalho da &#8220;Ferramenta da Moda&#8221;:</strong> Não escolha um método ou tecnologia só porque ela está no topo do Hype Cycle. Se a ferramenta não resolve o seu problema científico, ela é apenas ruído acumulado no seu cronograma.</li>



<li><strong>O atalho do isolamento:</strong> Achar que pesquisar é um ato solitário é o erro mais comum. O mestrado é um esporte de equipe. O tempo que você economiza não falando com seu orientador ou com seus pares, você perde dando voltas em problemas que uma conversa de 15 minutos resolveria.</li>
</ul>



<h4 class="wp-block-heading">Conselhos de quem &#8220;sobreviveu&#8221; ao Quilômetro Zero</h4>



<p>Se você está começando hoje, aqui estão três coisas que eu gostaria de ter ouvido logo no primeiro dia:</p>



<ol class="wp-block-list">
<li><strong>Documente seus &#8220;Erros&#8221;:</strong> No desenvolvimento, amamos logs. Na pesquisa, o resultado que deu errado também é ciência. Anote por que aquela abordagem não funcionou. Isso vale ouro na hora de escrever a conclusão.</li>



<li><strong>Defina seu MVP (Minimum Viable Thesis):</strong> O mestrado não é para resolver todos os problemas do mundo, mas para resolver UM problema com profundidade. Foque no coração da sua contribuição e deixe a perfumaria para o doutorado.</li>



<li><strong>Saúde Mental é Infraestrutura:</strong> Se o seu hardware (você) pifar, o software (a tese) não roda. Reserve janelas de tempo onde a tese não existe. Se puder, faça terapia, isso me ajudou muito. Normalmente, sua vida não irá parar para você fazer seu mestrado, problemas pessoais, familiares, e do trabalho irão continuar acontecendo, e irão concorrer com esse novo projeto.</li>
</ol>



<h4 class="wp-block-heading">Conclusão: A Realização é um Processo</h4>



<p>A sensação de realização não veio na assinatura da ata, mas na percepção de que hoje sou capaz de encarar um problema complexo e sem resposta sem entrar em pânico. O mestrado me deu o título de Mestre, mas a jornada me deu a resiliência de quem sabe que, para debugar a vida, é preciso paciência e muitas iterações.</p>



<p>Obrigado por me acompanharem nesta jornada técnica (e agora pessoal). Se você está no meio desse furacão chamado mestrado, saiba que o &#8220;deployment&#8221; final vale cada linha de esforço. </p>



<p>E eu acho que já estou com saudades da UFRN&#8230;.</p>



<p></p>
<p>O post <a href="https://ramondomingos.com.br/alem-do-codigo-e-dos-dados-o-que-o-mestrado-me-ensinou-sobre-a-vida-e-sobre-mim/">Além do Código e dos Dados: O que o Mestrado me ensinou sobre a Vida (e sobre mim)</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/alem-do-codigo-e-dos-dados-o-que-o-mestrado-me-ensinou-sobre-a-vida-e-sobre-mim/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>O Que é Dual Write? Escrevendo Dados em Dois Lugares ao Mesmo Tempo</title>
		<link>https://ramondomingos.com.br/o-que-e-dual-write-escrevendo-dados-em-dois-lugares-ao-mesmo-tempo/</link>
					<comments>https://ramondomingos.com.br/o-que-e-dual-write-escrevendo-dados-em-dois-lugares-ao-mesmo-tempo/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Tue, 29 Jul 2025 20:45:24 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=284</guid>

					<description><![CDATA[<p>No cotidiano do engenheiro de software, frequentemente nos deparamos com desafios complexos de integração de sistemas. Um conceito que surge bastante em discussões sobre sincronização de dados é o Dual Write. Pode parecer um termo técnico, mas vou tentar explicar de forma acessível para que todos, independentemente da área, possam entender o que é e&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/o-que-e-dual-write-escrevendo-dados-em-dois-lugares-ao-mesmo-tempo/">O Que é Dual Write? Escrevendo Dados em Dois Lugares ao Mesmo Tempo</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>No cotidiano do engenheiro de software, frequentemente nos deparamos com desafios complexos de integração de sistemas. Um conceito que surge bastante em discussões sobre sincronização de dados é o <strong>Dual Write</strong>. Pode parecer um termo técnico, mas vou tentar explicar de forma acessível para que todos, independentemente da área, possam entender o que é e por que é importante.</p>



<h3 class="wp-block-heading">A Base: O Que Acontece Quando Você Salva Dados?</h3>



<p>Imagine que você está usando um aplicativo bancário para transferir dinheiro. Quando você clica em &#8220;confirmar&#8221;, o sistema precisa registrar essa transação. Na maioria das vezes, essa informação é escrita em um <strong>banco de dados primário</strong>. Tudo simples até aqui, certo?</p>



<h3 class="wp-block-heading">Entendendo o Dual Write</h3>



<p>O Dual Write (escrita dupla, em tradução livre) é exatamente o que o nome sugere: <strong>o processo de escrever os mesmos dados em dois sistemas de armazenamento de dados diferentes, de forma simultânea ou quase simultânea</strong>.</p>



<p>Pense no nosso exemplo do aplicativo bancário. Se, além do banco de dados principal do banco, a informação da sua transação também fosse registrada <em>ao mesmo tempo</em> em um sistema de relatórios ou em um data warehouse para análise de dados. Isso seria um cenário de Dual Write.</p>



<h3 class="wp-block-heading">Por Que Usamos Dual Write?</h3>



<p>Existem várias razões pelas quais um engenheiro de software escolheria implementar o Dual Write. As mais comuns incluem:</p>



<ul class="wp-block-list">
<li><strong>Sincronização de Dados em Tempo Real:</strong> Em muitos cenários, precisamos que as informações estejam atualizadas em múltiplos sistemas imediatamente. Por exemplo, se uma venda é feita no sistema de e-commerce, o estoque no sistema de gerenciamento de armazém precisa ser atualizado instantaneamente. O Dual Write garante que ambos os sistemas recebam a informação ao mesmo tempo.</li>



<li><strong>Redundância e Recuperação de Desastres:</strong> Ao escrever dados em dois lugares, você cria uma cópia de segurança. Se um sistema falhar, o outro ainda tem os dados, o que ajuda na recuperação e garante a continuidade do negócio.</li>



<li><strong>Integração de Sistemas Distintos:</strong> Às vezes, diferentes departamentos usam sistemas diferentes que precisam da mesma informação. Em vez de construir integrações complexas que puxam e empurram dados de um lado para o outro, o Dual Write pode ser uma solução mais direta para manter ambos atualizados.</li>



<li><strong>Desempenho Otimizado:</strong> Em alguns casos, um sistema pode ser otimizado para transações rápidas (por exemplo, um banco de dados de pedidos), enquanto outro é otimizado para análises complexas (um data warehouse). O Dual Write permite que cada sistema use os dados da forma mais eficiente para sua finalidade.</li>
</ul>



<h3 class="wp-block-heading">Os Desafios do Dual Write</h3>



<p>Apesar de seus benefícios, o Dual Write não é uma bala de prata e apresenta seus próprios desafios:</p>



<ul class="wp-block-list">
<li><strong>Consistência dos Dados:</strong> O maior desafio é garantir que os dados sejam exatamente os mesmos em ambos os sistemas. O que acontece se uma escrita em um sistema falha e no outro não? É preciso ter mecanismos robustos para lidar com essas falhas e garantir a <strong>consistência</strong>.</li>



<li><strong>Complexidade na Implementação:</strong> Gerenciar duas escritas simultâneas, lidar com erros, retentativas e garantir a ordem correta das operações pode tornar a arquitetura do sistema mais complexa.</li>



<li><strong>Desempenho:</strong> Embora possa otimizar o desempenho para propósitos específicos, o Dual Write adiciona uma sobrecarga, pois cada operação de escrita precisa ser realizada duas vezes. Isso pode impactar a latência, especialmente se os sistemas estiverem geograficamente distantes.</li>



<li><strong>Tratamento de Conflitos:</strong> Se ambos os sistemas permitirem escritas independentes, pode haver conflitos que precisam ser resolvidos de forma inteligente para evitar dados inconsistentes.</li>
</ul>



<h3 class="wp-block-heading">Alternativas ao Dual Write</h3>



<p>É importante mencionar que o Dual Write não é a única forma de sincronizar dados. Existem outras abordagens, como:</p>



<ul class="wp-block-list">
<li><strong>Event-Driven Architecture (Arquitetura Orientada a Eventos):</strong> Onde um sistema publica um &#8220;evento&#8221; (ex: &#8220;pedido criado&#8221;) e outros sistemas interessados escutam e reagem a esse evento, atualizando seus próprios dados. Isso é geralmente mais robusto e escalável para cenários complexos.</li>



<li><strong>ETL (Extract, Transform, Load):</strong> Processos que extraem dados de uma fonte, os transformam e os carregam em um destino. Isso geralmente acontece em lotes e é mais comum para data warehouses ou sistemas de relatórios onde a latência de tempo real não é crítica.</li>
</ul>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="1024" src="https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-1024x1024.png" alt="" class="wp-image-285" srcset="https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-1024x1024.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-300x300.png 300w, https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-150x150.png 150w, https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-768x768.png 768w, https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr-1536x1536.png 1536w, https://ramondomingos.com.br/wp-content/uploads/2025/07/Gemini_Generated_Image_auwr30auwr30auwr.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading"></h3>



<p>O Dual Write é uma técnica valiosa no arsenal de um engenheiro de software para manter sistemas em sincronia. Embora ofereça benefícios significativos em termos de sincronização em tempo real e redundância, é crucial entender seus desafios e considerar se é a melhor abordagem para um determinado problema. A escolha da estratégia de sincronização de dados depende das necessidades específicas do negócio, da tolerância a falhas e dos requisitos de desempenho.</p>



<p>Espero que esta explicação tenha desmistificado o Dual Write para vocês! Se tiverem alguma dúvida ou quiserem compartilhar suas experiências, deixem um comentário.</p>
<p>O post <a href="https://ramondomingos.com.br/o-que-e-dual-write-escrevendo-dados-em-dois-lugares-ao-mesmo-tempo/">O Que é Dual Write? Escrevendo Dados em Dois Lugares ao Mesmo Tempo</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/o-que-e-dual-write-escrevendo-dados-em-dois-lugares-ao-mesmo-tempo/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Qualificado! Minha Jornada e os Desafios da LGPD em Microsserviços</title>
		<link>https://ramondomingos.com.br/qualificado-minha-jornada-e-os-desafios-da-lgpd-em-microsservicos/</link>
					<comments>https://ramondomingos.com.br/qualificado-minha-jornada-e-os-desafios-da-lgpd-em-microsservicos/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Fri, 11 Jul 2025 16:57:49 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=278</guid>

					<description><![CDATA[<p>É com uma enorme alegria e um grande alívio que venho compartilhar uma excelente notícia: fui qualificado no meu mestrado! Este é um marco muito importante na minha jornada acadêmica e pessoal, e quero aproveitar para contar um pouco sobre essa experiência e, claro, apresentar o tema que me consumiu (no bom sentido!) nos últimos&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/qualificado-minha-jornada-e-os-desafios-da-lgpd-em-microsservicos/">Qualificado! Minha Jornada e os Desafios da LGPD em Microsserviços</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>É com uma enorme alegria e um grande alívio que venho compartilhar uma excelente notícia: <strong>fui qualificado no meu mestrado</strong>! Este é um marco muito importante na minha jornada acadêmica e pessoal, e quero aproveitar para contar um pouco sobre essa experiência e, claro, apresentar o tema que me consumiu (no bom sentido!) nos últimos tempos.<br><br>A qualificação é um momento de grande tensão, mas também de muito aprendizado. Foram meses de dedicação intensa, de imersão profunda na literatura, de noites de poucas horas de sono e de muito café. Enfrentar a banca, com professores tão experientes como <strong>Eiji Adachi Medeiros Barbosa (presidente,orientador), Frederico Araujo da Silva Lopes (membro interno) e Carlos Eduardo da Silva (membro externo)</strong>, foi desafiador, mas incrivelmente enriquecedor. As perguntas e sugestões foram cruciais para lapidar ainda mais a minha pesquisa e me deixam ainda mais motivado(a) para a próxima etapa.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Meu Tema: Adaptando-se à LGPD com Middleware em Sistemas Distribuídos</h3>



<p>Minha pesquisa, intitulada &#8220;<strong>Adaptação à LGPD: Proposta de Middleware para a Implementação do Direito ao Esquecimento em Sistemas Distribuídos</strong>&#8220;, mergulha em um desafio crescente para muitas empresas: como garantir o <strong>direito ao esquecimento</strong> de dados, exigido pela <strong>LGPD</strong>, em sistemas modernos baseados em <strong>microsserviços</strong>?</p>



<p>Para quem não está familiarizado, sistemas de microsserviços são complexos, com dados espalhados e gerenciados de forma independente. Isso torna a exclusão consistente e confiável de dados uma tarefa manual e suscetível a erros, com grandes ramificações legais se não for bem executada.</p>



<p>É aí que entra a minha proposta! Desenvolvi uma solução de <strong>middleware automatizada</strong>, utilizando o padrão <em>two-phase commit (2PC)</em>, para orquestrar a exclusão de dados de forma consistente e segura nesses ambientes distribuídos. Além disso, criei uma biblioteca que pode ser facilmente importada em códigos existentes, simplificando a vida dos desenvolvedores e facilitando a adesão às regulamentações. Em minhas 118 páginas de trabalho, detalho a arquitetura e avalio o desempenho dessa abordagem, demonstrando sua eficácia para um problema que hoje é repleto de complexidade manual.</p>



<p>Em resumo, o objetivo é oferecer uma solução robusta e escalável que capacite as organizações a gerenciar efetivamente a exclusão de dados em ambientes de microsserviços, promovendo maior confiança e adesão às regulamentações de proteção de dados.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Quem é próximo a mim, sabe que eu, mesmo fazendo um trabalho bom, fico diversas vezes inseguro; Em relação a essa apresentação não poderia ser diferente; Quando eu vi meu nome no site da UFRN, com a data da defesa (<a href="https://sigaa.ufrn.br/sigaa/public/programa/noticias_desc.jsf?lc=pt_BR&amp;id=7872&amp;noticia=182750128">link</a>), começou o nervosismo, o medo de não responder adequadamente alguma pergunta, mesmo estando imerso no tema por 2 anos.</p>



<p>Minha dica pra quem chegou nesse momento:</p>



<p>Os professores estão ali para contribuir como seu trabalho, para ele ficar mais maduro;</p>



<p>Seu orientador JAMAIS iria deixar você levar algo que não esteja suficiente para aquele momento;</p>



<figure class="wp-block-image size-large"><img decoding="async" width="576" height="1024" src="https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-576x1024.jpeg" alt="" class="wp-image-279" srcset="https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-576x1024.jpeg 576w, https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-169x300.jpeg 169w, https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-768x1365.jpeg 768w, https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-864x1536.jpeg 864w, https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-1152x2048.jpeg 1152w, https://ramondomingos.com.br/wp-content/uploads/2025/07/932CA0B5-EA30-4696-88B9-25459E720F72-scaled.jpeg 1440w" sizes="(max-width: 576px) 100vw, 576px" /></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>Este é um passo gigante e sou imensamente grato a todos que me apoiaram nessa jornada. A energia agora se renova para os próximos desafios até a defesa final!</p>
<p>O post <a href="https://ramondomingos.com.br/qualificado-minha-jornada-e-os-desafios-da-lgpd-em-microsservicos/">Qualificado! Minha Jornada e os Desafios da LGPD em Microsserviços</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/qualificado-minha-jornada-e-os-desafios-da-lgpd-em-microsservicos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Conciliando a Tese e o Blog: Um Desafio da Vida de TI!</title>
		<link>https://ramondomingos.com.br/conciliando-a-tese-e-o-blog-um-desafio-da-vida-de-ti/</link>
					<comments>https://ramondomingos.com.br/conciliando-a-tese-e-o-blog-um-desafio-da-vida-de-ti/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Tue, 03 Jun 2025 17:51:52 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=270</guid>

					<description><![CDATA[<p>Olá, pessoal! Se você notou um silêncio maior do que o normal por aqui, tem uma boa razão para isso: estou imerso na escrita da minha tese de mestrado! Como muitos de vocês que trabalham com TI e buscam aprofundar seus conhecimentos, sei que a jornada acadêmica exige uma dedicação enorme. Conciliar as horas de&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/conciliando-a-tese-e-o-blog-um-desafio-da-vida-de-ti/">Conciliando a Tese e o Blog: Um Desafio da Vida de TI!</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Olá, pessoal!</p>



<p>Se você notou um silêncio maior do que o normal por aqui, tem uma boa razão para isso: estou imerso na escrita da minha tese de mestrado! Como muitos de vocês que trabalham com TI e buscam aprofundar seus conhecimentos, sei que a jornada acadêmica exige uma dedicação enorme.</p>



<p>Conciliar as horas de pesquisa, escrita e revisão com a rotina de um blog de TI e o meu trabalho, é, sem dúvida, um desafio. Confesso que tem sido uma verdadeira maratona, mas estou aprendendo muito no processo – tanto sobre o tema da minha tese quanto sobre <strong>gerenciamento de tempo e prioridades</strong>!</p>



<p>Ainda não quero detalhar muito sobre o assunto da tese, mas em breve, espero trazer alguns insights e, quem sabe, até um post mais aprofundado sobre a minha pesquisa. Por enquanto, a prioridade máxima é entregar um trabalho de qualidade.</p>



<p>Agradeço a compreensão de todos vocês e prometo que, assim que tiver um fôlego, voltarei com conteúdo novo e interessante. Enquanto isso, continuem explorando os posts antigos e deixando seus comentários!</p>



<p>Em breve, mais novidades!</p>



<p>Um abraço,</p>
<p>O post <a href="https://ramondomingos.com.br/conciliando-a-tese-e-o-blog-um-desafio-da-vida-de-ti/">Conciliando a Tese e o Blog: Um Desafio da Vida de TI!</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/conciliando-a-tese-e-o-blog-um-desafio-da-vida-de-ti/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Rastreando Requisições no FastAPI com Trace IDs: Desvendando o Fluxo da sua Aplicação! 🕵️‍♂️</title>
		<link>https://ramondomingos.com.br/rastreando-requisicoes-no-fastapi-com-trace-ids-desvendando-o-fluxo-da-sua-aplicacao-%f0%9f%95%b5%ef%b8%8f%e2%99%82%ef%b8%8f/</link>
					<comments>https://ramondomingos.com.br/rastreando-requisicoes-no-fastapi-com-trace-ids-desvendando-o-fluxo-da-sua-aplicacao-%f0%9f%95%b5%ef%b8%8f%e2%99%82%ef%b8%8f/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Fri, 18 Apr 2025 01:49:51 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=263</guid>

					<description><![CDATA[<p>Em aplicações distribuídas ou mesmo em backends complexos construídos com FastAPI, rastrear o caminho completo de uma requisição pode ser um desafio. Quando ocorrem erros ou gargalos de performance, saber exatamente qual serviço ou parte do código foi o responsável é crucial para um debugging eficiente. É aí que entram os Trace IDs (IDs de&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/rastreando-requisicoes-no-fastapi-com-trace-ids-desvendando-o-fluxo-da-sua-aplicacao-%f0%9f%95%b5%ef%b8%8f%e2%99%82%ef%b8%8f/">Rastreando Requisições no FastAPI com Trace IDs: Desvendando o Fluxo da sua Aplicação! 🕵️‍♂️</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Em aplicações distribuídas ou mesmo em backends complexos construídos com FastAPI, rastrear o caminho completo de uma requisição pode ser um desafio. Quando ocorrem erros ou gargalos de performance, saber exatamente qual serviço ou parte do código foi o responsável é crucial para um debugging eficiente.</p>



<p>É aí que entram os <strong>Trace IDs</strong> (IDs de rastreamento)! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p>Um Trace ID é um identificador único gerado para cada requisição que entra na sua aplicação. Esse ID é propagado por todos os serviços e componentes envolvidos no processamento daquela requisição, permitindo que você correlacione logs e métricas de diferentes partes do sistema.</p>



<p><strong>Por que usar Trace IDs no seu FastAPI?</strong></p>



<ul class="wp-block-list">
<li><strong>Debugging Facilitado:</strong> Rastreie o fluxo completo de uma requisição, desde o ponto de entrada até a resposta final, identificando exatamente onde ocorreu um erro ou lentidão.</li>



<li><strong>Análise de Performance:</strong> Visualize o tempo gasto em cada etapa do processamento, identificando gargalos e áreas para otimização.</li>



<li><strong>Observabilidade Aprimorada:</strong> Integre com ferramentas de logging e monitoramento (como ELK Stack, Grafana Loki, Datadog) para ter uma visão centralizada do comportamento da sua aplicação.</li>



<li><strong>Microserviços:</strong> Essencial em arquiteturas de microsserviços para entender a interação entre diferentes serviços em uma única requisição.</li>
</ul>



<p><strong>Como implementar Trace IDs no FastAPI?</strong></p>



<p>Existem algumas maneiras de implementar Trace IDs no seu FastAPI:</p>



<p><strong>1. Middleware Personalizado:</strong></p>



<p>Você pode criar um middleware personalizado para gerar um Trace ID para cada requisição e adicioná-lo aos headers da requisição e/ou ao contexto da aplicação.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="from fastapi import FastAPI, Request, Response
from uuid import uuid4
import logging

app = FastAPI()
logger = logging.getLogger(__name__)

TRACE_ID_HEADER = &quot;X-Request-ID&quot;

@app.middleware(&quot;http&quot;)
async def add_trace_id(request: Request, call_next):
    trace_id = request.headers.get(TRACE_ID_HEADER) or str(uuid4())
    request.state.trace_id = trace_id
    response: Response = await call_next(request)
    response.headers[TRACE_ID_HEADER] = trace_id
    logger.info(f&quot;Request: {request.method} {request.url} - Trace ID: {trace_id}&quot;)
    return response

@app.get(&quot;/&quot;)
async def read_root(request: Request):
    trace_id = request.state.trace_id
    logger.info(f&quot;Processing root endpoint - Trace ID: {trace_id}&quot;)
    return {&quot;Hello&quot;: &quot;World&quot;, &quot;trace_id&quot;: trace_id}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> fastapi </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> FastAPI</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> Request</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> Response</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> uuid </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> uuid4</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> logging</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">app </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">FastAPI</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">logger </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">getLogger</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">__name__</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">TRACE_ID_HEADER </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">X-Request-ID</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">@</span><span style="color: #D08770">app</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">middleware</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">add_trace_id</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">request</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> Request</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">call_next</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    trace_id </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">headers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">TRACE_ID_HEADER</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">or</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">str</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">uuid4</span><span style="color: #ECEFF4">())</span></span>
<span class="line"><span style="color: #D8DEE9FF">    request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">state</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">trace_id </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> trace_id</span></span>
<span class="line"><span style="color: #D8DEE9FF">    response</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> Response </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">await</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">call_next</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    response</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">headers</span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">TRACE_ID_HEADER</span><span style="color: #ECEFF4">]</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> trace_id</span></span>
<span class="line"><span style="color: #D8DEE9FF">    logger</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">info</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;Request: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">method</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C"> </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">url</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C"> - Trace ID: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">trace_id</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> response</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">@</span><span style="color: #D08770">app</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">get</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">read_root</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">request</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> Request</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    trace_id </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">state</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">trace_id</span></span>
<span class="line"><span style="color: #D8DEE9FF">    logger</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">info</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;Processing root endpoint - Trace ID: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">trace_id</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Hello</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">World</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">trace_id</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> trace_id</span><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p><strong>Explicação:</strong></p>



<ul class="wp-block-list">
<li>O middleware <code>add_trace_id</code> é executado para cada requisição HTTP.</li>



<li>Ele tenta obter um Trace ID do header <code>X-Request-ID</code> (uma prática comum). Se não existir, gera um novo UUID.</li>



<li>O Trace ID é armazenado no <code>request.state</code> para ser acessado em outras partes da sua aplicação.</li>



<li>O Trace ID também é adicionado como um header na resposta.</li>



<li>Você pode incluir o Trace ID nos seus logs para facilitar o rastreamento.</li>
</ul>



<p><strong>2. Utilizando Bibliotecas de Observabilidade:</strong></p>



<p>Bibliotecas como <strong>Opentracing</strong> ou <strong>Opentelemetry</strong> oferecem soluções mais completas para tracing distribuído, incluindo a geração e propagação de Trace IDs, além de integração com diversas ferramentas de observabilidade.</p>



<p><strong>Exemplo com Opentelemetry (simplificado):</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="from fastapi import FastAPI, Request
from opentelemetry import trace
from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator

app = FastAPI()
propagator = TraceContextTextMapPropagator()
tracer = trace.get_tracer(__name__)

@app.middleware(&quot;http&quot;)
async def trace_request(request: Request, call_next):
    carrier = {}
    for k, v in request.headers.items():
        carrier[k] = v
    context = propagator.extract(carrier)
    with tracer.start_as_current_span(f&quot;{request.method} {request.url.path}&quot;, context=context) as span:
        span.set_attribute(&quot;http.method&quot;, request.method)
        span.set_attribute(&quot;http.url&quot;, str(request.url))
        response = await call_next(request)
        span.set_attribute(&quot;http.status_code&quot;, response.status_code)
        return response

@app.get(&quot;/&quot;)
async def read_root():
    current_span = trace.get_current_span()
    current_span.set_attribute(&quot;greeting&quot;, &quot;Hello World&quot;)
    return {&quot;Hello&quot;: &quot;World&quot;}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> fastapi </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> FastAPI</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> Request</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> opentelemetry </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> trace</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> opentelemetry</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">trace</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">propagation</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">tracecontext </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> TraceContextTextMapPropagator</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">app </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">FastAPI</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">propagator </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">TraceContextTextMapPropagator</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">tracer </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> trace</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get_tracer</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">__name__</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">@</span><span style="color: #D08770">app</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">middleware</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">trace_request</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">request</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> Request</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">call_next</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    carrier </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{}</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> k</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> v </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">headers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">items</span><span style="color: #ECEFF4">():</span></span>
<span class="line"><span style="color: #D8DEE9FF">        carrier</span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">k</span><span style="color: #ECEFF4">]</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> v</span></span>
<span class="line"><span style="color: #D8DEE9FF">    context </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> propagator</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">extract</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">carrier</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">with</span><span style="color: #D8DEE9FF"> tracer</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">start_as_current_span</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&quot;</span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">method</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C"> </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">url</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">path</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">context</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">context</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">as</span><span style="color: #D8DEE9FF"> span</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        span</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">set_attribute</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http.method</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">method</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        span</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">set_attribute</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http.url</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">str</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">url</span><span style="color: #ECEFF4">))</span></span>
<span class="line"><span style="color: #D8DEE9FF">        response </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">await</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">call_next</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">request</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        span</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">set_attribute</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">http.status_code</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> response</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">status_code</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> response</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">@</span><span style="color: #D08770">app</span><span style="color: #ECEFF4">.</span><span style="color: #D08770">get</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">/</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #81A1C1">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">read_root</span><span style="color: #ECEFF4">():</span></span>
<span class="line"><span style="color: #D8DEE9FF">    current_span </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> trace</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get_current_span</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">    current_span</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">set_attribute</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">greeting</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Hello World</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Hello</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">World</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p><strong>Considerações Importantes:</strong></p>



<ul class="wp-block-list">
<li><strong>Propagação:</strong> Em arquiteturas com múltiplos serviços, é crucial garantir que o Trace ID seja propagado corretamente entre as chamadas HTTP. Isso geralmente envolve passar o Trace ID em headers HTTP.</li>



<li><strong>Logging:</strong> Configure sua solução de logging para incluir o Trace ID em cada log, permitindo a correlação de eventos relacionados à mesma requisição.</li>



<li><strong>Ferramentas de Observabilidade:</strong> Integre sua aplicação com ferramentas de observabilidade para visualizar os traces, analisar a performance e identificar problemas de forma mais intuitiva.</li>
</ul>



<p>Implementar Trace IDs no seu FastAPI é um investimento valioso que melhora significativamente a capacidade de entender, depurar e otimizar sua aplicação, especialmente em cenários mais complexos. Comece com um middleware simples e explore bibliotecas de observabilidade para uma solução mais robusta! <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>O post <a href="https://ramondomingos.com.br/rastreando-requisicoes-no-fastapi-com-trace-ids-desvendando-o-fluxo-da-sua-aplicacao-%f0%9f%95%b5%ef%b8%8f%e2%99%82%ef%b8%8f/">Rastreando Requisições no FastAPI com Trace IDs: Desvendando o Fluxo da sua Aplicação! 🕵️‍♂️</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/rastreando-requisicoes-no-fastapi-com-trace-ids-desvendando-o-fluxo-da-sua-aplicacao-%f0%9f%95%b5%ef%b8%8f%e2%99%82%ef%b8%8f/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Desenvolvedores precisam Dominar o Google Analytics? Um Guia Prático com Next.js</title>
		<link>https://ramondomingos.com.br/desenvolvedores-precisam-dominar-o-google-analytics-um-guia-pratico-com-next-js/</link>
					<comments>https://ramondomingos.com.br/desenvolvedores-precisam-dominar-o-google-analytics-um-guia-pratico-com-next-js/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Wed, 25 Sep 2024 16:31:38 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=254</guid>

					<description><![CDATA[<p>Olá, devs! Já pararam para pensar na importância de entender como seus projetos são utilizados? Enquanto o pessoal de marketing se concentra em analisar os dados para criar estratégias, os desenvolvedores têm um papel fundamental em garantir que os dados coletados sejam precisos e completos. Neste post, vamos explorar por que o Google Analytics é&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/desenvolvedores-precisam-dominar-o-google-analytics-um-guia-pratico-com-next-js/">Desenvolvedores precisam Dominar o Google Analytics? Um Guia Prático com Next.js</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Olá, devs! </p>



<blockquote class="wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow">
<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="has-text-align-left">Recentemente consegui minha <a href="https://skillshop.credential.net/012ceb69-932e-44ff-b11d-57b112b85a2c">certificação Individual do Google Analytics </a>, e no início da jornada de estudo me perguntei, isso é para o pessoal de  Marketing ou para desenvolvedor?  Mas ao final, entendi que todo mundo precisa entender um pouco de analytics. Fazer sua aplicação gerar dados é fundamental, para identificar insights de todos os aspectos da aplicação. No fundo, ser guiados por dados é mais importante do que seguir seu sentimento.  E ter um google analytcs bem configurado, promoverá esses dados para toda equipe.</p>
</blockquote>
</blockquote>



<p>Já pararam para pensar na importância de entender como seus projetos são utilizados? Enquanto o pessoal de marketing se concentra em analisar os dados para criar estratégias, os desenvolvedores têm um papel fundamental em garantir que os dados coletados sejam precisos e completos. Neste post, vamos explorar por que o Google Analytics é uma ferramenta importante para desenvolvedores coletar esses dados, nesse post especialmente iremos aplicar o GA numa aplicação  Next.js, mas facilmente é adaptável para outras aplicações, Te guiarei passo a passo na instalação e configuração do funil de vendas. Identificando desde o início da sessão, a primeira visita ao site, até efetuar a compra no checkout. Podendo assim, identificar a porcentagem de abandono de carrinhos, por exemplo.</p>



<p></p>



<p>P<strong>or que os Desenvolvedores Devem Entender o Google Analytics?</strong></p>



<ul class="wp-block-list">
<li><strong>Otimização de Desempenho:</strong> Ao acompanhar métricas como tempo de carregamento de página, taxa de rejeição e erros, os desenvolvedores podem identificar gargalos e implementar melhorias para otimizar a experiência do usuário.</li>



<li><strong>Qualidade do Código:</strong> Analisando eventos e interações do usuário, é possível identificar bugs e problemas de usabilidade que podem passar despercebidos em testes.</li>



<li><strong>Validação de Hipóteses:</strong> Ao desenvolver novas funcionalidades, o Google Analytics permite validar se as mudanças estão tendo o impacto esperado nos usuários.</li>



<li><strong>Integração com Outras Ferramentas:</strong> O Google Analytics pode ser integrado com outras ferramentas de desenvolvimento, como ferramentas de monitoramento de desempenho e sistemas de versionamento, proporcionando uma visão mais completa do ciclo de vida do software.</li>
</ul>



<p><strong>Instalando o Google Analytics com Funil de Vendas em um Aplicação Next.js</strong></p>



<ul class="wp-block-list">
<li><strong>Criar uma Conta no Google Analytics:</strong> Se você ainda não tem uma conta, acesse o Google Analytics e crie uma nova propriedade para o seu site. (Provavelmente o marketing da empresa ja possuirá ) </li>



<li><strong>Obter o Código de Rastreamento:</strong> Após criar a propriedade, você receberá um código de rastreamento único.</li>



<li><strong>Instalar o Pacote do Google Analytics:</strong> No seu projeto Next.js, instale o pacote oficial do Google Analytics.</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=" npm install @google/analytics" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">npm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">@google/analytics</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>Configurar o Rastreamento:</strong> Crie um componente customizado para envolver o seu aplicativo e enviar os dados para o Google Analytics.</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="const GoogleAnalytics = () =&gt; {
return (&lt;&gt;
/* 1. Initialize the Google tag and gtag.js library */
   &lt;!-- Google tag (gtag.js) --&gt;
   &lt;script async src=&quot;https://www.googletagmanager.com/gtag/js?id=TAG_ID&quot;&gt;&lt;/script&gt;
   &lt;script&gt;
     window.dataLayer = window.dataLayer || [];
     function gtag(){dataLayer.push(arguments)};
     gtag('js', new Date());
     gtag('config', 'TAG_ID');
   &lt;/script&gt;
   &lt;/&gt;
   )
   
export { GoogleAnalytics };" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">const</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">GoogleAnalytics</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> (</span><span style="color: #81A1C1">&lt;&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">/* 1. Initialize the Google tag and gtag.js library */</span></span>
<span class="line"><span style="color: #D8DEE9FF">   &lt;!-- Google tag (gtag.js) --&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;script</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">async</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">src</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">https://www.googletagmanager.com/gtag/js?id=TAG_ID</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">&gt;&lt;/script&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;script&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">     window.dataLayer = window.dataLayer || [];</span></span>
<span class="line"><span style="color: #D8DEE9FF">     function gtag()</span><span style="color: #81A1C1">{</span><span style="color: #D8DEE9">dataLayer</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">push</span><span style="color: #D8DEE9FF">(</span><span style="color: #81A1C1">arguments</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">}</span><span style="color: #D8DEE9FF">;</span></span>
<span class="line"><span style="color: #D8DEE9FF">     gtag(&#39;js&#39;, new Date());</span></span>
<span class="line"><span style="color: #D8DEE9FF">     gtag(&#39;config&#39;, &#39;TAG_ID&#39;);</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;/script&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span><span style="color: #81A1C1">&lt;/&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">   )</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">GoogleAnalytics</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<ul class="wp-block-list">
<li>Use esse componente no layout principal da sua aplicação.</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="import { GoogleAnalytics } from &quot;seu_componente_google-analytics&quot;;
export default function RootLayout({
  children,
}: Readonly&lt;{
  children: React.ReactNode;
}&gt;) {
  return (
    &lt;html&gt;
      &lt;body&gt;
        {children}
        &lt;GoogleAnalytics /&gt;
      &lt;/body&gt;
    &lt;/html&gt;
  );
}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">GoogleAnalytics</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">seu_componente_google-analytics</span><span style="color: #ECEFF4">&quot;</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #81A1C1">export</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">default</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">function</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">RootLayout</span><span style="color: #ECEFF4">({</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #D8DEE9">children</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #81A1C1">:</span><span style="color: #D8DEE9FF"> Readonly</span><span style="color: #ECEFF4">&lt;{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  children</span><span style="color: #81A1C1">:</span><span style="color: #D8DEE9FF"> React</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">ReactNode</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}&gt;)</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> (</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">&lt;html&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">&lt;body&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">{</span><span style="color: #D8DEE9">children</span><span style="color: #81A1C1">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">&lt;</span><span style="color: #8FBCBB">GoogleAnalytics</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">/&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #81A1C1">&lt;/body&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">&lt;/html&gt;</span></span>
<span class="line"><span style="color: #D8DEE9FF">  )</span><span style="color: #81A1C1">;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span></code></pre></div>



<h2 class="wp-block-heading">Eventos principais</h2>



<p>Para criar um funil de vendas, você precisa mapear alguns eventos:</p>



<ol class="wp-block-list">
<li>Início da sessão (o número de usuários que acionaram o evento  <a href="https://support.google.com/analytics/answer/9234069#session_start">session_start</a>)</li>



<li>Ver produto (o número de usuários que acionaram o evento  <a href="https://support.google.com/analytics/answer/9267735">view_item</a>)</li>



<li>Adicionar ao carrinho (o número de usuários que acionaram o evento <a href="https://support.google.com/analytics/answer/9267735">add_to_cart</a>)</li>



<li>Iniciar checkout (o número de usuários que acionaram o evento <a href="https://support.google.com/analytics/answer/9267735">begin_checkout</a>)</li>



<li>Compra (o número de usuários que acionaram  o evento <a href="https://support.google.com/analytics/answer/9267735">purchase</a> ou <a href="https://support.google.com/analytics/answer/9234069#in-app-purchase">in_app_purchase</a>)</li>
</ol>



<p>Nos links de cada evento tem o formato de dados que devem ser enviados junto do evento, alguns não precisa enviar nada além do titulo do evento. É muito importante enviar exatamente os campos necessários, dados faltando, ou em excesso irá fazer com que o evento seja descartado.</p>



<p>Para fazer o envio, basicamente será necessário usa a função, gtag. Aconselho criar uma função mais generalista e reutilizar em todos os lugares, pois será importante caso precise debugar, adicionar o <em>debug_mode:true</em>, em cada envio.)</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=" window.gtag(&quot;event&quot;, event,eventParams ) " style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">window</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">gtag</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">event</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">event</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9">eventParams</span><span style="color: #D8DEE9FF"> ) </span></span></code></pre></div>



<p>Exemplo para adicionar um  ou mais item ao carrinho:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="gtag(&quot;event&quot;, &quot;add_to_cart&quot;, {
  currency: &quot;BRL&quot;,
  value: 9.99,
  items: [
    {
      item_id: &quot;SKU_12345&quot;,
      item_name: &quot;Stan and Friends Tee&quot;,
      index: 0,
      price: 9.99,
      quantity: 1
    }
  ]
});" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">gtag</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">event</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">add_to_cart</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">currency</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">BRL</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">9.99</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">items</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> [</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SKU_12345</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Stan and Friends Tee</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">index</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">price</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">9.99</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">quantity</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #D8DEE9FF">  ]</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<p>Exemplo de purchase:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="gtag(&quot;event&quot;, &quot;purchase&quot;, {
    transaction_id: &quot;T_12345&quot;,
    value: 25.42,
    tax: 4.90,
    shipping: 5.99,
    currency: &quot;USD&quot;,
    coupon: &quot;SUMMER_SALE&quot;,
    items: [
     {
      item_id: &quot;SKU_12345&quot;,
      item_name: &quot;Stan and Friends Tee&quot;,
      affiliation: &quot;Google Merchandise Store&quot;,
      coupon: &quot;SUMMER_FUN&quot;,
      discount: 2.22,
      index: 0,
      item_brand: &quot;Google&quot;,
      item_category: &quot;Apparel&quot;,
      item_category2: &quot;Adult&quot;,
      item_category3: &quot;Shirts&quot;,
      item_category4: &quot;Crew&quot;,
      item_category5: &quot;Short sleeve&quot;,
      item_list_id: &quot;related_products&quot;,
      item_list_name: &quot;Related Products&quot;,
      item_variant: &quot;green&quot;,
      location_id: &quot;ChIJIQBpAG2ahYAR_6128GcTUEo&quot;,
      price: 9.99,
      quantity: 1
    },
    {
      item_id: &quot;SKU_12346&quot;,
      item_name: &quot;Google Grey Women's Tee&quot;,
      affiliation: &quot;Google Merchandise Store&quot;,
      coupon: &quot;SUMMER_FUN&quot;,
      discount: 3.33,
      index: 1,
      item_brand: &quot;Google&quot;,
      item_category: &quot;Apparel&quot;,
      item_category2: &quot;Adult&quot;,
      item_category3: &quot;Shirts&quot;,
      item_category4: &quot;Crew&quot;,
      item_category5: &quot;Short sleeve&quot;,
      item_list_id: &quot;related_products&quot;,
      item_list_name: &quot;Related Products&quot;,
      item_variant: &quot;gray&quot;,
      location_id: &quot;ChIJIQBpAG2ahYAR_6128GcTUEo&quot;,
      price: 20.99,
      promotion_id: &quot;P_12345&quot;,
      promotion_name: &quot;Summer Sale&quot;,
      quantity: 1
    }]
});" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">gtag</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">event</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">purchase</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">transaction_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">T_12345</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">25.42</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">tax</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">4.90</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">shipping</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">5.99</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">currency</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">USD</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">coupon</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SUMMER_SALE</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #88C0D0">items</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> [</span></span>
<span class="line"><span style="color: #D8DEE9FF">     </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SKU_12345</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Stan and Friends Tee</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">affiliation</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Google Merchandise Store</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">coupon</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SUMMER_FUN</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">discount</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">2.22</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">index</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_brand</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Google</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Apparel</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category2</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Adult</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category3</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Shirts</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category4</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Crew</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category5</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Short sleeve</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_list_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">related_products</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_list_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Related Products</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_variant</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">green</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">location_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ChIJIQBpAG2ahYAR_6128GcTUEo</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">price</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">9.99</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">quantity</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">},</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SKU_12346</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Google Grey Women&#39;s Tee</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">affiliation</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Google Merchandise Store</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">coupon</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">SUMMER_FUN</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">discount</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">3.33</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">index</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_brand</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Google</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Apparel</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category2</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Adult</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category3</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Shirts</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category4</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Crew</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_category5</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Short sleeve</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_list_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">related_products</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_list_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Related Products</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">item_variant</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">gray</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">location_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">ChIJIQBpAG2ahYAR_6128GcTUEo</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">price</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">20.99</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">promotion_id</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">P_12345</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">promotion_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Summer Sale</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #88C0D0">quantity</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">]</span></span>
<span class="line"><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<p>Visualizando o funil de vendas. Em Relatório > Monetization/sales/vendas > Purchase Journey.  Ficará algo parecido com isso:</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1000" height="506" src="https://ramondomingos.com.br/wp-content/uploads/2024/09/image.png" alt="" class="wp-image-256" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/09/image.png 1000w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-300x152.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-768x389.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></figure>



<h2 class="wp-block-heading">Debug view</h2>



<p>Os dados do GA podem demorar ate 24h para surgirem nos relatório. Para você acompanhar em tempo real os eventos chegando, voce pode adicionar o modo debug,</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code=" window.gtag(&quot;event&quot;, event,{ ...eventParams, debug_mode: true});" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">window</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">gtag</span><span style="color: #D8DEE9FF">(</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">event</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">event</span><span style="color: #ECEFF4">,{</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">...</span><span style="color: #D8DEE9">eventParams</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">debug_mode</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">true</span><span style="color: #ECEFF4">}</span><span style="color: #D8DEE9FF">)</span><span style="color: #81A1C1">;</span></span></code></pre></div>



<p>(lembra que falei de criar uma função e reutilizar?)</p>



<p>Em admin > Data Display > Debug view. Você irá acompanhar em tempo real todos os eventos. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="561" src="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-1024x561.png" alt="" class="wp-image-258" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-1024x561.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-300x164.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-768x421.png 768w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-1536x841.png 1536w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-1-2048x1122.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Eventos que possuem parâmetros, como <strong>items</strong> ficará assim:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="806" height="511" src="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-2.png" alt="" class="wp-image-259" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-2.png 806w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-2-300x190.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-2-768x487.png 768w" sizes="(max-width: 806px) 100vw, 806px" /></figure>



<p>Você pode estranhar o preço. Mas nesse <a href="https://stackoverflow.com/questions/67224841/ga4-price-is-appended-with-multiple-zeros">link do StackOverflow</a>, encontrei esse reposta:</p>



<p>Isso não é um problema em relatórios reais e só aparece no DebugView.</p>



<p>Internamente, o valor é multiplicado por 1000000 para que possa ser armazenado como um inteiro para economizar espaço. A ferramenta de depuração falha em convertê-lo de volta, mas relatórios reais parecem acertar.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="332" src="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-3-1024x332.png" alt="" class="wp-image-260" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/09/image-3-1024x332.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-3-300x97.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-3-768x249.png 768w, https://ramondomingos.com.br/wp-content/uploads/2024/09/image-3.png 1500w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Dominar o Google Analytics é uma habilidade fundamental para qualquer desenvolvedor que busca criar produtos digitais de sucesso. Ao entender como os usuários interagem com seus aplicativos, você pode tomar decisões mais informadas e entregar experiências cada vez melhores.</p>



<p><strong>Dicas Extras:</strong></p>



<ul class="wp-block-list">
<li><strong>Personalização:</strong> Explore as opções de personalização do Google Analytics para criar relatórios personalizados e segmentar seus dados.</li>



<li><strong>Integrações:</strong> Descubra as diversas integrações do Google Analytics com outras ferramentas para obter uma visão mais completa dos seus dados.</li>



<li><strong>Aprendizado Contínuo:</strong> O Google Analytics está em constante evolução. Mantenha-se atualizado sobre as novas funcionalidades e recursos.</li>
</ul>



<p>E aí, gostou deste guia? Compartilhe suas experiências nos comentários e me diga quais outras ferramentas você utiliza para analisar seus projetos.</p>
<p>O post <a href="https://ramondomingos.com.br/desenvolvedores-precisam-dominar-o-google-analytics-um-guia-pratico-com-next-js/">Desenvolvedores precisam Dominar o Google Analytics? Um Guia Prático com Next.js</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/desenvolvedores-precisam-dominar-o-google-analytics-um-guia-pratico-com-next-js/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Fazendo deploy de MONGO, REDIS API E FRONT no Kubernets</title>
		<link>https://ramondomingos.com.br/kubernetes-deploy-mongo-redis-api-front/</link>
					<comments>https://ramondomingos.com.br/kubernetes-deploy-mongo-redis-api-front/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Tue, 30 Apr 2024 21:52:42 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=247</guid>

					<description><![CDATA[<p>Este projeto tem repositório no github: https://github.com/ramondomiingos/PPGTI2001-cloud-computing/. Então, alguns códigos mais extensos estão apenas lá, e não aqui, principalmente os .yaml . Mas sempre irei botar o link para o exato arquivo que estou me referenciando. Este projeto foi a avaliação da disciplina Computação em Nuvem, PPGTI2001, do mestrado da UFRN. É necessário criar um&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/kubernetes-deploy-mongo-redis-api-front/">Fazendo deploy de MONGO, REDIS API E FRONT no Kubernets</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Este projeto tem repositório no github: <a href="https://github.com/ramondomiingos/PPGTI2001-cloud-computing/">https://github.com/ramondomiingos/PPGTI2001-cloud-computing/</a>. Então, alguns códigos mais extensos estão apenas lá, e não aqui, principalmente os .yaml . Mas sempre irei botar o link para o exato arquivo que estou me referenciando.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial-1024x1024.png" alt="" class="wp-image-249" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial-1024x1024.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial-300x300.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial-150x150.png 150w, https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial-768x768.png 768w, https://ramondomingos.com.br/wp-content/uploads/2024/04/k8s-tutorial.png 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>Este projeto foi a avaliação da disciplina Computação em Nuvem, PPGTI2001, do mestrado da UFRN. É necessário criar um pod com vários contêineres, deve ser gerado e atender aos seguintes requisitos:</p>



<p>&#8211; O pod deve ter 4 containers e deve ser criado usando um Manifesto do Kubernetes (arquivo yaml);</p>



<p>Alunos:</p>



<p>-Ramon Domingos Duarte Oliveira </p>



<p>&#8211; <a href="https://www.linkedin.com/in/gerfesson/">Gerfesson Santos da Nóbrega</a></p>



<p></p>



<p>Já que você ja aprendeu a configurar o k8s em sua máquina, conforme o<a href="https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/"> post anterior</a>, agra vamos subir as aplicações.</p>



<p><strong>front,back, cache e mongodb.</strong></p>



<p></p>



<h2 class="wp-block-heading"><strong>Sobre aplicativos</strong></h2>



<h2 class="wp-block-heading"><strong>API</strong></h2>



<p>API de registro de produto</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="{

&quot;nome&quot;: &quot;PEN_BLACK&quot;,

&quot;description&quot;: &quot;caneta preta, com corpo transparente&quot;,

&quot;qtdDisponível&quot;: 12

}" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #ECEFF4">{</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">nome</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">PEN_BLACK</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">description</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">caneta preta, com corpo transparente</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">&quot;</span><span style="color: #8FBCBB">qtdDisponível</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">12</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ECEFF4">}</span></span></code></pre></div>



<p></p>



<ul class="wp-block-list">
<li>/produto `(get, post)`</li>



<li>/produto/:id `(put, delete, get)`</li>
</ul>



<h2 class="wp-block-heading"><strong> FRONT</strong></h2>



<p>Aplicativo que consome a API, exibindo listagens e formulários.</p>



<p>Usando<a href=" https://refine.dev/"> https://refine.dev/</a> como modelo base.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="249" src="https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3-1024x249.png" alt="" class="wp-image-248" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3-1024x249.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3-300x73.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3-768x187.png 768w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3-1536x374.png 1536w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-3.png 1935w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading"><strong>Docker-compose</strong></h2>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="version: '3.7'
services:
  redis-service:
    container_name: redis-database
    image: 'bitnami/redis:latest'
    ports:
      - &quot;6379:6379&quot;
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
  front:
    build:
      context: ./front
      dockerfile: Dockerfile
    container_name: front
    expose:
      - '3000'
    ports:
      - '3000:3000'
    environment:
      API_URL: api
      NEXT_PUBLIC_API_URL: api
      NEXT_PUBLIC_API_URL_PORT: 8002
  api:
    build:
      context: ./api
      dockerfile: Dockerfile
    container_name: api
    expose:
      - '8002'
    ports:
      - '8002:8001'
    environment:
      - PORT=8001
      - REDIS_URL=redis-service
      - REDIS_PORT=6379
      - REDIS_EXPIRE=10
      - MONGO_USERNAME=root
      - MONGO_PASSWORD=example
      - MONGO_URL=mongo:27017
      - MONGO_DB=product
  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    ports:
      - '27017:27017'" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #8FBCBB">version</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">3.7</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #8FBCBB">services</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">redis-service</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">redis-database</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">bitnami/redis:latest</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">6379:6379</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ALLOW_EMPTY_PASSWORD=yes</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">front</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">build</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">context</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./front</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">dockerfile</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Dockerfile</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">front</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">expose</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">3000</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">3000:3000</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">API_URL</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">NEXT_PUBLIC_API_URL</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">NEXT_PUBLIC_API_URL_PORT</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8002</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">api</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">build</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">context</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">./api</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">dockerfile</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Dockerfile</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">container_name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">expose</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">8002</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">8002:8001</span><span style="color: #ECEFF4">&#39;</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">PORT=8001</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_URL=redis-service</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_PORT=6379</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_EXPIRE=10</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_USERNAME=root</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_PASSWORD=example</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_URL=mongo:27017</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_DB=product</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">mongo</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">mongo</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">restart</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">always</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">environment</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">MONGO_INITDB_ROOT_USERNAME</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">root</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">MONGO_INITDB_ROOT_PASSWORD</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">example</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">27017:27017</span><span style="color: #ECEFF4">&#39;</span></span></code></pre></div>



<p>Para executar usando apenas docker-compose use:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="docker-compose up" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">docker-compose</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">up</span></span></code></pre></div>



<p></p>



<h2 class="wp-block-heading">Serviços:</h2>



<ul class="wp-block-list">
<li>mongo: MongoDB para registro de produtos</li>



<li>redis: cache para solicitações frequentes</li>



<li>api: API REST para conectar-se ao banco de dados.</li>



<li>front: Frente usando React.</li>
</ul>



<h2 class="wp-block-heading"><strong>Kubernets</strong></h2>



<p><strong> Etapa 1: Envie estas imagens para DockerHub pessoal (opcional)</strong></p>



<p>Para construir a imagem da API</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="cd api
docker build -t &lt;your_username&gt;/api-products .
docker push  &lt;your_username&gt;/api-products" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #88C0D0">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">build</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">your_usernam</span><span style="color: #D8DEE9FF">e</span><span style="color: #81A1C1">&gt;</span><span style="color: #A3BE8C">/api-products</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.</span></span>
<span class="line"><span style="color: #88C0D0">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">push</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">your_usernam</span><span style="color: #D8DEE9FF">e</span><span style="color: #81A1C1">&gt;</span><span style="color: #A3BE8C">/api-products</span></span></code></pre></div>



<p>Para construir a imagem do front</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="cd frontend
docker build -t &lt;your_username&gt;/front-products .
docker push  &lt;your_username&gt;/front-products" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">cd</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">frontend</span></span>
<span class="line"><span style="color: #88C0D0">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">build</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-t</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">your_usernam</span><span style="color: #D8DEE9FF">e</span><span style="color: #81A1C1">&gt;</span><span style="color: #A3BE8C">/front-products</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">.</span></span>
<span class="line"><span style="color: #88C0D0">docker</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">push</span><span style="color: #D8DEE9FF">  </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">your_usernam</span><span style="color: #D8DEE9FF">e</span><span style="color: #81A1C1">&gt;</span><span style="color: #A3BE8C">/front-products</span></span></code></pre></div>



<p>Se você criar imagens personalizadas, vá para os arquivos `k8s/*-deployment` e altere a imagem para a sua.</p>



<p></p>



<p>As imagens MONGO e REDIS são imagens oficiais, já estão disponíveis no dockerhub para uso.</p>



<p class="has-medium-font-size"><em> Espera-se que o ambiente da máquina já esteja pré-configurado e domine um trabalhador unido, usando o comando `kubeadm join &#8211;token`</em></p>



<h2 class="wp-block-heading"><strong> Etapa 2: Criar namespace</strong></h2>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl get ns

kubectl create namespace products-application

kubectl get ns

kubectl config get-contexts

kubectl config set-context --current --namespace=products-application" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ns</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">namespace</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">products-application</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">ns</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get-contexts</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">set-context</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--current</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--namespace=products-application</span></span></code></pre></div>



<p></p>



<p><strong>[output]</strong></p>



<p><em>kubectl config set-context &#8211;current &#8211;namespace=products-application</em></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl config get-contexts" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">config</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get-contexts</span></span></code></pre></div>



<p></p>



<p></p>



<p><strong>[output]</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>CURRENT</td><td>NAME</td><td>CLUSTER</td><td>AUTHINFO</td><td>NAMESPACE</td></tr><tr><td>*</td><td>kubernetes-admin@kubernetes </td><td>kubernetes</td><td>kubernetes-admin </td><td>products-api</td></tr></tbody></table></figure>



<p></p>



<h2 class="wp-block-heading"><strong>Etapa 3: crie uma implantação</strong></h2>



<p>Nos arquivos de implantação, há detalhes sobre o <strong>**image docker**</strong> e um <strong>**imagePullPolicy**</strong>. Neste exemplo é Sempre,</p>



<p>para Sempre implantar, obtenha uma nova imagem para o dockerhub.</p>



<p>O comando de linha é</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl create deployment redis --image=redis --port=5701" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">create</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">deployment</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">redis</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--image=redis</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--port=5701</span></span></code></pre></div>



<p></p>



<p>mas, no diretório <a href="https://github.com/ramondomiingos/PPGTI2001-cloud-computing/tree/main/k8s">k8s</a> tem 4 arquivos yaml para [api,front,mongo,redis]-deployment.yaml</p>



<p>exempo do api-deployment</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="apiVersion: apps/v1
kind: Deployment
metadata:
metadata:
  annotations:
   
   
metadata:   
  annotations:
   
   
  labels:
    app: api
  name: api
spec:
  replicas: 1
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      annotations:
      annotations:
       
       
      annotations: 
       
       
      labels:
        app: api
    spec:
      containers:
        - env:
            - name: MONGO_DB
              value: product
            - name: MONGO_PASSWORD
              value: example
            - name: MONGO_URL
              value: $(MONGO_SERVICE_HOST):27017
            - name: MONGO_USERNAME
              value: root
            - name: PORT
              value: &quot;8001&quot;
            - name: REDIS_EXPIRE
              value: &quot;10&quot;
            - name: REDIS_PORT
              value: &quot;6379&quot;
            - name: REDIS_URL
              value: $(REDIS_SERVICE_SERVICE_HOST)
          image:  ramondomiingos/api-products
          imagePullPolicy: Always
          name: api
          ports:
            - containerPort: 8001
              hostPort: 8001
              protocol: TCP
      restartPolicy: Always" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #8FBCBB">apiVersion</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apps/v1</span></span>
<span class="line"><span style="color: #8FBCBB">kind</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Deployment</span></span>
<span class="line"><span style="color: #8FBCBB">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #8FBCBB">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #8FBCBB">metadata</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #D8DEE9FF">   </span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">labels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">app</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #8FBCBB">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">replicas</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">1</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">selector</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">matchLabels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">app</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #8FBCBB">template</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">metadata</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">annotations</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">annotations</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span></span>
<span class="line"><span style="color: #D8DEE9FF">       </span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">labels</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #8FBCBB">app</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #8FBCBB">spec</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">containers</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">env</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_DB</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">product</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_PASSWORD</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">example</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_URL</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">$(MONGO_SERVICE_HOST):27017</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">MONGO_USERNAME</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">root</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">PORT</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">8001</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_EXPIRE</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">10</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_PORT</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">6379</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">REDIS_URL</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">value</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">$(REDIS_SERVICE_SERVICE_HOST)</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">image</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF">  </span><span style="color: #A3BE8C">ramondomiingos/api-products</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">imagePullPolicy</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Always</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">name</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api</span></span>
<span class="line"><span style="color: #D8DEE9FF">          </span><span style="color: #8FBCBB">ports</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #ECEFF4">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">containerPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8001</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">hostPort</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">8001</span></span>
<span class="line"><span style="color: #D8DEE9FF">              </span><span style="color: #8FBCBB">protocol</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">TCP</span></span>
<span class="line"><span style="color: #D8DEE9FF">      </span><span style="color: #8FBCBB">restartPolicy</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">Always</span></span></code></pre></div>



<p>Os outros estão na mesma pasta [mongo, redis e front] </p>



<p><strong>### Etapa 4: crie um serviço</strong></p>



<p>para expor a aplicação para fora do k8s, é necessário criar um serviço</p>



<p>Você pode criar com um comando:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl create service nodeport web-products --tcp=3000:3000 --node-port=30300" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #A3BE8C">kubectl create service nodeport web-products --tcp=3000:3000 --node-port=30300</span></span></code></pre></div>



<p>confira a criação</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl get service" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #A3BE8C">kubectl get service</span></span></code></pre></div>



<p></p>



<figure class="wp-block-table"><table><tbody><tr><td>NAME</td><td>TYPE</td><td>CLUSTER-IP</td><td>EXTERNAL-IP </td><td>PORT(S) </td><td>AGE</td></tr><tr><td>web-products </td><td>NodePort</td><td>10.97.135.212 </td><td>&lt;none&gt; </td><td>3000:30300 | TCP</td><td> 3s </td></tr></tbody></table></figure>



<p></p>



<p><strong>No diretório k8s tem 4 arquivos yaml para [api,front,mongo,redis]-service.yaml</strong></p>



<h2 class="wp-block-heading"><strong>Etapa 5: Envie arquivos para o nó MASTER.</strong></h2>



<p>na pasta `k8s`tem 9 arquivos implantação e serviço para [api, front, mongo e Redis]</p>



<p>e 1 arquivo para <strong>**ingress**</strong>;</p>



<p>envie este arquivo para o seu mestre (pode usar scp)</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="scp k8s/* remote_username@10.10.0.2:/remote/directory" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #A3BE8C">scp k8s/* remote_username@10.10.0.2:/remote/directory</span></span></code></pre></div>



<p></p>



<p><strong>### Etapa 6: Aplicar arquivo de especificação</strong></p>



<p>Em sequência é necessário aplicar este arquivo e verificar os pods.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl apply -f ." style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #A3BE8C">kubectl apply -f .</span></span></code></pre></div>



<p></p>



<p>&#8220;`</p>



<p><strong>**[</strong><strong>output</strong><strong>]**</strong></p>



<p>For apply all files use `kubectl apply -f .`</p>



<p><strong>**[</strong><strong>output</strong><strong>]**</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="~kubectl apply -f .

deployment.apps/api created

service/api created

deployment.apps/front created

service/front created

deployment.apps/mongo created

service/mongo created

deployment.apps/redis-service created

service/redis-service created" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #81A1C1">~</span><span style="color: #D8DEE9FF">kubectl apply -f </span><span style="color: #88C0D0">.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">deployment.apps/api</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">service/api</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">deployment.apps/front</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">service/front</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">deployment.apps/mongo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">service/mongo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">deployment.apps/redis-service</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">service/redis-service</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">created</span></span></code></pre></div>



<p></p>



<p></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl get pods" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">pods</span></span></code></pre></div>



<p></p>



<p><strong>outpu</strong>t</p>



<figure class="wp-block-table"><table><tbody><tr><td>NAME</td><td>READY</td><td>STATUS</td><td>RESTARTS</td><td>AGE</td></tr><tr><td>web-products</td><td>0/4</td><td>ContainerCreating</td><td>0</td><td>40s</td></tr></tbody></table></figure>



<p></p>



<p>enquanto os contêineres são criados, verifique os logs com:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl logs web-products" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">web-products</span></span></code></pre></div>



<p></p>



<p>Se demorar muito para criar os containers com sucesso, verifique os logs individualmente para ver se ocorreu algum erro, se necessário corrija e aplique este arquivo novamente.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl logs web-products -c [redis-service, mongo, frontend, api]" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">logs</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">web-products</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-c</span><span style="color: #D8DEE9FF"> [redis-service, </span><span style="color: #A3BE8C">mongo,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">frontend,</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">api]</span></span></code></pre></div>



<p></p>



<p><strong>&gt; erro example:</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>NAME</td><td>READY</td><td>STATUS</td><td>RESTARTS</td><td>AGE</td></tr><tr><td>web-products</td><td>3/4</td><td>CrashLoopBackOff</td><td>0</td><td>10m </td></tr></tbody></table></figure>



<p></p>



<p>depois de alguns segundos, você pode executar este mesmo comando e verá:</p>



<figure class="wp-block-table"><table><tbody><tr><td>NAME</td><td>READY</td><td>STATUS</td><td>RESTARTS</td><td>AGE</td></tr><tr><td>web-products</td><td>4/4</td><td>Running</td><td>0</td><td>22s</td></tr></tbody></table></figure>



<p></p>



<h2 class="wp-block-heading"><strong>Etapa 7: Verifique sua aplicação.</strong></h2>



<p>Vá para o navegador, visite `<strong>http://&lt;ip-worker&gt;:3000</strong>` e veja o aplicativo.</p>



<p>3000 é a porta exposta em arquivos yaml.</p>



<p><em><strong>Não contemplei volumes persistentes.</strong></em></p>



<h2 class="wp-block-heading"><strong> Aprendizagem pessoal</strong></h2>



<p>&#8211; No nosso cenário precisamos expor a api, já que as requisições feitas pelo front eram do lado do cliente, usar um IP interno não funcionaria.</p>



<p>&#8211; Todos os pods possuem muitas variáveis de ambiente no formato `&lt;NAME&gt;_SERVICE_HOST` para identificar outros serviços e podem ser usados em yaml como ambientes de configuração. [Exemplo](k8s/api-deployment.yaml) linha 39.</p>



<p>&#8211; Para ver todos os ambientes você pode usar `kubectl exec &lt;pod-name&gt; printenv`.</p>



<p>&#8211; Outro formato para URL é `&lt;service-name&gt;.&lt;namespace|default&gt;.svc.cluster.local:&lt;service-port&gt;`;</p>
<p>O post <a href="https://ramondomingos.com.br/kubernetes-deploy-mongo-redis-api-front/">Fazendo deploy de MONGO, REDIS API E FRONT no Kubernets</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/kubernetes-deploy-mongo-redis-api-front/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Guia Passo a Passo: Configurando um Cluster Kubernetes com um Main e um Worker</title>
		<link>https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/</link>
					<comments>https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/#comments</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Tue, 30 Apr 2024 16:48:11 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=241</guid>

					<description><![CDATA[<p>Você já ouviu falar sobre Kubernetes, a popular plataforma de orquestração de contêineres, e está ansioso para experimentá-la? Neste guia, vamos explorar como configurar um cluster Kubernetes em duas máquinas virtuais: uma para ser o Main (master) e outra para ser o nó de trabalho (worker). Vamos começar! Pré-Requisitos Antes de começarmos, certifique-se de que&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/">Guia Passo a Passo: Configurando um Cluster Kubernetes com um Main e um Worker</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Você já ouviu falar sobre Kubernetes, a popular plataforma de orquestração de contêineres, e está ansioso para experimentá-la? Neste guia, vamos explorar como configurar um cluster Kubernetes em duas máquinas virtuais: uma para ser o Main (master) e outra para ser o nó de trabalho (worker). Vamos começar!</p>



<h2 class="wp-block-heading">Pré-Requisitos</h2>



<p>Antes de começarmos, certifique-se de que você tem:</p>



<ul class="wp-block-list">
<li>Duas máquinas virtuais rodando um sistema operacional Linux (pode ser Ubuntu, CentOS, ou outro de sua preferência).</li>



<li>Conhecimento básico de administração de sistemas Linux.</li>



<li>Acesso root ou permissões de sudo em ambas as máquinas.</li>



<li>Conexão de rede entre as duas máquinas.</li>
</ul>



<h2 class="wp-block-heading">Passo 1: Configuração da Máquina Mestre (Master)</h2>



<p>Na máquina que você deseja configurar como mestre, siga estes passos:</p>



<ol class="wp-block-list">
<li>Atualize o sistema operacional:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo apt update &amp;&amp; sudo apt upgrade -y
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">update</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">upgrade</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-y</span></span>
<span class="line"></span></code></pre></div>



<ol class="wp-block-list" start="2">
<li>Instale o Docker, que é um pré-requisito para o Kubernetes:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo apt install docker.io -y
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">docker.io</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-y</span></span>
<span class="line"></span></code></pre></div>



<ol class="wp-block-list" start="3">
<li>Configure o repositório do Kubernetes:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="codesudo apt-get update &amp;&amp; sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo &quot;deb https://apt.kubernetes.io/ kubernetes-xenial main&quot; | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">codesudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">update</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&amp;&amp;</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-y</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-transport-https</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">curl</span></span>
<span class="line"><span style="color: #88C0D0">curl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-s</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">https://packages.cloud.google.com/apt/doc/apt-key.gpg</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-key</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">add</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-</span></span>
<span class="line"><span style="color: #88C0D0">echo</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">deb https://apt.kubernetes.io/ kubernetes-xenial main</span><span style="color: #ECEFF4">&quot;</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">|</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">tee</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/etc/apt/sources.list.d/kubernetes.list</span></span>
<span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">update</span></span>
<span class="line"></span></code></pre></div>



<ol class="wp-block-list" start="4">
<li>Instale o Kubernetes:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo apt-get install -y kubelet kubeadm kubectl" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">apt-get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">install</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-y</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">kubelet</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">kubeadm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">kubectl</span></span></code></pre></div>



<ol class="wp-block-list" start="5">
<li>Inicie o cluster Kubernetes no nó mestre (master):</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo kubeadm init
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">kubeadm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">init</span></span>
<span class="line"></span></code></pre></div>



<ol class="wp-block-list" start="6">
<li>Após a inicialização, siga as instruções fornecidas pelo kubeadm para configurar o seu ambiente local do Kubernetes. Isso inclui a configuração do diretório do kubeconfig e a instalação de uma rede de pod. Por exemplo:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">mkdir</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-p</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$HOME</span><span style="color: #A3BE8C">/.kube</span></span>
<span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">cp</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">-i</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">/etc/kubernetes/admin.conf</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$HOME</span><span style="color: #A3BE8C">/.kube/config</span></span>
<span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">chown</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">$(</span><span style="color: #88C0D0">id</span><span style="color: #A3BE8C"> -u</span><span style="color: #ECEFF4">)</span><span style="color: #A3BE8C">:</span><span style="color: #ECEFF4">$(</span><span style="color: #88C0D0">id</span><span style="color: #A3BE8C"> -g</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">$HOME</span><span style="color: #A3BE8C">/.kube/config</span></span>
<span class="line"></span></code></pre></div>



<ol class="wp-block-list" start="7">
<li>Verifique o status do nó mestre (master):</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl get nodes" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">nodes</span></span></code></pre></div>



<h2 class="wp-block-heading">Passo 2: Configuração da Máquina de Trabalho (Worker)</h2>



<p>Agora, vamos configurar a máquina que atuará como o nó de trabalho (worker). Repita os passos 1 a 4 da configuração da máquina mestre, e depois siga estas etapas adicionais:</p>



<ol class="wp-block-list">
<li>Junte o nó de trabalho ao cluster Kubernetes. Use o comando <code>kubeadm join</code> fornecido pelo comando <code>kubeadm init</code> que você executou na máquina mestre. Ele deve se parecer com algo assim:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo kubeadm join &lt;endereço_do_master&gt;:&lt;porta&gt; --token &lt;token&gt; --discovery-token-ca-cert-hash sha256:&lt;hash&gt;" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">sudo</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">kubeadm</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">join</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">endereço_do_maste</span><span style="color: #D8DEE9FF">r</span><span style="color: #81A1C1">&gt;</span><span style="color: #A3BE8C">:</span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">port</span><span style="color: #D8DEE9FF">a</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--token</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">toke</span><span style="color: #D8DEE9FF">n</span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">--discovery-token-ca-cert-hash</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">sha256:</span><span style="color: #81A1C1">&lt;</span><span style="color: #A3BE8C">has</span><span style="color: #D8DEE9FF">h</span><span style="color: #81A1C1">&gt;</span></span></code></pre></div>



<p>Substitua <code>&lt;endereço_do_master>:&lt;porta></code>, <code>&lt;token></code> e <code>&lt;hash></code> pelos valores fornecidos pelo comando <code>kubeadm init</code> na máquina main.</p>



<ol class="wp-block-list" start="2">
<li>Depois que o nó de trabalho se juntar com sucesso ao cluster, volte para a máquina mestre e verifique o status dos nós:</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="kubectl get nodes" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #88C0D0">kubectl</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">get</span><span style="color: #D8DEE9FF"> </span><span style="color: #A3BE8C">nodes</span></span></code></pre></div>



<pre class="wp-block-preformatted"></pre>



<p>Você deve ver ambos os nós listados como &#8220;Ready&#8221;.</p>



<h2 class="wp-block-heading">Conclusão</h2>



<p>Parabéns! Você configurou com sucesso um cluster Kubernetes com um nó mestre e um nó de trabalho. Agora você pode começar a implantar e gerenciar seus aplicativos em contêineres de forma escalável e eficiente.</p>



<p>Este guia forneceu apenas uma introdução básica ao Kubernetes. Existem muitos outros recursos e conceitos avançados para explorar, como implantações, serviços, e balanceamento de carga. Continue aprendendo e experimentando para dominar totalmente o poder do Kubernetes!</p>



<p>Espero que este guia seja útil em sua jornada com Kubernetes. Se precisar de mais ajuda ou tiver alguma dúvida, sinta-se à vontade para entrar em contato.</p>
<p>O post <a href="https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/">Guia Passo a Passo: Configurando um Cluster Kubernetes com um Main e um Worker</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/configuracao-cluster-kubernetes-main-worker/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Aplicando Aprendizagem por Reforço no Cliff Walking</title>
		<link>https://ramondomingos.com.br/aplicando-aprendizagem-por-reforco-no-cliff-walking/</link>
					<comments>https://ramondomingos.com.br/aplicando-aprendizagem-por-reforco-no-cliff-walking/#respond</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Fri, 05 Apr 2024 00:15:05 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=233</guid>

					<description><![CDATA[<p>O link do colab: https://drive.google.com/file/d/1lzpWH0d6OsrSHFcJWi3Lzw7idTja9lwo/view?usp=sharing No post anterior comentei sobre alguns conceitos da aprendizagem por reforço, nesse, iremos aplicar os conceitos de forma prática, no Cliff Walking. Desvende os segredos do Aprendizado por Reforço e domine o desafio do Cliff Walking! O &#8220;gymnasium&#8221; é o nome de uma biblioteca Python amplamente utilizada no campo do&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/aplicando-aprendizagem-por-reforco-no-cliff-walking/">Aplicando Aprendizagem por Reforço no Cliff Walking</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>O link do colab: <a href="https://drive.google.com/file/d/1lzpWH0d6OsrSHFcJWi3Lzw7idTja9lwo/view?usp=sharing">https://drive.google.com/file/d/1lzpWH0d6OsrSHFcJWi3Lzw7idTja9lwo/view?usp=sharing</a></p>



<p>No <a href="https://ramondomingos.com.br/aprendizado-por-reforco-com-o-q-learning/">post</a> anterior comentei sobre alguns conceitos da aprendizagem por reforço, nesse, iremos aplicar os conceitos de forma prática, no <a href="https://gymnasium.farama.org/environments/toy_text/cliff_walking/">Cliff Walking</a>. <strong>Desvende os segredos do Aprendizado por Reforço e domine o desafio do Cliff Walking!</strong></p>



<p>O &#8220;gymnasium&#8221; é o nome de uma biblioteca Python amplamente utilizada no campo do aprendizado por reforço. Ela fornece uma interface padronizada (API) para interagir com diferentes ambientes de simulação.</p>



<p>Veja como o Gymnasium funciona:</p>



<ul class="wp-block-list">
<li><strong>Ambientes de simulação:</strong> Imagine vários cenários virtuais para treinar agentes de aprendizado por reforço, como labirintos virtuais, jogos simples e simuladores de robótica. O Gymnasium define uma interface comum para esses ambientes.</li>



<li><strong>Agente de aprendizado por reforço:</strong> É o algoritmo que interage com o ambiente, tomando decisões e aprendendo com as recompensas recebidas.</li>



<li><strong>API padronizada:</strong> O Gymnasium age como um tradutor entre o agente e o ambiente. Ele permite que o agente use comandos uniformes para interagir com qualquer ambiente compatível com o Gymnasium, independentemente de sua complexidade interna.</li>
</ul>



<p>Resumindo, o Gymnasium facilita o desenvolvimento de agentes de aprendizado por reforço ao fornecer uma interface única para diversos ambientes de simulação. Isso permite aos pesquisadores focar na lógica do agente sem se preocupar com os detalhes específicos de cada ambiente.</p>



<h1 class="wp-block-heading">O Problema</h1>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="720" height="240" src="https://ramondomingos.com.br/wp-content/uploads/2024/04/image.png" alt="Agente do jogo." class="wp-image-234" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/04/image.png 720w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-300x100.png 300w" sizes="(max-width: 720px) 100vw, 720px" /></figure>



<p>O jogo começa com o jogador na localização [3, 0] da grade mundial 4&#215;12 com o gol localizado em [3, 11]. Se o jogador atingir a meta o episódio termina.</p>



<p>Um penhasco corre ao longo de [3, 1..10]. Se o jogador se mover para um local de penhasco, ele retornará ao local inicial.</p>



<p>O jogador faz movimentos até atingir o objetivo.</p>



<p>Adaptado do Exemplo 6.6 (página 132) de Reinforcement Learning: An Introduction de Sutton e Barto</p>



<h2 class="wp-block-heading">Ações possíveis:</h2>



<ul class="wp-block-list">
<li>0: Subir</li>



<li>1: Mover para a direita</li>



<li>2: Mover para baixo</li>



<li>3: Mover para a esquerda</li>
</ul>



<p>Para vermos o gymnasium funcionando, podemos fazer algumas jogadas de forma aleatória, e salvar um gif do jogo renderizado.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="# Nesse código, iremos explorar os retornos da lib Gymnasium, antes de uma aplicação objetiva.

import gymnasium as gym
import random
import imageio
from IPython.display import Image
import numpy as np
import matplotlib.pyplot as plt
from argparse import Namespace
from tqdm.notebook import tqdm


env = gym.make('CliffWalking-v0', render_mode=&quot;rgb_array&quot;) # importando o CliffWalking
env.reset()
images = []
actions_ = {
    0: &quot;Subir&quot;,
    1: &quot;direita&quot;,
    2:&quot;baixo&quot;,
    3:&quot;esquerda&quot;
}
for i in range(100):
  random_action = env.action_space.sample() # Ações aleatórias
  new_state, reward, terminated, truncated, info = env.step(random_action)
  images.append(env.render()) # renderizando estado atual, para criar um gif.
  print(f'Açao escolhida: {actions_[random_action]} | posição: {new_state} | recompensa: {reward}') # exibindo as açoes em texto.
imageio.mimsave('/content/replay.gif', images, fps=1)
state, info = env.reset() # reiniciando o jogo para os próximos exemplos." style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88"># Nesse código, iremos explorar os retornos da lib Gymnasium, antes de uma aplicação objetiva.</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> gymnasium </span><span style="color: #81A1C1">as</span><span style="color: #D8DEE9FF"> gym</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> random</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> imageio</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> IPython</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">display </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> Image</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> numpy </span><span style="color: #81A1C1">as</span><span style="color: #D8DEE9FF"> np</span></span>
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> matplotlib</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">pyplot </span><span style="color: #81A1C1">as</span><span style="color: #D8DEE9FF"> plt</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> argparse </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> Namespace</span></span>
<span class="line"><span style="color: #81A1C1">from</span><span style="color: #D8DEE9FF"> tqdm</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">notebook </span><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> tqdm</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">env </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> gym</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">make</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">CliffWalking-v0</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">render_mode</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">rgb_array</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># importando o CliffWalking</span></span>
<span class="line"><span style="color: #D8DEE9FF">env</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">reset</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">images </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">[]</span></span>
<span class="line"><span style="color: #D8DEE9FF">actions_ </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">{</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">0</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">Subir</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">:</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">direita</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">2</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">baixo</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #B48EAD">3</span><span style="color: #ECEFF4">:</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">esquerda</span><span style="color: #ECEFF4">&quot;</span></span>
<span class="line"><span style="color: #ECEFF4">}</span></span>
<span class="line"><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> i </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">range</span><span style="color: #ECEFF4">(</span><span style="color: #B48EAD">100</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">  random_action </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">action_space</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">sample</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># Ações aleatórias</span></span>
<span class="line"><span style="color: #D8DEE9FF">  new_state</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> reward</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> terminated</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> truncated</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> info </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> env</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">step</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">random_action</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">  images</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">append</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">env</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">render</span><span style="color: #ECEFF4">())</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># renderizando estado atual, para criar um gif.</span></span>
<span class="line"><span style="color: #D8DEE9FF">  </span><span style="color: #88C0D0">print</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">f</span><span style="color: #A3BE8C">&#39;Açao escolhida: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">actions_</span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">random_action</span><span style="color: #ECEFF4">]</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C"> | posição: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">new_state</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C"> | recompensa: </span><span style="color: #EBCB8B">{</span><span style="color: #D8DEE9FF">reward</span><span style="color: #EBCB8B">}</span><span style="color: #A3BE8C">&#39;</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># exibindo as açoes em texto.</span></span>
<span class="line"><span style="color: #D8DEE9FF">imageio</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">mimsave</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">/content/replay.gif</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> images</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">fps</span><span style="color: #81A1C1">=</span><span style="color: #B48EAD">1</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">state</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> info </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> env</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">reset</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #616E88"># reiniciando o jogo para os próximos exemplos.</span></span></code></pre></div>



<p>Aleatoriamente, ele irá fazer jogadas erradas, mas dessa forma, conseguimos entender de forma mínima como ele se comporta.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="658" height="417" src="https://ramondomingos.com.br/wp-content/uploads/2024/04/image-1.png" alt="" class="wp-image-235" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/04/image-1.png 658w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-1-300x190.png 300w" sizes="(max-width: 658px) 100vw, 658px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="720" height="240" src="https://ramondomingos.com.br/wp-content/uploads/2024/04/replay.gif" alt="Agente andando aleatoriamente." class="wp-image-236"/></figure>



<h1 class="wp-block-heading">Q learning Implemetação</h1>



<p>Passos Iniciais</p>



<ul class="wp-block-list">
<li>Inicialziar a Q-Table com zeros.</li>



<li>Criar agente para:
<ul class="wp-block-list">
<li><strong>Selecionar ação</strong>: Existindo uma tabela Q, um estado, e um épsilon ( parametro de exploração), se escolhe uma ação.</li>



<li><strong>Fazer update na qTable</strong>: O aprendizado em si, ocorre com o registro das recompensas na tabela.</li>



<li><strong>Atualziar Épsilon:</strong> Com o passar dos episódios, precisamos diminuir exploração, e focar no aperfeiçoamento do objetivo.</li>
</ul>
</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="state_space = env.observation_space.n # 48  espaços
action_space = env.action_space.n # 4 açoes ( direita, esquerda, cima, baixo)

def initialize_q_table(state_space, action_space):
    Qtable = np.zeros((state_space, action_space))
    return Qtable" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #D8DEE9FF">state_space </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">observation_space</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">n </span><span style="color: #616E88"># 48  espaços</span></span>
<span class="line"><span style="color: #D8DEE9FF">action_space </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">action_space</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">n </span><span style="color: #616E88"># 4 açoes ( direita, esquerda, cima, baixo)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">initialize_q_table</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">state_space</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">action_space</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    Qtable </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> np</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">zeros</span><span style="color: #ECEFF4">((</span><span style="color: #D8DEE9FF">state_space</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> action_space</span><span style="color: #ECEFF4">))</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> Qtable</span></span></code></pre></div>



<p>Agente</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="# Agente para jogar, e buscar a melhor ação
class CliffwalkingAgent:
    def __init__(self, args):
        self.args = args
        self.training_error = []


    def get_action(
        self,
        Qtable,
        state,
        epsilon
    ):
        if np.random.random() &gt; epsilon:
            return np.argmax(Qtable[state][:])
        else:
            return env.action_space.sample()


    def update(
        self,
        Qtable,
        state,
        new_state,
        action
    ):
        td_target = reward + self.args.discount_factor * np.max(Qtable[new_state])
        td_error = td_target - Qtable[state][action]
        self.training_error.append(td_error)
        return Qtable[state][action] + self.args.learning_rate * td_error


    def decay_epsilon(
        self,
        episode
    ):
        exp_decay = np.exp(-self.args.decay_rate * episode)
        return self.args.min_epsilon + (self.args.max_epsilon - self.args.min_epsilon) * exp_decay
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"><span style="color: #616E88"># Agente para jogar, e buscar a melhor ação</span></span>
<span class="line"><span style="color: #81A1C1">class</span><span style="color: #D8DEE9FF"> </span><span style="color: #8FBCBB">CliffwalkingAgent</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">__init__</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">args</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">args </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> args</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">training_error </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">[]</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">get_action</span><span style="color: #ECEFF4">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">Qtable</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">state</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">epsilon</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> np</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">random</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">random</span><span style="color: #ECEFF4">()</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">&gt;</span><span style="color: #D8DEE9FF"> epsilon</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> np</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">argmax</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">Qtable</span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">state</span><span style="color: #ECEFF4">][:])</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">else</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> env</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">action_space</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">sample</span><span style="color: #ECEFF4">()</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">update</span><span style="color: #ECEFF4">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">Qtable</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">state</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">new_state</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">action</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">        td_target </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> reward </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">args</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">discount_factor </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> np</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">max</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">Qtable</span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">new_state</span><span style="color: #ECEFF4">])</span></span>
<span class="line"><span style="color: #D8DEE9FF">        td_error </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> td_target </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> Qtable</span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">state</span><span style="color: #ECEFF4">][</span><span style="color: #D8DEE9FF">action</span><span style="color: #ECEFF4">]</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">training_error</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">append</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">td_error</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> Qtable</span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">state</span><span style="color: #ECEFF4">][</span><span style="color: #D8DEE9FF">action</span><span style="color: #ECEFF4">]</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">args</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">learning_rate </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> td_error</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">decay_epsilon</span><span style="color: #ECEFF4">(</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">,</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #D8DEE9">episode</span></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">        exp_decay </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> np</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">exp</span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">-self</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">args</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">decay_rate </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> episode</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">args</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">min_epsilon </span><span style="color: #81A1C1">+</span><span style="color: #D8DEE9FF"> </span><span style="color: #ECEFF4">(</span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">args</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">max_epsilon </span><span style="color: #81A1C1">-</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">self</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">args</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">min_epsilon</span><span style="color: #ECEFF4">)</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">*</span><span style="color: #D8DEE9FF"> exp_decay</span></span>
<span class="line"></span></code></pre></div>



<p>Função de treino</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#2e3440ff"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="

def train(n_training_episodes, max_steps, Qtable):
    envClif = gym.make('CliffWalking-v0', render_mode=&quot;rgb_array&quot;)
    agent = CliffwalkingAgent(configs)
    env = gym.wrappers.RecordEpisodeStatistics(envClif, deque_size=configs.n_training_episodes)

    for episode in tqdm(range(n_training_episodes)):
        # Reduce epsilon
        epsilon = agent.decay_epsilon(episode)
        # Reset the environment
        state, info = env.reset()
        step = 0
        terminated = False
        truncated = False


        # repeat
        for step in range(max_steps):
            # epsilon greedy policy
            action = agent.get_action(Qtable, state, epsilon)


            # Take action At and observe Rt+1 and St+1
            new_state, reward, terminated, truncated, info = env.step(action)


            # Update Q-value
            Qtable[state][action] = agent.update(Qtable, state, new_state, action)


            # If terminated or truncated end the episode
            if terminated or truncated:
                break


            state = new_state


    return Qtable, env, agent
" style="color:#d8dee9ff;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki nord" style="background-color: #2e3440ff" tabindex="0"><code><span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #81A1C1">def</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">train</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">n_training_episodes</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">max_steps</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">Qtable</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">    envClif </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> gym</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">make</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">&#39;</span><span style="color: #A3BE8C">CliffWalking-v0</span><span style="color: #ECEFF4">&#39;</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">render_mode</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">&quot;</span><span style="color: #A3BE8C">rgb_array</span><span style="color: #ECEFF4">&quot;</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    agent </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">CliffwalkingAgent</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">configs</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">    env </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> gym</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">wrappers</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">RecordEpisodeStatistics</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">envClif</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">deque_size</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">configs</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">n_training_episodes</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> episode </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">tqdm</span><span style="color: #ECEFF4">(</span><span style="color: #88C0D0">range</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">n_training_episodes</span><span style="color: #ECEFF4">)):</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #616E88"># Reduce epsilon</span></span>
<span class="line"><span style="color: #D8DEE9FF">        epsilon </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> agent</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">decay_epsilon</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">episode</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #616E88"># Reset the environment</span></span>
<span class="line"><span style="color: #D8DEE9FF">        state</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> info </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> env</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">reset</span><span style="color: #ECEFF4">()</span></span>
<span class="line"><span style="color: #D8DEE9FF">        step </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #B48EAD">0</span></span>
<span class="line"><span style="color: #D8DEE9FF">        terminated </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">False</span></span>
<span class="line"><span style="color: #D8DEE9FF">        truncated </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">False</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #616E88"># repeat</span></span>
<span class="line"><span style="color: #D8DEE9FF">        </span><span style="color: #81A1C1">for</span><span style="color: #D8DEE9FF"> step </span><span style="color: #81A1C1">in</span><span style="color: #D8DEE9FF"> </span><span style="color: #88C0D0">range</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">max_steps</span><span style="color: #ECEFF4">):</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #616E88"># epsilon greedy policy</span></span>
<span class="line"><span style="color: #D8DEE9FF">            action </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> agent</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">get_action</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">Qtable</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> state</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> epsilon</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #616E88"># Take action At and observe Rt+1 and St+1</span></span>
<span class="line"><span style="color: #D8DEE9FF">            new_state</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> reward</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> terminated</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> truncated</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> info </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> env</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">step</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">action</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #616E88"># Update Q-value</span></span>
<span class="line"><span style="color: #D8DEE9FF">            Qtable</span><span style="color: #ECEFF4">[</span><span style="color: #D8DEE9FF">state</span><span style="color: #ECEFF4">][</span><span style="color: #D8DEE9FF">action</span><span style="color: #ECEFF4">]</span><span style="color: #D8DEE9FF"> </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> agent</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">update</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">Qtable</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> state</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> new_state</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> action</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #616E88"># If terminated or truncated end the episode</span></span>
<span class="line"><span style="color: #D8DEE9FF">            </span><span style="color: #81A1C1">if</span><span style="color: #D8DEE9FF"> terminated </span><span style="color: #81A1C1">or</span><span style="color: #D8DEE9FF"> truncated</span><span style="color: #ECEFF4">:</span></span>
<span class="line"><span style="color: #D8DEE9FF">                </span><span style="color: #81A1C1">break</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">            state </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> new_state</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">    </span><span style="color: #81A1C1">return</span><span style="color: #D8DEE9FF"> Qtable</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> env</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> agent</span></span>
<span class="line"></span></code></pre></div>



<p>Após algumas sessões de treinamento, o algoritmo tem um excelente desempenho, chegando bem próximo de zero na taxa de erros, e com poucos passos em cada episódio.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="395" src="https://ramondomingos.com.br/wp-content/uploads/2024/04/image-2-1024x395.png" alt="Gráfico de erros e duração dos episódios." class="wp-image-237" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/04/image-2-1024x395.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-2-300x116.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-2-768x297.png 768w, https://ramondomingos.com.br/wp-content/uploads/2024/04/image-2.png 1344w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>E temos um gif, dessa última rodada, com o agente jogando perfeitamente, sem precisar programar regras, ou ensina-lo. Apenas recompensando suas ações</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="720" height="240" src="https://ramondomingos.com.br/wp-content/uploads/2024/04/replay_best.gif" alt="Agente treinado, fazendo o melhor percurso." class="wp-image-238"/></figure>
<p>O post <a href="https://ramondomingos.com.br/aplicando-aprendizagem-por-reforco-no-cliff-walking/">Aplicando Aprendizagem por Reforço no Cliff Walking</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/aplicando-aprendizagem-por-reforco-no-cliff-walking/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Aprendizado por Reforço com o Q-Learning</title>
		<link>https://ramondomingos.com.br/aprendizado-por-reforco-com-o-q-learning/</link>
					<comments>https://ramondomingos.com.br/aprendizado-por-reforco-com-o-q-learning/#comments</comments>
		
		<dc:creator><![CDATA[Ramon Domingos]]></dc:creator>
		<pubDate>Thu, 04 Apr 2024 23:44:09 +0000</pubDate>
				<category><![CDATA[Sem categoria]]></category>
		<guid isPermaLink="false">https://ramondomingos.com.br/?p=227</guid>

					<description><![CDATA[<p>O Q-Learning é um algoritmo fundamental no campo do aprendizado por reforço (APR), permitindo que agentes autônomos aprendam a tomar decisões em ambientes complexos sem serem explicitamente programados. Este guia detalhado irá explorar os mecanismos internos do Q-Learning, desde seus fundamentos até suas aplicações práticas. 1. Abrindo a Caixa Preta: 2. Aprendendo com Tentativa e&#8230;</p>
<p>O post <a href="https://ramondomingos.com.br/aprendizado-por-reforco-com-o-q-learning/">Aprendizado por Reforço com o Q-Learning</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>O Q-Learning é um algoritmo fundamental no campo do aprendizado por reforço (APR), permitindo que agentes autônomos aprendam a tomar decisões em ambientes complexos sem serem explicitamente programados. Este guia detalhado irá explorar os mecanismos internos do Q-Learning, desde seus fundamentos até suas aplicações práticas.</p>



<figure class="wp-block-image size-large is-style-default"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://ramondomingos.com.br/wp-content/uploads/2024/04/Aprendizagem-por-reforco-1024x1024.png" alt="Aprendizagem por reforço" class="wp-image-230" srcset="https://ramondomingos.com.br/wp-content/uploads/2024/04/Aprendizagem-por-reforco-1024x1024.png 1024w, https://ramondomingos.com.br/wp-content/uploads/2024/04/Aprendizagem-por-reforco-300x300.png 300w, https://ramondomingos.com.br/wp-content/uploads/2024/04/Aprendizagem-por-reforco-150x150.png 150w, https://ramondomingos.com.br/wp-content/uploads/2024/04/Aprendizagem-por-reforco-768x768.png 768w, https://ramondomingos.com.br/wp-content/uploads/2024/04/Aprendizagem-por-reforco.png 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><strong>1. Abrindo a Caixa Preta:</strong></p>



<ul class="wp-block-list">
<li><strong>O Agente:</strong>&nbsp;Imagine um robô explorando um labirinto. O Q-Learning guia suas decisões, mapeando estados do ambiente (posições no labirinto) para ações (mover-se para cima, baixo, etc.) e recompensas (encontrar queijo).</li>



<li><strong>A Função Q:</strong>&nbsp;No coração do Q-Learning está a função Q, que armazena o valor esperado de tomar uma ação em um determinado estado. Essa função é estimada e atualizada ao longo do tempo, guiando o agente para melhores decisões.</li>



<li><strong>Recompensas e Penalidades:</strong>&nbsp;O ambiente fornece feedback ao agente, recompensando ações vantajosas (encontrar queijo) e penalizando ações prejudiciais (cair em um buraco).</li>



<li><strong>Episódios e Experiência:</strong>&nbsp;A jornada do agente é dividida em episódios, onde cada ação e recompensa contribuem para a sua base de conhecimento. A experiência acumulada molda a função Q e aprimora a tomada de decisões.</li>
</ul>



<p><strong>2. Aprendendo com Tentativa e Erro:</strong></p>



<ul class="wp-block-list">
<li><strong>Atualização da Função Q:</strong>&nbsp;A fórmula de atualização do Q-Learning é crucial. Ela pondera a recompensa imediata com o valor futuro potencial, ajustando a função Q para cada ação-estado.</li>



<li><strong>Equilíbrio entre Exploração e Exploração:</strong>&nbsp;O agente precisa explorar o ambiente para encontrar novas oportunidades, mas também explorar as ações já aprendidas para maximizar recompensas. Essa dicotomia é crucial para o aprendizado eficiente.</li>



<li><strong>A Taxa de Aprendizagem:</strong>&nbsp;Controla o quanto a nova informação influencia a função Q. Uma taxa alta permite adaptações rápidas, enquanto uma taxa baixa promove estabilidade e evita oscilações.</li>



<li><strong>Desconto de Recompensa:</strong>&nbsp;Recompensas futuras são menos valiosas que as imediatas. O desconto de recompensa ajusta o valor das recompensas futuras, equilibrando a gratificação instantânea com objetivos de longo prazo.</li>
</ul>



<p><strong>3. Implementando o Q-Learning:</strong></p>



<ul class="wp-block-list">
<li><strong>Definindo o Ambiente:</strong>&nbsp;Comece por definir os estados, ações e recompensas do seu problema.</li>



<li><strong>Inicializando a Função Q:</strong>&nbsp;Inicialize a função Q com valores arbitrários ou com base em conhecimento prévio.</li>



<li><strong>Executando o Loop de Aprendizado:</strong>
<ul class="wp-block-list">
<li>O agente observa o estado atual do ambiente.</li>



<li>Seleciona uma ação com base na função Q e na estratégia de exploração/exploração.</li>



<li>Executa a ação e observa a recompensa e o novo estado.</li>



<li>Atualiza a função Q com base na fórmula de atualização.</li>



<li>Repete os passos acima até que o objetivo seja atingido.</li>
</ul>
</li>
</ul>



<p><strong>4. Considerações Importantes:</strong></p>



<ul class="wp-block-list">
<li><strong>Convergência:</strong>&nbsp;A função Q pode levar tempo para convergir para valores ótimos. Fatores como taxa de aprendizado, desconto de recompensa e estratégia de exploração/exploração impactam a convergência.</li>



<li><strong>Maldição da Dimensionalidade:</strong>&nbsp;O Q-Learning pode se tornar ineficaz em ambientes com muitos estados e ações. Técnicas como discretização de estados e generalização podem ser utilizadas para mitigar esse problema.</li>



<li><strong>Recompensas Raras:</strong>&nbsp;O aprendizado pode ser lento se as recompensas forem muito raras. Técnicas como modelagem de recompensas e bootstrapping podem ser úteis nesses casos.</li>
</ul>



<p><strong>5. Explorando Aplicações:</strong></p>



<p>O Q-Learning tem sido aplicado em diversos domínios, como:</p>



<ul class="wp-block-list">
<li><strong>Robótica:</strong>&nbsp;Controle de robôs para navegação, manipulação de objetos e tarefas complexas.</li>



<li><strong>Jogos:</strong>&nbsp;Treinamento de agentes para jogar jogos de tabuleiro, cartas e videogames.</li>



<li><strong>Finanças:</strong>&nbsp;Negociação de ações e otimização de portfólios.</li>



<li><strong>Recomendação:</strong>&nbsp;Personalização de sistemas de recomendação de produtos e serviços.</li>
</ul>



<p>No próximo post vamos aplicar esse conceito em um jogo.</p>
<p>O post <a href="https://ramondomingos.com.br/aprendizado-por-reforco-com-o-q-learning/">Aprendizado por Reforço com o Q-Learning</a> apareceu primeiro em <a href="https://ramondomingos.com.br">Ramon Domingos Blog</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://ramondomingos.com.br/aprendizado-por-reforco-com-o-q-learning/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
