{"id":10835,"date":"2017-01-24T12:33:02","date_gmt":"2017-01-24T14:33:02","guid":{"rendered":"https:\/\/king.host\/blog\/?p=10835"},"modified":"2024-06-03T18:07:27","modified_gmt":"2024-06-03T21:07:27","slug":"monitorando-aplicacoes-php-com-prometheus-parte-2","status":"publish","type":"post","link":"https:\/\/king.host\/blog\/tecnologia\/monitorando-aplicacoes-php-com-prometheus-parte-2\/","title":{"rendered":"Monitorando aplica\u00e7\u00f5es PHP com Prometheus \u2014 parte 2"},"content":{"rendered":"<h2>Configurando e entendendo o AlertManager<\/h2>\n<p>No <strong><a href=\"https:\/\/kinghost.com.br\/blog\/2017\/01\/monitorando-aplicacoes-php-com-prometheus\/\" target=\"_blank\" rel=\"noopener\">primeiro artigo<\/a> <\/strong>explorei um pouco do projeto opensource <strong><a href=\"https:\/\/medium.com\/r\/?url=https%3A%2F%2Fgithub.com%2Fstefanprodan%2Fdockprom\" target=\"_blank\" rel=\"noopener\">dockprom<\/a><\/strong>, com ele \u00e9 poss\u00edvel monitorar a sua aplica\u00e7\u00e3o em tempo real utilizando tecnologias, como Prometheus e Grafana, e tamb\u00e9m enviar alertar caso alguma coisa saia do controle. Aqui na <strong>Kinghost <\/strong>come\u00e7amos a utiliza-lo para monitorar sistema que j\u00e1 est\u00e3o rodando em containers <strong>(Docker)<\/strong>. Falei um pouco sobre a configura\u00e7\u00e3o e monitorias, pois bem, agora gostaria de me aprofundar um pouco mais na parte de <strong>Alertas<\/strong>. Um tema super importante, afinal de contas, n\u00e3o adianta monitorar a aplica\u00e7\u00e3o se ela n\u00e3o me avisar quando algo estiver errado.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-10836 size-full\" src=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem1.png\" alt=\"\" width=\"1000\" height=\"553\" title=\"\" srcset=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem1.png 1000w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem1-300x166.png 300w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem1-768x425.png 768w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem1-780x431.png 780w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem1-400x221.png 400w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><\/p>\n<h3>Arquivos de Configura\u00e7\u00e3o<\/h3>\n<p>Nesse reposit\u00f3rio do github, os arquivos que voc\u00ea deve alterar est\u00e3o na pasta prometheus. Abaixo um trecho do arquivo<strong> prometheus.yml<\/strong>.<\/p>\n<pre class=\"expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:php decode:true \">[...]\nglobal:\n  scrape_interval:     15s\n  evaluation_interval: 15s\n\n  # Attach these labels to any time series or alerts when communicating with\n  # external systems (federation, remote storage, Alertmanager).\n  external_labels:\n      monitor: 'docker-host-alpha'\n\n# Load and evaluate rules in this file every 'evaluation_interval' seconds.\nrule_files:\n  - \"targets.rules\"\n  - \"host.rules\"\n  - \"containers.rules\"\n[...]<\/pre>\n<p>Importante reparar as 3 \u00faltimas linhas citadas, ali estamos fazendo refer\u00eancia aos demais arquivos para melhor organiza\u00e7\u00e3o das regras.<\/p>\n<p>Todos os targets configurados nos scrappers ter\u00e3o uma m\u00e9trica chamada \u201cup\u201d populada automaticamente, sendo assim podemos criar nosso primeiro alerta:<\/p>\n<p>Abaixo o arquivo <strong>targets.rules<\/strong><\/p>\n<pre class=\"expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:php decode:true \">ALERT monitor_service_down\n  IF up == 0\n  FOR 30s\n  LABELS { severity = \"critical\" }\n  ANNOTATIONS {\n      summary = \"Monitor service non-operational\",\n      description = \"Service {{ $labels.instance }} is down.\",\n  }<\/pre>\n<p>Esse arquivo indica que: se a condi\u00e7\u00e3o for <strong>verdadeira<\/strong> durante <strong>30 segundos<\/strong>, devo disparar o alerta.<\/p>\n<p>Isso pode ser feito para qualquer condi\u00e7\u00e3o, inclusive em qualquer consulta, as mesmas que voc\u00ea possui no Grafana para visualizar os dados da aplica\u00e7\u00e3o.<br \/>\nExemplo (mais elaborado):<\/p>\n<pre class=\"expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:php decode:true \">ALERT hight_storage_load\n  IF (node_filesystem_size{fstype=\"aufs\"} - node_filesystem_free{fstype=\"aufs\"}) \/ node_filesystem_size{fstype=\"aufs\"}  * 100 &gt; 85\n  FOR 30s\n  LABELS { severity = \"warning\" }\n  ANNOTATIONS {\n      summary = \"Server storage is almost full\",\n      description = \"Docker host storage usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.\",\n  }<\/pre>\n<p>A condi\u00e7\u00e3o acima verifica se a porcentagem de <strong>disco utilizado ultrapassa os 85%<\/strong>, ent\u00e3o envia um alerta. Como podemos ver, as possibilidades s\u00e3o infinitas.<\/p>\n<h3>Envio de Mensagens<\/h3>\n<p>Os arquivos configura\u00e7\u00e3o dos alertas s\u00e3o propriedade do prometheus, por\u00e9m a sa\u00edda \u00e9 configurada no <strong>AlertManager<\/strong>. Voc\u00ea encontrar\u00e1 o seguinte arquivo em <strong>alertmanager\/config.yml<\/strong>.<\/p>\n<pre class=\"expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:default decode:true \">route:\n    receiver: 'slack'\n\nreceivers:\n    - name: 'slack'\n      slack_configs:\n          - send_resolved: true\n            text: \"{{ .CommonAnnotations.description }}\"\n            username: 'Prometheus'\n            channel: '#&lt;channel-name&gt;'\n            api_url: 'https:\/\/hooks.slack.com\/services\/&lt;webhook-id&gt;'<\/pre>\n<p>O arquivo acima diz que todas os alertas ser\u00e3o enviados via Slack para o grupo respons\u00e1vel. Mas podemos adicionar v\u00e1rias funcionalidades legais, por exemplo:<\/p>\n<pre class=\"expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:php decode:true \">route:\n    #receiver padr\u00e3o\n    receiver: 'email' \n\n    #rotas filhas\n    routes:\n    - match:\n        severity: critical\n        receiver: 'slack'\n\nreceivers:\n    - name: 'slack'\n      slack_configs:\n          - send_resolved: true\n            text: \"{{ .CommonAnnotations.description }}\"\n            username: 'Prometheus'\n            channel: '#&lt;channel-name&gt;'\n            api_url: 'https:\/\/hooks.slack.com\/services\/&lt;webhook-id&gt;'\n\nreceivers:\n    - name: 'email'\n      email_configs:\n      - to: 'devs@example.org'<\/pre>\n<p>Agora sim, todos os alertas ser\u00e3o encaminhados por email, e se acontecer algo cr\u00edtico, pode ser enviado para a equipe imediatamente via Slack!<\/p>\n<p><strong>Importante!<\/strong><br \/>\nPara melhor utiliza\u00e7\u00e3o dos alertas: encontramos uma dificuldade em rela\u00e7\u00e3o a periodicidade das verifica\u00e7\u00f5es, mas adicionando essa linha no alertmanager a velocidade dos alertas ficou excelente, exatamente como nosso time precisava:<\/p>\n<pre class=\"expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:php decode:true \">group_interval: 10s<\/pre>\n<p>Desse modo todos os alertas ser\u00e3o enviados a cada 10 segundos (o padr\u00e3o \u00e9 de 5 minutos).<\/p>\n<h3>Alertas pelo Grafana<\/h3>\n<p>A partir do Grafana 4.0, temos a possibilidade de alertas <strong>direto na ferramenta<\/strong>, sendo poss\u00edvel controlar os alertas da aplica\u00e7\u00e3o atrav\u00e9s da interface gr\u00e1fica. Mas aten\u00e7\u00e3o, todos os alertas e configura\u00e7\u00f5es de envio <strong>n\u00e3o s\u00e3o as mesmas<\/strong>! S\u00e3o configura\u00e7\u00f5es exclusivas do Grafana.<\/p>\n<p><img decoding=\"async\" class=\"alignnone wp-image-10837 size-full\" src=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem2.png\" alt=\"aplica\u00e7\u00f5es php\" width=\"800\" height=\"400\" title=\"\" srcset=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem2.png 800w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem2-300x150.png 300w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem2-768x384.png 768w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem2-780x390.png 780w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem2-400x200.png 400w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>Abaixo uma amostra da configura\u00e7\u00e3o na interface do Grafana.<\/p>\n<p><img decoding=\"async\" class=\"alignnone wp-image-10838 size-full\" src=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/imagem3.gif\" alt=\"\" width=\"800\" height=\"609\" title=\"\"><\/p>\n<p>Para maiores informa\u00e7\u00f5es sobre a vers\u00e3o 4.x do Grafana basta acessar o link:<a href=\"http:\/\/docs.grafana.org\/guides\/whats-new-in-v4-1\/\/\" target=\"_blank\" rel=\"noopener\"> http:\/\/docs.grafana.org\/guides\/whats-new-in-v4-1\/\/<\/a><\/p>\n<h3>Conclus\u00e3o<\/h3>\n<p>A configura\u00e7\u00e3o de alertas \u00e9 um pouco confusa, pois \u00e9 necess\u00e1rio configurar diversos arquivos para que todos os crit\u00e9rios sejam atendidos, mas em uma tarde d\u00e1 pra entender legal a ferramenta. A ado\u00e7\u00e3o dessa solu\u00e7\u00e3o foi t\u00e3o boa entre as equipes de desenvolvimento da <strong><a href=\"https:\/\/kinghost.com.br\/\" target=\"_blank\" rel=\"noopener\">Kinghost<\/a> <\/strong>que cada grupo j\u00e1 est\u00e1 fazendo suas pr\u00f3prias contribui\u00e7\u00f5es. Espero que assim como foi pra n\u00f3s, que voc\u00ea tamb\u00e9m possa se surpreender e melhorar cada vez mais o seu processo de desenvolvimento. Muito obrigado e caso tenha testado ou tenha alguma opini\u00e3o sobre o assunto, pode comentar abaixo!<\/p>\n<p><a title=\"Webinar - Refatora\u00e7\u00e3o em PHP\" href=\"https:\/\/king.host\/blog\/2016\/02\/primeiro-webinar-gratuito-de-2016-refatoracao-em-php\/\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-11006 size-full\" src=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2015\/09\/cta-refatoracao.png\" alt=\"Webinar - Refatora\u00e7\u00e3o em PHP\" width=\"803\" height=\"222\" title=\"\" srcset=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2015\/09\/cta-refatoracao.png 803w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2015\/09\/cta-refatoracao-300x83.png 300w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2015\/09\/cta-refatoracao-768x212.png 768w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2015\/09\/cta-refatoracao-780x216.png 780w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2015\/09\/cta-refatoracao-400x111.png 400w\" sizes=\"(max-width: 803px) 100vw, 803px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Configurando e entendendo o AlertManager No primeiro artigo explorei um pouco do projeto opensource dockprom, com ele \u00e9 poss\u00edvel monitorar a sua aplica\u00e7\u00e3o em tempo real utilizando tecnologias, como Prometheus e Grafana, e tamb\u00e9m enviar alertar caso alguma coisa saia do controle. Aqui na Kinghost come\u00e7amos a utiliza-lo para monitorar sistema que j\u00e1 est\u00e3o rodando [&hellip;]<\/p>\n","protected":false},"author":292,"featured_media":10839,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-10835","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tecnologia"],"_links":{"self":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10835","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/users\/292"}],"replies":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/comments?post=10835"}],"version-history":[{"count":5,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10835\/revisions"}],"predecessor-version":[{"id":35869,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10835\/revisions\/35869"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/media\/10839"}],"wp:attachment":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/media?parent=10835"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/categories?post=10835"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/tags?post=10835"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}