{"id":52115,"date":"2019-11-01T00:00:00","date_gmt":"2019-10-31T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury"},"modified":"2020-02-18T13:59:47","modified_gmt":"2020-02-18T10:59:47","slug":"monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury","title":{"rendered":"Monitoramento como servi\u00e7o: um sistema modular para arquitetura de microsservi\u00e7os","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hoje, em nosso projeto, al\u00e9m do c\u00f3digo monol\u00edtico, funcionam dezenas de microsservi\u00e7os. Cada um deles requer monitoramento. Fazer isso em tal escala com a ajuda de engenheiros DevOps \u00e9 problem\u00e1tico. Desenvolvemos um sistema de monitoramento que funciona como um servi\u00e7o para os desenvolvedores. Eles podem escrever m\u00e9tricas para o sistema de monitoramento, utiliz\u00e1-las, criar pain\u00e9is com base nelas, e configurar alertas que ser\u00e3o acionados ao atingirem limites predefinidos. Os engenheiros DevOps cuidam apenas da infraestrutura e da documenta\u00e7\u00e3o. <\/p>\n<p>Esta postagem \u00e9 a transcri\u00e7\u00e3o da minha apresenta\u00e7\u00e3o na nossa <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/tomicro\">sess\u00e3o<\/a><\/noindex> na RIT++. Muitos pediram que fiz\u00e9ssemos vers\u00f5es textuais das palestras l\u00e1. Se voc\u00ea estava na confer\u00eancia ou assistiu ao v\u00eddeo, n\u00e3o encontrar\u00e1 nada de novo. E para todos os outros \u2014 bem-vindos ao post. Vou contar como chegamos a esse sistema, como ele funciona e como planejamos atualiz\u00e1-lo. <\/p>\n<p><img decoding=\"async\" alt=\"Monitoramento como servi\u00e7o: um sistema modular para arquitetura de microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2019\/11\/000b8fdc8fb16aa76ce545ff2aa4e767.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>O passado: esquemas e planos <\/h3>\n<p>\nComo chegamos ao sistema de monitoramento existente? Para responder a essa pergunta, precisamos voltar a 2015. Veja como era naquela \u00e9poca: <\/p>\n<p><img decoding=\"async\" alt=\"Monitoramento como servi\u00e7o: um sistema modular para arquitetura de microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2019\/11\/d955f9bcdb5f5a5a54720c77113ca85d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00ednhamos cerca de 24 n\u00f3s respons\u00e1veis pelo monitoramento. Aqui havia um conjunto de diferentes cron jobs, scripts, daemons que monitoravam algo de alguma forma, enviavam mensagens, executavam fun\u00e7\u00f5es. Pensamos que quanto mais avan\u00e7\u00e1ssemos, menos vi\u00e1vel seria tal sistema. N\u00e3o fazia sentido desenvolv\u00ea-lo: era muito pesado. <br \/>\nDecidimos escolher os elementos de monitoramento que manter\u00edamos e desenvolver\u00edamos, e aqueles dos quais desistir\u00edamos. Afinal, restaram 19. Fomos deixados apenas com Graphite, agregadores e Grafana como painel. Mas como ser\u00e1 o novo sistema? Assim: <\/p>\n<p><img decoding=\"async\" alt=\"Monitoramento como servi\u00e7o: um sistema modular para arquitetura de microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2019\/11\/57d220113d0b76c05874b5d774bff8af.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTemos um armazenamento de m\u00e9tricas: s\u00e3o os Graphites, que ser\u00e3o baseados em SSDs r\u00e1pidos, al\u00e9m de determinados agregadores para m\u00e9tricas. Em seguida \u2014 Grafana para exibi\u00e7\u00e3o de pain\u00e9is e Moira como sistema de alerta. Tamb\u00e9m quer\u00edamos desenvolver um sistema para detec\u00e7\u00e3o de anomalias. <\/p>\n<h3>Padr\u00e3o: Monitoramento 2.0<\/h3>\n<p>\nAssim eram os planos em 2015. Mas precis\u00e1vamos preparar n\u00e3o apenas a infraestrutura e o pr\u00f3prio servi\u00e7o, mas tamb\u00e9m a documenta\u00e7\u00e3o para ele. Desenvolvemos para n\u00f3s um padr\u00e3o corporativo que chamamos de monitoramento 2.0. Quais eram os requisitos para o sistema? <\/p>\n<ul>\n<li>disponibilidade constante; <\/li>\n<li>intervalo de armazenamento de m\u00e9tricas = 10 segundos; <\/li>\n<li>armazenamento estruturado de m\u00e9tricas e pain\u00e9is; <\/li>\n<li>SLA &gt; 99,99% <\/li>\n<li>coleta de m\u00e9tricas de eventos via UDP (!). <\/li>\n<\/ul>\n<p>\nPrecis\u00e1vamos de UDP, pois temos um grande fluxo de tr\u00e1fego e eventos que geram m\u00e9tricas. Se todas fossem escritas de uma vez no Graphite, o armazenamento falharia. Tamb\u00e9m optamos por prefixos de primeiro n\u00edvel para todas as m\u00e9tricas. <\/p>\n<p><img decoding=\"async\" alt=\"Monitoramento como servi\u00e7o: um sistema modular para arquitetura de microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2019\/11\/d24c4474b19b532a48cef4d4376287ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nCada prefixo tem uma propriedade espec\u00edfica. Existem m\u00e9tricas para servidores, redes, containers, recursos, aplica\u00e7\u00f5es e assim por diante. Implementamos um filtro claro, rigoroso e tipificado, onde aceitamos m\u00e9tricas de primeiro n\u00edvel e descartamos as restantes. Assim planejamos este sistema em 2015. E o que temos agora? <\/p>\n<h3>O presente: esquema de intera\u00e7\u00e3o dos componentes de monitoramento<\/h3>\n<p>\nEm primeiro lugar, monitoramos as aplica\u00e7\u00f5es: nosso c\u00f3digo PHP, aplica\u00e7\u00f5es e microservi\u00e7os - em suma, tudo que nossos desenvolvedores escrevem. Todas as aplica\u00e7\u00f5es enviam m\u00e9tricas para o agregador Brubeck (statsd, reescrito em C) via UDP. Ele se mostrou o mais r\u00e1pido em testes sint\u00e9ticos. E j\u00e1 envia m\u00e9tricas agregadas para o Graphite via TCP. <\/p>\n<p>Ele possui um tipo de m\u00e9trica chamado timers. Isso \u00e9 muito \u00fatil. Por exemplo, para cada conex\u00e3o do usu\u00e1rio com o servi\u00e7o, voc\u00ea envia uma m\u00e9trica de tempo de resposta para o Brubeck. Chegaram um milh\u00e3o de respostas, e o agregador retornou apenas 10 m\u00e9tricas. Voc\u00ea possui a contagem de visitantes, o tempo m\u00e1ximo, m\u00ednimo e m\u00e9dio de resposta, a mediana e 4 percentis. Depois, os dados s\u00e3o enviados ao Graphite e podemos v\u00ea-los todos ao vivo. <\/p>\n<p>Tamb\u00e9m temos agrega\u00e7\u00e3o para m\u00e9tricas de hardware, software, m\u00e9tricas de sistema e nosso antigo sistema de monitoramento Munin (que operou at\u00e9 2015). Coletamos tudo isso atrav\u00e9s do daemon CollectD em C (que conta com uma variedade de plugins embutidos, e consegue interrogar todos os recursos do sistema host no qual est\u00e1 instalado, basta especificar na configura\u00e7\u00e3o para onde gravar os dados) e escrevemos esses dados no Graphite. Ele tamb\u00e9m suporta plugins em python e scripts shell, permitindo que voc\u00ea crie suas pr\u00f3prias solu\u00e7\u00f5es personalizadas: o CollectD coletar\u00e1 esses dados de um host local ou remoto (suponha que exista Curl) e enviar\u00e1 para o Graphite. <\/p>\n<p>A seguir, todas as m\u00e9tricas que coletamos s\u00e3o enviadas para o Carbon-c-relay. Esta \u00e9 uma solu\u00e7\u00e3o do Carbon Relay da Graphite, desenvolvida em C. \u00c9 um roteador que agrega todas as m\u00e9tricas que enviamos de nossos agregadores e as roteia para os n\u00f3s. Al\u00e9m disso, na fase de roteamento, ele verifica a validade das m\u00e9tricas. Elas, por um lado, devem corresponder ao esquema com prefixos que mostrei anteriormente e, por outro, ser v\u00e1lidas para o Graphite. Caso contr\u00e1rio, s\u00e3o descartadas. <\/p>\n<p>Em seguida, o Carbon-c-relay envia as m\u00e9tricas para o cluster Graphite. Usamos o Carbon-cache, reescrito em Go, como nosso principal reposit\u00f3rio de m\u00e9tricas. O Go-carbon, devido \u00e0 sua capacidade de multitarefa, supera em desempenho o Carbon-cache. Ele aceita os dados e os grava em discos utilizando o pacote whisper (o padr\u00e3o, escrito em Python). Para ler os dados de nossos reposit\u00f3rios, utilizamos a API do Graphite. Ela funciona muito mais r\u00e1pido do que o padr\u00e3o Graphite WEB. O que acontece com os dados depois? <\/p>\n<p>Eles v\u00e3o para o Grafana. Usamos nossos clusters Graphite como a principal fonte de dados, al\u00e9m de termos o Grafana como interface web para exibi\u00e7\u00e3o de m\u00e9tricas e constru\u00e7\u00e3o de pain\u00e9is. Cada servi\u00e7o tem seu pr\u00f3prio painel, onde constr\u00f5em gr\u00e1ficos que mostram as m\u00e9tricas que registram de suas aplica\u00e7\u00f5es. Al\u00e9m do Grafana, temos tamb\u00e9m o SLAM. Este \u00e9 um daemon em Python que calcula o SLA com base nos dados do Graphite. Como mencionei, temos v\u00e1rias dezenas de microsservi\u00e7os, cada um com seus pr\u00f3prios requisitos. Com o SLAM, consultamos a documenta\u00e7\u00e3o e a comparamos com o que existe no Graphite para verificar a conformidade dos requisitos com a disponibilidade de nossos servi\u00e7os. <\/p>\n<p>Continuando: o alerta. Ele \u00e9 organizado por meio de um sistema robusto \u2014 o Moira. Ele \u00e9 independente porque possui seu pr\u00f3prio Graphite em seu n\u00facleo. Foi desenvolvido por pessoal da SKB 'Kontur', escrito em Python e Go, e \u00e9 totalmente open-source. O Moira recebe o mesmo fluxo de dados que vai para os Graphites. Se, por algum motivo, seu reposit\u00f3rio falhar, seu sistema de alertas continuar\u00e1 funcionando.<\/p>\n<p>Implementamos o Moira no Kubernetes, utilizando um cluster de servidores Redis como banco de dados principal. O resultado foi um sistema resiliente. Ele compara o fluxo de m\u00e9tricas com uma lista de gatilhos: se n\u00e3o houver men\u00e7\u00f5es, descarta a m\u00e9trica. Assim, ele \u00e9 capaz de processar gigabytes de m\u00e9tricas por minuto. <\/p>\n<p>Al\u00e9m disso, conectamos um LDAP corporativo, que permite que cada usu\u00e1rio do sistema corporativo crie notifica\u00e7\u00f5es para gatilhos existentes (ou novos). Como o Moira cont\u00e9m o Graphite, ele suporta todas as suas funcionalidades. Portanto, voc\u00ea primeiro pega uma linha e a copia para o Grafana. Veja como os dados aparecem nos gr\u00e1ficos. Ent\u00e3o, voc\u00ea pega essa mesma linha e a copia para o Moira. Voc\u00ea define limites e recebe alertas como resultado. Para fazer tudo isso, voc\u00ea n\u00e3o precisa de conhecimentos espec\u00edficos. O Moira pode enviar alertas via SMS, e-mail, Jira, Slack\u2026 Tamb\u00e9m suporta a execu\u00e7\u00e3o de scripts personalizados. Quando um gatilho ocorre e ele est\u00e1 inscrito em um script ou execut\u00e1vel personalizado, ele o inicia e passa um JSON para o stdin desse execut\u00e1vel. Assim, seu programa deve analisar esse JSON. O que voc\u00ea far\u00e1 com esse JSON \u2014 decide voc\u00ea. Quer enviar para o Telegram, quer abrir tarefas no Jira, fa\u00e7a o que quiser. <\/p>\n<p>Para os alertas, usamos tamb\u00e9m uma solu\u00e7\u00e3o desenvolvida internamente \u2014 o Imagotag. Adaptamos um painel normalmente usado para etiquetas eletr\u00f4nicas em lojas para nossas necessidades. Exibimos nele os gatilhos do Moira. Nele, est\u00e1 indicado em qual estado eles est\u00e3o e quando ocorreram. Parte da equipe de desenvolvimento desistiu das notifica\u00e7\u00f5es no Slack e no e-mail em favor deste painel. <\/p>\n<p><img decoding=\"async\" alt=\"Monitoramento como servi\u00e7o: um sistema modular para arquitetura de microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2019\/11\/bcf454c96adaa0cff81f5e56db5b715c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nE como somos uma empresa inovadora, monitoramos tamb\u00e9m o Kubernetes nesse sistema. O integramos usando o Heapster, que instalamos no cluster, que coleta dados e os envia para o Graphite. No final, este \u00e9 o diagrama: <\/p>\n<p><img decoding=\"async\" alt=\"Monitoramento como servi\u00e7o: um sistema modular para arquitetura de microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2019\/11\/cca0f2f9f590fc84609d48e52ebd0d21.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Componentes de Monitoramento<\/h3>\n<p>Aqui est\u00e1 uma lista de links para os componentes que utilizamos para essa tarefa. Todos eles s\u00e3o open-source. <\/p>\n<h4>Graphite:<\/h4>\n<p><\/p>\n<ul>\n<li>go-carbon: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lomik\/go-carbon\">github.com\/lomik\/go-carbon<\/a><\/noindex><\/li>\n<li>whisper: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/graphite-project\/whisper\">github.com\/graphite-project\/whisper<\/a><\/noindex> <\/li>\n<li>graphite-api: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/brutasse\/graphite-api\">github.com\/brutasse\/graphite-api<\/a><\/noindex> <\/li>\n<\/ul>\n<h4>Carbon-c-relay: <\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/grobian\/carbon-c-relay\">github.com\/grobian\/carbon-c-relay<\/a><\/noindex> <\/p>\n<h4>Brubeck: <\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">github.com\/github\/brubeck<\/a><\/noindex> <\/p>\n<h4>Collectd:<\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/collectd.org\/\">collectd.org<\/a><\/noindex><\/p>\n<h4>Moira: <\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moira-alert\">github.com\/moira-alert<\/a><\/noindex> <\/p>\n<h4>Grafana: <\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/\">grafana.com<\/a><\/noindex> <\/p>\n<h4>Heapster: <\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/heapster\">github.com\/kubernetes\/heapster<\/a><\/noindex><\/p>\n<h3>Estat\u00edsticas<\/h3>\n<p>\nAqui est\u00e3o alguns n\u00fameros sobre como o sistema funciona para n\u00f3s. <\/p>\n<h4>Agregador (brubeck)<\/h4>\n<p>\nN\u00famero de m\u00e9tricas: ~ 300 000 \/ seg<br \/>\nIntervalo de envio de m\u00e9tricas ao Graphite: 30 seg<br \/>\nUso de recursos do servidor: ~ 6% CPU (referente a servidores completos); ~ 1Gb RAM; ~ 3 Mbps LAN<\/p>\n<h4>Graphite (go-carbon)<\/h4>\n<p>\nN\u00famero de m\u00e9tricas: ~ 1 600 000 \/ min<br \/>\nIntervalo de atualiza\u00e7\u00e3o de m\u00e9tricas: 30 seg<br \/>\nEsquema de armazenamento de m\u00e9tricas: 30seg 35d, 5min 90d, 10min 365d (oferece uma vis\u00e3o do que acontece com o servi\u00e7o ao longo do tempo) <br \/>\nUso de recursos do servidor: ~ 10% CPU; ~ 20Gb RAM; ~ 30 Mbps LAN<\/p>\n<h3>Flexibilidade<\/h3>\n<p>\nN\u00f3s, da Avito, valorizamos muito a flexibilidade em nosso servi\u00e7o de monitoramento. Por que ele se tornou assim? Em primeiro lugar, seus componentes s\u00e3o intercambi\u00e1veis: tanto os pr\u00f3prios componentes quanto suas vers\u00f5es. Em segundo lugar, a manuten\u00e7\u00e3o. Como todo o projeto \u00e9 baseado em c\u00f3digo aberto, voc\u00ea pode editar o c\u00f3digo, fazer altera\u00e7\u00f5es e implementar funcionalidades que n\u00e3o est\u00e3o dispon\u00edveis por padr\u00e3o. Utilizamos pilhas bastante comuns, principalmente Go e Python, o que torna isso bastante simples. <\/p>\n<p>Aqui est\u00e1 um exemplo de um problema que realmente surgiu. Uma m\u00e9trica no Graphite \u00e9 um arquivo. Ele tem um nome. O nome do arquivo = nome da m\u00e9trica. E h\u00e1 um caminho para ele. Nomes de arquivos no Linux s\u00e3o limitados a 255 caracteres. E temos (como 'clientes internos') pessoas do departamento de banco de dados. Eles nos dizem: 'Queremos monitorar nossas consultas SQL. E elas n\u00e3o t\u00eam 255 caracteres, mas 8 MB cada. Queremos exibi-las no Grafana, ver os par\u00e2metros para essa consulta, e ainda melhor, queremos ver as principais dessas consultas. Seria \u00f3timo se isso fosse exibido em tempo real. E seria incr\u00edvel se pud\u00e9ssemos inclu\u00ed-las em alertas.' <\/p>\n<p><img decoding=\"async\" alt=\"Monitoramento como servi\u00e7o: um sistema modular para arquitetura de microsservi\u00e7os\" src=\"\/wp-content\/uploads\/2019\/11\/e1136c7fd0b6156c0c3fd49bab54737e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Exemplo de consulta SQL selecionado como exemplo de <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/9.6\/queries-with\">site postgrespro.ru<\/a><\/noindex> <\/i><\/p>\n<p>Levantamos um servidor Redis e, utilizando nossos plugins Collectd, que acessam o Postgres e obt\u00eam todos os dados, enviamos m\u00e9tricas para o Graphite. Mas substitu\u00edmos o nome da m\u00e9trica pelos hashes. Esse mesmo hash \u00e9 enviado para o Redis como chave, e toda a consulta SQL como valor. Precisamos garantir que o Grafana consiga acessar o Redis e pegar essas informa\u00e7\u00f5es. Abrimos a API do Graphite, pois \u00e9 a principal interface de intera\u00e7\u00e3o entre todos os componentes de monitoramento com o Graphite, e adicionamos uma nova fun\u00e7\u00e3o chamada aliasByHash() \u2014 do Grafana recebemos o nome da m\u00e9trica e o usamos na consulta ao Redis como chave, recebendo em resposta o valor da chave, que \u00e9 nossa \u201cconsulta SQL\u201d. Assim, conseguimos exibir no Grafana a representa\u00e7\u00e3o da consulta SQL, que, teoricamente, seria imposs\u00edvel exibir, juntamente com as estat\u00edsticas correspondentes (calls, rows, total_time, ...). <\/p>\n<h3>Resultados <\/h3>\n<p>\n<b>Disponibilidade.<\/b> Nosso servi\u00e7o de monitoramento est\u00e1 dispon\u00edvel 24 horas por dia, 7 dias por semana, de qualquer aplicativo e qualquer c\u00f3digo. Se voc\u00ea tiver acesso aos reposit\u00f3rios, pode enviar dados para o servi\u00e7o. A linguagem n\u00e3o importa, as solu\u00e7\u00f5es n\u00e3o importam. Voc\u00ea s\u00f3 precisa saber como abrir um socket, enviar a m\u00e9trica e fechar o socket. <\/p>\n<p><b>Confiabilidade.<\/b> Todos os componentes s\u00e3o tolerantes a falhas e lidam bem com nossas cargas de trabalho. <\/p>\n<p><b>Baixa barreira de entrada.<\/b> Para usar este sistema, voc\u00ea n\u00e3o precisa aprender linguagens de programa\u00e7\u00e3o e consultas no Grafana. Basta abrir seu aplicativo, inserir um socket que enviar\u00e1 as m\u00e9tricas para o Graphite, fech\u00e1-lo, abrir o Grafana, criar dashboards l\u00e1 e observar o comportamento de suas m\u00e9tricas, recebendo notifica\u00e7\u00f5es atrav\u00e9s do Moira.<\/p>\n<p><b>Autonomia.<\/b> Tudo isso pode ser feito por conta pr\u00f3pria, sem a ajuda de engenheiros de DevOps. E isso \u00e9 um overkill, porque voc\u00ea pode monitorar seu projeto agora mesmo, sem precisar pedir ajuda \u2014 nem para come\u00e7ar a trabalhar, nem para fazer altera\u00e7\u00f5es. <\/p>\n<h3>A que estamos nos esfor\u00e7ando? <\/h3>\n<p>\nTudo o que est\u00e1 listado abaixo n\u00e3o s\u00e3o apenas pensamentos abstratos, mas sim objetivos para os quais j\u00e1 foram dados pelo menos os primeiros passos. <\/p>\n<ol>\n<li>Detetor de anomalias. Queremos criar um servi\u00e7o que acesse nossos reposit\u00f3rios Graphite e verifique cada m\u00e9trica usando v\u00e1rios algoritmos. J\u00e1 temos algoritmos que queremos revisar, temos dados, e sabemos como trabalhar com eles.\n<\/li>\n<li>Metadados. Temos muitos servi\u00e7os que mudam com o tempo, assim como as pessoas que trabalham com eles. Manter documenta\u00e7\u00e3o manualmente n\u00e3o \u00e9 uma op\u00e7\u00e3o. Por isso, agora nossos microsservi\u00e7os incorporam metadados. L\u00e1 est\u00e1 registrado quem o desenvolveu, as linguagens com as quais interage, os requisitos de SLA, para onde e para quem enviar notifica\u00e7\u00f5es. No processo de implanta\u00e7\u00e3o do servi\u00e7o, todos os dados da entidade s\u00e3o gerados automaticamente. No final, voc\u00ea recebe dois links \u2014 um para os gatilhos, o outro para os dashboards no Grafana.\n<\/li>\n<li>Monitoramento em cada casa. Acreditamos que todos os desenvolvedores devem usar um sistema assim. Dessa forma, voc\u00ea sempre entende onde est\u00e1 seu tr\u00e1fego, o que est\u00e1 acontecendo com ele, onde ele falha e quais s\u00e3o seus pontos fracos. Se, por exemplo, algo inesperado acontecer e derrubar seu servi\u00e7o, voc\u00ea ser\u00e1 avisado n\u00e3o quando receber uma liga\u00e7\u00e3o do gerente, mas por um alerta, e imediatamente poder\u00e1 abrir os logs recentes e ver o que ocorreu.\n<\/li>\n<li>Alta performance. Nosso projeto est\u00e1 em constante crescimento e hoje processa cerca de 2.000.000 de valores de m\u00e9tricas por minuto. Um ano atr\u00e1s, esse n\u00famero era de 500.000. O crescimento continua, e isso significa que em breve o Graphite (whisper) come\u00e7ar\u00e1 a sobrecarregar bastante o sistema de armazenamento. Como j\u00e1 mencionei, esse sistema de monitoramento \u00e9 bastante vers\u00e1til devido \u00e0 intercambialidade dos componentes. Algumas pessoas mant\u00eam e expandem continuamente sua infraestrutura especialmente para o Graphite, mas n\u00f3s decidimos seguir por outro caminho: usar <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.yandex\/\">ClickHouse<\/a><\/noindex> como nosso reposit\u00f3rio de m\u00e9tricas. Essa transi\u00e7\u00e3o est\u00e1 praticamente conclu\u00edda, e em breve contarei mais detalhes sobre como foi feito: quais dificuldades surgiram e como foram superadas, como foi o processo de migra\u00e7\u00e3o, descreverei os componentes escolhidos como suporte e suas configura\u00e7\u00f5es. \n<\/li>\n<\/ol>\n<p>\nObrigado pela aten\u00e7\u00e3o! Fiquem \u00e0 vontade para fazer suas perguntas sobre o assunto, tentarei responder aqui ou nos pr\u00f3ximos posts. Talvez algu\u00e9m tenha experi\u00eancia na constru\u00e7\u00e3o de um sistema de monitoramento semelhante ou na migra\u00e7\u00e3o para o Clickhouse em uma situa\u00e7\u00e3o parecida \u2014 compartilhe nos coment\u00e1rios.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/335410\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043b\u0438. \u0414\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0441\u0438\u043b\u0430\u043c\u0438 DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e. \u041c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0438, \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u044b, \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u043a \u043d\u0438\u043c \u0430\u043b\u0435\u0440\u0442\u044b, [&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-52115","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=\"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043b\u0438. \u0414\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0441\u0438\u043b\u0430\u043c\u0438 DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e.\" \/>\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\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury\" \/>\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\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441: \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043b\u0438. \u0414\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0441\u0438\u043b\u0430\u043c\u0438 DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury\" \/>\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=\"2019-10-31T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T10:59:47+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\udd47Monitoramento como servi\u00e7o: sistema modular para arquitetura de microservi\u00e7os | ProHoster","description":"Atualmente, em nosso projeto, al\u00e9m do c\u00f3digo monol\u00edtico, dezenas de microsservi\u00e7os est\u00e3o em funcionamento. Cada um deles exige monitoramento. Fazer isso em tais volumes com a equipe de DevOps \u00e9 problem\u00e1tico.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury","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\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441: \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b | ProHoster","og:description":"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043b\u0438. \u0414\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0441\u0438\u043b\u0430\u043c\u0438 DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e.","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury","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":"2019-10-31T21:00:00+00:00","article:modified_time":"2020-02-18T10:59:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52115","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":"2026-01-24 02:30:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:49:49","updated":"2026-01-24 02:30:22","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\/52115","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=52115"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/52115\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=52115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=52115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=52115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}