37
Monitorización de logs con el stack ELK IES Gran Capitán - 31 Enero 2017 Nacho Álvarez @neonigmacdb [email protected] http://www.nacho-alvarez.es

Sysmana 2017 monitorización de logs con el stack elk

Embed Size (px)

Citation preview

Page 1: Sysmana 2017   monitorización de logs con el stack elk

Monitorización de logs con el stack ELK

IES Gran Capitán - 31 Enero 2017Nacho Álvarez

@neonigmacdb✉ [email protected]

http://www.nacho-alvarez.es

Page 2: Sysmana 2017   monitorización de logs con el stack elk

Índice1) Preliminares: Vagrant y Ansible

2) Introducción a ELK

3) ElasticSearch

4) Logstash

5) Kibana

6) Arquitectura del sistema de pruebas

7) Demo time!1/36

Page 3: Sysmana 2017   monitorización de logs con el stack elk

Vagrant● Gestor de máquinas virtuales● Necesita dos elementos:

○ Proveedor (VirtualBox, VMWare, Docker…)○ Aprovisionador (Ansible, Puppet, Chef…)

● Funciona con boxes predefinidashttps://atlas.hashicorp.com/boxes/search

● La definición de la máquina virtual se lee de un fichero de configuración, el Vagrant file

2/36

Page 4: Sysmana 2017   monitorización de logs con el stack elk

Vagrant# -*- mode: ruby -*-

# vi: set ft=ruby :

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.vm.box = "ubuntu/trusty64"

config.vm.network "forwarded_port", guest: 80, host: 8080

config.vm.network "private_network", ip: "192.168.33.10"

config.vm.synced_folder "htdocs", "/var/www/html"

config.vm.provision "shell", path: "config.sh"

end3/36

Page 5: Sysmana 2017   monitorización de logs con el stack elk

Vagrant#!/bin/bash

# Update server

apt-get update

apt-get upgrade -y

# Install essentials

apt-get -y install build-essential binutils-doc git -y

# Install Apache

apt-get install apache2 -y

#Install PHP

apt-get install php5 libapache2-mod-php5 php5-cli php5-mysql -y

# Install MySQL

echo "mysql-server mysql-server/root_password password root" | sudo debconf-set-selections

echo "mysql-server mysql-server/root_password_again password root" | sudo debconf-set-selections

apt-get install mysql-client mysql-server -y

# Restart Apache service

service apache2 restart 4/36

Page 6: Sysmana 2017   monitorización de logs con el stack elk

Vagrant$ vagrant up # Ejecutar la máquina virtual

$ vagrant ssh # Entrar por ssh a la máquina

$ vagrant suspend # Suspender la máquina

$ vagrant resume # Despertar la máquina

$ vagrant halt # Apagar la máquina

$ vagrant status # Saber el estado de la máquina (apagada, ejecutándose o en modo suspensión):

$ vagrant destroy # Destruir la máquina

A todos los comandos se les puede añadir como argumento el nombre de la máquina,

si tenemos varias5/36

Page 7: Sysmana 2017   monitorización de logs con el stack elk

Ansible● Herramienta de gestión de configuración y

aprovisionamiento● Se conecta a los equipos a configurar usando SSH● Trabaja con un inventario de máquinas a configurar● Existen playbooks o recetas ya configuradas por

terceroshttps://galaxy.ansible.com/

6/36

Page 8: Sysmana 2017   monitorización de logs con el stack elk

Ansible● Máquina de Administración: donde tenemos instalado Ansible y desde donde se ejecutarán las tareas

● Inventory: archivo donde registramos los servidores sobre los cuales ejecutaremos las tareas

● Playbook: archivo donde listamos las tareas a ejecutar, es como una receta de cocina. En formato YAML

● Grupo de hosts: si se usa el mismo Playbook para varias máquinas, diferencia entre servidores

● Task: bloque dentro del Playbook que define una acción específica a realizar, pj: instalar un paquete.

● Module: Plugins que permiten realizar tareas de forma más fácil, como yum para instalar software, y también

nosotros podemos crear los nuestros.

● Role: una forma de ordenar los diferentes Playbooks.

● Play: se refiere a la ejecución de un Playbook.

● Facts: variables dentro de Ansible que contienen información sobre los servidores. Ej: SO, RAM, Dirs IP, etc.

● Handlers: pequeño código que se usa cuando algo cambia. Por ej: si actualizas el archivo de configuración de

Apache, un Handler reiniciará el servicio httpd.7/36

Page 9: Sysmana 2017   monitorización de logs con el stack elk

Ansible ---

- hosts: stats sudo: yes gather_facts: yes roles: - java8 - elasticsearch - kibana

- hosts: apps sudo: yes gather_facts: yes roles: - java8 - logstash - appdeploy

8/36

---

# file: /roles/java8/tasks/main.yml

- name: add Java repository to sources apt_repository: repo='ppa:webupd8team/java' tags: java

