Skip to Content

Monitoring

Π’ этом Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ настроим Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ с Prometheus, Grafana, loki, Promtail


ΠšΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС сСрвисов

  • Prometheus β€” систСма сбора ΠΈ хранСния ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ.
  • Grafana β€” визуализация ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΈ Π»ΠΎΠ³ΠΎΠ².
  • Loki β€” систСма хранСния Π»ΠΎΠ³ΠΎΠ² ΠΎΡ‚ Grafana.
  • Promtail β€” Π°Π³Π΅Π½Ρ‚, ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‰ΠΈΠΉ Π»ΠΎΠ³ΠΈ с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΈΡ… Π² Loki.

НачнСм с создания ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ для Π½Π°ΡˆΠΈΡ… сСрвисов

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ°ΠΏΠΊΡƒ Π² monitoring Π² ΠΏΠ°ΠΏΠΊΠ΅ с нашим docker-compose.yaml

mkdir monitoring

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„Π°ΠΉΠ» loki-config.yaml

sudo nano loki-config.yaml

πŸ“„ loki-config.yaml

auth_enabled: false server: http_listen_port: 3100 common: ring: instance_addr: 127.0.0.1 kvstore: store: inmemory replication_factor: 1 path_prefix: /tmp/loki schema_config: configs: - from: 2020-05-15 store: tsdb object_store: filesystem schema: v13 index: prefix: index_ period: 24h storage_config: filesystem: directory: /tmp/loki/chunks

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„Π°ΠΉΠ» prometheus.yml

sudo nano prometheus.yml

πŸ“„ prometheus.yml

global: scrape_interval: 15s # ΠΊΠ°ΠΊ часто ΠΎΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'backend' metrics_path: '/api/metrics' static_configs: - targets: ['backend:3001'] # адрСс Π²Π½ΡƒΡ‚Ρ€ΠΈ docker-сСти

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„Π°ΠΉΠ» promtail-config.yaml

sudo nano promtail-config.yaml

πŸ“„ promtail-config.yaml

server: http_listen_port: 9080 grpc_listen_port: 0 positions: filename: /tmp/positions.yaml clients: - url: http://loki:3100/loki/api/v1/push scrape_configs: - job_name: docker pipeline_stages: - docker: {} docker_sd_configs: - host: unix:///var/run/docker.sock relabel_configs: - source_labels: [__meta_docker_container_name] target_label: container regex: "/(.*)" # ΡƒΠ±ΠΈΡ€Π°Π΅ΠΌ слэш Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΈΠΌΠ΅Π½ΠΈ - source_labels: [__meta_docker_container_id] target_label: container_id - source_labels: [__meta_docker_container_image] target_label: image - source_labels: [__meta_docker_container_labels_com_docker_compose_service] target_label: service - source_labels: [__meta_docker_container_log_path] target_label: __path__

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„Π°ΠΉΠ» datasources.yml

sudo nano datasources.yml

πŸ“„ datasources.yml

apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 isDefault: true editable: true - name: Loki type: loki access: proxy url: http://loki:3100 editable: true

Π”Π°Π»Π΅Π΅ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ docker-compose.yml ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° наши сСрвисы ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

Π’ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ сСрвис нашСго прилоТСния Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ container_name это Π½Π°ΠΌ пригодится для отобраТСния Π² Grafana

πŸ“„ docker-compose.yml

container_name: db container_name: backend container_name: frontend

ДобавляСм сСрвис prometheus

prometheus: image: prom/prometheus:latest container_name: prometheus ports: - "9090:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml command: - '--config.file=/etc/prometheus/prometheus.yml'

ДобавляСм сСрвис grafana

grafana: image: grafana/grafana:latest container_name: grafana ports: - "3000:3000" volumes: - grafana-storage:/var/lib/grafana - ./monitoring/datasources.yml:/etc/grafana/provisioning/datasources/datasources.yaml environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin depends_on: - prometheus

ДобавляСм сСрвис loki

loki: image: grafana/loki:latest container_name: loki volumes: - ./monitoring/loki-config.yaml:/etc/loki/local-config.yaml

ДобавляСм сСрвис promtail

promtail: image: grafana/promtail:latest container_name: promtail volumes: - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock - ./monitoring/promtail-config.yaml:/etc/promtail/config.yml command: -config.file=/etc/promtail/config.yml privileged: true

Π’Π°ΠΆΠ΅ Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²Ρ‚ΡŒ volumes для grafana

volumes: pgdata: grafana-storage:

Π˜Ρ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ docker-compose.yml Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ

