Consulta mapeo en logstash


(Diego Gomez) #1

Hola a todos, quería consultarles tengo un archivo que es .txt que es este.

I:RSSA0003#N:0#AX:5#AY:-2#AZ:1023#BAT:94#TS:Sun, 16/10/30, 06:45:40#ST:21.11#SH:61.86#CB:105.16

I:RSSA0003#N:1#AX:9#AY:1#AZ:1020#BAT:95#TS:Sun, 16/10/30, 06:46:41#ST:21.11#SH:61.95#CB:104.45

Quería saber si alguien me da idea de como seria ingresarlo al logstash y mapearlo a elastisearch para dividirlo en diferentes variables. Cada cadena que esta entre # serian variables que quisiera mostrar con kibana.

Esto es lo que tengo echo pero no me muestra nada.

 input {
   file {
                 path => "/home/rack/libelium.txt"
                     start_position => "beginning"
                     type => "stock"
                     sincedb_path => "NUL"


 }
 }


 filter {
    csv {
            columns =>["date","n","ax","ay","az","bat","date_of_record","st","sh","cb"]
            separator => "#"
    }

    date{
            match => ["date_of_record", "yyyy-MM-dd"]
            locale => "es-ES"
            target => "@timestamp"
    }

    mutate {
            convert => ["date","string"]
            convert => ["n","string"]
            convert => ["ax","string"]
            convert => ["ay","string"]
            convert => ["az","string"]
            convert => ["bat","string"]
            convert => ["st","string"]
            convert => ["sh","string"]
            convert => ["cb","string"]
 }
 }


 output {
    elasticsearch {
    action => "index"
    hosts => ["localhost:9200"]
    index => "libelium1"
    workers => 1
}
stdout {codec => dots}
 }

(Gabriel Moskovicz) #2

Hola Diego!

Gracias por incluir tu configuracion de logstash. Aqui te dejo una forma mas sencilla de hacer esto y que deberia de functionar para ti:

  kv { 
    field_split => "#"
    value_split => ":"
  }

  mutate {
            convert => ["N","integer"]
            convert => ["AX","integer"]
            convert => ["AY","integer"]
            convert => ["AZ","integer"]
            convert => ["BAT","integer"]
            convert => ["ST","float"]
            convert => ["SH","float"]
            convert => ["CB","float"]
    }

     date{
            match => ["TS", "EEE, yy/MM/dd, HH:mm:ss"]
            target => "@timestamp"
    }

Como ejemplo, si utilizo una de tus trazas, logstash devolveria lo siguiente:

{
       "message" => "I:RSSA0003#N:0#AX:5#AY:-2#AZ:1023#BAT:94#TS:Sun, 16/10/30, 06:45:40#ST:21.11#SH:61.86#CB:105.16",
      "@version" => "1",
    "@timestamp" => "2016-10-30T09:45:40.000Z",
          "host" => "Gabriels-MacBook-Pro.local",
             "I" => "RSSA0003",
             "N" => 0,
            "AX" => 5,
            "AY" => -2,
            "AZ" => 1023,
           "BAT" => 94,
            "TS" => "Sun, 16/10/30, 06:45:40",
            "ST" => 21.11,
            "SH" => 61.86,
            "CB" => 105.16
}

Espero que esto te sirva de ayuda. Cuidado con el file input tambien, deberia probablemente ser:

sincedb_path => "dev/null"

Cualquier cosa quedo a las ordenes. Con esta conf ya parseas date, strings y numericos tambien.

Saludos!

--Gabriel


(Diego Gomez) #3

Muchas Gracias Gabriel lo pruebo y te comento como me fue.


(Gabriel Moskovicz) #4

Un lujo.

Espero respuesta. Saludos!


(Diego Gomez) #5

Hola Gabriel sigue sin tirarme la información este es mi archivo a ver si estoy cometiendo un error.

 input {
   file {
           path => "/home/rack/libelium.txt"
          start_position => "beginning"
          sincedb_path => "dev/null"


}

  filter {
         kv {
           field_split => "#"
            value_split => ":"
 }

    mutate {
         convert => ["N","integer"]
         convert => ["AX","integer"]
         convert => ["AY","integer"]
         convert => ["AZ","integer"]
         convert => ["BAT","integer"]
         convert => ["ST","float"]
         convert => ["SH","float"]
         convert => ["CB","float"]
   }

 date{
        match => ["TS", "EEE, yy/MM/dd, HH:mm:ss"]
        target => "@timestamp"
}

}

 output {
    elasticsearch {
    action => "index"
    hosts => ["localhost:9200"]
    index => "libelium1"
    workers => 1
}
stdout {codec => rubydebug}
}

En realidad originalmente voy a ingresar con imput tcp


(Gabriel Moskovicz) #6

Hola Diego,

Algunos comentarios:

  1. En el input falta un { para cerrar , creo que esta configuracion no funcionaria.
  2. Que Sistema Operativo estas utilizando?
  3. Que output muestra logstash? Nada? Ningun output en el log?
  4. Que version estas utilizando?

Saludos!


(Diego Gomez) #7

Estoy utilizando ubuntu 14
El logstash no me muestra nada me manca Pipeline main started y nada mas
Estoy utilizando logstash 2.4.0


(Gabriel Moskovicz) #8

Creo que se lo que puede estar sucediento:

https://www.elastic.co/guide/en/logstash/2.4/plugins-inputs-file.html#plugins-inputs-file-ignore_older

Ignore older va ignorar archivos que son antiguos, mas que 24 horas. Entonces tienes que poner ignore_older 0 en la configuracion del file.

Prueba con eso y dime que sucede.

Saludos!


(Diego Gomez) #9

Hola Gabriel ya funciona perfecto con eso, también cambie el logstash a la ultima versión.

te hago una consulta tenes experiencia con sensores de humedad, temperatura, etc, porque esto que estoy haciendo es para unos sensores que compre para poner en la empresa donde trabajo, y queria monitoriar las variables con el ELK y después poner el watcher para dar alertas, esos datos que puse antes son los datos que dan los sensores, pero los van a pasar por medio de TCP.


(Gabriel Moskovicz) #10

Parece muy interesante el proyecto. Lo mejor es utilizar kibana e ingerir los logs de los sensores. Luego plottear las graficas para ver los registros que los sensores toman. Es un caso de uso bastante utilizado. La experiencia nuestra es mas en el producto, que en los sensores. Pero parece muy interesante.

Buenisimo que al final funciono. Saludos grandes!

--Gabriel


(system) #11