"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Propoño ler a transcrición do informe de Roman Khavronenko "ExtendedPromQL"

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Brevemente sobre min. Chámome Romano. Traballo para CloudFlare e vivo en Londres. Pero tamén son mantedor de VictoriaMetrics.
E eu son o autor Complemento ClickHouse para Grafana e ClickHouse-proxy é un pequeno proxy para ClickHouse.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Comezaremos pola primeira parte, que se chama “Dificultades de tradución” e nela falarei de que calquera lingua ou incluso só unha lingua de comunicación é moi importante. Porque así é como transmites os teus pensamentos a outra persoa ou sistema, como formulas unha solicitude. A xente en Internet discute sobre cal é o mellor idioma: java ou outro. Para min, decidín que é necesario escoller unha tarefa, porque todo isto é específico.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Comecemos dende o principio. Que é PromQL? PromQL é a linguaxe de consulta de Prometheus. Así é como formamos consultas en Prometheus para obter datos de series temporais, series temporais.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Que son os datos de series temporais? Literalmente, estes son tres parámetros.

Estes son:

  • Que estamos mirando.
  • Cando o miramos.
  • E que valor mostra.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Se miras este gráfico (este gráfico é do meu teléfono, que mostra as estatísticas dos meus pasos), aquí podes responder rapidamente a estas preguntas.

Estamos mirando os pasos. Vemos o significado e vemos o tempo cando o miramos. É dicir, mirando este diagrama, pódese dicir facilmente que o domingo camiñei uns 15 pasos. Estes son datos de series temporais.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Agora imos "romper" (transformalos) noutro modelo de datos en forma de táboa. Aquí tamén temos o que estamos mirando. Aquí engadín uns pequenos datos adicionais, que chamaremos metadatos, é dicir, non fun eu o que pasou, senón dúas persoas, por exemplo, Jay e Silent Bob. Iso é o que estamos mirando; que mostra e cando mostra ese valor.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko
Agora imos tentar almacenar todos estes datos na base de datos. Por exemplo, tomei a sintaxe de ClickHouse. E aquí estamos creando unha táboa chamada "Pasos", é dicir, o que estamos mirando. Hai un tempo aquí no que o miramos; o que mostra e algúns metadatos onde almacenaremos quen é: Jay e Silent Bob.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E para tentar visualizalo todo, usaremos Grafana, porque, en primeiro lugar, é bonito.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Tamén usaremos este complemento. Hai dúas razóns para iso. O primeiro é porque o escribín. E sei exactamente o difícil que é sacar datos de series temporais de ClickHouse para mostralos en Grafana.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Amosarémolo no panel de gráficos. Este é o panel máis popular en Grafana e mostra o valor fronte ao tempo, polo que só necesitamos dous parámetros.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko
Escribamos a consulta máis sinxela: como mostrar as estatísticas de pasos en Grafana, almacenando estes datos en ClickHouse, na táboa que creamos. E escribimos unha consulta tan sinxela. Escollemos entre pasos. Seleccionamos un valor e seleccionamos o tempo destes valores, é dicir, os mesmos tres parámetros dos que falamos.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E como resultado, obtemos este gráfico. Quen sabe por que é tan raro?

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

É certo, cómpre ordenar por tempo.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E ao final temos un calendario mellor, pero aínda estraño. Quen sabe por que? É certo, hai dous participantes e regalamos dúas series temporais en Grafana, porque se tratamos de novo co modelo de datos, cada serie temporal é unha combinación única dun nome e de todas as etiquetas clave-valor.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Polo tanto, necesitamos escoller unha persoa específica. Escollemos a Jay.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E debuxa de novo. Agora o gráfico parece a verdade. Agora é un horario normal e todo funciona ben.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E, probablemente, sabes como facer o mesmo, pero en Prometheus a través de PromQL. Aproximadamente así. Un pouco máis fácil. E desglosámolo todo. Damos Pasos. E filtrar por Jay. Non especificamos aquí que necesitamos obter un valor e non eliximos un momento.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Agora imos tentar calcular a velocidade de movemento de Jay ou Silent Bob. En ClickHouse, teremos que facer runningDifference, é dicir, calcular a diferenza entre pares de puntos e dividilos por tempo para obter a velocidade exacta. A solicitude terá un aspecto así.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E mostrará aproximadamente estes valores, é dicir, aproximadamente 1,8 pasos por segundo fai Silent Bob ou Jay.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E en Prometheus tamén sabes como facelo. Moito máis doado que antes.

