# Hướng dẫn Observability Stack Tài liệu này hướng dẫn cách sử dụng stack observability (Grafana, Prometheus, Loki, Promtail) được tích hợp trong dự án. ## Tổng quan Kiến trúc ```mermaid graph TB subgraph Services[" Microservices"] IAM["IAM Service"] User["User Service"] Order["Order Service"] end subgraph Collectors[" Data Collectors"] Prometheus["Prometheus
Metrics Collector"] Promtail["Promtail
Log Collector"] end subgraph Storage[" Storage"] PrometheusDB["Prometheus TSDB
Metrics Storage"] Loki["Loki
Log Aggregation"] end subgraph Visualization[" Visualization"] Grafana["Grafana
Dashboard & Analytics"] end IAM -->|"metrics /metrics"| Prometheus User -->|"metrics /metrics"| Prometheus Order -->|"metrics /metrics"| Prometheus IAM -->|"logs (stdout)"| Promtail User -->|"logs (stdout)"| Promtail Order -->|"logs (stdout)"| Promtail Prometheus -->|"store"| PrometheusDB Promtail -->|"push logs"| Loki PrometheusDB -->|"query PromQL"| Grafana Loki -->|"query LogQL"| Grafana style Services fill:#1a1a2e,stroke:#16213e,stroke-width:2px,color:#ffffff style Collectors fill:#0f3460,stroke:#16213e,stroke-width:2px,color:#ffffff style Storage fill:#16213e,stroke:#0f3460,stroke-width:2px,color:#ffffff style Visualization fill:#533483,stroke:#16213e,stroke-width:2px,color:#ffffff style IAM fill:#e94560,stroke:#c81e3b,stroke-width:2px,color:#ffffff style User fill:#e94560,stroke:#c81e3b,stroke-width:2px,color:#ffffff style Order fill:#e94560,stroke:#c81e3b,stroke-width:2px,color:#ffffff style Prometheus fill:#f39c12,stroke:#d68910,stroke-width:2px,color:#ffffff style Promtail fill:#f39c12,stroke:#d68910,stroke-width:2px,color:#ffffff style PrometheusDB fill:#3498db,stroke:#2874a6,stroke-width:2px,color:#ffffff style Loki fill:#3498db,stroke:#2874a6,stroke-width:2px,color:#ffffff style Grafana fill:#9b59b6,stroke:#7d3c98,stroke-width:2px,color:#ffffff ``` ### Các thành phần chính - **Prometheus**: Thu thập metrics từ các services qua endpoint `/metrics` - **Loki**: Thu thập và tổng hợp logs từ các container - **Promtail**: Agent quét logs từ Docker containers và đẩy đến Loki - **Grafana**: Dashboard trực quan hóa metrics (Prometheus) và logs (Loki) ## Bắt đầu ### Yêu cầu tiên quyết - Đã cài đặt Docker và Docker Compose. - Đã có network `microservices-network` (thường được tạo bởi stack chính của ứng dụng hoặc tạo thủ công). ### Khởi chạy Stack Bạn có thể khởi chạy dễ dàng bằng script có sẵn: ```bash ./scripts/observability/start.sh ``` Hoặc chạy thủ công: ```bash # Đảm bảo network đã tồn tại docker network create microservices-network || true cd infra/observability docker-compose -f docker-compose.observability.yml up -d ``` Kiểm tra xem các container đã chạy chưa: ```bash docker ps ``` Bạn sẽ thấy các container `grafana`, `prometheus`, `loki`, và `promtail`. ## Truy cập Dịch vụ | Dịch vụ | URL | Tài khoản (nếu có) | Mô tả | | :--- | :--- | :--- | :--- | | **Grafana** | [http://localhost:3001](http://localhost:3001) | `admin` / `admin` | Dashboard chính để theo dõi. | | **Prometheus** | [http://localhost:9090](http://localhost:9090) | N/A | Xem metrics thô và trạng thái target. | | **Loki** | [http://localhost:3100](http://localhost:3100) | N/A | API tổng hợp log (không có giao diện web). | ## Sử dụng Grafana 1. **Đăng nhập**: Truy cập [http://localhost:3001](http://localhost:3001) và đăng nhập với `admin`/`admin`. 2. **Khám phá dữ liệu (Explore)**: - Chọn biểu tượng **Explore** (hình la bàn) ở thanh bên trái. - Chọn **Loki** từ menu datasource để tìm kiếm logs. - Chọn **Prometheus** từ menu datasource để truy vấn metrics. ### Xem Logs (Loki) Trong giao diện **Explore** với **Loki** đã chọn: 1. Nhấn nút **Label browser**. 2. Chọn một label, ví dụ: `container`. 3. Chọn tên container cụ thể (ví dụ: `iam-service` hoặc `traefik`). 4. Nhấn **Show logs**. Bạn cũng có thể viết truy vấn LogQL thủ công, ví dụ: ```logql {container="iam-service"} ``` ### Xem Metrics (Prometheus) Trong giao diện **Explore** với **Prometheus** đã chọn: 1. Nhập tên metric vào ô truy vấn (ví dụ: `up`, `container_memory_usage_bytes`). 2. Nhấn **Run query**. ## Cấu hình - **Prometheus**: Các rules và targets được cấu hình tại `infra/observability/prometheus/prometheus.yml`. - **Promtail**: Rules để quét log được cấu hình tại `infra/observability/promtail/promtail-config.yml`. - **Grafana**: Cấu hình datasources và dashboards provisioning nằm trong `infra/observability/grafana/`. ## Quick Tips ### Troubleshooting chung | Vấn đề | Triệu chứng | Giải pháp | |--------|-------------|-----------| | Không thấy logs | Grafana Explore không hiển thị logs | Kiểm tra Promtail đang chạy: `docker ps \| grep promtail` | | Metrics bị thiếu | Services không xuất hiện trong Prometheus targets | Kiểm tra `/metrics` endpoint của service | | Container không khởi động | `docker ps` không show container | Xem logs: `docker-compose logs ` | | Network issue | Services không kết nối được | Tạo network: `docker network create microservices-network` | ### LogQL Quick Reference ```logql {container="iam-service"} # Logs từ IAM service {container="iam-service"} |= "error" # Chỉ logs có chứa "error" {container="iam-service"} | json # Parse JSON logs {container="iam-service"} | json | level="error" # Filter by log level ``` ### PromQL Quick Reference ```promql up # Status của tất cả targets (1 = up, 0 = down) rate(http_requests_total[5m]) # Request rate trong 5 phút container_memory_usage_bytes{container="iam-service"} # Memory usage của IAM service ``` ### Best Practices - **Naming Convention**: Đặt tên metrics theo pattern `___` - **Labels**: Sử dụng labels để phân loại dữ liệu (environment, service, instance) - **Retention**: Cấu hình retention phù hợp cho Prometheus và Loki - **Alerting**: Thiết lập alerts cho các metrics quan trọng - **Cardinality**: Tránh sử dụng quá nhiều unique labels (gây tăng cardinality) ### Color Palette Reference Diagram sử dụng bảng màu tối để dễ nhìn: | Loại Component | Fill Color | Stroke Color | Mục đích | |----------------|------------|--------------|----------| | Services | `#e94560` | `#c81e3b` | Microservices (đỏ) | | Collectors | `#f39c12` | `#d68910` | Thu thập dữ liệu (cam) | | Storage | `#3498db` | `#2874a6` | Lưu trữ (xanh dương) | | Visualization | `#9b59b6` | `#7d3c98` | Trực quan hóa (tím) | | Subgraphs | `#1a1a2e` - `#533483` | `#16213e` - `#0f3460` | Nhóm logic | **Tất cả text sử dụng `color:#ffffff` (trắng) để dễ đọc trên nền tối**