Monitor các Docker service với Prometheus

Monitor là một việc làm bắt buột trong môi trường production nếu muốn biết tình trạng của hệ thống hoặc các vấn đề đang xảy ra để có biện pháp giải quyết sự cố. Bài viết này sẽ trình bày cách monitor các thành phần (các Docker service) của một hệ thống chạy trong Docker Swarm cluster bằng Prometheus.

Trong trường hợp bình thường khi các Docker service chỉ chạy với một instance, việc monitor có thể được thực hiện như trong tài liệu của Prometheus. Nhưng khi muốn scale out các service ra thành nhiều instance, ta phải cấu hình để Prometheus có thể tự động “thấy” được các instance hiện có và scrape các metric từ chúng.

Giả sử đã có một Swarm cluster được dựng sẵn, tạo một overlay network, các service đã được deploy, attach vào network đã tạo và có thể scale ra nhiều instace (dùng lệnh docker service scale service_name=5 hoặc khai báo trong file docker-compose.yml).

Tiếp theo, trong file prometheus.yml, cấu hình các target cần scrape bằng cơ chế DNS service discovery

scrape_configs:
  - job_name: 'your-job-name'
    dns_sd_configs:
      - names: ['tasks.service-name']
        type: A
        port: 7071

Lưu ý, service-name phải giống với name của Docker service cần monitor.

Với cấu hình như vậy, Prometheus sẽ tự resolve được IP của các service (IP trong overlay network) và lấy được các metric cần monitor.

Tham khảo

Note về chuyện kết nối tới PostgreSQL

Gần đây mình có tạo một Spring-Boot app connect tới PostgreSQL (tất cả đều nắm trên máy local). Lúc chạy thì bị báo lỗi không login được

org.postgresql.util.PSQLException: FATAL: password authentication failed for user “username”

Username và password cấu hình trong app là username và password của tài khoản Ubuntu mà mình login vào máy. Khi login vào PostgreSQL bằng lệnh psql -d dbname thì được bình thường. Sau một hồi tìm hiểu thì cũng biết được lý do.

PostgreSQL hỗ trợ nhiều phương thức login[1]: Trust, Peer, Password, LDAP,… Khi login bằng lệnh psql -d dbname PostgreSQL sẽ kết nối thông qua Unix socket sử dụng Peer Authentication, phương pháp này sử dụng username của hệ điều hành như là database username để xác thực[2]. Do đó, nếu tạo 1 user khác trong PostgreSQL khác với username của hệ điệu hành thì khi login bằng psql -U new_username -d dbname sẽ gặp lỗi psql: FATAL: Peer authentication failed for user "new_username".

Để app kết nối được với PostgreSQL, mình phải đặt password cho username dùng để login (password này khác với password của hệ điều hành). Lúc này Password Authentication sẽ được sử dụng, lưu ý nếu không đặt password thì không login được nhé.