Skip to content

Commit

Permalink
Prometheus added
Browse files Browse the repository at this point in the history
  • Loading branch information
XanderMoroz committed Jun 20, 2024
1 parent ccfac66 commit cb375cc
Show file tree
Hide file tree
Showing 6 changed files with 260 additions and 50 deletions.
34 changes: 24 additions & 10 deletions .env
Original file line number Diff line number Diff line change
@@ -1,15 +1,29 @@
# DJANGO DEFAULT SETTINGS
################################################################################
# DJANGO APP Config
# Automatically setup app variables
################################################################################
SECRET_KEY='django-insecure-#)!-t1b(7&wr_7c%0m%w$(y@^#z6wizw^trm$dtz70@m1fe$6*'
# DJANGO SUPERUSER
DJANGO_SUPERUSER_USERNAME=root
DJANGO_SUPERUSER_EMAIL=root@root.com
DJANGO_SUPERUSER_PASSWORD=123

# POSTGRESQL DEFAULT DATABASE
POSTGRES_USER=postgres
POSTGRES_PASS=postgres
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_DB=goodnews

################################################################################
# POSTGRESQL Config
# Automatically create database and user
################################################################################
DB_NAME="goodNews"
DB_USER="xander"
DB_PASSWORD="pass:123"
DATABASE_PORT=5432
DATABASE_HOST="localhost" # при использовании локально
DATABASE_HOST="goodNews-postgres" # при использовании c Docker
################################################################################
# PGADMIN Config
# Automatically setup interface for DB
################################################################################
PGADMIN_DEFAULT_EMAIL=xander@admin.com
PGADMIN_DEFAULT_PASSWORD=pwd123
################################################################################
# CELERY BROKER Config
# Automatically setup message broker for celery
################################################################################
CELERY_BROKER_HOST=rabbitmq
130 changes: 120 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,11 @@ GoodNews представляет собой веб-портал на основ
База данных - `PostgreSQL`. ORM - `DjangoORM`.
Асинхронные задачи - `Celery`. Брокер сообщений - `RabbitMQ`.
Интерфейс - `Jinja2`, `HTML`, `CSS`, `JavaScript`.
Контейнеризация - `Docker`. Зависимости - `Poetry`. Линтер - `Flake8`.
Контейнеризация - `Docker-Compose`. Зависимости - `Poetry`. Линтер - `Flake8`.
Мониторинг - `Prometheus`. Метрики хоста - `Node Exporter`. Визуализация - `Grafana`.


![Screen Shot](extras/GN-schema.png)

## <a name="features"> 🌟 Возможности сервиса </a>

Expand Down Expand Up @@ -160,15 +164,35 @@ git clone https://github.com/XanderMoroz/GoodNews-DRF.git
1.3 Заполняете файл .env по следующему шаблону:

```sh
# DJANGO DEFAULT SETTINGS
################################################################################
# DJANGO APP Config
# Automatically setup app variables
################################################################################
SECRET_KEY='django-insecure-#)!-t1b(7&wr_7c%0m%w$(y@^#z6wizw^trm$dtz70@m1fe$6*'

# POSTGRESQL DEFAULT DATABASE
POSTGRES_USER=postgres
POSTGRES_PASS=postgres
POSTGRES_HOST=postgres #localhost(при использовании локально)
POSTGRES_PORT=5432
POSTGRES_DB=goodnews
DJANGO_SUPERUSER_USERNAME=root
DJANGO_SUPERUSER_EMAIL=root@root.com
DJANGO_SUPERUSER_PASSWORD=123
################################################################################
# POSTGRESQL Config
# Automatically create database and user
################################################################################
DB_NAME="goodNews"
DB_USER="xander"
DB_PASSWORD="pass:123"
DATABASE_PORT=5432
DATABASE_HOST="localhost" # при использовании локально
DATABASE_HOST="goodNews-postgres" # при использовании c Docker
################################################################################
# PGADMIN Config
# Automatically setup interface for DB
################################################################################
PGADMIN_DEFAULT_EMAIL=xander@admin.com
PGADMIN_DEFAULT_PASSWORD=pwd123
################################################################################
# CELERY BROKER Config
# Automatically setup message broker for celery
################################################################################
CELERY_BROKER_HOST=rabbitmq

```
2. ### Запуск проекта с Doker
Expand All @@ -181,8 +205,94 @@ sudo docker-compose up -d
sudo docker exec -it goodnews-drf_web_1 python manage.py createsuperuser
```
2.3 Сервис доступен по адресу: http://0.0.0.0:8000/
2.3 Сервисы доступны для эксплуатации:

- Приложение Python `Django APP`: http://127.0.0.1:8080/
- Брокер сообщений `RabbitMQ`: http://127.0.0.1:15672/
- Интерфейс для управления БД Postgres `PGAdmin4`: http://127.0.0.1:5050
- Система мониторинга (сбора метрик) `Prometheus`: http://127.0.0.1:9090
- Извлекает метрики хоста (cpu-, memory-usage) для мониторинга `Node Exporter`: http://127.0.0.1:9100/
- Аналитическая система (визиализирует данные в виде дашбордов) `Grafana`: http://127.0.0.1:3000


3. ### Дополнительные настройки

<details>
<summary>Как подключить PGAdmin4 к БД? </summary>


1. Заходим в браузер по адресу http://127.0.0.1:5050 и вводим данные из .env

```bash
PGADMIN_DEFAULT_EMAIL=xander@admin.com
PGADMIN_DEFAULT_PASSWORD=pwd123
```
![Screen Shot](docs/extras/pgadmin_auth.jpg)

2. Заполняем Имя сервера (обязательно)

![Screen Shot](docs/extras/pgadmin_settings_01.jpg)

3. Извлекаем адрес хоста, на котором расположилась БД Postgres

```bash
sudo docker inspect go_blog_postgres | grep IPAddress
```
![Screen Shot](docs/extras/pgadmin_get_host.jpg)

4. Заполняем Адрес сервера данными хоста БД Postgres и пароль (из файла .env)

![Screen Shot](docs/extras/pgadmin_settings_02.jpg)

6. Готово

![Screen Shot](docs/extras/pgadmin_ready.jpg)

</details>


<details>
<summary>Как подключить Grafana к Prometheus? </summary>


1. Заходим в браузер по адресу http://127.0.0.1:3000 и вводим данные по умолчанию:

- Email or username: admin
- Password: admin

![Screen Shot](docs/extras/geafana_auth_01.jpg)

2. После система потребует придумать новый пароль (это необязательно).

![Screen Shot](docs/extras/geafana_auth_02.jpg)

3. Мы авторизованы в сервисе Grafana. Добавим новое подключение...

![Screen Shot](docs/extras/grafana_settings_01.jpg)

4. Ищем в списке Prometheus и кликаем по нему

![Screen Shot](docs/extras/grafana_settings_02.jpg)

5. Теперь его нужно настроить

![Screen Shot](docs/extras/grafana_settings_03.jpg)

7. Извлекаем адрес хоста, на котором расположился Prometheus

```bash
sudo docker inspect prometheus | grep IPAddress
```
![Screen Shot](docs/extras/grafana_get_host.jpg)

8. Заполняем Адрес сервера Prometheus данными хоста

![Screen Shot](docs/extras/grafana_settings_04.jpg)

9. Готово

</details>

## <a name="tests"> 💯 Тесты



Expand Down
129 changes: 104 additions & 25 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -1,58 +1,137 @@
version: '3'
services:
web:
container_name: "goodNews-app" # Название контейнера
build:
context: .
context: . # Образ контейнера берем из текущей папки
args:
REQUIREMENTS_FILE: reqs.txt
restart: always
env_file: .env
command: bash -c "python manage.py migrate && python manage.py loaddata initial.json && python manage.py createsuperuser && python manage.py runserver 0.0.0.0:8000"
volumes:
volumes: # Монтируем том с приложением
- ./:/app
ports:
ports: # Связываем порты хоста:контейнера
- 8000:8000
restart: on-failure # Перезапускаем при ошибке
depends_on:
- rabbitmq
- celery-worker
networks:
- goodnews-network
networks: # Подключаем к сети
- goodNews-network

postgres:
image: postgres:15-alpine
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=goodnews
volumes:
good_news-postgres:
container_name: "goodNews-postgres" # Название контейнера
image: postgres:15.7-alpine # Название:версия образа (postgres:15.7-alpine)
environment: # Берем из .env
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
- POSTGRES_DB=${DB_NAME}
- DATABASE_HOST=${DB_HOST}
ports: # Связываем порты хоста:контейнера
- "5432:5432"
volumes: # Монтируем том с данными из БД
- postgres-data:/var/lib/postgresql/data
networks: # Подключаем к сети
- goodNews-network

pgadmin:
container_name: pgadmin_container # Название контейнера
image: dpage/pgadmin4 # Название:версия образа
environment: # Берем из .env
PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL}
PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD}
ports:
- "5050:80" # Связываем порты хоста:контейнера
depends_on:
- good_news-postgres # Ставим в зависимость от БД
networks:
- goodnews-network
- goodNews-network # Подключаем к сети
restart: unless-stopped

rabbitmq:
image: rabbitmq:3.9.10-management
ports:
# - 5672:5672
- 15672:15672
volumes:
container_name: "goodNews-rabbitmq" # Название контейнера
image: rabbitmq:3.10.7-management # Название:версия образа (rabbitmq:3.10.7-management)
ports: # Связываем порты хоста:контейнера
- "5672:5672"
- "15672:15672"
volumes: # Монтируем том с данными из rabbitmq
- rabbitmq-data:/var/lib/rabbitmq
networks:
- goodnews-network
networks: # Подключаем к сети
- goodNews-network

celery-worker:
container_name: "goodNews-celery-worker" # Название контейнера
build:
context: .
context: . # Образ контейнера берем из текущей папки
args:
REQUIREMENTS_FILE: reqs.txt
command: celery -A src worker --loglevel=info
volumes:
volumes: # Монтируем том с данными из rabbitmq
- ./:/app
networks: # Подключаем к сети
- goodNews-network

prometheus:
container_name: prometheus # Система мониторинга
image: prom/prometheus:latest
volumes:
- ./etc/prometheus:/etc/prometheus/ # Монтируем том с данными из БД
hostname: prometheus
command:
- --config.file=/etc/prometheus/prometheus.yml # Устанавливаем конфигурацию из файла prometheus.yml
ports:
- 9090:9090 # Связываем порты хоста:контейнера
restart: unless-stopped
environment:
TZ: "Europe/Moscow"
networks:
- goodNews-network

# Извлекает данные хоста (cpu, memory)
node-exporter:
container_name: exporter
image: prom/node-exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
hostname: exporter
command:
- --path.procfs=/host/proc
- --path.sysfs=/host/sys
- --collector.filesystem.ignored-mount-points
- ^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)
ports:
- 9100:9100
restart: unless-stopped
environment:
TZ: "Europe/Moscow"
networks:
- goodnews-network
- goodNews-network

# Визуализация данных на дашборде
grafana:
image: grafana/grafana
user: root
depends_on:
- prometheus
ports:
- 3000:3000
volumes:
- ./etc/grafana:/var/lib/grafana
- ./etc/grafana/provisioning/:/etc/grafana/provisioning/
container_name: grafana
hostname: grafana
restart: unless-stopped
environment:
TZ: "Europe/Moscow"
networks:
- goodNews-network


volumes:
postgres-data:
rabbitmq-data:

networks:
goodnews-network:
goodNews-network:
7 changes: 7 additions & 0 deletions etc/prometheus/prometheus.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
scrape_configs:

- job_name: node # Название мониторинговой задачи
scrape_interval: 5s # Интервал извлечения данных
static_configs:
# Источник данных
- targets: ['node-exporter:9100'] # Извлекает данные хоста (cpu, memory)
Binary file added extras/GN-schema.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 5 additions & 5 deletions src/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,11 @@
"default": {
"ENGINE": "django.db.backends.postgresql",

"USER": os.environ.get("POSTGRES_USER"),
"NAME": os.environ.get("POSTGRES_DB"),
"PASSWORD": os.environ.get("POSTGRES_PASS"),
"PORT": os.environ.get("POSTGRES_PORT"),
"HOST": os.environ.get("POSTGRES_HOST"),
"USER": os.environ.get("DB_USER"),
"NAME": os.environ.get("DB_NAME"),
"PASSWORD": os.environ.get("DB_PASSWORD"),
"PORT": os.environ.get("DATABASE_PORT"),
"HOST": os.environ.get("DATABASE_HOST"),
}
}

Expand Down

0 comments on commit cb375cc

Please sign in to comment.