- name: autoaccept license for Java debconf: name='oracle-java8-installer' question='shared/accepted-oracle-license-v1-1' value='true' vtype='select' tags: java

- name: update APT package cache apt: update_cache=yes tags: java

- name: install Java 8 apt: name=oracle-java8-installer state=latest install_recommends=yes tags: java

Page 10: Sysmana 2017   monitorización de logs con el stack elk

Introducción a ELK● ELK viene de ElasticSearch, Logstash y Kibana● Surge como respuesta a la necesidad de analítica● Problema de búsquedas con buenas visualizaciones● Lucene + sist. distribuido ElasticSearch para búsquedas● Normalización de datos con Logstash● Herramienta de visualización de datos Kibana● Tenemos un rival muy duro para soluciones de pago

9/36

Page 11: Sysmana 2017   monitorización de logs con el stack elk

ElasticSearch

10/36

● Servidor de búsqueda basado en Apache Lucene

● Proporciona un motor de búsqueda de texto completo, distribuido y con

capacidad de multi-tenencia con API REST + JSON

● En nuestro ejemplo la usaremos como BBDD donde almacenar, indexar y

buscar los eventos de log de las apps

● Usuarios ilustres: Wikimedia, Mozilla, Quora, Foursquare, SoundCloud,

GitHub, CERN y Stack Exchange

Page 12: Sysmana 2017   monitorización de logs con el stack elk

ElasticSearch - Nodos

11/36

● Cada nodo es una VM Java ejecutando una instancia del servicio

● Límite 40% heap de la RAM

● Tipos de nodos

○ master => responsable de gestión del cluster y asegurar su integridad

○ master-eligible => nodos candidatos a maestro según se necesite

○ data => nodos normales conteniendo los datos y haciendo búsquedas

○ client => enrutan peticiones dentro del clúster

○ tribe => permiten agregar clústeres de forma transparente

Page 13: Sysmana 2017   monitorización de logs con el stack elk

ElasticSearch - Shards

12/36

● Unidad de distribución de trabajo en cluster donde se hacen las búsquedas

● Internamente es una instancia de Lucene con sus datos, metadatos e índices

● Cada índice tiene un número fijo y predeterminado de shards primarias, que

son las fuentes que tienen la info almacenada e indexada en Elasticsearch

● Para añadir o quitar shards primarias hay que recrear el índice (reindexar)

● Shards de respaldo: copias que se distribuyen por los nodos del cluster para

conseguir mayor rendimiento, alta disponibilidad y backup

Page 14: Sysmana 2017   monitorización de logs con el stack elk

ElasticSearch - Mapping

13/36

● La configuración por defecto consiste en tokenizar los textos e intentar detectar

otros valores primitivos

● Mapping consiste en definir cómo un documento y los campos que contiene son

almacenados e indexados. Por ejemplo, usamos mappings para definir:

○ Qué campos string deberían tratarse como campos de texto

○ Qué campos contienen números, fechas, localizaciones...

○ Formato de los campos de fecha

○ Reglas personalizadas para controlar el mapeado para campos añadidos

dinámicamente

Page 15: Sysmana 2017   monitorización de logs con el stack elk

ElasticSearch - Mapping

14/36

PUT my_index

{

"mappings": {

"user": {

"_all": { "enabled": false },

"properties": {

"title": { "type": "text" },

"name": { "type": "text" },

"age": { "type": "integer" }

}

},

"blogpost": {

"_all": { "enabled": false },

"properties": {

"title": { "type": "text" },

"body": { "type": "text" },

"user_id": {

"type": "keyword"

},

"created": {

"type": "date",

"format":

"strict_date_optional_time||epoch_millis"

}

}

}

}

}

Page 16: Sysmana 2017   monitorización de logs con el stack elk

ElasticSearch

15/36

Page 17: Sysmana 2017   monitorización de logs con el stack elk

LogStash

16/36

● Herramienta para recolectar, parsear y guardar los logs

● En el caso que nos ocupa los guardaremos en ElasticSearch

● La configuración consta de una sección input, una filter y otra output

● Todo funciona en base a plugins, las estrellas de esta herramienta

Page 18: Sysmana 2017   monitorización de logs con el stack elk

LogStash - Ejemplo

17/36

Page 19: Sysmana 2017   monitorización de logs con el stack elk

LogStash - Ejemplo

18/36

input {

stdin {}

}

filter {

grok {

match => {"message" => "%{IP:ip}"}

}

geoip {

source => "ip"

}

}

output {

stdout {

codec => rubydebug

}

}

Page 20: Sysmana 2017   monitorización de logs con el stack elk

LogStash - Ejemplo

19/36

Page 21: Sysmana 2017   monitorización de logs con el stack elk

LogStash - Syslog

20/36

input {

tcp {

port => 5000

type => syslog

}

udp {

port => 5000

type => syslog

}

}

