[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog:post:vi:tu-dong-hoa-kiem-tra-suc-khoe-proxy-voi-prometheus-va-roproxy":3},{"slug":4,"lang":5,"title":6,"summary":7,"date":8,"tags":9,"tag_slugs":15,"thumbnail_url":16,"translations":17,"body":18,"asset_base":19},"tu-dong-hoa-kiem-tra-suc-khoe-proxy-voi-prometheus-va-roproxy","vi","Tự động hóa kiểm tra sức khỏe proxy với Prometheus và RoProxy","Hướng dẫn xây dựng hệ thống health-check tự động cho proxy pool, thu thập metric latency, error rate và tự động loại IP xấu bằng Prometheus, Grafana và RoProxy.","2026-08-18",[10,11,12,13,14],"proxy","health-check","prometheus","grafana","roproxy",[10,11,12,13,14],"https://blog-api.ro-proxy.com/api/blog/posts/tu-dong-hoa-kiem-tra-suc-khoe-proxy-voi-prometheus-va-roproxy/thumbnail.svg?lang=vi",[5],"## Giới thiệu\n\nKhi vận hành một proxy pool quy mô lớn (hàng trăm đến hàng nghìn IP), việc biết được proxy nào vẫn khỏe, proxy nào bị chậm hoặc bị block là yếu tố quyết định thành bại của các tác vụ scraping, test API hay giám sát SEO. Nếu không có cơ chế health-check tự động, bạn sẽ phải thủ công kiểm tra, dẫn đến lãng phí tài nguyên và rủi ro dữ liệu không chính xác.\n\nBài viết này trình bày quy trình xây dựng một hệ thống **health-check tự động** sử dụng **Prometheus** để thu thập metric, **Grafana** để trực quan hóa và **Alertmanager** để cảnh báo, đồng thời tận dụng **RoProxy API** để bật/tắt hoặc xoá proxy không đạt yêu cầu. Toàn bộ quy trình được viết dưới dạng infrastructure-as-code để dễ dàng triển khai trên Kubernetes, Docker Compose hay VM đơn lẻ.\n\n## Kiến trúc hệ thống health-check\n\n```\n+----------------+      +----------------+      +----------------+      +----------------+\n|  Proxy Exporter| ---> |   Prometheus   | ---> |    Grafana     | ---> |  Alertmanager  |\n+----------------+      +----------------+      +----------------+      +----------------+\n        |                       ^                        ^                |\n        |                       |                        |                |\n        v                       |                        |                v\n+----------------+      +----------------+      +----------------+  +----------------+\n|  RoProxy API   | \u003C--- |  Remediation   | \u003C--- |  Alert Rules   |  |  Notification  |\n+----------------+      +----------------+      +----------------+  +----------------+\n```\n\n* **Proxy Exporter**: dịch vụ nhẹ (Python/Go) định kỳ gọi endpoint của RoProxy để đo latency, tỷ lệ thành công, mã trạng thái HTTP.\n* **Prometheus**: scrape metric từ exporter theo chu kỳ cấu hình (mặc định 30s).\n* **Grafana**: dashboard hiển thị latency trung bình, error rate, số lượng proxy active/inactive.\n* **Alertmanager**: nhận cảnh báo từ Prometheus, kích hoạt script remediation gọi RoProxy API để disable/remove proxy xấu.\n\n## Bước 1: Triển khai Proxy Exporter\n\nDưới đây là một exporter Python đơn giản sử dụng `requests` và `prometheus_client`. Nó đọc danh sách proxy từ RoProxy (hoặc file config), gửi request test đến một target an toàn (ví dụ `https://httpbin.org/ip`) và xuất metric.\n\n```python\n# proxy_exporter.py\nimport os\nimport time\nimport requests\nfrom prometheus_client import start_http_server, Gauge, CollectorRegistry\n\nROPROXY_API = os.getenv(\"ROPROXY_API\", \"https://api.roproxy.com/v1/proxies\")\nAPI_KEY = os.getenv(\"ROPROXY_API_KEY\")\nTARGET_URL = os.getenv(\"TARGET_URL\", \"https://httpbin.org/ip\")\nSCRAPE_INTERVAL = int(os.getenv(\"SCRAPE_INTERVAL\", \"30\"))\n\nregistry = CollectorRegistry()\nlatency = Gauge('proxy_latency_seconds', 'Latency of proxy request', ['proxy_id', 'proxy_ip'], registry=registry)\nsuccess = Gauge('proxy_success', '1 if request succeeded else 0', ['proxy_id', 'proxy_ip'], registry=registry)\n\ndef fetch_proxies():\n    headers = {\"Authorization\": f\"Bearer {API_KEY}\"}\n    resp = requests.get(ROPROXY_API, headers=headers, timeout=10)\n    resp.raise_for_status()\n    return resp.json()  # list of {id, ip, port, type}\n\ndef check_proxy(proxy):\n    proxy_url = f\"http://{proxy['ip']}:{proxy['port']}\"\n    proxies = {\"http\": proxy_url, \"https\": proxy_url}\n    start = time.time()\n    try:\n        r = requests.get(TARGET_URL, proxies=proxies, timeout=10)\n        elapsed = time.time() - start\n        ok = 1 if r.status_code == 200 else 0\n    except Exception:\n        elapsed = time.time() - start\n        ok = 0\n    latency.labels(proxy_id=proxy['id'], proxy_ip=proxy['ip']).set(elapsed)\n    success.labels(proxy_id=proxy['id'], proxy_ip=proxy['ip']).set(ok)\n\ndef main():\n    start_http_server(9100, registry=registry)\n    while True:\n        proxies = fetch_proxies()\n        for p in proxies:\n            check_proxy(p)\n        time.sleep(SCRAPE_INTERVAL)\n\nif __name__ == \"__main__\":\n    main()\n```\n\n**Giải thích nhanh**:\n- Exporter expose metric trên cổng `9100` (`/metrics`).\n- Biến môi trường giúp cấu hình linh hoạt cho các môi trường dev/staging/prod.\n- Có thể đóng gói thành Docker image và chạy như sidecar hoặc deployment riêng.\n\n## Bước 2: Cấu hình Prometheus scrape\n\nThêm job scrape vào `prometheus.yml`:\n\n```yaml\nscrape_configs:\n  - job_name: 'proxy-exporter'\n    static_configs:\n      - targets: ['proxy-exporter:9100']\n    metrics_path: /metrics\n    scrape_interval: 30s\n```\n\nNếu exporter chạy trên nhiều replica, hãy dùng service discovery (Consul, Kubernetes SD) để tự động phát hiện target.\n\n## Bước 3: Tạo dashboard Grafana\n\n1. Tạo dashboard mới → **Add panel**.\n2. Chọn metric `proxy_latency_seconds` → **Legend** `{{proxy_ip}}` → **Visualization** *Time series*.\n3. Thêm panel thứ hai cho `proxy_success` → **Stat** hiển thị tỷ lệ thành công trung bình.\n4. Panel bảng (Table) liệt kê proxy có `proxy_success == 0` trong 5 phút gần nhất.\n\nĐể tái sử dụng, xuất dashboard thành JSON và commit vào repo. Ví dụ snippet panel latency:\n\n```json\n{\n  \"title\": \"Proxy Latency (seconds)\",\n  \"type\": \"graph\",\n  \"targets\": [\n    {\n      \"expr\": \"proxy_latency_seconds\",\n      \"legendFormat\": \"{{proxy_ip}}\",\n      \"refId\": \"A\"\n    }\n  ],\n  \"gridPos\": { \"x\": 0, \"y\": 0, \"w\": 12, \"h\": 8 }\n}\n```\n\n## Bước 4: Cảnh báo tự động với Alertmanager\n\nTạo file `alert.rules.yml` cho Prometheus:\n\n```yaml\ngroups:\n- name: proxy-health\n  rules:\n  - alert: ProxyHighLatency\n    expr: proxy_latency_seconds > 5\n    for: 2m\n    labels:\n      severity: warning\n    annotations:\n      summary: \"Proxy {{ $labels.proxy_ip }} latency > 5s\"\n      description: \"Latency đã vượt ngưỡng 5 giây trong 2 phút liên tiếp.\"\n  - alert: ProxyHighErrorRate\n    expr: avg_over_time(proxy_success[5m]) \u003C 0.8\n    for: 3m\n    labels:\n      severity: critical\n    annotations:\n      summary: \"Proxy {{ $labels.proxy_ip }} error rate > 20%\"\n      description: \"Tỷ lệ thành công dưới 80% trong 5 phút.\"\n```\n\nCấu hình Alertmanager để gửi webhook đến script remediation:\n\n```yaml\nroute:\n  receiver: 'remediation-webhook'\nreceivers:\n- name: 'remediation-webhook'\n  webhook_configs:\n  - url: 'http://remediation-service:8080/alert'\n```\n\n## Bước 5: Tích hợp tự động loại bỏ proxy xấu (Remediation)\n\nService remediation nhận payload từ Alertmanager, trích xuất `proxy_ip` và gọi RoProxy API để disable hoặc delete proxy.\n\n```python\n# remediation.py (Flask)\nfrom flask import Flask, request, jsonify\nimport os\nimport requests\n\napp = Flask(__name__)\nROPROXY_API = os.getenv(\"ROPROXY_API\", \"https://api.roproxy.com/v1/proxies\")\nAPI_KEY = os.getenv(\"ROPROXY_API_KEY\")\nHEADERS = {\"Authorization\": f\"Bearer {API_KEY}\", \"Content-Type\": \"application/json\"}\n\n@app.route('/alert', methods=['POST'])\ndef alert():\n    data = request.json\n    for alert in data.get('alerts', []):\n        labels = alert.get('labels', {})\n        proxy_ip = labels.get('proxy_ip')\n        if not proxy_ip:\n            continue\n        # Tìm proxy_id từ IP (có thể cache mapping)\n        proxy_id = get_proxy_id_by_ip(proxy_ip)\n        if proxy_id:\n            # Disable proxy thay vì xóa để có thể bật lại sau\n            requests.patch(f\"{ROPROXY_API}/{proxy_id}\", headers=HEADERS, json={\"status\": \"disabled\"})\n    return jsonify({\"status\": \"ok\"})\n\ndef get_proxy_id_by_ip(ip):\n    # Giả sử có endpoint list proxies, thực tế nên cache Redis\n    resp = requests.get(ROPROXY_API, headers=HEADERS)\n    for p in resp.json():\n        if p['ip'] == ip:\n            return p['id']\n    return None\n\nif __name__ == '__main__':\n    app.run(host='0.0.0.0', port=8080)\n```\n\nTriển khai remediation cùng namespace với Alertmanager, đảm bảo network policy cho phép inbound từ Alertmanager.\n\n## Ví dụ thực tế: Giám sát pool 500 IP\n\n1. **Khởi tạo**: Tạo 500 proxy residential qua RoProxy dashboard, ghi nhận ID/IP.\n2. **Deploy exporter** với `SCRAPE_INTERVAL=30` → Prometheus thu thập ~10k metric/phút.\n3. **Dashboard** hiển thị latency trung bình 1.2s, success rate 96%.\n4. **Cảnh báo** kích hoạt khi 3 proxy latency >5s → remediation disable 3 IP.\n5. **Kết quả**: Sau 24h, pool ổn định ở 497 active proxy, không còn request thất bại do proxy chết.\n\n## Mẹo tối ưu hoá\n\n- **Sampling interval**: 30s đủ cho hầu hết use-case; giảm xuống 10s nếu cần phát hiện nhanh nhưng tăng load Prometheus.\n- **Label enrichment**: Thêm label `region`, `type` (residential/datacenter) tại exporter để lọc dashboard theo khu vực.\n- **Retention**: Cấu hình Prometheus `--storage.tsdb.retention.time=30d` để giữ lịch sử phân tích xu hướng.\n- **Cache mapping IP→ID**: Dùng Redis TTL 1h để tránh gọi RoProxy API lặp lại trong remediation.\n- **Canary test**: Trước khi disable vĩnh viễn, chạy 3 request test thêm để tránh false positive do network blip.\n\n## Kết luận\n\nViệc tự động hóa health-check proxy không chỉ giúp duy trì chất lượng pool mà còn giảm thiểu can thiệp thủ công, cho phép team tập trung vào logic scraping hay test chính. Kết hợp **Prometheus**, **Grafana**, **Alertmanager** và **RoProxy API** tạo thành một vòng lặp quan sát – cảnh báo – khắc phục hoàn toàn tự động, có thể mở rộng cho hàng chục nghìn IP. Hãy bắt đầu với exporter nhỏ, sau đó mở rộng dashboard và alert rule phù hợp với SLA của dự án bạn.\n\n---\n*Lưu ý: Các đoạn code trên là minh hoạ cốt lõi; khi đưa vào production hãy thêm logging, retry, circuit-breaker và bảo mật API key (Vault/SealedSecrets).*\n","https://blog-api.ro-proxy.com/api/blog/posts/tu-dong-hoa-kiem-tra-suc-khoe-proxy-voi-prometheus-va-roproxy/assets"]