{"id":10762,"date":"2017-01-16T10:01:31","date_gmt":"2017-01-16T12:01:31","guid":{"rendered":"https:\/\/king.host\/blog\/?p=10762"},"modified":"2024-06-03T18:07:57","modified_gmt":"2024-06-03T21:07:57","slug":"monitorando-aplicacoes-php-com-prometheus","status":"publish","type":"post","link":"https:\/\/king.host\/blog\/tecnologia\/monitorando-aplicacoes-php-com-prometheus\/","title":{"rendered":"Monitorando Aplica\u00e7\u00f5es PHP com Prometheus"},"content":{"rendered":"<p>Essa semana nosso time de desenvolvimento teve\u00a0o desafio de buscar ferramentas para monitorar aplica\u00e7\u00f5es web, tendo uma vis\u00e3o completa tanto do host quanto dos containers. Al\u00e9m disso, centralizar a visualiza\u00e7\u00e3o de alguns dados da aplica\u00e7\u00e3o.<\/p>\n<div class=\"section-content\">\n<div class=\"section-inner sectionLayout--insetColumn\">\n<p id=\"53ef\" class=\"graf graf--p graf--leading\">Depois de algumas pesquisas, encontrei esse reposit\u00f3rio que me chamou bastante aten\u00e7\u00e3o: <a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/github.com\/stefanprodan\/dockprom\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-href=\"https:\/\/github.com\/stefanprodan\/dockprom\" data-><strong class=\"markup--strong markup--p-strong\">https:\/\/github.com\/stefanprodan\/dockprom<\/strong><\/a>. Trata-se de um conjunto de servi\u00e7os para monitoramento e alerta!<\/p>\n<p id=\"7af1\" class=\"graf graf--p graf-after--p\">Tudo que precis\u00e1vamos!<\/p>\n<h3 id=\"964e\" class=\"graf graf--h3 graf-after--p\">Servi\u00e7os Utilizados<\/h3>\n<p id=\"b379\" class=\"graf graf--p graf-after--h3\"><a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/prometheus.io\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-href=\"https:\/\/prometheus.io\/\" data-><strong class=\"markup--strong markup--p-strong\">Prometheus<\/strong><\/a>?\u2014?Reposit\u00f3rio e M\u00e9tricas<br \/>\n<a class=\"markup--anchor markup--p-anchor\" href=\"http:\/\/grafana.org\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-href=\"http:\/\/grafana.org\/\" data-><strong class=\"markup--strong markup--p-strong\">Grafana<\/strong><\/a>?\u2014?Visualiza\u00e7\u00e3o<br \/>\n<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/github.com\/prometheus\/alertmanager\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-href=\"https:\/\/github.com\/prometheus\/alertmanager\" data-><strong class=\"markup--strong markup--p-strong\">AlertManager<\/strong><\/a>?\u2014?Gerenciador de Alertas<br \/>\n<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/github.com\/prometheus\/node_exporter\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-href=\"https:\/\/github.com\/prometheus\/node_exporter\" data-><strong class=\"markup--strong markup--p-strong\">NodeExporter<\/strong><\/a>?\u2014?Coleta de dados do Host<br \/>\n<a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/github.com\/google\/cadvisor\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-href=\"https:\/\/github.com\/google\/cadvisor\" data-><strong class=\"markup--strong markup--p-strong\">cAdvisor<\/strong><\/a>?\u2014?Coleta de dados dos <em class=\"markup--em markup--p-em\">Containers<\/em><\/p>\n<p id=\"25ba\" class=\"graf graf--p graf-after--p\">Em poucos minutos, \u00e9 poss\u00edvel visualizar os dados do seu host como estes abaixo. Lembrando que o projeto j\u00e1 inclui alguns <em class=\"markup--em markup--p-em\">dashboards<\/em> bem completos, basta import\u00e1-los ao Grafana.<\/p>\n<p class=\"graf graf--p graf-after--p\"><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone wp-image-10766 size-large\" src=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/prometeus-780x1078.png\" alt=\"\" width=\"780\" height=\"1078\" title=\"\" srcset=\"https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/prometeus-780x1078.png 780w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/prometeus-217x300.png 217w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/prometeus-768x1061.png 768w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/prometeus-400x553.png 400w, https:\/\/cdn-cms.king.host\/blog-hlg\/uploads\/2017\/01\/prometeus.png 1000w\" sizes=\"(max-width: 780px) 100vw, 780px\" \/><\/p>\n<\/div>\n<div class=\"section-inner sectionLayout--outsetColumn\">\n<h3 id=\"a996\" class=\"graf graf--h3 graf-after--figure\">Centraliza\u00e7\u00e3o de Informa\u00e7\u00e3o<\/h3>\n<p id=\"d953\" class=\"graf graf--p graf-after--h3\">A melhor parte \u00e9 que n\u00e3o ficamos presos a um \u00fanico host, podendo distribuir os <em class=\"markup--em markup--p-em\">containers<\/em> e ainda centralizar a visualiza\u00e7\u00e3o dos dados.<\/p>\n<p id=\"5ef5\" class=\"graf graf--p graf-after--p\">O <strong class=\"markup--strong markup--p-strong\">Prometheus<\/strong> \u00e9 o encarregado dessa m\u00e1gica. Com ele \u00e9 poss\u00edvel configurar <a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/prometheus.io\/docs\/introduction\/getting_started\/#configuring-prometheus-to-monitor-the-sample-targets\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-href=\"https:\/\/prometheus.io\/docs\/introduction\/getting_started\/#configuring-prometheus-to-monitor-the-sample-targets\" data-><strong class=\"markup--strong markup--p-strong\">Scrapers<\/strong><\/a> que ficar\u00e3o observando a sua aplica\u00e7\u00e3o e coletando as m\u00e9tricas automaticamente.<\/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 \">scrape_configs:\n  - job_name:       'example-random'\n\n    # Override the global default and scrape targets from this job every 5 seconds.\n    scrape_interval: 5s\n\n    static_configs:\n      - targets: ['localhost:8080', 'localhost:8081']\n        labels:\n          group: 'production'\n\n      - targets: ['localhost:8082']\n        labels:\n          group: 'canary'<\/pre>\n<h3 id=\"f3e2\" class=\"graf graf--h3 graf--leading\">Enviando dados da Aplica\u00e7\u00e3o<\/h3>\n<p id=\"b0b8\" class=\"graf graf--p graf-after--h3\">Para que o Prometheus consiga capturar corretamente os dados da sua aplica\u00e7\u00e3o \u00e9 necess\u00e1rio que a sa\u00edda seja formatada de uma maneira espec\u00edfica, e para isso temos diversos <a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/prometheus.io\/docs\/instrumenting\/clientlibs\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-href=\"https:\/\/prometheus.io\/docs\/instrumenting\/clientlibs\/\" data-><strong class=\"markup--strong markup--p-strong\">clients<\/strong><\/a><strong class=\"markup--strong markup--p-strong\">.<\/strong> No nosso caso, vou mostrar um pouco do <a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/github.com\/Jimdo\/prometheus_client_php\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-href=\"https:\/\/github.com\/Jimdo\/prometheus_client_php\" data-><strong class=\"markup--strong markup--p-strong\">Client PHP<\/strong><\/a><\/p>\n<p id=\"8121\" class=\"graf graf--p graf-after--p\">Abaixo, n\u00f3s adicionamos algumas m\u00e9tricas sobre a aplica\u00e7\u00e3o.<\/p>\n<pre class=\"show-plain:1 expand-toggle:false decode-attributes:false trim-whitespace:false trim-code-tag:false mixed:false show_mixed:false lang:php decode:true \">$registry = \\Prometheus\\CollectorRegistry::getDefault();\n\n$counter = $registry-&gt;getOrRegisterCounter('test', 'some_counter', 'it increases', ['type']);\n$counter-&gt;incBy(3, ['blue']);\n\n$gauge = $registry-&gt;getOrRegisterGauge('test', 'some_gauge', 'it sets', ['type']);\n$gauge-&gt;set(2.5, ['blue']);\n\n$histogram = $registry-&gt;getOrRegisterHistogram('test', 'some_histogram', 'it observes', ['type'], [0.1, 1, 2, 3.5, 4, 5, 6, 7, 8, 9]);\n$histogram-&gt;observe(3.5, ['blue']);<\/pre>\n<p>E logo ap\u00f3s, expomos esses dados para a coleta do Scraper<\/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 \">$registry = \\Prometheus\\CollectorRegistry::getDefault();\n$registry = CollectorRegistry::getDefault();\n\n$renderer = new RenderTextFormat();\n$result = $renderer-&gt;render($registry-&gt;getMetricFamilySamples());\n\nheader('Content-type: ' . RenderTextFormat::MIME_TYPE);\necho $result;<\/pre>\n<h3 id=\"332e\" class=\"graf graf--h3 graf-after--pre\">Exporters<\/h3>\n<p id=\"77fb\" class=\"graf graf--p graf-after--h3\">Para finalizar, podemos adicionar <em class=\"markup--em markup--p-em\">exporters<\/em> para quase todos os tipos de servi\u00e7os que utilizamos, desde dados de deploy do Jenkins, como dados de filas do RabbitMQ.<\/p>\n<p id=\"0f4d\" class=\"graf graf--p graf-after--p\">Basta conferir essa <a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/prometheus.io\/docs\/instrumenting\/exporters\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-href=\"https:\/\/prometheus.io\/docs\/instrumenting\/exporters\/\" data-><strong class=\"markup--strong markup--p-strong\">lista de exporters<\/strong><\/a> para entender as infinitas possibilidades de monitoramento dessa ferramenta.<\/p>\n<p id=\"f04a\" class=\"graf graf--p graf-after--p\">N\u00f3s, da <strong class=\"markup--strong markup--p-strong\">Kinghost<\/strong>, ficamos bem empolgados com esse potencial, e espero que seja \u00fatil para outros Devs tamb\u00e9m.<\/p>\n<p id=\"be1d\" class=\"graf graf--p graf-after--p graf--last\">O <a class=\"markup--anchor markup--p-anchor\" href=\"https:\/\/prometheus.io\/docs\/alerting\/alertmanager\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" data-href=\"https:\/\/prometheus.io\/docs\/alerting\/alertmanager\/\" data-><strong class=\"markup--strong markup--p-strong\">AlertManager<\/strong><\/a> merece um capitulo s\u00f3 para ele, abordando configura\u00e7\u00f5es de sa\u00edda e querys de alertas, ent\u00e3o, aguardem o pr\u00f3ximo artigo!<\/p>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Essa semana nosso time de desenvolvimento teve\u00a0o desafio de buscar ferramentas para monitorar aplica\u00e7\u00f5es web, tendo uma vis\u00e3o completa tanto do host quanto dos containers. Al\u00e9m disso, centralizar a visualiza\u00e7\u00e3o de alguns dados da aplica\u00e7\u00e3o. Depois de algumas pesquisas, encontrei esse reposit\u00f3rio que me chamou bastante aten\u00e7\u00e3o: https:\/\/github.com\/stefanprodan\/dockprom. Trata-se de um conjunto de servi\u00e7os para [&hellip;]<\/p>\n","protected":false},"author":292,"featured_media":10765,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1179,8],"tags":[1374],"class_list":["post-10762","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimento","category-tecnologia","tag-php"],"_links":{"self":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10762","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=10762"}],"version-history":[{"count":7,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10762\/revisions"}],"predecessor-version":[{"id":35870,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/posts\/10762\/revisions\/35870"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/media\/10765"}],"wp:attachment":[{"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/media?parent=10762"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/categories?post=10762"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/king.host\/blog\/wp-json\/wp\/v2\/tags?post=10762"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}