Elasticsearch - Como gerenciar
seus logs com Logstash e Kibana
Luiz Henrique Zambom Santana
Campus Party – 2015
#CPRecife4
Recife-PE, 23/07/2015
Quem sou eu?
• Doutorando na UFSC
• Consultor e programador freelancer
• Trabalhando com Elasticsearch desde 2013 (versão 0.9.x)
• Autor de artigos, Blog (luizsantana.info) e livros
Agenda
• Big Data e NoSQL
• Porque Elasticsearch?
• ELK
• Exemplo
• Conclusões
• Futuro
Big Data
Qual é o problema?
100 ms
150 ms
200 ms
NoSQL
Sadalage e Fowler, 2012
(http://martinfowler.com/books/nosql.html)
Not only SQL
Nathan Marz, 2014
(http://www.slideshare.net/nathanmarz/runaway-complexity-in-big-data-and-a-plan-to-stop-it)
Relational databases will be a
footnote in history
Por que Elasticsearch?
• Tempo real
• Flexível
• Livre de esquema e muito escalável
• Iniciado por Shay Banon em 2010
• Desenvolvido pela comunidade
• Código aberto em:
• https://github.com/elastic/elasticsearch
• Atualmente apoiado pela Elastic
Kibana e Logstash
• Também são produtos da Elastic, mas incialmente projetos da comunidade
• O Kibana facilita a visualização dos dados indexados no Elasticsearch
• Enquanto o Logstash ajuda na indexação
Kibana por Rashid Khan
Logstash por Jordan Sissel
ELK
• Log
• Informação sobre um evento
• Logstash
• Elasticsearch
• Kibana
Logs
• Segundo a Wikipedia:
“In computing, a logfile is a file that records either events that occur in an
operating system or other software runs, or messages between different users
of a communication software. Logging is the act of keeping a log. In the simplest
case, messages are written to a single logfile.”
• Basicamente um registro de evento
Exemplo
• Logs dos deslocamentos de ônibus no Rio de Janeiro
• http://dadosabertos.rio.rj.gov.br/apiTransporte/apresentacao/rest/index.cfm
/obterTodasPosicoes
• Infelizmente não encontrei informações sobre Recife :(
• http://dados.recife.pe.gov.br/
• MASSS... a solução é genérica
• Poderia ser aplicada também para:
• São Paulo
• http://www.sptrans.com.br/desenvolvedores/APIOlhoVivo.aspx
• Os códigos de busca estão no seguinte Gist:
• https://gist.github.com/lhzsantana/ad15ed27a3191f0a68f8
Receber os dados de log
• Na API de dados abertos do Rio, eles têm o seguinte formato:
dataHora,ordem,linha,latitude,longitude,velocidade
07-13-2015 00:00:29,B63056,,"-22.8676","-43.2585",0
07-13-2015 00:44:12,D53744,846,"-22.88271","-43.49538",30
07-13-2015 01:35:11,A37510,,"-22.81443","-43.325508",0
07-13-2015 02:44:19,B42537,,"-22.8764","-43.3296",0
07-13-2015 03:01:52,D87185,,"-22.916969","-43.608009",0
Download e Instalação
• Simplesmente baixar e desempacotar
• Elasticsearch
• https://www.elastic.co/downloads/elasticsearch
• Versão 1.6.0
• Logstash
• https://www.elastic.co/downloads/logstash
• Versão 1.5.2
• Kibana
• https://www.elastic.co/downloads/kibana
• Versão 4.1.1
• Em produção não é tão simples:
• http://logz.io/blog/deploy-elk-production/
Conceitos
• Cluster
• Lucene
• Índice
• Mapeamento
• Tipo Lucene Banco de dados relacional (BDR)
Índice (Index) Esquema
Type Tabela
Documento (JSON) Linha
Campo (Field) Coluna
Mapeamento (Mapping) Estrutura da tabela
Query DSL SQL
Iniciar o Elasticsearch e o Kibana
Sense
Verificar
• http://localhost:9200/ • http://localhost:5601/
Criar índice e mapeamento no Elasticsearch
PUT campusparty
POST /campusparty/onibus-csv/_mapping
{
"onibus-csv": {
"properties": {
"linha": {
"type": "string"
},
"dataHora": {
"type": "date"
},
"velocidade": {
"type": "double"
},
"localizacao": {
"type": "geo_point"
}
}}}
Lembrando...
• Na API de dados abertos do Rio, eles têm o seguinte formato:
dataHora,ordem,linha,latitude,longitude,velocidade
07-13-2015 00:00:29,B63056,,"-22.8676","-43.2585",0
07-13-2015 00:44:12,D53744,846,"-22.88271","-43.49538",30
07-13-2015 01:35:11,A37510,,"-22.81443","-43.325508",0
07-13-2015 02:44:19,B42537,,"-22.8764","-43.3296",0
07-13-2015 03:01:52,D87185,,"-22.916969","-43.608009",0
Pipeline do Logstash
Inputs generate events, filters modify them,
outputs ship them elsewhere.
Modificar o arquivo do logstash.conf
• Três partes:
• Input
• Filter (optativo)
• Output
• Nessa apresentação, usamos:
• Input
• File
• Filter
• CSV
• Mutate
• Output
• Elasticsearch
input {
...
}
filter {
...
}
output {
...
}
Input
file {
path => "c:/tmp/onibus.csv"
type => "onibus-csv"
start_position => "beginning"
sincedb_path => "/dev/null"
}
Durante o
desenvolvimento
Filtros
filter {
csv {
columns =>
["datahora","ordem","linha","latitude","longitude","velocidade"]
separator => ","
}
date {
match => ["datahora","MM-dd-YYYY HH:mm:ss"]
locale => "br"
target => "@timestamp"
}
...
}
Filtros
filter {
...
if [velocidade]=="0" {
drop{}
}
mutate {
convert => [ "velocidade", "float" ]
}
...
}
Filtros
filter {
...
if [latitude] and [longitude] {
mutate {
add_field => [ "[location]", "%{longitude}" ]
add_field => [ "[location]", "%{latitude}" ]
}
mutate {
convert => [ "[location]", "float" ]
}
}
...
}
Output
elasticsearch {
host => "localhost"
index => “campusparty"
protocol => "http"
}
stdout {
codec => rubydebug
}
Iniciar o Logstash
• logstash agent -f logstash.conf -l log1.txt –debug
• -l é a saída de logs
• -debug o nível do log
Verificar dados
• Verificar o Elasticsearch
Consultas – Agregação por linha
GET campusparty/_search
{
"size": 0,
"query": {
"match_all": {}
},
"aggs": {
"products": {
"terms": {
"field": "linha",
"size": 5
}}}
}
Consultas – Agregação por horário
GET campusparty/_search
{
"size": 0,
"query": {
"filtered": {
"query": {
"match_all": {}
}}},
"aggs" : {
"articles_over_time" : {
"date_histogram" : {
"field" : "@timestamp",
"interval" : “5m"
}}}}
Consultas – Filtro por posição
GET campusparty/_search
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"geo_distance": {
"distance": "1km",
"localizacao": {
"lat": -22.90340110,
"lon": -43.1916759
}}}}}}
Kibana
• Adicionar um novo índice, em Settings
Kibana
• Um gráfico de barras que mostre o número de leituras para cada linha de
ônibus.
Kibana
• Leituras por horário
Kibana
• Um Tile com a posição geográfica
Kibana
• Um Tile com a posição geográfica combinado com a velocidade
Kibana
• Combinar as informações em um dashboard
Adicionar a uma página HTML
Acessar com Java, PHP, Javascript…
• Java
• http://www.devmedia.com.br/elasticsearch-realizando-buscas-no-big-
data/32180
• PHP
• http://www.devmedia.com.br/elasticsearch-desenvolvendo-big-data-com-
php/31609
• Javascript
• No livro e breve na Devmedia
Exemplo de cliente
Arquiteturas
• Com o Redis
Arquiteturas
• Para Streaming
Arquiteturas
Arquiteturas
• Arquitetura Lambda
Conclusões
• Muitos outros casos de uso
• O Elasticsarch é muito estável e fácil de começar a usar
• Cuidado com essa facilidade, em produção pode se tornar um problema
• Novos projetos estão tornando o ES ainda mais completo
• Watcher
• Shield
• O Elasticsearch 2.0 beta 1 vai estar disponível logo:
• Usa o Lucene 5.2.1
• Filtros e querys serão uma coisa só
• Compressão vs. Velocidade de escrita
• Etc...
Futuro
• Aprofundamento
• Tipos, analisadores e buscas avançadas
• Ferramentas e plug-ins
• Clientes
• Arquiteturas complexas
• Redis
• Hadoop
• Apache Spark (Java Magazine 142)
• Expandir o exemplo com outros dados abertos
• Posição de pontos de ônibus
• Criminalidade
• Número de acidentes
Outras referências
• http://www.devmedia.com.br/spac
e/luiz-henrique-zambom-santana
• Essa apresentação está disponível
em:
• http://pt.slideshare.net/LuizHenrique
ZambomSa/elasticsearch-como-
gerenciar-seus-logs-com-logstash-e-
kibana
• Os códigos de busca estão no
seguinte Gist:
• https://gist.github.com/lhzsantana/ad
15ed27a3191f0a68f8
Obrigado!
Luiz Henrique Zambom Santana
lhzsantana@gmail.com
https://twitter.com/LuizHZSantana
Elasticsearch - Como gerenciar seus logs
com Logstash e Kibana
(23/07/2015)

