Я разработчик, но на моей новой работе в компании нет команды DevOps. Таким образом, у нас нет какого-либо сбора метрик или надлежащих потоков CI/CD. По этой причине я пытаюсь реализовать здесь несколько вещей, но я не эксперт.
Первое, что я пытаюсь сделать, — это реализовать сбор и визуализацию показателей с помощью Prometheus и Grafana. для мониторинга некоторых локальных приложений Python и Node.js. Я использую приложение Flask для тестирования и Docker для локальной установки Prometheus и Grafana, прежде чем настраивать их на соответствующем сервере. Я легко сделал это с помощью prometheus-flask-exporter, но начал замечать некоторые проблемы и у меня возникли вопросы о том, что лучше всего подходит для моего стека приложений.
Стек приложений:< /p>
- Python
- Flask
- Gunicorn с 2 воркёрами и 2 потоками
- Докер с репликой< /p>
- Nginx
- Реплика Docker Deploy: Я сразу понял, что в моем приложении есть Реплика Docker для балансировки нагрузки. Итак, когда Prometheus очищает путь /metrics, Docker отправляет запрос на одну из реплик. Я считаю, что оба должны иметь отдельные метрики в Grafana, чтобы увидеть, правильно ли работает балансировка нагрузки. Я создал разные пути для каждой реплики, например /metrics_1 и /metrics_2 в Nginx и два разных задания в Prometheus, и это сработало, но я не думаю, что это правильный способ сделать это.
Точность показателей. Мне нужны базовые показатели, такие как процентильная задержка, количество запросов в секунду на каждом пути, запросы 2xx, запросы 3xx, запросы 4xx, и запросы 5xx. Однако в том виде, в котором я это реализовал, я не могу доверять метрикам, потому что, когда я сравниваю их с нагрузочным тестом K6, у меня совершенно другие метрики, особенно по процентильной задержке и количеству запросов в секунду.
< /li>
Мои файлы конфигурации:
compose.yml:
services:
api:
image: api-auth-ad
build: .
expose:
\- "8000"
environment:
\- SECRET_KEY=${SECRET_KEY}
\- LDAP_DOMAIN=${LDAP_DOMAIN}
deploy:
replicas: 2
resources:
limits:
cpus: "0.75"
memory: "1gb"
restart: always
nginx:
container_name: api-auth-ad-nginx
image: nginx:1.27.0
ports:
\- "80:80"
\- "443:443"
volumes:
\- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
\- api
restart: always
Файл Docker:
FROM python:3.11
WORKDIR /app
COPY pyproject.toml ./
RUN pip install poetry
RUN poetry lock
RUN poetry install --only main
COPY . .
CMD \["poetry", "run", "gunicorn", "--config", "gunicorn_config.py", "src.app:create_app()"\]
gunicorn_config.py:
workers = 2
threads = 2
bind = "0.0.0.0:8000"
loglevel = "info"
accesslog = "-"
errorlog = "-"
worker_class = "gthread"
nginx.conf:
worker_processes auto;
worker_rlimit_nofile 500000;
events {
use epoll;
worker_connections 512;
}
http {
access_log off;
error_log /dev/null emerg;
upstream api_auth {
server api:8000;
keepalive 400;
}
server {
listen 80;
location / {
proxy_pass http://api_auth;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_intercept_errors off;
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... cker-swarm