Prometheus Scrape App Metrics
🎯 Mục tiêu: Chạy Prometheus scrape metrics từ một app Python (Flask + prometheus-client), viết PromQL query tính request rate và error rate.
🧰 Công cụ / nền tảng: Docker Compose, Python 3, prometheus-client library.
📦 Chuẩn bị: Docker Desktop đang chạy; tạo thư mục lab-106.
▶️ Các bước:
mkdir lab-106 && cd lab-106
# Bước 1: Tạo app Python expose /metrics
cat > app.py <<'PYEOF'
from flask import Flask, Response
from prometheus_client import Counter, Histogram, generate_latest, CONTENT_TYPE_LATEST
import random, time
app = Flask(__name__)
REQUEST_COUNT = Counter('app_requests_total',
'Total requests', ['method', 'endpoint', 'status'])
REQUEST_LATENCY = Histogram('app_request_latency_seconds',
'Request latency', ['endpoint'],
buckets=[0.01, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5])
@app.route('/')
def index():
start = time.time()
# Giả lập 5% error rate
status = '500' if random.random() < 0.05 else '200'
time.sleep(random.uniform(0.01, 0.3))
REQUEST_COUNT.labels('GET', '/', status).inc()
REQUEST_LATENCY.labels('/').observe(time.time() - start)
if status == '500':
return 'Error', 500
return 'Hello Observability!', 200
@app.route('/metrics')
def metrics():
return Response(generate_latest(), mimetype=CONTENT_TYPE_LATEST)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
PYEOF
# Bước 2: Tạo Dockerfile cho app
cat > Dockerfile <<'EOF'
FROM python:3.11-slim
RUN pip install flask prometheus-client
COPY app.py .
CMD ["python","app.py"]
EOF
# Bước 3: Tạo cấu hình Prometheus
cat > prometheus.yml <<'EOF'
global:
scrape_interval: 10s
evaluation_interval: 10s
scrape_configs:
- job_name: 'flask-app'
static_configs:
- targets: ['flask-app:8000']
metrics_path: /metrics
EOF
# Bước 4: Tạo docker-compose.yml
cat > docker-compose.yml <<'EOF'
version: '3.8'
services:
flask-app:
build: .
ports:
- "8000:8000"
container_name: flask-app
prometheus:
image: prom/prometheus:v2.51.0
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.enable-lifecycle'
container_name: prometheus
EOF
# Bước 5: Khởi động
docker compose up -d --build
docker compose ps
# Bước 6: Tạo traffic để có data
for i in {1..50}; do curl -s http://localhost:8000/ > /dev/null; done
# Hoặc dùng load generator liên tục
watch -n 0.5 'curl -s http://localhost:8000/ > /dev/null' &
# Bước 7: Mở Prometheus UI http://localhost:9090
# Kiểm tra target: Status → Targets
# flask-app phải ở trạng thái "UP"
# Bước 8: Chạy PromQL queries trong UI
# --- Query 1: Request rate trong 1 phút ---
# rate(app_requests_total[1m])
# --- Query 2: Error rate (%) ---
# sum(rate(app_requests_total{status="500"}[1m])) /
# sum(rate(app_requests_total[1m])) * 100
# --- Query 3: p95 latency ---
# histogram_quantile(0.95, sum(rate(app_request_latency_seconds_bucket[5m])) by (le))
# --- Query 4: Total requests by status ---
# sum by(status) (rate(app_requests_total[5m]))
✅ Kết quả mong đợi: Prometheus UI tại http://localhost:9090 hiển thị target flask-app trạng thái UP; query rate(app_requests_total[1m]) trả về time-series có giá trị; error rate dao động quanh 5% (đúng với code giả lập); p95 latency < 350ms.
🧹 Cleanup:
kill %1 # dừng watch loop nếu có
docker compose down -v
cd .. && rm -rf lab-106