Elasticsearch como gerenciar seus logs com logstash e kibana

  • 1.
    Elasticsearch - Comogerenciar seus logs com Logstash e Kibana Luiz Henrique Zambom Santana Campus Party – 2015 #CPRecife4 Recife-PE, 23/07/2015
  • 2.
    Quem sou eu? •Doutorando na UFSC • Consultor e programador freelancer • Trabalhando com Elasticsearch desde 2013 (versão 0.9.x) • Autor de artigos, Blog (luizsantana.info) e livros
  • 3.
    Agenda • Big Datae NoSQL • Porque Elasticsearch? • ELK • Exemplo • Conclusões • Futuro
  • 4.
  • 5.
    Qual é oproblema? 100 ms 150 ms 200 ms
  • 6.
    NoSQL Sadalage e Fowler,2012 (http://martinfowler.com/books/nosql.html) Not only SQL Nathan Marz, 2014 (http://www.slideshare.net/nathanmarz/runaway-complexity-in-big-data-and-a-plan-to-stop-it) Relational databases will be a footnote in history
  • 8.
    Por que Elasticsearch? •Tempo real • Flexível • Livre de esquema e muito escalável • Iniciado por Shay Banon em 2010 • Desenvolvido pela comunidade • Código aberto em: • https://github.com/elastic/elasticsearch • Atualmente apoiado pela Elastic
  • 9.
    Kibana e Logstash •Também são produtos da Elastic, mas incialmente projetos da comunidade • O Kibana facilita a visualização dos dados indexados no Elasticsearch • Enquanto o Logstash ajuda na indexação Kibana por Rashid Khan Logstash por Jordan Sissel
  • 10.
    ELK • Log • Informaçãosobre um evento • Logstash • Elasticsearch • Kibana
  • 11.
    Logs • Segundo aWikipedia: “In computing, a logfile is a file that records either events that occur in an operating system or other software runs, or messages between different users of a communication software. Logging is the act of keeping a log. In the simplest case, messages are written to a single logfile.” • Basicamente um registro de evento
  • 12.
    Exemplo • Logs dosdeslocamentos de ônibus no Rio de Janeiro • http://dadosabertos.rio.rj.gov.br/apiTransporte/apresentacao/rest/index.cfm /obterTodasPosicoes • Infelizmente não encontrei informações sobre Recife :( • http://dados.recife.pe.gov.br/ • MASSS... a solução é genérica • Poderia ser aplicada também para: • São Paulo • http://www.sptrans.com.br/desenvolvedores/APIOlhoVivo.aspx • Os códigos de busca estão no seguinte Gist: • https://gist.github.com/lhzsantana/ad15ed27a3191f0a68f8
  • 13.
    Receber os dadosde log • Na API de dados abertos do Rio, eles têm o seguinte formato: dataHora,ordem,linha,latitude,longitude,velocidade 07-13-2015 00:00:29,B63056,,"-22.8676","-43.2585",0 07-13-2015 00:44:12,D53744,846,"-22.88271","-43.49538",30 07-13-2015 01:35:11,A37510,,"-22.81443","-43.325508",0 07-13-2015 02:44:19,B42537,,"-22.8764","-43.3296",0 07-13-2015 03:01:52,D87185,,"-22.916969","-43.608009",0
  • 14.
    Download e Instalação •Simplesmente baixar e desempacotar • Elasticsearch • https://www.elastic.co/downloads/elasticsearch • Versão 1.6.0 • Logstash • https://www.elastic.co/downloads/logstash • Versão 1.5.2 • Kibana • https://www.elastic.co/downloads/kibana • Versão 4.1.1 • Em produção não é tão simples: • http://logz.io/blog/deploy-elk-production/
  • 15.
    Conceitos • Cluster • Lucene •Índice • Mapeamento • Tipo Lucene Banco de dados relacional (BDR) Índice (Index) Esquema Type Tabela Documento (JSON) Linha Campo (Field) Coluna Mapeamento (Mapping) Estrutura da tabela Query DSL SQL
  • 16.
  • 17.
  • 18.
  • 19.
    Criar índice emapeamento no Elasticsearch PUT campusparty POST /campusparty/onibus-csv/_mapping { "onibus-csv": { "properties": { "linha": { "type": "string" }, "dataHora": { "type": "date" }, "velocidade": { "type": "double" }, "localizacao": { "type": "geo_point" } }}}
  • 20.
    Lembrando... • Na APIde dados abertos do Rio, eles têm o seguinte formato: dataHora,ordem,linha,latitude,longitude,velocidade 07-13-2015 00:00:29,B63056,,"-22.8676","-43.2585",0 07-13-2015 00:44:12,D53744,846,"-22.88271","-43.49538",30 07-13-2015 01:35:11,A37510,,"-22.81443","-43.325508",0 07-13-2015 02:44:19,B42537,,"-22.8764","-43.3296",0 07-13-2015 03:01:52,D87185,,"-22.916969","-43.608009",0
  • 21.
    Pipeline do Logstash Inputsgenerate events, filters modify them, outputs ship them elsewhere.
  • 22.
    Modificar o arquivodo logstash.conf • Três partes: • Input • Filter (optativo) • Output • Nessa apresentação, usamos: • Input • File • Filter • CSV • Mutate • Output • Elasticsearch input { ... } filter { ... } output { ... }
  • 23.
    Input file { path =>"c:/tmp/onibus.csv" type => "onibus-csv" start_position => "beginning" sincedb_path => "/dev/null" } Durante o desenvolvimento
  • 24.
    Filtros filter { csv { columns=> ["datahora","ordem","linha","latitude","longitude","velocidade"] separator => "," } date { match => ["datahora","MM-dd-YYYY HH:mm:ss"] locale => "br" target => "@timestamp" } ... }
  • 25.
    Filtros filter { ... if [velocidade]=="0"{ drop{} } mutate { convert => [ "velocidade", "float" ] } ... }
  • 26.
    Filtros filter { ... if [latitude]and [longitude] { mutate { add_field => [ "[location]", "%{longitude}" ] add_field => [ "[location]", "%{latitude}" ] } mutate { convert => [ "[location]", "float" ] } } ... }
  • 27.
    Output elasticsearch { host =>"localhost" index => “campusparty" protocol => "http" } stdout { codec => rubydebug }
  • 28.
    Iniciar o Logstash •logstash agent -f logstash.conf -l log1.txt –debug • -l é a saída de logs • -debug o nível do log
  • 29.
  • 30.
    Consultas – Agregaçãopor linha GET campusparty/_search { "size": 0, "query": { "match_all": {} }, "aggs": { "products": { "terms": { "field": "linha", "size": 5 }}} }
  • 31.
    Consultas – Agregaçãopor horário GET campusparty/_search { "size": 0, "query": { "filtered": { "query": { "match_all": {} }}}, "aggs" : { "articles_over_time" : { "date_histogram" : { "field" : "@timestamp", "interval" : “5m" }}}}
  • 32.
    Consultas – Filtropor posição GET campusparty/_search { "query": { "filtered": { "query": { "match_all": {} }, "filter": { "geo_distance": { "distance": "1km", "localizacao": { "lat": -22.90340110, "lon": -43.1916759 }}}}}}
  • 33.
    Kibana • Adicionar umnovo índice, em Settings
  • 34.
    Kibana • Um gráficode barras que mostre o número de leituras para cada linha de ônibus.
  • 35.
  • 36.
    Kibana • Um Tilecom a posição geográfica
  • 37.
    Kibana • Um Tilecom a posição geográfica combinado com a velocidade
  • 38.
    Kibana • Combinar asinformações em um dashboard
  • 39.
    Adicionar a umapágina HTML
  • 40.
    Acessar com Java,PHP, Javascript… • Java • http://www.devmedia.com.br/elasticsearch-realizando-buscas-no-big- data/32180 • PHP • http://www.devmedia.com.br/elasticsearch-desenvolvendo-big-data-com- php/31609 • Javascript • No livro e breve na Devmedia
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
    Conclusões • Muitos outroscasos de uso • O Elasticsarch é muito estável e fácil de começar a usar • Cuidado com essa facilidade, em produção pode se tornar um problema • Novos projetos estão tornando o ES ainda mais completo • Watcher • Shield • O Elasticsearch 2.0 beta 1 vai estar disponível logo: • Usa o Lucene 5.2.1 • Filtros e querys serão uma coisa só • Compressão vs. Velocidade de escrita • Etc...
  • 47.
    Futuro • Aprofundamento • Tipos,analisadores e buscas avançadas • Ferramentas e plug-ins • Clientes • Arquiteturas complexas • Redis • Hadoop • Apache Spark (Java Magazine 142) • Expandir o exemplo com outros dados abertos • Posição de pontos de ônibus • Criminalidade • Número de acidentes
  • 48.
    Outras referências • http://www.devmedia.com.br/spac e/luiz-henrique-zambom-santana •Essa apresentação está disponível em: • http://pt.slideshare.net/LuizHenrique ZambomSa/elasticsearch-como- gerenciar-seus-logs-com-logstash-e- kibana • Os códigos de busca estão no seguinte Gist: • https://gist.github.com/lhzsantana/ad 15ed27a3191f0a68f8
  • 49.
    Obrigado! Luiz Henrique ZambomSantana lhzsantana@gmail.com https://twitter.com/LuizHZSantana Elasticsearch - Como gerenciar seus logs com Logstash e Kibana (23/07/2015)

Notas do Editor

  • #2 Agradecer o convite a organização
  • #5 Já é bem manjado o que significa Big Data, mas não custa falar uma vez mais
  • #6 Pedir atenção
  • #9 Falar do Solar
  • #12 Eu entendo