"ExtendedPromQL" - transcrición do informe de Roman KhavronenkoE para que tamén sexa fácil de facer en Grafana, engadín un envoltorio que se parece moito a PromQL. Chámase Macros de tarifas, ou como queiras chamarlle. En Grafana, só escribes "taxa", pero nalgún lugar no fondo transfórmase nunha petición tan grande. E nin sequera tes que miralo, está aí nalgún lugar, pero aforras moito tempo, porque escribir consultas SQL tan grandes sempre é caro. Pode facilmente cometer un erro e despois non entender o que está a suceder durante moito tempo.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E esta é unha consulta que nin sequera cabía nunha diapositiva, e ata tiven que dividila en dúas columnas. Esta tamén é unha solicitude en ClickHouse, que fai a mesma tarifa, pero para ambas as series temporais: Silent Bob e Jay, polo que temos dúas series temporais no panel. E isto xa é moi difícil, na miña opinión.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E segundo Prometeo será suma (taxa). Para ClickHouse fixen unha macro separada chamada RateColumns que parece unha consulta de Prometheus.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Miramos e parece que PromQL é moi xenial, pero ten, por suposto, limitacións.

Estes son:

  • SELECCIÓN LIMITADA.
  • Edge JOINs.
  • Non hai apoio.

E se traballas con el durante moito tempo, sabes que ás veces é moi difícil facer algo en PromQL, e en SQL podes facer case todo, porque todas estas opcións das que acabamos de falar poderían facerse en SQL. . Pero sería conveniente usalo? E isto faime pensar que non sempre a lingua máis poderosa pode ser a máis conveniente.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Polo tanto, ás veces cómpre escoller un idioma para as tarefas. É como unha batalla entre Batman e Superman. Está claro que Superman é máis forte, pero Batman puido derrotalo porque é máis práctico e sabía exactamente o que estaba a facer.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E a seguinte parte é A extensión de PromQL.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Unha vez máis sobre VictoriaMetrics. Que é VictoriaMetrics? Esta é unha base de datos de series temporais, está en OpenSource, distribuímos as súas versións single e cluster. Segundo os nosos puntos de referencia, é o máis rápido que hai no mercado agora e é similar en termos de compresión, é dicir, as persoas vivas informan de compresión duns 0,4 bytes por punto, cando Prometheus ten 1,2-1,4.

Apoiamos non só a Prometeo. Soportamos InfluxDB, Graphite, OpenTSDB.

Podes "escribir" en nós, é dicir, podes transferir datos antigos.

E tamén traballamos perfectamente con Prometheus e Grafana, é dicir, admitimos o motor PromQL. E en Grafana, simplemente podes cambiar o punto final de Prometheus a VictoriaMetrics e todos os teus paneis funcionarán como o fixeron.

Pero tamén podes usar chips adicionais proporcionados por VictoriaMetrics.

Imos repasar rapidamente as funcións que engadimos.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Omitir parámetro de intervalo: pode omitir o intervalo de parámetros en Grafana. Cando non quere obter gráficos estraños ao achegar ou diminuír o zoom no panel, recoméndase utilizar a variable $__interval. Este é un cambio interno de Grafana e escolle o propio intervalo de datos. E VictoriaMetrics pode entender por si mesma cal debería ser este rango. E non tes que actualizar todas as túas consultas. Será moito máis doado.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

A segunda función é a referencia de intervalos. Podes usar este espazo nas túas expresións. Podes multiplicar, dividir, transferir, referirse a el.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

O seguinte é a familia de funcións de acumulación. A función de acumulación transforma calquera das súas series temporais en tres series temporais separadas. Estes son min, max e avg. Paréceme moi conveniente, porque ás veces pode mostrar algúns valores atípicos (anomalías) e imprecisións.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E se só estás enfurecido ou valoras, probablemente podes perder algúns casos nos que a serie temporal non se comporta como querías. É moito máis fácil de ver con esta función, digamos que max está moi fóra da media.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

