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.

¿Es posible dividir un valor de campo JSON anidado en un registro JSON en más subcampos utilizando la función mutate en Logstash?

Tengo un registro JSON como este que se está transmitiendo a ELK.

{
  "event": "Events Report",
  "level": "info",
  "logger": "XXXXX",
  "method": "YYYYY",
  "report_duration": {
    "duration": "5 days, 12:43:16",
    "end": "2021-12-13 03:43:16",
    "start": "2021-12-07 15:00:00"
  },
  "request_type": "GET",
  "rid": "xyz-123-yzfs",
  "field_id": "arefer-e3-adfe93439",
  "timestamp": "12/13/2021 03:43:53 AM",
  "user": "8f444233ed4-91b8-4839-a57d-ande2534"
}

Me gustaría dividir aún más el valor de la duración, es decir, “5 days, 12:43:16”, como algo como “días”: “5”.

He intentado usar el siguiente filtro de Logstash y aún no funciona.

filter {
        if "report_duration" in [reports]{
           mutate {
            split => { "duration" => " " }
            add_field => { "days" => "%{[duration][0]}" }
            convert => {
             "days" => "integer"
            }
          }
       }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El filtro de Logstash dado parece incompleto y le falta alguna configuración. Aquí hay una versión modificada del filtro que debería funcionar:

    filter {
        if "report_duration" in [reports] {
            mutate {
                split => { "[reports][report_duration][duration]" => ", " }
                add_field => {
                    "days" => "%{[reports][report_duration][duration][0]}"
                }
                convert => {
                    "days" => "integer"
                }
            }
        }
    }
    

    Este filtro primero verifica si el campo report_duration existe en el objeto reports. Si es así, divide el valor de duration por coma y espacio utilizando la función split, y crea un nuevo campo days con el primer elemento ([0]) del arreglo dividido. Finalmente, convierte el campo days a un entero utilizando la función convert.

    Ten en cuenta que el filtro asume que el registro de entrada se está transmitiendo a la pila ELK con reports como campo de nivel superior que contiene los datos de registro. Si este no es el caso, es posible que debas ajustar el filtro en consecuencia.

Comments are closed.