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

Sysmana 2017 monitorización de logs con el stac...

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).

Avatar for Nacho Álvarez

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