Filtrado de JSON mediante Expresiones Regulares (Regexp) en LogQL
Me gustaría traducir la consulta de Kibana a LogQL de la siguiente manera:
host:("test1-myservice-*") AND level:ERROR
AND NOT logger_name:"com.example.ExampleClass"
AND _exists_:stack_trace
AND NOT stack_trace:(
"interrupted"
OR "Read timed out"
OR "java.lang.InterruptedException"
)
He intentado lo siguiente en Grafana Explore pero no devuelve ningún registro para nuestros mensajes de registro JSON:
{host=~"test1-myservice-.*"} | json
| logger_name != "com.example.ExampleClass"
| stack_trace !=""
| stack_trace =~ ".*InterruptedException.*"
Al usar !=
en lugar de =~
, devuelve todos los registros:
{host=~"test1-myservice-.*"} | json
| logger_name != "com.example.ExampleClass"
| stack_trace !=""
| stack_trace !~ ".*InterruptedException.*"
Si estoy en lo correcto, se aplica lo siguiente de la documentación al campo stack_trace
de la línea de registro JSON:
El tipo String funciona exactamente como los selectores de transmisión de registros en las coincidencias de etiquetas de Prometheus. Esto significa que puede usar las mismas operaciones (=, !=, =~, !~).
Fuente: Expresión de filtro de etiquetas
Lo siguiente parece funcionar, pero parece incómodo:
{host=~"test1-myservice-.*"} | json
| logger_name != "com.example.ExampleClass"
| stack_trace !=""
!~ ".*InterruptedException.*|.*Read timed out.*"
| json
Además, si entiendo correctamente, busca subcadenas de InterruptedException
y Read timed out
en la cadena JSON completa en lugar de solo su campo stack_trace
.
¿Existe una forma más adecuada de traducir la consulta de Kibana anterior a LogQL? ¿Debería funcionar el operador !~
en este caso?
Entorno: Grafana 7.5.4 / 8.2.3, Loki: 2.4.1
davy.ai
Para traducir la consulta de Kibana dada a LogQL, se puede utilizar la siguiente consulta de LogQL:
En esta consulta, se utiliza el operador
=
en lugar de=~
en el filtrohost
porque queremos una coincidencia exacta en lugar de una coincidencia de regex. El filtrolevel
se aplica utilizando el operador=
porque queremos una coincidencia exacta para la cadena “ERROR”. El operador!~
se utiliza en lugar de!=
para negar la coincidencia de regex en el filtrologger_name
.El filtro del campo
stack_trace
se aplica utilizando el operador!=
que verifica si el campo no es una cadena vacía. Por último, el operador!~
se utiliza para negar la coincidencia de regex de las subcadenas “interrupted”, “Read timed out” y “java.lang.InterruptedException” en el campostack_trace
.El operador
$
también se puede utilizar para hacer referencia al objeto JSON completo, pero como el campostack_trace
solo existe en el objeto JSON y no en el flujo de LogQL, en este caso no es necesario utilizar$
.Cabe destacar que el operador
!~
debería funcionar como se espera en este caso. La dificultad en la consulta original podría haber sido debido a la falta de paréntesis que encierran las condiciones deor
.