{"id":75585,"date":"2020-03-27T07:42:28","date_gmt":"2020-03-27T05:42:28","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/extendedpromql-rasshifrovka-doklada-romana-havronenko"},"modified":"2020-03-27T07:42:28","modified_gmt":"2020-03-27T05:42:28","slug":"extendedpromql-rasshifrovka-doklada-romana-havronenko","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/extendedpromql-rasshifrovka-doklada-romana-havronenko","title":{"rendered":"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><strong>Proponho uma revis\u00e3o do relat\u00f3rio de Roman Khavronenko \"ExtendedPromQL\"<\/strong><\/p>\n<p>\n<center><div class=\"youtube-placeholder\" data-id=\"lWYaiagvmfw\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/lWYaiagvmfw\/hqdefault.jpg\" alt=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/54a175d9c74c90d9d313f8ff71476638.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um breve resumo sobre mim. Meu nome \u00e9 Roman. Trabalho na CloudFlare e moro em Londres. Mas tamb\u00e9m sou mantenedor do VictoriaMetrics.<br \/>\nE sou o autor <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Vertamedia\/clickhouse-grafana\">do plugin ClickHouse<\/a><\/noindex> para Grafana e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Vertamedia\/chproxy\">ClickHouse-proxy<\/a><\/noindex> \u2013 \u00e9 um pequeno proxy para ClickHouse.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/fc1aa56b144def5db9fcee844d5016f1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos come\u00e7ar pela primeira parte, intitulada \"As dificuldades da tradu\u00e7\u00e3o\", onde falarei sobre como qualquer l\u00edngua ou mesmo apenas a l\u00edngua de comunica\u00e7\u00e3o \u00e9 muito importante. Porque \u00e9 assim que voc\u00ea transmite seus pensamentos a outra pessoa ou sistema, como voc\u00ea formula uma solicita\u00e7\u00e3o. As pessoas na internet discutem sobre qual linguagem \u00e9 melhor \u2013 java ou outra qualquer. Para mim, decidi que devemos escolher conforme a tarefa, pois tudo isso \u00e9 espec\u00edfico.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/ea21f52ba5c2d3507e0106715c4ab96d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos come\u00e7ar do come\u00e7o. O que \u00e9 PromQL? PromQL \u00e9 a Linguagem de Consulta do Prometheus. \u00c9 assim que formulamos consultas no Prometheus para obtendo dados de s\u00e9ries temporais.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/56b1ef4cc04defdffeea8b2666fdc354.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>O que s\u00e3o dados de s\u00e9ries temporais? Literalmente, s\u00e3o tr\u00eas par\u00e2metros. <\/p>\n<p><\/p>\n<p>S\u00e3o:<\/p>\n<p><\/p>\n<ul>\n<li>No que estamos olhando. <\/li>\n<li>Quando estamos olhando para isso.<\/li>\n<li>E qual valor est\u00e1 sendo mostrado. <\/li>\n<\/ul>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/358a193e889204d28debe1b74b93df3a.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Se olharmos para este gr\u00e1fico (este gr\u00e1fico \u00e9 do meu telefone, mostrando a estat\u00edstica dos meus passos), podemos responder rapidamente a essas perguntas. <\/p>\n<p><\/p>\n<p>Olhamos para os passos. Vemos o valor e vemos o tempo em que olhamos para isso. Ou seja, olhando para este gr\u00e1fico, podemos facilmente dizer que no domingo eu andei cerca de 15.000 passos. Esses s\u00e3o dados de s\u00e9ries temporais. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/859299ee9d25a3419c869b3ed6db6e72.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Agora vamos \"quebr\u00e1-los\" (transform\u00e1-los) em um novo modelo de dados na forma de tabela. Aqui tamb\u00e9m temos o que estamos observando. Eu adicionei alguns dados extras, que chamaremos de metadados, ou seja, n\u00e3o fui eu que passei, mas duas pessoas, digamos, Jay e Silent Bob. Isso \u00e9 o que estamos analisando; o que isso mostra e quando mostra esse valor. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/fd7b48ea3c25b57c13605e84c4a52a2c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAgora vamos tentar armazenar todos esses dados em um banco de dados. Para o exemplo, escolhi a sintaxe do ClickHouse. E aqui estamos criando uma tabela chamada \"Steps\", ou seja, o que estamos observando. Aqui temos o tempo em que estamos olhando; o que isso mostra e alguns metadados, onde armazenaremos quem s\u00e3o: Jay e Silent Bob.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/bd01f9dc0b29d34aacbb8f012710a94f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E para tentar visualizar tudo isso, usaremos o Grafana, porque, em primeiro lugar, \u00e9 bonito.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/9f573241e9ae32e31d6d0b879115970b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Tamb\u00e9m vamos usar este plugin. Existem duas raz\u00f5es para isso. A primeira \u00e9 porque eu o escrevi. E eu sei exatamente como \u00e9 dif\u00edcil extrair dados de s\u00e9ries temporais do ClickHouse para mostrar no Grafana. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/29f2d72f9995afb54b23bb7b4230b840.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Vamos exibir no Graph Panel. Este \u00e9 o painel mais popular no Grafana, que mostra a rela\u00e7\u00e3o entre valor e tempo, ent\u00e3o s\u00f3 precisamos de dois par\u00e2metros.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/d820f63944ce0112660337b44a6c1f36.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVamos escrever a consulta mais simples \u2014 como mostrar a estat\u00edstica de passos no Grafana, armazenando esses dados no ClickHouse, na tabela que criamos. E escrevemos esta consulta simples. Selecionamos dos passos. Selecionamos o valor e selecionamos o tempo desses valores, ou seja, os mesmos tr\u00eas par\u00e2metros que mencionamos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/ad7895105050178de5bc8a154da7e6e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E no resultado, obteremos este gr\u00e1fico. Quem sabe por que ele \u00e9 t\u00e3o estranho?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/4a8108737e834cf35b7834be7b4db719.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Certo, precisamos ordenar pelo tempo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/d37343c7a6a811e2012f1cbae4b9a5d5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E, no final, teremos um gr\u00e1fico melhor, mas ainda estranho. Quem sabe por qu\u00ea? Certo, h\u00e1 dois participantes, e no Grafana estamos colocando duas s\u00e9ries temporais, porque se analisarmos o modelo de dados uma vez mais, cada s\u00e9rie temporal \u00e9 uma combina\u00e7\u00e3o \u00fanica de nome e todos os pares chave-valor das labels.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/f19bf1a9f43ae8de22af6bf7b494902f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Portanto, precisamos escolher uma pessoa espec\u00edfica. Vamos escolher Jay.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/b6a714d5d6ce4d4b27634da9414aa6f6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E desenhamos novamente. Agora o gr\u00e1fico parece verdadeiro. Agora \u00e9 um gr\u00e1fico normal e tudo funciona bem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/2a93b4cd548239c9314c3283c5b9f488.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E, provavelmente, voc\u00ea sabe como fazer algo semelhante, mas no Prometheus atrav\u00e9s do PromQL. Mais ou menos assim. Um pouco mais f\u00e1cil. E ainda vamos dividir isso tudo. Pegamos Steps. E filtramos por Jay. Aqui n\u00e3o especificamos que precisamos obter um valor e n\u00e3o escolhemos o tempo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/5e080a1b88c156522af21bf00f3cd641.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Agora vamos tentar calcular a velocidade de movimento de Jay ou Silent Bob. No ClickHouse, precisaremos fazer a runningDifference, ou seja, calcular a diferen\u00e7a entre pares de pontos e dividi-los pelo tempo para obter a velocidade exata. A consulta ficar\u00e1 mais ou menos assim.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/13102b04ba4cf0ff9c955c36801044d0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E mostrar\u00e1 valores como este, ou seja, aproximadamente 1,8 passos por segundo que Silent Bob ou Jay fazem.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/1c328f99da6f160bdca23ab5f461bda8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E no Prometheus voc\u00ea sabe como fazer isso tamb\u00e9m. Muito mais f\u00e1cil do que antes.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/a7145785dee9fafcc8ab573e920cb88e.jpeg\" style=\"display:block;margin: 0 auto;\" \/>E para que isso continue sendo t\u00e3o simples de fazer no Grafana, eu adicionei esta camada, que se parece muito com PromQL. Ela \u00e9 chamada de Rate Macros ou como voc\u00ea quiser cham\u00e1-la. No Grafana, voc\u00ea simplesmente escreve \"rate\", mas em algum lugar profundo, isso \u00e9 transformado em uma grande consulta. E voc\u00ea nem precisa olhar para isso, est\u00e1 l\u00e1, mas voc\u00ea economiza muito tempo, pois escrever grandes consultas SQL \u00e9 sempre dispendioso. Voc\u00ea pode facilmente cometer um erro e depois ficar muito tempo sem entender o que est\u00e1 acontecendo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/511bb35469567b07412a10bb7c0b7312.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E esta \u00e9 uma consulta que n\u00e3o coube em um \u00fanico slide e eu tive que dividi-la em duas colunas. Esta tamb\u00e9m \u00e9 uma consulta no ClickHouse, que faz a mesma taxa, mas para ambas as s\u00e9ries temporais: tanto Silent Bob quanto Jay, para que tiv\u00e9ssemos duas s\u00e9ries temporais no nosso painel. E isso j\u00e1 \u00e9 muito complicado, na minha opini\u00e3o. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/c9c1e6b58672069370153a151dceef3d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E para o Prometheus, isso ser\u00e1 sum(rate). Para o ClickHouse, eu criei um macro separado chamado RateColumns, que se parece com uma consulta no Prometheus.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/9743c6a4b3de4aab7cfb5bd3fd50fcfd.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>N\u00f3s olhamos e parece que o PromQL \u00e9 muito legal, mas ele tem, \u00e9 claro, suas limita\u00e7\u00f5es.<\/p>\n<p><\/p>\n<p>S\u00e3o:<\/p>\n<p><\/p>\n<ul>\n<li>SELECT limitado.<\/li>\n<li>JOINs limitados.<\/li>\n<li>Sem suporte a HAVING.<\/li>\n<\/ul>\n<p><\/p>\n<p>E se voc\u00ea trabalhou muito com ele, sabe que \u00e0s vezes \u00e9 muito dif\u00edcil fazer algo no PromQL, enquanto no SQL voc\u00ea pode fazer quase tudo, porque todas essas op\u00e7\u00f5es que discutimos agora poderiam ser feitas no SQL. Mas isso seria conveniente de usar? E isso me leva a pensar que nem sempre a linguagem mais poderosa pode ser a mais conveniente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/ec8786f1d72a1f8652fa631cdffc9c25.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Portanto, \u00e0s vezes \u00e9 necess\u00e1rio escolher a linguagem para as tarefas. \u00c9 como a batalha entre Batman e Superman. \u00c9 claro que Superman \u00e9 mais forte, mas Batman conseguiu venc\u00ea-lo porque \u00e9 mais pr\u00e1tico e sabia exatamente o que estava fazendo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/59e5cb7e54ee14705a9e8a36db6f5541.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E a pr\u00f3xima parte \u00e9 Extending PromQL.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/b806acf0e6c7c416614d3fd49004b4be.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Mais uma vez sobre a VictoriaMetrics. O que \u00e9 a VictoriaMetrics? \u00c9 uma base de dados de s\u00e9ries temporais, \u00e9 OpenSource, distribu\u00edmos suas vers\u00f5es single e cluster. De acordo com nossos benchmarks, ela \u00e9 a mais r\u00e1pida no mercado atualmente e em compress\u00e3o, da mesma forma, ou seja, pessoas reais reportam compress\u00e3o em torno de 0,4 bytes por ponto, enquanto no Prometheus \u00e9 de 1,2-1,4. <\/p>\n<p><\/p>\n<p>N\u00f3s suportamos n\u00e3o apenas Prometheus. N\u00f3s suportamos InfluxDB, Graphite, OpenTSDB.<\/p>\n<p><\/p>\n<p>Podemos \"escrever\" nele, ou seja, podemos transferir dados antigos. <\/p>\n<p><\/p>\n<p>E ainda trabalhamos perfeitamente com Prometheus e Grafana, ou seja, suportamos o motor PromQL. E no Grafana, voc\u00ea pode simplesmente mudar o endpoint do Prometheus para VictoriaMetrics e todos os seus dashboards funcionar\u00e3o como antes. <\/p>\n<p><\/p>\n<p>Mas voc\u00ea tamb\u00e9m pode aproveitar recursos adicionais que o VictoriaMetrics oferece.<\/p>\n<p><\/p>\n<p>Vamos passar rapidamente pelas funcionalidades que adicionamos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/78e9c0ce91fad48ab859fc2cf06a0689.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Omitir o par\u00e2metro de intervalo \u2013 voc\u00ea pode pular o par\u00e2metro de intervalo no Grafana. Quando voc\u00ea n\u00e3o quer obter gr\u00e1ficos estranhos ao aumentar ou diminuir o zoom no painel, \u00e9 recomend\u00e1vel usar a vari\u00e1vel <code>$__interval<\/code>. Esta \u00e9 uma vari\u00e1vel interna do Grafana e ela mesma escolhe o intervalo de dados. E o VictoriaMetrics pode entender qual deve ser esse intervalo. E voc\u00ea n\u00e3o precisa atualizar todas as suas consultas. Ser\u00e1 muito mais f\u00e1cil.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/4094c7b8b5e6eef6134b5aa344ef7409.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>A segunda fun\u00e7\u00e3o \u00e9 a refer\u00eancia de intervalo. Voc\u00ea pode usar esse intervalo em suas express\u00f5es. Voc\u00ea pode multiplicar, dividir, passar, referenciar.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/967ca6166e588987bd69c1e1953dca31.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Em seguida, a fam\u00edlia de fun\u00e7\u00f5es rollup. A fun\u00e7\u00e3o rollup transforma qualquer s\u00e9rie temporal sua em tr\u00eas s\u00e9ries temporais distintas. S\u00e3o elas min, max e avg. Eu considero isso muito pr\u00e1tico, pois \u00e0s vezes pode revelar outliers (anomalias) e imprecis\u00f5es. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/d5ff7d6f6ae8f7550434a3dbbca09b20.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E se voc\u00ea simplesmente utilizar irate ou rate, \u00e9 prov\u00e1vel que voc\u00ea perca alguns casos em que a s\u00e9rie temporal se comporta de maneira diferente do que voc\u00ea esperava. Com essa fun\u00e7\u00e3o, \u00e9 muito mais f\u00e1cil ver, por exemplo, que o max est\u00e1 muito acima do avg.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/a4e9f0d246fa33459597f7140e09538c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Agora, a vari\u00e1vel default. Default significa qual valor precisamos desenhar no Grafana, se n\u00e3o tivermos a s\u00e9rie temporal no momento. Quando isso acontece? Suponha que voc\u00ea est\u00e1 exportando uma m\u00e9trica de erros. E voc\u00ea tem um aplicativo t\u00e3o bom que, quando voc\u00ea o lan\u00e7ou, n\u00e3o houve erros, e n\u00e3o houve erros nas tr\u00eas horas seguintes ou at\u00e9 mesmo um dia. E voc\u00ea tem dashboards que mostram a rela\u00e7\u00e3o entre sucesso e erro. E eles n\u00e3o mostrar\u00e3o nada, porque voc\u00ea n\u00e3o tem a m\u00e9trica de erro. Mas em default voc\u00ea pode indicar qualquer coisa.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/cb4e23199194006186ac6907d2335cf6.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Keep_last_Value \u2013 mant\u00e9m o \u00faltimo valor da m\u00e9trica se ela desaparecer. Se o Prometheus n\u00e3o encontr\u00e1-la na pr\u00f3xima coleta dentro de 5 minutos, ent\u00e3o aqui iremos lembrar seu \u00faltimo valor e seus gr\u00e1ficos n\u00e3o quebrar\u00e3o novamente.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/ca202f8a70f071cbd85b33b98cd28bb5.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Scrape_interval \u2013 mostra com que frequ\u00eancia o Prometheus coleta dados sobre sua m\u00e9trica, com que frequ\u00eancia. Aqui voc\u00ea pode ver se houve alguma perda, por exemplo. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/9e9f43c7e9ef9a24dcc0b43673558046.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLabel replace \u2013 uma fun\u00e7\u00e3o popular. Mas consideramos que ela \u00e9 um pouco complicada, pois aceita v\u00e1rios argumentos. E voc\u00ea n\u00e3o apenas precisa lembrar de 5 argumentos, mas tamb\u00e9m se lembrar da ordem deles.<br \/>\n<img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/adfee335e9329f6b03d6f8a42ad8e7b8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPor isso, por que n\u00e3o simplific\u00e1-los? Ou seja, dividi-los em fun\u00e7\u00f5es menores com uma sintaxe clara.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/e928549205018e7405cc2a81970a8514.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E agora a parte mais interessante. Por que consideramos que isso \u00e9 PromQL estendido? Porque suportamos Express\u00f5es de Tabela Comum. Voc\u00ea pode escanear o QR Code (<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/wiki\/ExtendedPromQL\">https:\/\/github.com\/VictoriaMetrics\/VictoriaMetrics\/wiki\/ExtendedPromQL<\/a><\/noindex>), conferir os links com exemplos, com um playground, onde voc\u00ea pode executar consultas diretamente no VictoriaMetrics sem precisar instal\u00e1-lo, apenas pelo navegador.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/33259a4bcd1a92f2cab6e943b73502ad.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E o que exatamente \u00e9 isso? Essa consulta acima \u00e9 uma consulta bastante popular. Eu acredito que em qualquer dashboard de muitas empresas voc\u00ea usa o mesmo filtro em toda parte. Normalmente \u00e9 assim. Mas quando voc\u00ea precisa adicionar um novo filtro, tem que atualizar cada painel ou baixar o dashboard, abrir em JSON, fazer um buscar e substituir, o que tamb\u00e9m leva tempo. Por que n\u00e3o salvar esse valor em uma vari\u00e1vel e reutiliz\u00e1-lo? Isso parece, na minha opini\u00e3o, muito mais simples e claro.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/60aea73cf49934ef7d9a7928a8e2f8e7.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por exemplo, quando preciso atualizar filtros no Grafana em todas as consultas, e o dashboard pode ser enorme ou pode haver v\u00e1rios deles. E como eu gostaria de resolver esse problema no Grafana?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/7cf9eb13219bbd9a5d3240bdda1839a2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eu resolvo esse problema assim: eu crio um commonFilter e nele defino esse filtro, e depois o reutilizo nas consultas. Mas se voc\u00ea fizer isso agora, n\u00e3o funcionar\u00e1, porque o Grafana n\u00e3o permite que voc\u00ea use vari\u00e1veis dentro de vari\u00e1veis de consulta. E isso \u00e9 um pouco estranho.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/0b7a40976cb3eeda370518a242f78708.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>E por isso eu criei uma vers\u00e3o que permite fazer isso. E se voc\u00ea est\u00e1 interessado ou quer esse recurso, apoie ou d\u00ea um deslike, se n\u00e3o gosta da ideia. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/grafana\/grafana\/pull\/16694\">https:\/\/github.com\/grafana\/grafana\/pull\/16694<\/a><\/noindex><\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/68e3a408ff2b554cdfd61a2da4c75bc0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Agora, sobre o PromQL estendido. Aqui definimos n\u00e3o apenas uma vari\u00e1vel, mas uma fun\u00e7\u00e3o inteira. Chamamos essa fun\u00e7\u00e3o de ru (uso de recursos). E essa fun\u00e7\u00e3o aceita recursos livres, limite de recurso e filtro. O sintaxe parece bem simples. E \u00e9 muito f\u00e1cil usar essa fun\u00e7\u00e3o e calcular a porcentagem de mem\u00f3ria livre que temos. Ou seja, quanto de mem\u00f3ria temos, qual \u00e9 o limite e como filtrar. Isso parece muito mais conveniente se voc\u00ea escrever tudo isso, reutilizando os mesmos filtros, porque isso se tornaria uma consulta muito grande.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/4ca66e18ac665fe1038493709530b82b.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui est\u00e1 um exemplo de uma solicita\u00e7\u00e3o muito grande. Ele vem do painel oficial do NodeExporter para o Grafana. Mas eu entendo pouco do que est\u00e1 acontecendo aqui. Ou seja, claro que entendo se olhar de perto, mas a quantidade de par\u00eanteses pode rapidamente desmotivar algu\u00e9m a entender o que est\u00e1 acontecendo. E por que n\u00e3o simplific\u00e1-lo e torn\u00e1-lo mais claro?<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/50e01e7f0c1d03965b028266130413f0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Por exemplo, assim, destacando as partes significativas em vari\u00e1veis. E ent\u00e3o fazendo sua matem\u00e1tica b\u00e1sica. Isso j\u00e1 se parece mais com programa\u00e7\u00e3o, \u00e9 isso que eu gostaria de ver no futuro no Grafana.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/81f957d89f97ebf686abdf969982d3ba.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Aqui est\u00e1 um segundo exemplo de como podemos torn\u00e1-lo ainda mais simples, se j\u00e1 tiv\u00e9ssemos essa fun\u00e7\u00e3o ru, que j\u00e1 est\u00e1 dispon\u00edvel diretamente no VictoriaMetrics. E voc\u00ea simplesmente passa o valor em cache que voc\u00ea declarou no CTE.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/415302741e14232228353db6ec57a2e1.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Eu j\u00e1 falei sobre como \u00e9 importante usar a linguagem de programa\u00e7\u00e3o apropriada. E, provavelmente, em cada empresa, algo \u00fanico acontece no Grafana. E, certamente, voc\u00ea tamb\u00e9m d\u00e1 acesso ao Grafana para seus desenvolvedores, e eles fazem algo pr\u00f3prio. E todos fazem isso de maneiras diferentes. O ideal seria que tudo fosse mais uniforme, ou seja, que se chegasse a um padr\u00e3o comum.<\/p>\n<p><\/p>\n<p>Suponha que voc\u00ea tenha n\u00e3o apenas engenheiros de sistema, mas talvez at\u00e9 especialistas, devops ou SRE. Pode ser que tenha especialistas que sabem o que \u00e9 monitoramento, conhecem o Grafana, ou seja, eles trabalham com isso h\u00e1 anos e sabem exatamente como fazer corretamente. E eles j\u00e1 escreveram isso 100 vezes e explicaram a todos, mas, por algum motivo, ningu\u00e9m escuta.<\/p>\n<p><\/p>\n<p>E se eles pudessem incorporar esse conhecimento diretamente no Grafana, para que outros usu\u00e1rios pudessem reutilizar as fun\u00e7\u00f5es? E se fosse necess\u00e1rio calcular a porcentagem de mem\u00f3ria livre, eles simplesmente aplicariam a fun\u00e7\u00e3o. E se os criadores dos exportadores, junto com seu produto, tamb\u00e9m fornecessem um conjunto de fun\u00e7\u00f5es sobre como trabalhar com suas m\u00e9tricas, porque eles sabem exatamente o que s\u00e3o as m\u00e9tricas e como calcul\u00e1-las corretamente?<\/p>\n<p><\/p>\n<p>Na verdade, isso n\u00e3o existe. Eu fiz isso eu mesmo. \u00c9 o suporte a bibliotecas no Grafana. Suponha que o pessoal que fez o NodeExporter realizou o que eu descrevi. E tamb\u00e9m forneceram um conjunto de fun\u00e7\u00f5es. <\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/755391ee41fd2abf4cb74fad17cecaf0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Ou seja, isso parece mais ou menos assim. Voc\u00ea conecta essa biblioteca no Grafana, vai para a edi\u00e7\u00e3o e aqui est\u00e1 muito simples em JSON como trabalhar com essa m\u00e9trica. Ou seja, um conjunto de fun\u00e7\u00f5es, suas descri\u00e7\u00f5es e como elas se desdobram.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/78a85dd219a421757807be895c173a39.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Na minha opini\u00e3o, isso poderia ser \u00fatil, porque ent\u00e3o no Grafana voc\u00ea escreveria simplesmente assim. E o Grafana \"diz\" a voc\u00ea que existe essa fun\u00e7\u00e3o de certa biblioteca \u2013 vamos us\u00e1-la. Acho que isso seria realmente \u00f3timo.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/6e6b2b459c574d95d56251cd5fae5586.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Um pouco sobre VictoriaMetrics. Estamos fazendo muitas coisas interessantes. Confira nossos artigos sobre compress\u00e3o, sobre nossas competi\u00e7\u00f5es com outras aplica\u00e7\u00f5es de dados de s\u00e9ries temporais, nossa explica\u00e7\u00e3o de como trabalhar com PromQL, porque ainda h\u00e1 muitos novatos nisso, bem como sobre escalabilidade vertical e sobre o confronto com o Thanos.<\/p>\n<p><\/p>\n<p><img decoding=\"async\" alt=\"\u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko\" src=\"\/wp-content\/uploads\/2020\/03\/562829a25ee6131c7eaed8c561c6927c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>Perguntas:<\/p>\n<p><\/p>\n<p><em>Vou come\u00e7ar minha pergunta com uma hist\u00f3ria da vida real. Quando comecei a usar o Grafana pela primeira vez, escrevi uma consulta muito convincente com 5 linhas. No final, resultou em um gr\u00e1fico muito convincente. Esse gr\u00e1fico quase foi para produ\u00e7\u00e3o. Mas ao olhar mais de perto, ficou claro que esse gr\u00e1fico mostrava uma absoluta bobagem, que n\u00e3o tinha rela\u00e7\u00e3o alguma com a realidade, embora os n\u00fameros estivessem dentro da faixa que esper\u00e1vamos ver. E minha pergunta \u00e9: temos bibliotecas, temos fun\u00e7\u00f5es, mas como escrevemos testes para o Grafana? Voc\u00ea escreveu uma consulta complexa, da qual depende a decis\u00e3o de neg\u00f3cios \u2013 pedir um verdadeiro container de servidores ou n\u00e3o. E como sabemos se a fun\u00e7\u00e3o que desenha o gr\u00e1fico se parece com a verdade. Obrigado.<\/em><\/p>\n<p><\/p>\n<p>Obrigado pela pergunta. Aqui h\u00e1 duas partes. A primeira \u2013 tenho a impress\u00e3o, com base na minha pr\u00e1tica, que a maioria dos usu\u00e1rios, quando olha para seus gr\u00e1ficos, n\u00e3o entende o que eles est\u00e3o mostrando. Por algum motivo, as pessoas s\u00e3o muito boas em inventar justificativas para qualquer anomalia que ocorra nos gr\u00e1ficos, mesmo que seja um erro dentro da fun\u00e7\u00e3o. E a segunda parte \u2013 acho que o uso de tais fun\u00e7\u00f5es se encaixaria muito melhor na solu\u00e7\u00e3o do seu problema, ao inv\u00e9s de cada um dos seus desenvolvedores fazer seu planejamento de capacidade e errar com alguma probabilidade.<\/p>\n<p><\/p>\n<p><em>Como verificar?<\/em><\/p>\n<p><\/p>\n<p>Como verificar? Provavelmente, n\u00e3o d\u00e1. <\/p>\n<p><\/p>\n<p><em>Na forma de teste no Grafana.<\/em><\/p>\n<p><\/p>\n<p>Qual \u00e9 a rela\u00e7\u00e3o com o Grafana? O Grafana traduz essa consulta diretamente para a DataSource.<\/p>\n<p><\/p>\n<p><em>Adicionando um pouco mais aos par\u00e2metros.<\/em><\/p>\n<p><\/p>\n<p>N\u00e3o, o Grafana n\u00e3o adiciona nada. Pode haver par\u00e2metros GET, como, por exemplo, step. Ele n\u00e3o \u00e9 claramente especificado, mas voc\u00ea pode sobrescrev\u00ea-lo ou n\u00e3o, sendo adicionado automaticamente. Voc\u00ea n\u00e3o escrever\u00e1 testes aqui. Eu acho que n\u00e3o devemos confiar no Grafana como uma fonte de verdade.<\/p>\n<p><\/p>\n<p><em>Obrigado pela apresenta\u00e7\u00e3o! Obrigado pela compress\u00e3o! Voc\u00ea mencionou o mapeamento de vari\u00e1veis no gr\u00e1fico, que no Grafana n\u00e3o se pode usar uma vari\u00e1vel dentro de outra vari\u00e1vel. Voc\u00ea entende do que estou falando?<\/em><\/p>\n<p><\/p>\n<p>Sim.<\/p>\n<p><\/p>\n<p><em>Isso foi inicialmente uma dor de cabe\u00e7a quando eu queria criar um alerta no Grafana. E voc\u00ea precisa fazer alertas para cada host separadamente. Essa coisa que voc\u00ea fez, ela funciona para alertas no Grafana?<\/em><\/p>\n<p><\/p>\n<p>Se o Grafana n\u00e3o lida com vari\u00e1veis de forma diferente, ent\u00e3o - sim, funcionar\u00e1. Mas meu conselho \u00e9 n\u00e3o usar alertas no Grafana de forma alguma, \u00e9 melhor usar o alertmanager.<\/p>\n<p><\/p>\n<p><em>Sim, eu o utilizo, mas pareceu mais f\u00e1cil de configurar no Grafana, obrigado pela dica!<\/em><\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/494034\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e &quot;ExtendedPromQL&quot; \u041a\u0440\u0430\u0442\u043a\u043e \u043e\u0431\u043e \u043c\u043d\u0435. \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0420\u043e\u043c\u0430\u043d. \u042f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 CloudFlare, \u0436\u0438\u0432\u0443 \u0432 \u041b\u043e\u043d\u0434\u043e\u043d\u0435. \u041d\u043e \u0442\u0430\u043a\u0436\u0435 \u044f \u043c\u0435\u0439\u0442\u0435\u043d\u0435\u0440 VictoriaMetrics. \u0418 \u044f \u0430\u0432\u0442\u043e\u0440 ClickHouse \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f Grafana \u0438 ClickHouse-proxy \u2013 \u044d\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u043f\u0440\u043e\u043a\u0441\u0438 \u0434\u043b\u044f ClickHouse. \u041c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0441 \u043f\u0435\u0440\u0432\u043e\u0439 \u0447\u0430\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00ab\u0421\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430\u00bb \u0438 \u0432 \u043d\u0435\u0439 \u044f \u0431\u0443\u0434\u0443 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":75586,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-75585","post","type-post","status-publish","format-standard","has-post-thumbnail","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\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e &quot;ExtendedPromQL&quot;\" \/>\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\/extendedpromql-rasshifrovka-doklada-romana-havronenko\" \/>\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\u00abExtendedPromQL\u00bb \u2014 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e &quot;ExtendedPromQL&quot;\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/extendedpromql-rasshifrovka-doklada-romana-havronenko\" \/>\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-03-27T05:42:28+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-27T05:42:28+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\udd47 \u00abExtendedPromQL\u00bb \u2014 transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavroenko | ProHoster","description":"Convido voc\u00ea a conferir a transcri\u00e7\u00e3o da apresenta\u00e7\u00e3o de Roman Khavronenko \"ExtendedPromQL\"","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/extendedpromql-rasshifrovka-doklada-romana-havronenko","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\u00abExtendedPromQL\u00bb \u2014 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u0430 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e | ProHoster","og:description":"\u041f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u043a\u043e\u0439 \u0434\u043e\u043a\u043b\u0430\u0434\u0430 \u0420\u043e\u043c\u0430\u043d\u0430 \u0425\u0430\u0432\u0440\u043e\u043d\u0435\u043d\u043a\u043e &quot;ExtendedPromQL&quot;","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/extendedpromql-rasshifrovka-doklada-romana-havronenko","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-03-27T05:42:28+00:00","article:modified_time":"2020-03-27T05:42:28+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"75585","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 17:54:47","updated":"2022-09-28 07:46:53","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\/75585","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=75585"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/75585\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/75586"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=75585"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=75585"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=75585"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}