services: db: image: postgres:16 container_name: db environment: POSTGRES_USER: ${DB_USER} POSTGRES_PASSWORD: ${DB_PASSWORD} POSTGRES_DB: ${DB_NAME} volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD", "pg_isready", "-U", "${DB_USER}"] interval: 10s timeout: 5s retries: 5 backend: image: ${BACKEND_IMAGE} container_name: backend depends_on: db: condition: service_healthy environment: DB_HOST: db DB_PORT: 5432 DB_NAME: ${DB_NAME} DB_USER: ${DB_USER} DB_PASSWORD: ${DB_PASSWORD} ports: - "4545:3001" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3001/api/health"] interval: 10s timeout: 5s retries: 3 start_period: 5s frontend: image: ${FRONTEND_IMAGE} container_name: frontend ports: - "4546:80" depends_on: backend: condition: service_healthy prometheus: image: prom/prometheus:latest container_name: prometheus ports: - "9090:9090" volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml command: - '--config.file=/etc/prometheus/prometheus.yml' grafana: image: grafana/grafana:latest container_name: grafana ports: - "3000:3000" volumes: - grafana-storage:/var/lib/grafana - ./monitoring/grafana/provisioning/datasources.yml:/etc/grafana/provisioning/datasources/datasources.yaml environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin depends_on: - prometheus loki: image: grafana/loki:latest container_name: loki volumes: - ./monitoring/loki-config.yaml:/etc/loki/local-config.yaml promtail: image: grafana/promtail:latest container_name: promtail volumes: - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock - ./monitoring/promtail-config.yaml:/etc/promtail/config.yml command: -config.file=/etc/promtail/config.yml privileged: true volumes: pgdata: grafana-storage:

Настройка Dashboards Grafana

Нам Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Π²Π° Π΄Π°ΡˆΠ±ΠΎΡ€Π΄Π°

  • Express.js Node Application Application Performance Dashboard β€” Π”Π°ΡˆΠ±ΠΎΡ€Π΄ для отобраТСния состояния нашСго Π±Π΅ΠΊΠ΅Π½Π΄ прилоТСния Node JS 
  • Simple Loki Log Dashboard β€” ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π»ΠΎΠ³ΠΎΠ² ΠΈΠ· Π½Π°ΡˆΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅Π½Π΅ΠΉΡ€ΠΎΠ² docker Loki logs 

Настройка nginx для Grafana сСрвиса

βš™οΈ Настройка прокси

Π‘ΠΎΠ·Π΄Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³:

sudo nano /etc/nginx/sites-available/devops-grafana.it-incubator.io

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ

server { listen 80; # Π‘Π»ΡƒΡˆΠ°Π΅ΠΌ HTTP-запросы Π½Π° 80 ΠΏΠΎΡ€Ρ‚Ρƒ server_name devops-grafana.it-incubator.io; # Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π΄ΠΎΠΌΠ΅Π½ ΠΈΠ»ΠΈ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ IP сСрвСра location / { proxy_pass http://localhost:3000; # ΠŸΡ€ΠΎΠΊΡΠΈΡ€ΡƒΠ΅ΠΌ запросы Π½Π° Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Node.js-сСрвСр (Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π΅) proxy_http_version 1.1; # Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ HTTP/1.1 для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π²Π΅Π±-сокСтов ΠΈ keep-alive proxy_set_header Host $host; # ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‘ΠΌ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ Host-Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ } }

Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅:

# Π‘ΠΎΠ·Π΄Π°Ρ‘ΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ссылку ΠΈΠ· Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π² sites-available Π² ΠΏΠ°ΠΏΠΊΡƒ sites-enabled, # Ρ‡Ρ‚ΠΎΠ±Ρ‹ NGINX Π½Π°Ρ‡Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΊΠΎΠ½Ρ„ΠΈΠ³ (Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ сайт) sudo ln -s /etc/nginx/sites-available/devops-grafana.it-incubator.io /etc/nginx/sites-enabled/ # ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ синтаксис ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ NGINX ΠΈ ΠΈΡ‰Π΅ΠΌ ошибки sudo nginx -t # ΠŸΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ NGINX, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ настройки (Π±Π΅Π· остановки сСрвСра) sudo systemctl reload nginx

Настройка Π΄ΠΎΠΌΠ΅Π½Π° ΠΈ HTTPS Ρ‡Π΅Ρ€Π΅Π· Let’s Encrypt

sudo certbot --nginx -d devops-grafana.it-incubator.io
Last updated on