O campo de data está sendo apresentado como inteiro

1

Eu tenho um Elastic Stack server (em Hyper-v ) que está ingerindo dados por meio de um comando logstash exec e fazendo análises nele. Tudo está funcionando bem, exceto um campo de data que está sendo exibido como um número.

Como faço para que logstash , Elasticsearch ou Kibana reconheçam o campo como uma data em vez de um número?

Os dados são Unix epoch tempo em milliseconds .

Código:

Os dados gerados pelo arquivo python estão no formato JSON . Nenhum processamento real está ocorrendo até atingir elasticsearch .

Configuração do Logstash:

input {
  exec {
    command => "/home/elliot/BullhornConnector.py JobOrder isOpen,webResponses,submissions,sendouts,interviews,placements,address,numOpenings,employmentType,owner,title,clientCorporation"
    interval => 60
    codec => json
    tags => ["JobOrder"]
  }
  exec {
    command => "/home/elliot/BullhornConnector.py Lead owner,leadSource,firstName,lastName,status,dateAdded"
    interval => 60
    codec => json
    tags => ["Lead"]
  }
  exec {
    command => "/home/elliot/BullhornConnector.py Opportunity owner,isOpen,dealValue,weightedDealValue,clientCorporation,status"
    interval => 60
    codec => json
    tags => ["Opportunity"]
  }
}

output {
  elasticsearch {
    hosts => ["localhost:9200"]
  }
  stdout { codec => rubydebug }
}

Capturas de tela:

Aqui está uma captura de tela dos dados brutos:

Páginadevisãogeraldopadrãodeíndice:

Visãodetalhadadocampo:

Obrigado!

    
por Elliot Labs 15.07.2017 / 14:25

3 respostas

0

Eu descobri: O que você precisa fazer é usar um plugin de filtro no logstash, especificamente a data .

Aqui está o trecho que eu adicionei à minha configuração do logstash:

filter {
  date {
    match => [ "dateAdded", "UNIX_MS" ]
    target => "dateAddedCorrected"
  }
}
    
por 24.07.2017 / 09:18
3

Se eu ler corretamente o link da da documentação do ElasticSearch

JSON doesn’t have a date datatype, so dates in Elasticsearch can either be:

strings containing formatted dates, e.g. "2015-01-01" or "2015/01/01 12:10:30".
a long number representing milliseconds-since-the-epoch.
an integer representing seconds-since-the-epoch. 

Portanto, o campo dateAdded representado como um tipo de dados "number" é lógico: o Elasticsearch simplesmente traduziu um número JSON para um número ES.

Se eu observar minha própria instância do ELK, descobri que o campo "timestamp" é representado como um tipo de dados "data". É feito automaticamente pelo logstash.

Por trás da cena, o logstash gerencia um 'template de mapeamento' para definir os tipos de dados dos campos ES. No seu caso, ele traduz ingenuamente o tipo de data do JSON e, no caso do timestamp, ele sabe que é uma data que define explicitamente.

Então, o que você precisa fazer é definir um modelo de mapeamento e usar o logstash para enviá-lo para o ES com seus dados.

O doc. de mapeamento ES está aqui link e o Logstash pode gerenciá-lo com manage_template e modelo na saída do elasticsearch link . Uma introdução ao mapeamento de AS link .

Você também pode ver o mapeamento que está sendo usado com

curl -XGET 'localhost:9200/<index>/_mapping?pretty'
    
por 21.07.2017 / 15:28
0

Eu estou supondo aqui, porque eu não estou familiarizado com as plataformas e programas que você está falando. No entanto, na sua captura de tela, você afirmou que alterou o tipo de dados para Duração, mas parece que o tipo de dados ainda é "número" e o "formato" é a duração. Se eu tivesse que continuar adivinhando, eu diria que sua plataforma ainda está tentando serializar seu campo como um número, porque seu tipo de dados ainda é 'number'. Altere esse tipo para "data", como o campo @timestamp, na parte superior da captura de tela, e veja se isso o corrige.

    
por 21.07.2017 / 15:22