{"id":55700,"date":"2020-01-26T00:00:00","date_gmt":"2020-01-25T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti"},"modified":"2020-02-18T14:03:50","modified_gmt":"2020-02-18T11:03:50","slug":"trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","title":{"rendered":"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>O princ\u00edpio da incerteza de Heisenberg afirma que n\u00e3o \u00e9 poss\u00edvel medir simultaneamente a posi\u00e7\u00e3o de um objeto e sua velocidade. Se um objeto est\u00e1 em movimento, ele n\u00e3o tem uma localiza\u00e7\u00e3o definida. E se h\u00e1 uma localiza\u00e7\u00e3o, significa que n\u00e3o possui velocidade.<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/617ace5f892b62652b404b24585537b0.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNo que diz respeito aos microsservi\u00e7os na plataforma Red Hat OpenShift (e sob a gest\u00e3o do Kubernetes), devido ao software de c\u00f3digo aberto, eles podem relatar simultaneamente seu desempenho e sua integridade. Isso, \u00e9 claro, n\u00e3o refuta o velho Heisenberg, mas elimina a incerteza ao trabalhar com aplica\u00e7\u00f5es em nuvem. O Istio permite organizar facilmente a rastreabilidade e o monitoramento dessas aplica\u00e7\u00f5es para mant\u00ea-las sob controle.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Definindo a terminologia<\/h3>\n<p>\nPor <b>rastreamento<\/b> (Tracing) entendemos como o registro da atividade do sistema. Parece bastante gen\u00e9rico, mas na verdade uma das principais regras aqui \u00e9 despejar os dados de rastreamento no reposit\u00f3rio apropriado, sem se preocupar com sua formata\u00e7\u00e3o. E todo o trabalho de busca e an\u00e1lise dos dados \u00e9 responsabilidade do consumidor. O Istio usa o sistema de rastreamento Jaeger, que implementa o modelo de dados OpenTracing.<\/p>\n<p><b>Rastros<\/b> (Traces, e a palavra \"rastros\" aqui \u00e9 usada no sentido de \"marcas\", como na an\u00e1lise bal\u00edstica) chamaremos de dados que descrevem completamente o percurso de uma solicita\u00e7\u00e3o ou unidade de trabalho, ou seja, \"do in\u00edcio ao fim\". Por exemplo, tudo o que acontece desde o momento em que o usu\u00e1rio clica em um bot\u00e3o na p\u00e1gina da web at\u00e9 o retorno dos dados, incluindo todos os microsservi\u00e7os envolvidos. Pode-se dizer que um rastro descreve completamente (ou modela) o percurso de uma solicita\u00e7\u00e3o de ida e volta. Na interface do Jaeger, os rastros s\u00e3o dispostos em componentes ao longo do tempo, como uma corrente pode ser dividida em elos individuais. Mas, em vez de elos, o rastro consiste nos chamados spans.<\/p>\n<p><b>Span<\/b> \u2013 \u00e9 o intervalo desde o in\u00edcio da execu\u00e7\u00e3o de uma unidade de trabalho at\u00e9 sua conclus\u00e3o. Continuando a analogia, pode-se dizer que cada span \u00e9 um elo separado da corrente. Um span pode ter (ou n\u00e3o ter) um ou mais spans filhos. Como consequ\u00eancia, o span de n\u00edvel mais alto (root span) ter\u00e1 a mesma dura\u00e7\u00e3o geral que o rastro ao qual est\u00e1 associado.<\/p>\n<p><b>Monitoramento<\/b> \u2013 \u00e9, na verdade, a pr\u00f3pria observa\u00e7\u00e3o do seu sistema \u2013 atrav\u00e9s dos olhos, pelo UI ou por meio de ferramentas de automa\u00e7\u00e3o. A base da monitoriza\u00e7\u00e3o est\u00e1 nos dados de rastreamento. No Istio, a monitoriza\u00e7\u00e3o \u00e9 implementada usando o Prometheus e possui uma interface correspondente. O Prometheus suporta a monitoriza\u00e7\u00e3o autom\u00e1tica com o uso de alertas e Alert Managers.<\/p>\n<h3>Deixamos marcas<\/h3>\n<p>\nPara que o rastreamento seja poss\u00edvel, a aplica\u00e7\u00e3o deve criar uma cole\u00e7\u00e3o de spans. Depois, eles precisam ser exportados para o Jaeger, que por sua vez ir\u00e1 criar uma representa\u00e7\u00e3o visual do rastreamento. Entre outras coisas, esses spans marcam o nome da opera\u00e7\u00e3o, bem como as marcas de tempo de in\u00edcio e t\u00e9rmino. A transfer\u00eancia dos spans \u00e9 feita redirecionando os cabe\u00e7alhos HTTP destinados ao Jaeger das requisi\u00e7\u00f5es de entrada para as requisi\u00e7\u00f5es de sa\u00edda. Dependendo da linguagem de programa\u00e7\u00e3o utilizada, isso pode exigir uma pequena modifica\u00e7\u00e3o no c\u00f3digo-fonte das aplica\u00e7\u00f5es. Abaixo est\u00e1 um exemplo de c\u00f3digo em Java (usando o framework Spring Boot) que adiciona cabe\u00e7alhos B3 (estilo Zipkin) \u00e0 sua solicita\u00e7\u00e3o na classe de configura\u00e7\u00e3o do Spring:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/2314e2d156dc9b9fdb299af2dac01f66.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAs seguintes configura\u00e7\u00f5es de cabe\u00e7alho s\u00e3o utilizadas:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/18f0a13af27665ec2d154ff4cff48157.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSe voc\u00ea estiver usando Java, n\u00e3o \u00e9 necess\u00e1rio alterar o c\u00f3digo, apenas adicionar algumas linhas no arquivo POM do Maven e definir vari\u00e1veis de ambiente. Aqui est\u00e3o as linhas que devem ser adicionadas ao arquivo POM.XML para implementar o Jaeger Tracer Resolver:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/a63a634c2c22fc09a237cafc4873855d.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAs correspondentes vari\u00e1veis de ambiente s\u00e3o definidas no Dockerfile:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/7fe9046242d7e628342a6266e4a2f743.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPronto, agora tudo est\u00e1 configurado, e nossos microservi\u00e7os come\u00e7ar\u00e3o a gerar dados de rastreamento.<\/p>\n<h3>Vamos dar uma olhada de forma geral<\/h3>\n<p>\nO Istio inclui um painel de controle simples baseado no Grafana. Quando tudo est\u00e1 configurado e funcionando na plataforma Red Hat OpenShift PaaS (no nosso exemplo, Red Hat OpenShift e Kubernetes est\u00e3o implementados no minishift), este painel \u00e9 iniciado com o seguinte comando:<\/p>\n<pre><code class=\"plaintext\">abra &quot;$(minishift openshift service grafana -u)\\\/d\\\/1\\\/istio-dashboard?refresh=5&amp;ord;Id=1&quot;\n<\/code><\/pre>\n<p>\nO painel do Grafana permite avaliar rapidamente o desempenho do sistema. Um fragmento deste painel \u00e9 mostrado na figura abaixo:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/2c10cd23fd5166f437c2b3c1d50c6a18.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAqui podemos ver que o microsservi\u00e7o customer chama o microsservi\u00e7o preference v1, que por sua vez chama os microsservi\u00e7os recommendation v1 e v2. No painel Grafana, h\u00e1 um bloco Dashboard Row para m\u00e9tricas de alto n\u00edvel, como o volume total de solicita\u00e7\u00f5es (Global Request Volume), a taxa de solicita\u00e7\u00f5es bem-sucedidas (success rates) e erros 4xx. Al\u00e9m disso, h\u00e1 uma visualiza\u00e7\u00e3o Server Mesh com gr\u00e1ficos para cada servi\u00e7o e um bloco Services Row para ver detalhes sobre cada cont\u00eainer de cada servi\u00e7o.<\/p>\n<h3>Agora vamos mergulhar mais fundo<\/h3>\n<p>\nCom o rastreamento do Istio configurado corretamente, o que pode ser feito praticamente direto da caixa, \u00e9 poss\u00edvel aprofundar na an\u00e1lise de desempenho do sistema. Na interface do Jaeger, voc\u00ea pode visualizar rastreamentos e ver qu\u00e3o longe e profundo eles v\u00e3o, al\u00e9m de localizar visualmente os gargalos de desempenho. Ao usar o Red Hat OpenShift na plataforma minishift, voc\u00ea pode iniciar a interface do Jaeger com o seguinte comando:<\/p>\n<pre><code class=\"plaintext\">minishift openshift service jaeger-query --in-browser\n<\/code><\/pre>\n<p>\n<img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/074fea646ad191f819a9a67a3f311c8f.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nO que podemos dizer sobre o rastreamento nesta tela:<\/p>\n<ul>\n<li>Ele \u00e9 dividido em 7 spans.<\/li>\n<li>O tempo total de execu\u00e7\u00e3o \u00e9 de 6,99 ms.<\/li>\n<li>O microsservi\u00e7o recommendation, que \u00e9 o \u00faltimo da cadeia, leva 0,69 ms.<\/li>\n<\/ul>\n<p>\nDiagramas desse tipo permitem entender rapidamente a situa\u00e7\u00e3o quando um servi\u00e7o que n\u00e3o est\u00e1 funcionando bem afeta o desempenho de todo o sistema.<\/p>\n<p>Agora, vamos complicar a tarefa e executar duas inst\u00e2ncias do microsservi\u00e7o recommendation:v2 com o comando oc scale &#8212;replicas=2 deployment\\\/recommendation-v2. Aqui est\u00e3o os pods que teremos depois disso:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/0ecb8d78d6967d0392de67be6553b870.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSe agora voltarmos ao Jaeger e expandirmos o span para o servi\u00e7o recommendation, veremos para qual pod as solicita\u00e7\u00f5es est\u00e3o sendo roteadas. Assim, podemos facilmente localizar os delays no n\u00edvel de um pod espec\u00edfico. Observe o campo node_id:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/474da66c581692cd11070a1732ac5458.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Para onde e como tudo \u00e9 encaminhado<\/h3>\n<p>\nAgora, vamos para a interface do Prometheus e, como era de se esperar, vemos que as solicita\u00e7\u00f5es entre a segunda e a primeira vers\u00f5es do servi\u00e7o recommendation est\u00e3o sendo divididas na propor\u00e7\u00e3o de 2:1, estritamente de acordo com o n\u00famero de pods em funcionamento. Al\u00e9m disso, esse gr\u00e1fico mudar\u00e1 dinamicamente com a escalonamento dos pods para cima e para baixo, o que ser\u00e1 especialmente \u00fatil durante o Canary Deployment (veremos essa estrat\u00e9gia de implanta\u00e7\u00e3o em mais detalhes da pr\u00f3xima vez).<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/c080fffd2398b0a2eac3e63665bdb0a7.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Tudo est\u00e1 apenas come\u00e7ando<\/h3>\n<p>\nNa verdade, hoje apenas tocamos levemente na fonte de informa\u00e7\u00f5es \u00fateis sobre Jaeger, Grafana e Prometheus. Esse era, de fato, nosso objetivo \u2013 direcion\u00e1-lo na dire\u00e7\u00e3o certa e abrir as perspectivas do Istio.<\/p>\n<p>E lembre-se, tudo isso j\u00e1 est\u00e1 embutido no Istio. Ao usar certas linguagens de programa\u00e7\u00e3o (como Java) e frameworks (como Spring Boot), tudo isso pode ser implementado sem alterar o c\u00f3digo das aplica\u00e7\u00f5es. Sim, ser\u00e1 necess\u00e1rio modificar um pouco o c\u00f3digo se voc\u00ea estiver usando outras linguagens, principalmente Nodejs ou C#. Mas como a rastreabilidade (ou 'tra\u00e7abilidade') \u00e9 um dos requisitos obrigat\u00f3rios na constru\u00e7\u00e3o de sistemas de nuvem confi\u00e1veis, voc\u00ea precisar\u00e1 ajustar o c\u00f3digo de qualquer forma, independentemente de ter ou n\u00e3o o Istio. Ent\u00e3o, por que n\u00e3o direcionar seu esfor\u00e7o de forma mais produtiva?<\/p>\n<p>Pelo menos para sempre responder \u00e0s perguntas 'onde?' e 'com que rapidez?' com 100% de certeza.<\/p>\n<h3>Engenharia do caos no Istio: assim foi planejado<\/h3>\n<p><\/p>\n<h3>A habilidade de quebrar coisas ajuda a garantir que elas n\u00e3o quebrem<\/h3>\n<p>\nTestar software \u00e9 algo n\u00e3o apenas complicado, mas tamb\u00e9m importante. Ao mesmo tempo, testar a corre\u00e7\u00e3o (por exemplo, se uma fun\u00e7\u00e3o retorna o resultado correto) \u00e9 uma coisa, enquanto testar em condi\u00e7\u00f5es de rede inst\u00e1vel \u00e9 uma tarefa completamente diferente (frequentemente, assume-se que a rede sempre funciona sem falhas, e essa \u00e9 a primeira de oito fal\u00e1cias sobre computa\u00e7\u00e3o distribu\u00edda). Uma das dificuldades ao enfrentar essa tarefa \u00e9 como simular falhas no sistema ou introduzi-las deliberadamente, realizando o que \u00e9 conhecido como inje\u00e7\u00e3o de falhas. Isso pode ser feito modificando o c\u00f3digo-fonte da pr\u00f3pria aplica\u00e7\u00e3o. Mas ent\u00e3o voc\u00ea estar\u00e1 testando n\u00e3o seu c\u00f3digo original, mas uma vers\u00e3o que simula falhas. Como resultado, voc\u00ea corre o risco de cair nos abra\u00e7os mortais da inje\u00e7\u00e3o de falhas e enfrentar 'geysers bugs' \u2013 falhas que desaparecem ao tentar detect\u00e1-las.<\/p>\n<p>Agora, vamos mostrar como o Istio ajuda a enfrentar essas complexidades de maneira simples.<\/p>\n<h3>Como tudo parece quando est\u00e1 tudo \u00f3timo<\/h3>\n<p>\nVamos considerar o seguinte cen\u00e1rio: temos dois pods para nosso microsservi\u00e7o de recomenda\u00e7\u00e3o, que pegamos do manual do Istio. Um pod est\u00e1 marcado como v1 e o outro como v2. Como podemos ver, tudo est\u00e1 funcionando perfeitamente at\u00e9 agora.<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/c50387b7cfd12298cfab8123f13b2ca4.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n(A prop\u00f3sito, o n\u00famero \u00e0 direita \u00e9 apenas um contador de chamadas para cada pod.)<\/p>\n<p>Mas precisamos de algo muito diferente, certo? Bem, vamos tentar quebrar tudo, sem tocar no c\u00f3digo fonte.<\/p>\n<h3>Causando interrup\u00e7\u00f5es no funcionamento do microservi\u00e7o<\/h3>\n<p>\nAbaixo est\u00e1 o arquivo yaml para a regra de roteamento do Istio, que falhar\u00e1 em metade das vezes (erro <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/pt\/server\/dts-los-angeles\/\"   title=\"servidor\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"3597\">servidor<\/a> 503):<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/8fb3ed7f16ed7fd1a57b27dfc3bfd2da.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nObserve que estamos especificando claramente que em metade das vezes deve retornar um erro 503.<\/p>\n<p>E d\u00e1 uma olhada em como ser\u00e1 a captura de tela do comando curl em execu\u00e7\u00e3o em loop ap\u00f3s ativarmos essa regra para simular falhas. Como vemos, metade das requisi\u00e7\u00f5es retorna o erro 503, independentemente de para qual pod \u2013 v1 ou v2 \u2013 elas est\u00e3o indo:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/3d9760cf5abc7480ad3aab826c274766.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPara restaurar o funcionamento normal, basta remover essa regra, que neste caso \u00e9 feita com o comando istioctl delete routerule recommendation-503 -n tutorial. Aqui, Tutorial \u00e9 o nome do projeto Red Hat OpenShift em que nosso tutorial de Istio est\u00e1 sendo executado.<\/p>\n<h3>Introduzindo atrasos artificiais<\/h3>\n<p>\nErros artificiais 503 ajudam a testar o sistema quanto \u00e0 resist\u00eancia a falhas, mas a capacidade de prever e lidar com atrasos deve impression\u00e1-lo ainda mais. Al\u00e9m disso, atrasos na vida real ocorrem com mais frequ\u00eancia do que falhas. Um microservi\u00e7o lento \u00e9 um veneno que afeta todo o sistema. Com o Istio, podemos testar o c\u00f3digo relacionado ao manejo de atrasos sem alter\u00e1-lo. Para come\u00e7ar, vamos mostrar como fazer isso no caso de atrasos de rede introduzidos artificialmente.<\/p>\n<p>Observe que, ap\u00f3s esse teste, pode ser que voc\u00ea precise (ou queira) ajustar seu c\u00f3digo. A boa not\u00edcia \u00e9 que, neste caso, voc\u00ea estar\u00e1 agindo de forma proativa, e n\u00e3o reativa. \u00c9 assim que o ciclo de desenvolvimento deve ser constru\u00eddo: codifica\u00e7\u00e3o-teste-feedback-codifica\u00e7\u00e3o-teste\u2026<\/p>\n<p>Aqui est\u00e1 como parece a regra que... Embora voc\u00ea saiba o qu\u00ea? O Istio \u00e9 t\u00e3o simples e este arquivo yaml \u00e9 t\u00e3o claro que tudo neste exemplo fala por si s\u00f3, basta dar uma olhada:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/e077e891cbccc66ebc4d4c7b67a0f1ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa metade dos casos, teremos um atraso de 7 segundos. E isso n\u00e3o \u00e9 o mesmo que se tiv\u00e9ssemos inserido um comando sleep no c\u00f3digo-fonte, pois o Istio realmente atrasa a solicita\u00e7\u00e3o em 7 segundos. Como o Istio suporta rastreamento Jaeger, esse atraso \u00e9 claramente vis\u00edvel na interface do Jaeger, como mostrado na captura de tela abaixo. Observe a longa solicita\u00e7\u00e3o no canto superior direito do gr\u00e1fico \u2013 sua dura\u00e7\u00e3o \u00e9 de 7,02 segundos:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/97a7b33fb7e0455973c7fd1b2aefadf3.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEsse cen\u00e1rio permite testar o c\u00f3digo em condi\u00e7\u00f5es de atrasos de rede. E \u00e9 evidente que, ao remover essa regra, eliminaremos o atraso artificial. Reiteramos, mas fizemos tudo isso sem tocar no c\u00f3digo-fonte.<\/p>\n<h3>N\u00e3o recuar e n\u00e3o desistir<\/h3>\n<p>\nOutra fun\u00e7\u00e3o \u00fatil do Istio para engenharia do caos \u00e9 a possibilidade de fazer novas tentativas ao servi\u00e7o um n\u00famero determinado de vezes. A ideia aqui \u00e9 n\u00e3o parar de tentar quando a primeira solicita\u00e7\u00e3o resulta em erro 503 \u2013 e assim, talvez na N-\u00e9sima tentativa tenhamos sorte. Pode ser que o servi\u00e7o tenha apenas se desacelerado por algum motivo. Sim, essa causa precisa ser investigada e resolvida. Mas isso fica para depois; por enquanto, vamos tentar manter o sistema em funcionamento.<\/p>\n<p>Ent\u00e3o, queremos que o servi\u00e7o ocasionalmente retorne um erro 503, e o Istio, ap\u00f3s isso, tente se reconectar. E aqui claramente precisamos de uma forma de gerar um erro 503 sem tocar no c\u00f3digo\u2026<\/p>\n<p>Espere, um momento! Acabamos de fazer isso.<\/p>\n<p>Este arquivo far\u00e1 com que o servi\u00e7o recommendation-v2 retorne um erro 503 em metade das vezes:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/f446528f9c968e40cc2cf318cf0acde9.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c9 evidente que parte das solicita\u00e7\u00f5es terminar\u00e1 em falha:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/f998513746604beda241b8d6de2ed727.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nE agora vamos ativar a fun\u00e7\u00e3o Retry do Istio:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/32e210b6ecbf4c1ecf121ee73e64ba35.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEsta regra de roteamento faz tr\u00eas tentativas com um intervalo de dois segundos e deve reduzir (e idealmente eliminar) os erros 503:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/7f9711c52949072b823399e59141cb64.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nResumindo: fizemos com que o Istio, em primeiro lugar, gerasse um erro 503 para metade das solicita\u00e7\u00f5es. E, em segundo lugar, o mesmo Istio realiza tr\u00eas tentativas de se reconectar ao servi\u00e7o em caso de erro 503. Como resultado, tudo funciona perfeitamente. Assim, usando a fun\u00e7\u00e3o Retry, cumprimos nossa promessa de n\u00e3o recuar e n\u00e3o desistir.<\/p>\n<p>E sim, fizemos isso novamente, sem tocar no c\u00f3digo. Tudo o que precisamos foi de duas regras de roteamento do Istio:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/c21a1cfd2d78ae4145a57d1cefcc6c59.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Como n\u00e3o decepcionar o usu\u00e1rio ou sete pessoas n\u00e3o esperam<\/h3>\n<p>\nE agora vamos inverter a situa\u00e7\u00e3o e considerar um cen\u00e1rio em que n\u00e3o devemos recuar e desistir apenas por um tempo fixo. Depois, devemos simplesmente parar de tentar processar a solicita\u00e7\u00e3o, para n\u00e3o fazer todos aguardarem por um \u00fanico servi\u00e7o que est\u00e1 lento. Em outras palavras, n\u00e3o iremos proteger uma posi\u00e7\u00e3o perdida, mas recuaremos para uma linha de defesa secund\u00e1ria, para n\u00e3o desapontar o usu\u00e1rio do site e n\u00e3o for\u00e7\u00e1-lo a ficar na incerteza.<\/p>\n<p>No Istio, \u00e9 poss\u00edvel definir um timeout para a execu\u00e7\u00e3o da solicita\u00e7\u00e3o. Se o servi\u00e7o exceder esse timeout, um erro 504 (Gateway Timeout) ser\u00e1 retornado \u2013 novamente, tudo isso \u00e9 feito atrav\u00e9s da configura\u00e7\u00e3o do Istio. Mas teremos que adicionar um comando sleep no c\u00f3digo-fonte do servi\u00e7o (e, claro, realizar o rebuild e redeploy), para simular um desempenho lento do servi\u00e7o. Infelizmente, n\u00e3o h\u00e1 outra maneira.<\/p>\n<p>Assim, inserimos um sleep de tr\u00eas segundos no c\u00f3digo do servi\u00e7o recommendation v2, recompilemos a imagem correspondente e fizemos o redeploy do cont\u00eainer, e agora vamos adicionar um timeout usando a seguinte regra de roteamento do Istio:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/c03fc452b98dd875a8a7d3ac561893ca.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNa captura de tela acima, voc\u00ea pode ver que desistimos de tentar nos conectar ao servi\u00e7o recommendation se n\u00e3o recebermos uma resposta em um segundo, ou seja, ainda antes de ocorrer o erro 504. Ap\u00f3s aplicar essa regra de roteamento (e adicionar um sleep de tr\u00eas segundos no c\u00f3digo do servi\u00e7o recommendation:v2), teremos o seguinte resultado:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento e monitoramento no Istio: microservi\u00e7os e o princ\u00edpio da incerteza\" src=\"\/wp-content\/uploads\/2020\/01\/ed6e80052c67254718b1fde2bd873e71.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nNovamente, reiteramos que o timeout pode ser definido sem alterar o c\u00f3digo-fonte. Um benef\u00edcio adicional aqui \u00e9 que agora voc\u00ea pode modificar seu c\u00f3digo para que ele reaja ao timeout, e testar facilmente essas modifica\u00e7\u00f5es usando o Istio.<\/p>\n<h3>E agora tudo junto<\/h3>\n<p>\nAdicionar um pouco de caos com o Istio \u00e9 uma excelente maneira de testar seu c\u00f3digo e a confiabilidade do seu sistema como um todo. Padr\u00f5es de fallback, bulkhead e circuit breaker, mecanismos para criar falhas e atrasos artificiais, bem como re-execu\u00e7\u00f5es e timeouts, ser\u00e3o muito \u00fateis na constru\u00e7\u00e3o de sistemas em nuvem resilientes. Em conjunto com o Kubernetes e o Red Hat OpenShift, essas ferramentas ajudar\u00e3o a enfrentar o futuro com confian\u00e7a.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/485136\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0410 \u0435\u0441\u043b\u0438 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0435\u0441\u0442\u044c \u2013 \u0437\u043d\u0430\u0447\u0438\u0442 \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438. \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 Red Hat OpenShift (\u0438 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Kubernetes), \u0442\u043e \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u043c\u0443 \u0441\u043e\u0444\u0442\u0443 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0440\u0430\u043f\u043e\u0440\u0442\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55700","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432 Istio: \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-25T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:50+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Rastreamento e monitoramento no Istio: microsservi\u00e7os e o princ\u00edpio da incerteza | ProHoster","description":"O princ\u00edpio da incerteza de Heisenberg afirma que n\u00e3o se pode medir ao mesmo tempo a posi\u00e7\u00e3o de um objeto e sua velocidade. Se o objeto estiver em movimento, ent\u00e3o ele n\u00e3o tem uma localiza\u00e7\u00e3o definida.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0432 Istio: \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 | ProHoster","og:description":"\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0413\u0435\u0439\u0437\u0435\u043d\u0431\u0435\u0440\u0433\u0430 \u0433\u043b\u0430\u0441\u0438\u0442, \u0447\u0442\u043e \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0437\u043c\u0435\u0440\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c. \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u0432\u0438\u0436\u0435\u0442\u0441\u044f, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/trassirovka-i-monitoring-v-istio-mikroservisy-i-printsip-neopredelennosti","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-25T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:50+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55700","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:38:32","updated":"2026-02-22 15:29:16","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/55700","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=55700"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/55700\/revisions"}],"predecessor-version":[{"id":162124,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/55700\/revisions\/162124"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=55700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=55700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=55700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}