homework 10.4: complete all tasks

This commit is contained in:
2022-10-17 10:58:59 +07:00
parent 91d0541f99
commit cf2c1e633a
9 changed files with 265 additions and 0 deletions

View File

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

View File

@@ -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

View File

@@ -0,0 +1,2 @@
---
http.host: "0.0.0.0"

View File

@@ -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}"
}
}

View File

@@ -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

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

View File

@@ -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 для изучения корня проблемы и ее устранения.