diff --git a/readme.md b/readme.md index c207bdb..d4a3462 100644 --- a/readme.md +++ b/readme.md @@ -50,3 +50,4 @@ * [10.1. Зачем и что нужно мониторить](/src/homework/10-monitoring/10.1) * [10.2. Системы мониторинга](/src/homework/10-monitoring/10.2) * [10.3. Grafana](/src/homework/10-monitoring/10.3) +* [10.4. ELK](/src/homework/10-monitoring/10.4) diff --git a/src/homework/10-monitoring/10.4/help/configs/filebeat.yml b/src/homework/10-monitoring/10.4/help/configs/filebeat.yml new file mode 100644 index 0000000..408dfd3 --- /dev/null +++ b/src/homework/10-monitoring/10.4/help/configs/filebeat.yml @@ -0,0 +1,23 @@ +--- +filebeat.inputs: + - type: container + paths: + - '/var/lib/docker/containers/*/*.log' + +processors: + - add_docker_metadata: + host: "unix:///var/run/docker.sock" + + - decode_json_fields: + fields: ["message"] + target: "json" + overwrite_keys: true + +output.logstash: + hosts: ["logstash:5044"] + +#output.console: +# enabled: true + +logging.json: true +logging.metrics.enabled: false diff --git a/src/homework/10-monitoring/10.4/help/configs/logstash.yml b/src/homework/10-monitoring/10.4/help/configs/logstash.yml new file mode 100644 index 0000000..a59b38a --- /dev/null +++ b/src/homework/10-monitoring/10.4/help/configs/logstash.yml @@ -0,0 +1,2 @@ +--- +http.host: "0.0.0.0" diff --git a/src/homework/10-monitoring/10.4/help/configs/pipeline/logstash.conf b/src/homework/10-monitoring/10.4/help/configs/pipeline/logstash.conf new file mode 100644 index 0000000..40c23a9 --- /dev/null +++ b/src/homework/10-monitoring/10.4/help/configs/pipeline/logstash.conf @@ -0,0 +1,24 @@ +input { + beats { + type => beats + port => 5044 + } +} + +filter { + # Prevent recursive overflow on same machine + if [container][name] =~ "filebeat" + or [container][name] =~ "logstash" + or [container][name] =~ "elasticsearch" + or [container][name] =~ "kibana" + or [container][image][name] =~ /^sha256/ { + drop { } + } +} + +output { + elasticsearch { + hosts => ["es-hot:9200"] + index => "logstash-%{+YYYY-MM-dd}" + } +} diff --git a/src/homework/10-monitoring/10.4/help/docker-compose.yml b/src/homework/10-monitoring/10.4/help/docker-compose.yml new file mode 100644 index 0000000..c5dc5ee --- /dev/null +++ b/src/homework/10-monitoring/10.4/help/docker-compose.yml @@ -0,0 +1,112 @@ +--- +version: '2.2' +services: + + es-hot: + image: elasticsearch:7.11.2 + container_name: es-hot + environment: + - node.name=es-hot + - cluster.name=es-docker-cluster + - discovery.seed_hosts=es-warm + - cluster.initial_master_nodes=es-hot,es-warm + - bootstrap.memory_lock=true + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + volumes: + - data01:/usr/share/elasticsearch/data:Z + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + ports: + - "9200:9200" + networks: + - elastic + depends_on: + - es-warm + + es-warm: + image: elasticsearch:7.11.2 + container_name: es-warm + environment: + - node.name=es-warm + - cluster.name=es-docker-cluster + - discovery.seed_hosts=es-hot + - cluster.initial_master_nodes=es-hot,es-warm + - bootstrap.memory_lock=true + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + volumes: + - data02:/usr/share/elasticsearch/data:Z + ulimits: + memlock: + soft: -1 + hard: -1 + nofile: + soft: 65536 + hard: 65536 + networks: + - elastic + + kibana: + image: kibana:7.11.2 + container_name: kibana + ports: + - "5601:5601" + environment: + ELASTICSEARCH_URL: http://es-hot:9200 + ELASTICSEARCH_HOSTS: '["http://es-hot:9200","http://es-warm:9200"]' + networks: + - elastic + depends_on: + - es-hot + - es-warm + + logstash: + image: logstash:6.4.3 + container_name: logstash + expose: + - 5044 + volumes: + - ./configs/logstash.yml:/opt/logstash/config/logstash.yml:Z + - ./configs/pipeline/:/usr/share/logstash/pipeline/ + networks: + - elastic + depends_on: + - es-hot + - es-warm + + filebeat: + image: elastic/filebeat:7.11.2 + container_name: filebeat + privileged: true + user: root + volumes: + - ./configs/filebeat.yml:/usr/share/filebeat/filebeat.yml + - /var/lib/docker:/var/lib/docker:Z + - /var/run/docker.sock:/var/run/docker.sock:Z + depends_on: + - logstash + networks: + - elastic + + some_application: + image: library/python:3.9-alpine + container_name: some_app + volumes: + - ./pinger/run.py:/opt/run.py:Z + entrypoint: python3 /opt/run.py + +volumes: + data01: + driver: local + data02: + driver: local + data03: + driver: local + +networks: + elastic: + driver: bridge diff --git a/src/homework/10-monitoring/10.4/help/pinger/run.py b/src/homework/10-monitoring/10.4/help/pinger/run.py new file mode 100644 index 0000000..aaf94ea --- /dev/null +++ b/src/homework/10-monitoring/10.4/help/pinger/run.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 + +import logging +import random +import time + +while True: + + number = random.randrange(0, 4) + + if number == 0: + logging.info('Hello there!!') + elif number == 1: + logging.warning('Hmmm....something strange') + elif number == 2: + logging.error('OH NO!!!!!!') + elif number == 3: + logging.exception(Exception('this is exception')) + + time.sleep(1) diff --git a/src/homework/10-monitoring/10.4/img/kibana_discover_index_pattern.png b/src/homework/10-monitoring/10.4/img/kibana_discover_index_pattern.png new file mode 100644 index 0000000..7b57173 Binary files /dev/null and b/src/homework/10-monitoring/10.4/img/kibana_discover_index_pattern.png differ diff --git a/src/homework/10-monitoring/10.4/img/kibana_startup.png b/src/homework/10-monitoring/10.4/img/kibana_startup.png new file mode 100644 index 0000000..1df89ac Binary files /dev/null and b/src/homework/10-monitoring/10.4/img/kibana_startup.png differ diff --git a/src/homework/10-monitoring/10.4/readme.md b/src/homework/10-monitoring/10.4/readme.md new file mode 100644 index 0000000..50e2b4a --- /dev/null +++ b/src/homework/10-monitoring/10.4/readme.md @@ -0,0 +1,83 @@ +Выполнение [домашнего задания](https://github.com/netology-code/mnt-homeworks/blob/MNT-13/10-monitoring-04-elk/README.md) +по теме "10.4. ELK" + +## Q/A + +### Задание 1 + +> Вам необходимо поднять в докере: +> - elasticsearch(hot и warm ноды) +> - logstash +> - kibana +> - filebeat +> +> и связать их между собой. +> +> Logstash следует сконфигурировать для приёма по tcp json сообщений. +> +> Filebeat следует сконфигурировать для отправки логов docker вашей системы в logstash. +> +> В директории [help](./help) находится манифест docker-compose и конфигурации filebeat/logstash для быстрого +> выполнения данного задания. +> +> Результатом выполнения данного задания должны быть: +> - скриншот `docker ps` через 5 минут после старта всех контейнеров (их должно быть 5) +> - скриншот интерфейса kibana +> - docker-compose манифест +> - ваши yml конфигурации для стека + +Использовал готовый стэк из оригинального репозитория: [help](./help), но с некоторыми доработками: + +- конфигурацию pipelines унёс в отдельную директорию и убрал из фильтра: + - логи elk-стека, чтобы не было проблем с переполнением памяти + - условия по json, так как pinger-приложение генерирует простую строку + +```shell +docker-compose ps +``` + +```text + Name Command State Ports +---------------------------------------------------------------------------------------------------------------- +es-hot /bin/tini -- /usr/local/bi ... Up 0.0.0.0:9200->9200/tcp,:::9200->9200/tcp, 9300/tcp +es-warm /bin/tini -- /usr/local/bi ... Up 9200/tcp, 9300/tcp +filebeat /usr/bin/tini -- /usr/loca ... Up +kibana /bin/tini -- /usr/local/bi ... Up 0.0.0.0:5601->5601/tcp,:::5601->5601/tcp +logstash /usr/local/bin/docker-entr ... Up 5044/tcp, 0.0.0.0:5046->5046/tcp,:::5046->5046/tcp, 9600/tcp +some_app python3 /opt/run.py Up +``` + +![kibana_startup](./img/kibana_startup.png) + +### Задание 2 + +> Перейдите в меню создания index-patterns в kibana (http://localhost:5601/app/management/kibana/indexPatterns/create) +> и создайте несколько index-patterns из имеющихся. +> +> Перейдите в меню просмотра логов в kibana (Discover) и самостоятельно изучите как отображаются логи и как производить +> поиск по логам. +> +> В манифесте директории help также приведено dummy приложение, которое генерирует рандомные события в stdout контейнера. +> Данные логи должны порождать индекс logstash-* в elasticsearch. Если данного индекса нет - воспользуйтесь советами +> и источниками из раздела "Дополнительные ссылки" данного ДЗ. + +Discover по созданному index pattern: + +![kibana_discover_index_pattern](./img/kibana_discover_index_pattern.png) + +### Дополнительные ссылки + +При выполнении задания пользуйтесь вспомогательными ресурсами: + +- [поднимаем elk в докер](https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-docker.html) +- [поднимаем elk в докер с filebeat и докер логами](https://www.sarulabs.com/post/5/2019-08-12/sending-docker-logs-to-elasticsearch-and-kibana-with-filebeat.html) +- [конфигурируем logstash](https://www.elastic.co/guide/en/logstash/current/configuration.html) +- [плагины filter для logstash](https://www.elastic.co/guide/en/logstash/current/filter-plugins.html) +- [конфигурируем filebeat](https://www.elastic.co/guide/en/beats/libbeat/5.3/config-file-format.html) +- [привязываем индексы из elastic в kibana](https://www.elastic.co/guide/en/kibana/current/index-patterns.html) +- [как просматривать логи в kibana](https://www.elastic.co/guide/en/kibana/current/discover.html) +- [решение ошибки increase vm.max_map_count elasticsearch](https://stackoverflow.com/questions/42889241/how-to-increase-vm-max-map-count) + +В процессе выполнения задания могут возникнуть также не указанные тут проблемы в зависимости от системы. + +Используйте output stdout filebeat/kibana и api elasticsearch для изучения корня проблемы и ее устранения.