filter {

if [type] == "syslog" {

grok {

match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp}

%{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?:

%{GREEDYDATA:syslog_message}" }

add_field => [ "received_at", "%{@timestamp}" ]

add_field => [ "received_from", "%{host}" ]

}

date {

match => [ "syslog_timestamp", "MMM d HH:mm:ss", "MMM dd HH:mm:ss" ]

}

}

}

output {

elasticsearch { hosts =>

["localhost:9200"] }

stdout { codec => rubydebug }

}

Page 22: Sysmana 2017   monitorización de logs con el stack elk

LogStash - Syslog

21/36

{

"message" => "Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null

2>/var/log/cacti/poller-error.log)",

"@timestamp" => "2013-12-23T22:30:01.000Z",

"@version" => "1",

"type" => "syslog",

"host" => "0:0:0:0:0:0:0:1:52617",

"syslog_timestamp" => "Dec 23 14:30:01",

"syslog_hostname" => "louis",

"syslog_program" => "CRON",

"syslog_pid" => "619",

"syslog_message" => "(www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)",

"received_at" => "2013-12-23 22:49:22 UTC",

"received_from" => "0:0:0:0:0:0:0:1:52617",

"syslog_severity_code" => 5,

"syslog_facility_code" => 1,

"syslog_facility" => "user-level",

"syslog_severity" => "notice"

}

Page 23: Sysmana 2017   monitorización de logs con el stack elk

LogStash - IBM Websphere

22/36

grok {

# was_shortname need to be regex, because numbers and $ can be in the word

match => ["message", "\[%{DATA:wastimestamp} %{WORD:tz}\] %{BASE16NUM:was_threadID}

(?<was_shortname>\b[A-Za-z0-9\$]{2,}\b) %{SPACE}%{WORD:was_loglevel}%{SPACE}

%{GREEDYDATA:message}"]

overwrite => [ "message" ]

#tag_on_failure => [ ]

}

grok {

# Extract the WebSphere Response Code

match => ["message", "(?<was_responsecode>[A-Z0-9]{9,10})[:,\s\s]"]

tag_on_failure => [ ]

}

Page 24: Sysmana 2017   monitorización de logs con el stack elk

LogStash - IBM Websphere

23/36

Page 25: Sysmana 2017   monitorización de logs con el stack elk

LogStash - IBM Websphere

24/36

Page 26: Sysmana 2017   monitorización de logs con el stack elk

LogStash - Plugins

25/36

● Existen decenas de plugins para las tres etapas

● INPUT○ https://www.elastic.co/guide/en/logstash/current/input-plugins.html

● FILTER○ https://www.elastic.co/guide/en/logstash/current/filter-plugins.html

● OUTPUT○ https://www.elastic.co/guide/en/logstash/current/output-plugins.html

Page 27: Sysmana 2017   monitorización de logs con el stack elk

Kibana● Aplicación web que facilita la explotación visual de

información almacenada en una base de datos

● Los usuarios pueden crear gráficos de barras, líneas,

tartas, mapas, etc., sobre grandes cantidades de datos

● Permite montar tableros de mandos o dashboards a

medida según las necesidades26/36

Page 28: Sysmana 2017   monitorización de logs con el stack elk

Kibana

27/36

Page 29: Sysmana 2017   monitorización de logs con el stack elk

Kibana

28/36

Page 30: Sysmana 2017   monitorización de logs con el stack elk

Kibana

29/36

Page 31: Sysmana 2017   monitorización de logs con el stack elk

Kibana

30/36

Page 32: Sysmana 2017   monitorización de logs con el stack elk

Kibana

31/36

Page 33: Sysmana 2017   monitorización de logs con el stack elk

Arquitectura sist. pruebas

32/36

Page 34: Sysmana 2017   monitorización de logs con el stack elk

Demo time!

33/36

Page 35: Sysmana 2017   monitorización de logs con el stack elk

Referencias● Tutorial Vagrant

https://geekytheory.com/tutorial-vagrant-1-que-es-y-como-usarlo/

● Tutorial Ansiblehttp://blog.itlinux.cl/blog/2016/04/09/automatizacion-y-el-desafio-de-la-nube/

● ElasticSearchhttps://www.adictosaltrabajo.com/tutoriales/administracion-de-elasticsearch/

● Mappings con ElasticSearchhttps://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html

● Introducción a ELKhttp://elmanytas.es/?q=node/318

34/36

Page 36: Sysmana 2017   monitorización de logs con el stack elk

Referencias● Better logstash filter to analyze SystemOut.log and some more

https://www.stoeps.de/better-logstash-filter-to-analyze-systemout-log-and-some-more/

● Análisis de logs con Kibanahttps://www.adictosaltrabajo.com/tutoriales/analisis-de-logs-con-kibana/

● Twitter Elasticsearch examplehttps://github.com/elastic/examples/tree/master/ElasticStack_twitter

35/36

Page 37: Sysmana 2017   monitorización de logs con el stack elk

¿Preguntas?

36/36