Grafana: Solicitud de función: manipulaciones de cadenas de variables de plantilla

Creado en 1 may. 2017  ·  42Comentarios  ·  Fuente: grafana/grafana

Sería bueno si las variables de plantilla de Grafana pudieran tener algunas manipulaciones de cadenas aplicadas. Esto podría ser útil para poder hacer referencia a datos sobre la misma cosa de varias fuentes de datos de una variable, donde esa cosa tiene un nombre ligeramente diferente por razones técnicas. Por ejemplo, si tiene un sitio web al que se refiere por el nombre "algún_sitio" en sus sistemas, pero tiene un bucket de AWS S3 para él donde no puede usar guiones bajos, puede transformar ese nombre en "algún sitio". , o 'somesite' en su lugar.

Las ideas inmediatamente obvias sobre qué tipo de manipulaciones apoyar serían las diversas sustituciones de variables que soporta bash. En bash, haría el ejemplo anterior usando ${var//_/-} o ${var//_} .

aredashboartemplating typfeature-request

Comentario más útil

Cuando inicialmente agregué el soporte para la sintaxis ${varname:raw} , pensé que podría extenderse para ser un lenguaje de procesamiento de propósito más general para munging variables según sea necesario, por lo que una sintaxis como ${varname:replace(/(.*)_/,'$1 '):toLower} podría representar una canalización para modificar el valor en el momento de la interpolación (a diferencia de aplicar una expresión regular para modificar los valores en el momento de la consulta, ya que el mismo valor podría usarse en diferentes contextos dentro de un tablero).

Todos 42 comentarios

Sería bueno poder tomar partes de la variable también, por ejemplo, $(regex(some_variable, "/^([^-]+)\-([^-]+)$/", "foo: $1 bar:$2")) .

Esto permitiría mostrar etiquetas mucho más agradables con paneles / filas repetidos (no es necesario mostrar el valor completo como ew1-cosmos-prd-prod-admin_api-AutoScalingGroup-1FC4QCWSNZZFV pero solo admin_api (o incluso Admin API en combinación también se admiten transformaciones de texto ).

¿Alguna solución para esta solicitud todavía?

Estoy tratando de entender si esto ya se puede resolver a través de http://docs.grafana.org/reference/templating/#query -options
¿Podrías describir tu problema con un ejemplo concreto y posiblemente una captura de pantalla en el lugar donde chocaste contra una pared?

En mi caso tengo una variable $Host de tipo _Query_, cuyos posibles valores son los nombres de host de mi servidor: lo uso en mis consultas solo para obtener datos de este / estos host (s) y en el _Title_ o _Description_ campo.

Pero estos nombres de host pueden ser bastante largos: "_srv42-nyc-prod.example.com_" que puede crear un ajuste de línea en un pequeño panel "Singlestat", por ejemplo.

La capacidad de realizar una operación de subcadena / expresión regular en mi variable $Host para que elimine "_-prod.example.com_" y solo mantenga "_srv42-nyc_" sería excelente.

Tengo un caso de uso similar al de C-Duv.
Retiro una variable en la forma " http://server1.example.com " y me gustaría usar solo el elemento "server1" de la cadena.

@ billyaustin84 usa el soporte de expresión regular variable para eso

Todavía no estoy seguro de dónde se utilizan las variables manipuladas: ¿en consultas de panel o en otro lugar? La captura de pantalla ayudaría inmensamente.

También sería útil que http://docs.grafana.org/reference/templating/#query -options y fallaron.

probablemente se usaría en el formato de alias de series y en los títulos de los paneles.

Cuando inicialmente agregué el soporte para la sintaxis ${varname:raw} , pensé que podría extenderse para ser un lenguaje de procesamiento de propósito más general para munging variables según sea necesario, por lo que una sintaxis como ${varname:replace(/(.*)_/,'$1 '):toLower} podría representar una canalización para modificar el valor en el momento de la interpolación (a diferencia de aplicar una expresión regular para modificar los valores en el momento de la consulta, ya que el mismo valor podría usarse en diferentes contextos dentro de un tablero).

Por ejemplo en particular, me enfrenté a la imposibilidad de usar conversiones simples como [[variable:toLower]] o [[variable:toUpper]] ya que en diferentes consultas necesitamos diferentes sabores de valor variable mientras mantenemos la agrupación (es decir, para repetir filas por variable)

También tengo un caso de uso en el que las variables de plantilla representan aplicaciones, y estas aplicaciones pueden tener un espacio de nombres usando caracteres / (barra) en una plataforma de orquestación de contenedores (concretamente, Marathon).

Estos caracteres se eliminan en el proceso de recopilación de métricas y se reemplazan por _ (guión bajo).

Pero luego, si desea proponer enlaces dinámicos en paneles de texto, por ejemplo. a la aplicación / API / lo que sea, tienes que hacer la transformación opuesta, es decir. s/_/\./ .

@davkal , ya usé la opción regex para mi variable $Host de tipo "Consulta". La consulta obtiene todas las instancias conocidas de Prometheus y la expresión regular elimina la parte del puerto, por lo que mi variable solo contiene el FQDN del servidor.

Funciona para consultar datos (usando some_metric{instance=~"$Host"} ).

Pero para las etiquetas en la leyenda de los gráficos o en el título / descripción del gráfico, a veces quiero mostrar un nombre de host más corto (por ejemplo, srv42-nyc lugar de srv42-nyc-prod.example.com ).
Entonces, el tipo de manipulación variable de un Bash está bien para mí.

Sé que podría cambiar la expresión regular de la variable para que solo contenga srv42-nyc y use la siguiente consulta some_metric{instance=~"$Host-prod.example.com} . Pero debo adaptar todas las consultas, ¿y si cambio / agrego un dominio ?. También sienta que una variable de función FQDN $Host es adecuada y el contenido / significado de la variable no debe cambiarse con fines de visualización.

mi ejemplo:
tengo un statsd-exporter para nginx-ingress-controller que cambia todos los caracteres no alfanuméricos en los nombres y etiquetas de las métricas para subrayar _

como resultado, no puedo consultar las métricas de nginx y las métricas de kubernetes en un panel,
porque la etiqueta de implementación de la aplicación es example-app y la etiqueta del controlador nginx example_app

Sería muy útil si pudiéramos tener alguna manipulación básica de cadenas en la sección de variables,
o directamente en una cadena de consulta, por ejemplo, cambie el guión bajo _ al guión - en el valor de la variable para esta consulta

Cuando inicialmente agregué el soporte para la sintaxis ${varname:raw} , pensé que podría extenderse para ser un lenguaje de procesamiento de propósito más general para munging variables según sea necesario, por lo que una sintaxis como ${varname:replace(/(.*)_/,'$1 '):toLower} podría representar una canalización para modificar el valor en el momento de la interpolación (a diferencia de aplicar una expresión regular para modificar los valores en el momento de la consulta, ya que el mismo valor podría usarse en diferentes contextos dentro de un tablero).

Este es exactamente uno de mis casos de uso. Tengo métricas con parte de la ruta en mayúsculas y parte en minúsculas. Sería fantástico poder crear una única variable que pudiera transformarse para adaptarse a cualquier caso de uso, en un panel de control determinado.

También mi caso de uso. Tengo algunas métricas que están etiquetadas con la dirección IP del host y algunas que están etiquetadas con el nombre de host (que contiene la dirección IP ip-xxxx.blah). Me gustaría una forma de usar una variable para impulsar ambas consultas.

Mi problema: filtro las consultas usando nombres de entorno en minúsculas, pero quiero que los entornos se muestren en MAYÚSCULAS en los títulos del panel de la plantilla. Entonces, en general, algo como ${variable:toUpper} sería genial :-)
Otras ideas de transformación:

  • de camelCase a underscore_case
  • y opuesto de underscore_case a camelCase
  • primera letra mayúscula
  • primera letra caja INFERIOR

Mi situación es que estoy usando plantillas de interruptores usando el complemento Zabbix y lo que necesito es que el título contenga el nombre de la interfaz y la descripción de la variable del tablero $ ifalias.

Las métricas usarán el nombre de la interfaz extraído de la variable y categorizarán con cadenas como ": Bits recibidos: Bits enviados, etc." y crearán dinámicamente un panel para cada interfaz en el conmutador. La única pieza que falta es tener la descripción de la interfaz en el título, ya que hasta ahora solo estoy usando una variable con el nombre de la interfaz. Si pudiera dejar todo después del primer espacio en la variable. La cadena completa será: (Ethernet3 / 1 Alias ​​_myinterfacedescription_). Puedo usar "Interfaz $ {ifalias _regex manipulación_} |: Bits recibidos"

¿Es esto posible ahora?

image

Voy a rehacer el prototipo de elemento de Zabbix para eliminar el SI y el espacio antepuestos, por lo que no tengo que preocuparme por eso.

image

image

En el campo "elemento" del ejemplo anterior, reemplace $ ifname con $ {ifalias _variable manipulation_}

Estoy tan cerca que sería increíble si pudiera hacer esto. Estamos a punto de implementar muchos conmutadores y esto nos permitirá ahorrar mucho tiempo.

También tengo una necesidad de esto. Tomo una lista o medidas de InfluxDB como mi variable, necesito las dos primeras partes del nombre de la medida para construir paneles consistentes.
A modo de ejemplo:

compA_orders_east
compB_orders_west
compB_orders_east

Deseo que mi lista de variables sea ['compA_orders', 'compB_orders']
Luego agregaré west y east a la consulta en 2 paneles en el tablero

El resultado debería ser que puedo elegir compA_orders y tener dos paneles para west y east para esta empresa.

!!!!!
EDITAR - Ignóreme, Grafana ya hace esto con Regex en carga variable /^(.*?_.*?)_/ fue mi respuesta
!!!!!

Mi caso de uso es repetir filas sobre 'tuplas' de valores de etiqueta. Si pudiera crear variables como:

action-controller,action-controller,action-controller...

Y luego use solo una parte de la variable en la parte derecha de la consulta (dos etiquetas diferentes). Esto me permitiría crear el tipo de paneles repetidos que quiero.

Mi caso de uso es convertir "host_example_com" en "host.example.com", algo que pensé que sería fácil de hacer ...

Mi caso de uso es poder definir una lista de puntos finales http para monitorear, como:
endpoint=GET /path1, POST /path2
y luego poder crear un gráfico repetido para cada uno de los valores, como:
http_server_requests_seconds_count{method="${endpoint[0]}", uri="${endpoint[1]}"}

Mi caso de uso es que las variables son ip_port, pero solo queremos ip
image
vea esto, la variable $ host es 192.168.x.x_3307, pero solo queremos 192.168.xx. si hay una manera como
'192.168.x.x_3307'.split (' _ ') [0] ¡sería perfecto!

@Fanduzi, ¿no puedes usar _<port> en la variable?

¡+1 la capacidad de manipular las cuerdas de esta manera sería inmensamente útil!

Para mí, me gustaría mantener una lista única de pares de enrutador / interfaz, por ejemplo

BYO-XXX-XXX_LZWXXXXXX,BYO-XXX-XXX_GigabitEthernet0/X/X.XXXX

Me gustaría tener un panel repetido en esta lista de variables, que luego usa la primera parte antes de _ para completar el campo Host (complemento Zabbix) y la segunda parte el campo Item dentro de una expresión regular más grande.

si puedo crear variables anidadas que extraigan las partes de la variable principal para lograr este efecto, eso también funcionaría para mí

Creo que sería bueno tener opiniones de los mantenedores sobre esto en lugar de agregar casos de uso y casos de uso año tras año: sonrisa:
@davkal @marefr ¿qué opinas? ¿Escéptico sobre la validez de los casos de uso? En términos generales, las personas no siempre tienen el control total sobre su ingestión de métricas, transformación de métricas, historial de métricas y les gustaría cambiar su representación de texto en listas desplegables y paneles.

@marefr

@Fanduzi, ¿no puedes usar _<port> en la variable?

¿Cómo haría uno eso? ¿Tienes un ejemplo?

EDITAR: Acabo de encontrar la solución para mí. Estoy usando esta expresión regular en la consulta para obtener la variable:
'/(.*)_traffic_in/' selecciona todo sin el "_traffic_in" de la métrica.

@marefr

@Fanduzi, ¿no puedes usar _<port> en la variable?

¿Cómo haría uno eso? ¿Tienes un ejemplo?

EDITAR: Acabo de encontrar la solución para mí. Estoy usando esta expresión regular en la consulta para obtener la variable:
'/(.*)_traffic_in/' selecciona todo sin el "_traffic_in" de la métrica.

¡Gracias! ¡Exactamente lo que estaba buscando!

Estoy usando table.
renderizar valor como enlace
agregando $ {__ cell} en la URL.

pero, antes de llamar a la URL, tengo que transformar $ {_ cell}
y eliminar dominio.

igual que. regex: /([^.]+)/

como: hostname.cade.com o hostname.aqui.com o hostname, cargado en $ {_ cell}

tranform: $ {_ celda: regex = / ([^.] +) /}

resultado: nombre de host

refresh = 10s & var-job = All & var-host = $ {__ celda: TRANSFORM } & var-interval = $ __ auto_interval_interval
refresh = 10s & var-job = All & var-host = nombre de host & var-interval = $ __ auto_interval_interval

¿hay alguna solución para ello?

@davkal , ya usé la opción regex para mi variable $Host de tipo "Consulta". La consulta obtiene todas las instancias conocidas de Prometheus y la expresión regular elimina la parte del puerto, por lo que mi variable solo contiene el FQDN del servidor.

Funciona para consultar datos (usando some_metric{instance=~"$Host"} ).

Pero para las etiquetas en la leyenda de los gráficos o en el título / descripción del gráfico, a veces quiero _ mostrar_ un nombre de host más corto (por ejemplo, srv42-nyc lugar de srv42-nyc-prod.example.com ).
Entonces, el tipo de manipulación variable de un Bash está bien para mí.

Sé que podría cambiar la expresión regular de la variable para que solo contenga srv42-nyc y use la siguiente consulta some_metric{instance=~"$Host-prod.example.com} . Pero debo adaptar todas las consultas, ¿y si cambio / agrego un dominio ?. También sienta que una variable de función FQDN $Host es adecuada y el contenido / significado de la variable no debe cambiarse con fines de visualización.

@davkal Este método solo funciona cuando se selecciona un único valor para $Host . Si está buscando una forma de trabajar con varios valores seleccionados, pruebe con una consulta como some_metric{instance=~"${Host:regex}-prod.example.com"} .

${var_name:regex} formatea variables con múltiples valores en una cadena de expresiones regulares [1], por lo que cuando tiene seleccionados srv41-nyc y srv42-nyc , la consulta se traduce en some_metric{instance=~"(srv41-nyc|sv42-nyc)-prod.example.com"} .

[1] https://grafana.com/docs/grafana/latest/variables/advanced-variable-format-options/#regex

+1 para esto
Mi opción más deseada sería usar algo como nunjucks para proporcionar plantillas de tipo jinja.

Otro +1 más para esto: usamos Grafana como un panel para ver cientos de entidades individuales, cada una de ellas tiene un SHA único que tiene más de 64 caracteres de longitud, y para identificar de manera única una en el contexto que existe, debe haga clic en el gráfico para ver el título completo, porque la pantalla corta los últimos 8 o 10 caracteres únicos.

TL; DR: Necesito los títulos de identificación únicos individuales de CIENTOS de gráficos que se parecen a:
x31089005522ubz7qhc3mldewguc45wrku3eqsxsr64bhbmvwrgeqsxhaffa Bandwidth
parecerse a:
qsxhaffa Bandwidth

Algo como el problema que se cerró como duplicado anterior habría sido perfecto.

¡Hola!

Me encontré con este problema al intentar usar las métricas de Prometheus, específicamente $__rate_interval .

Se define como una cadena , por lo que obtenemos algo con una melodía de 60s .

Esto está bien cuando se usa como un selector de vector de rango , pero nuestra métrica se agrega a través de una regla record , por lo que al final del día me gustaría multiplicar la métrica agregada, pero estoy atascado tratando de elimine el s al final.

El ejemplo completo es:

  • contador básico:

    • seconds_service_used

  • agregación local:

    • sum(increase(seconds_service_used[$__range])) BY (email)

  • fuente para la regla de registro agg_seconds_service_used:rate10m :

    • sum(rate(seconds_service_used[10m])) BY (email)

  • estimación aproximada de la suma agregada:

    • sum_over_time(agg_seconds_service_used:rate10m[$__range]) * 60

  • callejón sin salida que apunta a este problema como un camino rápido a seguir:

    • sum_over_time(agg_seconds_service_used:rate10m[$__range]) * $__rate_interval

La última consulta se interrumpe debido a un s al final.

¡Gracias por investigar el problema!

mi problema: no quiero usar subcadena en el valor seleccionado
pero los formateadores son solo para multiselectores
tal vez haya una manera de agregar un formateador de valor único

En mi problema tengo pods en k8s con nombres como

pod = auth-78df597855-f2hxq
pod = auth-redis-b499985c4-h2rx8

Yo tengo una variable

service_name= label_values(kube_deployment_labels{namespace=~"$namespace"}, deployment)

image

Estoy buscando una forma de tenerlo como patrón.

image

entonces podría usar pod = ~ "$ service_name" en lugar de pod = ~ "$ service_name- [a-zA-Z0-9] - [a-zA-Z0-9] "
El problema con el primero es que el patrón ALL no coincidirá con algunas vainas que tengo en kubernetes
como con $ service_name ~ = ". " sería pod = ~ ". - [a-zA-Z0-9] - [a-zA-Z0-9] " en lugar de pod ~ = ". *"

¿Hay alguna forma de agregar sufijo a una variable en Grafana, por ejemplo, con expresiones regulares?
Podría ser un sufijo constante "- [a-zA-Z0-9] - [a-zA-Z0-9] "
Por ejemplo, ¿así?
image

Esto, por supuesto, no funciona.

El resultado esperado sería

service_name:
  .*    <<<<<<<<<<<<<<<<<<<<<<- from Include All option
  auth-[a-zA-Z0-9]*-[a-zA-Z0-9]*       <<<<< pattern in variable name
  auth-redis-[a-zA-Z0-9]*-[a-zA-Z0-9]*
  some_other_name-[a-zA-Z0-9]*-[a-zA-Z0-9]*

¿O hay alguna forma de label_replace en Variable Query?
image

Así es como se ve en Prometheus

label_replace(kube_deployment_labels{namespace=~".*"}, "deploymentregex", "$1-[a-zA-Z0-9]*-[a-zA-Z0-9]*", "deployment", "(.*)" )

image

Lo resolvió con
query_result

''
query_result (label_replace (kube_deployment_labels {namespace = ~ ". "}, "deploymentregex", "$ 1- [a-zA-Z0-9] - [a-zA-Z0-9] ", "implementación", "(. ) "))

/. deploymentregex = "([^,] ). * /
`` ``

image

No funciona en un filtro: /

Editar - obras
image

Mientras hablamos sobre la manipulación de variables, me falta una opción para agregar "Variables personalizadas" a una variable de consulta.
Sería genial si pudiéramos combinar algunos tipos de variables en una sola entidad
image

Una variable de consulta con una opción para una entrada de usuario ad-hoc (variable de texto), por ejemplo

Tengo la necesidad de concatenar cadenas y reemplazar caracteres. Imagina que los valores de mis variables son como

  • Apache Tomcat
  • Servidor web Apache
  • ...

Entonces contienen caracteres de espacio. Más tarde, necesito consultar una base de datos MariaDB, que contiene tablas separadas para cada uno de los valores. En la base de datos encuentro tablas como

  • instance_Apache_Tomcat
  • instance_Apache_Webserver
  • ...

Como puede ver, con un simple reemplazo de texto (espacio-> subrayado) y la concatenación del prefijo 'instancias_' es fácil crear el nombre correcto de la tabla SQL. Sin embargo, no sé cómo lograr esto usando las capacidades de expresiones regulares de Grafana, y enviar el valor sin procesar a MariaDB para realizar la manipulación de la cadena no me permite colocar el resultado en la cláusula FROM de la consulta.

¿Cómo se puede solucionar esto? Por cierto, estoy ejecutando Grafana 7.3.1.1.

Esta es una combinación desordenada de problemas. Primero quiero que Grafana se encargue de mi problema bastante básico, pero no lo hace (https://github.com/grafana/grafana/issues/8259#issuecomment-722990863), luego trato de pasar la manipulación de cadenas a MariaDB (https : //stackoverflow.com/a/64714297/4222206) que tampoco funciona (https://github.com/grafana/grafana/issues/8755).
Parece que Grafana no es tan veraz como esperaba.

¿Algún progreso en la solicitud del OP?
¿Por qué es tan difícil integrar esto? Ya han pasado 3 años

@torkelo @bergquist @marefr @ryantxu @dprokop

¿Qué opinas de esta función?
Queremos que la variable Regex admita sustituciones.
s/(.*)/\1_postfix/

Implementé una solución para este problema en https://github.com/grafana/grafana/pull/29754. Me encantaría recibir comentarios.

¿Fue útil esta página
0 / 5 - 0 calificaciones