es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para traducir la consulta de Kibana dada a LogQL, se puede utilizar la siguiente consulta de LogQL:

    {host="test1-myservice-*"} | json | level="ERROR" 
    |!~ "example_class.*" 
    | stack_trace != "" 
    | !~ "(.*interrupted.*|.*Read timed out.*|.*java.lang.InterruptedException.*)"
    

    En esta consulta, se utiliza el operador = en lugar de =~ en el filtro host porque queremos una coincidencia exacta en lugar de una coincidencia de regex. El filtro level 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 filtro logger_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 campo stack_trace.

    El operador $ también se puede utilizar para hacer referencia al objeto JSON completo, pero como el campo stack_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 de or.

Comments are closed.