Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Sysmana 2017 monitorización de logs con el stack ELK

Sysmana 2017 monitorización de logs con el stack ELK

Cómo hacer analítica de los logs que producen las aplicaciones. Introducción teorica y práctica de las tres herramientas ELK(ElasticSearch, Logstash y Kibana).

Nacho Álvarez

January 31, 2017
Tweet

More Decks by Nacho Álvarez

Other Decks in Technology

Transcript

  1. 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
  2. Índice 1) 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
  3. Vagrant • Gestor de máquinas virtuales • Necesita dos elementos:

    ◦ Proveedor (VirtualBox, VMWare, Docker…) ◦ Aprovisionador (Ansible, Puppet, Chef…) • Funciona con boxes predefinidas https://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
  4. 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" end 3/36
  5. 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
  6. 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 varias 5/36
  7. 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 terceros https://galaxy.ansible.com/ 6/36
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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" } } } } }
  16. 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
  17. LogStash - Ejemplo 18/36 input { stdin {} } filter

    { grok { match => {"message" => "%{IP:ip}"} } geoip { source => "ip" } } output { stdout { codec => rubydebug } }
  18. 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 } }
  19. 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" }
  20. 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 => [ ] }
  21. 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
  22. 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 necesidades 26/36
  23. Referencias • Tutorial Vagrant https://geekytheory.com/tutorial-vagrant-1-que-es-y-como-usarlo/ • Tutorial Ansible http://blog.itlinux.cl/blog/2016/04/09/automatizacion-y-el-desafio-de-la-nube/ •

    ElasticSearch https://www.adictosaltrabajo.com/tutoriales/administracion-de-elasticsearch/ • Mappings con ElasticSearch https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html • Introducción a ELK http://elmanytas.es/?q=node/318 34/36
  24. 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 Kibana https://www.adictosaltrabajo.com/tutoriales/analisis-de-logs-con-kibana/ • Twitter Elasticsearch example https://github.com/elastic/examples/tree/master/ElasticStack_twitter 35/36