A continuación é a variable predeterminada. Por defecto: isto significa que valor necesitamos debuxar en Grafana se non temos unha serie temporal neste momento. Cando ocorre? Digamos que exportas algunhas métricas de erro. E tes unha aplicación tan xenial que cando inicias, non tes erros nin sequera durante as próximas tres horas ou mesmo un día. E tes paneis que mostran as relacións de éxito a erro. E non che mostrarán nada porque non tes unha métrica de erro. E por defecto podes especificar calquera cousa.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Keep_last_Value: garda o último valor da métrica se falta. Se Prometheus despois do seguinte raspado non o atopou en 5 minutos, aquí lembraremos o seu último valor e os teus gráficos non volverán romper.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Scrape_interval: mostra con que frecuencia Prometheus recolle datos sobre a túa métrica, con que frecuencia. Aquí podes ver o pase, por exemplo.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko
A substitución de etiquetas é unha característica popular. Pero pensamos que é un pouco complicado porque necesita argumentos enteiros. E cómpre non só lembrar os 5 argumentos, senón tamén lembrar a súa secuencia.
"ExtendedPromQL" - transcrición do informe de Roman Khavronenko
Polo tanto, por que non facelos máis sinxelos? É dicir, dividilo en pequenas funcións cunha sintaxe clara.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E agora o máis interesante. Por que pensamos que é PromQL estendido? Porque admitimos Common Table Expressions. Podes seguir o código QR (https://github.com/VictoriaMetrics/VictoriaMetrics/wiki/ExtendedPromQL), consulta ligazóns con exemplos, do parque infantil, onde podes realizar consultas directamente en VictoriaMetrics sen instalalo só no navegador.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E que é? Esta solicitude desde arriba é unha solicitude bastante popular. Creo que en calquera panel de moitas empresas utilizas o mesmo filtro para todo. Normalmente así. Pero cando necesites engadir algún filtro novo, tes que actualizar cada panel, ou descargar o panel, abrilo en JSON, facer unha substitución de busca, o que tamén leva tempo. Por que non almacenar este valor nunha variable e reutilizalo? Parece, na miña opinión, moito máis sinxelo e claro.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Por exemplo, cando necesito actualizar filtros en Grafana en todas as solicitudes, e o panel pode ser enorme ou incluso pode haber varios deles. E como me gustaría resolver este problema en Grafana?

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Resolvo este problema así: fago un commonFilter e defino este filtro nel, e despois reutilizoo nas consultas. Pero se fai o mesmo agora, non funcionará porque Grafana non che permite usar variables dentro das variables de consulta. E é un pouco raro.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E por iso fixen unha opción que che permite facelo. E se estás interesado ou queres esa función, apoia ou non che gusta se non che gusta esta idea. https://github.com/grafana/grafana/pull/16694

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Máis información sobre PromQL estendido. Aquí definimos non só unha variable, senón directamente unha función enteira. E chamámoslle ru (uso de recursos). E esta función acepta recursos gratuítos, un límite de recursos e un filtro. A sintaxe parece ser sinxela. E é moi sinxelo usar esta función e calcular a porcentaxe de memoria libre que temos. É dicir, canta memoria temos, que límite e como filtrar. Parece moito mellor se o escribiras todo reutilizando os mesmos filtros, porque se convertería nunha consulta grande e grande.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

E aquí tes un exemplo dunha petición tan grande e grande. É do panel oficial de NodeExporter para Grafana. Pero realmente non entendo o que está a pasar aquí. Iso é, por suposto, entendo se miras detidamente, pero o número de corchetes pode reducir inmediatamente a motivación para comprender o que está a suceder aquí. E por que non facelo máis sinxelo e claro?

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Por exemplo, así, destacando cousas ou partes significativas en variables. E despois fai as túas matemáticas básicas. Isto xa é máis como programar, isto é o que me gustaría ver no futuro en Grafana.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Aquí tes un segundo exemplo de como podemos facelo aínda máis sinxelo se xa tiñamos esta función ru, e xa existe directamente en VictoriaMetrics. E entón só pasas o valor almacenado na caché que declarou no CTE.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Xa falei do importante que é empregar a linguaxe de programación adecuada. E, probablemente, algo diferente está a suceder en Grafana en cada empresa. E, probablemente, aínda dás acceso a Grafana aos teus desenvolvedores, e os desenvolvedores fan algo propio. E todos fano dun xeito diferente. Pero queríao dalgún xeito igual, é dicir, reducido a un estándar común.

Digamos que nin sequera tes enxeñeiros de sistemas, quizais teñas expertos, devops ou SRE. Quizais teñas expertos que saben o que é a vixilancia, saben o que é Grafana, é dicir, levan anos traballando con isto e saben exactamente como facelo ben. E xa o escribiron 100 veces e explicárono a todos, pero por algo ninguén escoita.

E se puidesen poñer estes coñecementos directamente en Grafana para que outros usuarios poidan reutilizar as funcións? E se fose necesario calcular a porcentaxe de memoria libre, entón simplemente aplicarían a función. Pero e se os creadores dos exportadores, xunto co seu produto, tamén proporcionasen un conxunto de funcións, como traballar coas súas métricas, porque saben exactamente cales son estas métricas e como calculalas correctamente?

Este realmente non existe. Aquí está o que fixen eu mesmo. Este é o soporte da biblioteca en Grafana. Digamos que os mozos que fixeron NodeExporter fixeron o que describín. E tamén proporcionou un conxunto de características.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

É dicir, parece algo así. Conectas esta biblioteca a Grafana, entras na edición e aquí é moi sinxelo en JSON como traballar con esta métrica. É dicir, algún conxunto de funcións, a súa descrición e en que se desenvolven.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Na miña opinión, isto podería ser útil, porque así escribirías en Grafana. E Grafana "dílle" que hai tal función de tal biblioteca, empregámola. Creo que sería moi chulo.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Un pouco sobre VictoriaMetrics. Facemos moitas cousas interesantes. Lea os nosos artigos sobre compresión, sobre a nosa competencia con outras aplicacións de datos de series temporais, a nosa explicación de como traballar con PromQL, porque hai moitos máis principiantes nisto, así como sobre a escalabilidade vertical e sobre a confrontación con Thanos.

"ExtendedPromQL" - transcrición do informe de Roman Khavronenko

Preguntas:

Comezo a miña pregunta cunha simple historia de vida. Cando comecei a usar Grafana, escribín unha consulta de 5 liñas moi persuasiva. O resultado final é un gráfico moi convincente. Este gráfico case entrou en produción. Pero tras unha inspección máis atenta, resultou que este gráfico mostra un despropósito absoluto que non ten nada que ver coa realidade, aínda que os números entran no rango que esperabamos ver. E a miña pregunta. Temos bibliotecas, temos funcións, pero como escribimos probas para Grafana? Escribiu unha consulta complexa que afecta á decisión empresarial: pedir un contedor real de servidores ou non pedir. E como sabemos, esta función que debuxa unha gráfica é semellante á verdade. Grazas.

Grazas pola pregunta. Aquí hai dúas partes. En primeiro lugar, teño a impresión, baseándome na miña experiencia, de que a maioría dos usuarios, cando miran os seus gráficos, non entenden o que lles están mostrando. Dalgunha maneira, a xente é moi boa para buscar unha escusa para calquera anomalía que ocorre nos gráficos, aínda que sexa un erro dentro dunha función. E a segunda parte, paréceme que usar tales funcións sería moito máis adecuado para resolver o teu problema, en lugar de que cada un dos teus desenvolvedores faga a súa propia planificación da capacidade e cometa erros con certa probabilidade.

Como comprobar?

Como comprobar? Probablemente non.

Como proba en Grafana.

E que pasa con Grafana? Grafana traduce esta solicitude directamente ao DataSource.

Engadindo un pouco aos parámetros.

Non, non se lle engade nada a Grafana. Pode haber parámetros GET, como step. Non se especifica explícitamente, pero pode anulalo, non pode anulalo, pero engádese automaticamente. Non escribes probas aquí. Non creo que debas confiar aquí en Grafana como fonte de verdade.

Grazas polo informe! Grazas pola compresión! Lembraches sobre a asignación dunha variable nun gráfico, que en Grafana non podes usar unha variable nunha variable. Entendes o que quero dicir?

Si

Isto foi inicialmente unha dor de cabeza cando quixen facer unha alerta en Grafana. E hai que facer alertas para cada host por separado. Aquí está o que fixeches, funciona para alertas en Grafana?

Se Grafana non accede ás variables doutro xeito, entón si, funcionará. Pero o meu consello é que non uses as alertas en Grafana, é mellor que uses alertmanager.

Si, úsoo, pero pareceume máis fácil de configurar en Grafana, pero grazas polo consello.

Fonte: www.habr.com

Engadir un comentario