Số liệu tại thời điểm cho bạn biết điều gì đang xảy ra. Dữ liệu chuỗi thời gian cho bạn biết điều gì đã thay đổi, thời điểm thay đổi và liệu điều gì đó có xu hướng dẫn đến vấn đề hay không. Theo dõi tốc độ giải quyết CAPTCHA, độ trễ và chi phí theo thời gian để nắm bắt tình trạng xuống cấp trước khi nó ảnh hưởng đến quy trình của bạn.
Những gì cần theo dõi
| Số liệu | loại | tại sao |
|---|---|---|
| Tỷ lệ giải quyết (%) | Máy đo | Phát hiện những thay đổi về chất lượng nhà cung cấp |
| Giải quyết độ trễ (ms) | biểu đồ | Phát hiện tình trạng chậm lại, lập kế hoạch thời gian chờ |
| Tỷ lệ lỗi theo mã | quầy | Xác định các mẫu lỗi mới nổi |
| Chi phí cho mỗi lần giải ($) | Máy đo | Theo dõi ngân sách, phát hiện bất thường |
| Độ sâu hàng đợi | Máy đo | Quy hoạch năng lực |
| Mã thông báo đã hết hạn trước khi sử dụng | quầy | Tín hiệu điều chỉnh TTL |
| Cân bằng API | Máy đo | Kích hoạt nạp tiền |
Prometheus + Python (Cổng đẩy)
Công cụ Bộ giải của bạn
import os
import time
import requests
from prometheus_client import CollectorRegistry, Counter, Histogram, Gauge, push_to_gateway
registry = CollectorRegistry()
SOLVE_TOTAL = Counter(
"captcha_solve_total", "Total CAPTCHA solve attempts",
["type", "status"], registry=registry
)
SOLVE_LATENCY = Histogram(
"captcha_solve_latency_seconds", "CAPTCHA solve latency",
["type"], buckets=[5, 10, 15, 20, 30, 45, 60, 90, 120],
registry=registry
)
SOLVE_COST = Counter(
"captcha_solve_cost_dollars", "Total cost of CAPTCHA solves",
["type"], registry=registry
)
API_BALANCE = Gauge(
"captcha_api_balance_dollars", "CaptchaAI account balance",
registry=registry
)
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
PUSHGATEWAY = os.environ.get("PUSHGATEWAY_URL", "localhost:9091")
def solve_with_metrics(sitekey, pageurl, captcha_type="recaptcha_v2"):
start = time.time()
resp = requests.post("https://ocr.captchaai.com/in.php", data={
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1
})
data = resp.json()
if data.get("status") != 1:
SOLVE_TOTAL.labels(type=captcha_type, status="submit_error").inc()
push_metrics()
return {"error": data.get("request")}
captcha_id = data["request"]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get",
"id": captcha_id, "json": 1
}).json()
if result.get("status") == 1:
elapsed = time.time() - start
SOLVE_TOTAL.labels(type=captcha_type, status="solved").inc()
SOLVE_LATENCY.labels(type=captcha_type).observe(elapsed)
SOLVE_COST.labels(type=captcha_type).inc(0.00299)
push_metrics()
return {"solution": result["request"]}
if result.get("request") != "CAPCHA_NOT_READY":
SOLVE_TOTAL.labels(type=captcha_type, status="error").inc()
push_metrics()
return {"error": result.get("request")}
SOLVE_TOTAL.labels(type=captcha_type, status="timeout").inc()
push_metrics()
return {"error": "TIMEOUT"}
def push_metrics():
try:
push_to_gateway(PUSHGATEWAY, job="captcha_solver", registry=registry)
except Exception:
pass # Don't fail solving because metrics push failed
def update_balance():
resp = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "getbalance"
})
try:
balance = float(resp.text)
API_BALANCE.set(balance)
push_metrics()
except ValueError:
pass
Truy vấn Prometheus
# Success rate over last hour
rate(captcha_solve_total{status="solved"}[1h])
/ rate(captcha_solve_total[1h]) * 100
# P95 solve latency
histogram_quantile(0.95, rate(captcha_solve_latency_seconds_bucket[1h]))
# Error rate by type
rate(captcha_solve_total{status="error"}[1h])
# Hourly cost
increase(captcha_solve_cost_dollars_total[1h])
InfluxDB + Python
Viết Giải số liệu
from influxdb_client import InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS
INFLUX_URL = os.environ.get("INFLUX_URL", "http://localhost:8086")
INFLUX_TOKEN = os.environ.get("INFLUX_TOKEN", "")
INFLUX_ORG = os.environ.get("INFLUX_ORG", "captcha")
INFLUX_BUCKET = os.environ.get("INFLUX_BUCKET", "captcha_metrics")
influx_client = InfluxDBClient(url=INFLUX_URL, token=INFLUX_TOKEN, org=INFLUX_ORG)
write_api = influx_client.write_api(write_options=SYNCHRONOUS)
def record_solve_metric(captcha_type, status, elapsed_ms, cost=0.0, error=None):
point = (
Point("captcha_solve")
.tag("type", captcha_type)
.tag("status", status)
.field("elapsed_ms", elapsed_ms)
.field("cost", cost)
.field("success", 1 if status == "solved" else 0)
)
if error:
point = point.tag("error_code", error)
write_api.write(bucket=INFLUX_BUCKET, record=point)
def record_balance(balance):
point = Point("captcha_balance").field("balance", balance)
write_api.write(bucket=INFLUX_BUCKET, record=point)
Truy vấn InfluxDB (Flux)
// Success rate over last 24 hours (1-hour windows)
from(bucket: "captcha_metrics")
|> range(start: -24h)
|> filter(fn: (r) => r._measurement == "captcha_solve" and r._field == "success")
|> aggregateWindow(every: 1h, fn: mean)
|> map(fn: (r) => ({r with _value: r._value * 100.0}))
|> yield(name: "success_rate")
// Average solve time by type
from(bucket: "captcha_metrics")
|> range(start: -24h)
|> filter(fn: (r) => r._measurement == "captcha_solve" and r._field == "elapsed_ms" and r.status == "solved")
|> group(columns: ["type"])
|> aggregateWindow(every: 1h, fn: mean)
|> yield(name: "avg_latency")
// Cumulative cost
from(bucket: "captcha_metrics")
|> range(start: -24h)
|> filter(fn: (r) => r._measurement == "captcha_solve" and r._field == "cost")
|> cumulativeSum()
|> yield(name: "cumulative_cost")
Triển khai JavaScript (Prometheus)
const client = require("prom-client");
const axios = require("axios");
const register = new client.Registry();
const API_KEY = process.env.CAPTCHAAI_API_KEY;
const solveTotal = new client.Counter({
name: "captcha_solve_total",
help: "Total CAPTCHA solve attempts",
labelNames: ["type", "status"],
registers: [register],
});
const solveLatency = new client.Histogram({
name: "captcha_solve_latency_seconds",
help: "CAPTCHA solve latency",
labelNames: ["type"],
buckets: [5, 10, 15, 20, 30, 45, 60, 90, 120],
registers: [register],
});
async function solveWithMetrics(sitekey, pageurl, type = "recaptcha_v2") {
const start = Date.now();
const submit = await axios.post("https://ocr.captchaai.com/in.php", null, {
params: { key: API_KEY, method: "userrecaptcha", googlekey: sitekey, pageurl, json: 1 },
});
if (submit.data.status !== 1) {
solveTotal.inc({ type, status: "submit_error" });
return { error: submit.data.request };
}
const captchaId = submit.data.request;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
const poll = await axios.get("https://ocr.captchaai.com/res.php", {
params: { key: API_KEY, action: "get", id: captchaId, json: 1 },
});
if (poll.data.status === 1) {
const elapsed = (Date.now() - start) / 1000;
solveTotal.inc({ type, status: "solved" });
solveLatency.observe({ type }, elapsed);
return { solution: poll.data.request };
}
if (poll.data.request !== "CAPCHA_NOT_READY") {
solveTotal.inc({ type, status: "error" });
return { error: poll.data.request };
}
}
solveTotal.inc({ type, status: "timeout" });
return { error: "TIMEOUT" };
}
// Expose metrics endpoint
const express = require("express");
const app = express();
app.get("/metrics", async (req, res) => {
res.set("Content-Type", register.contentType);
res.end(await register.metrics());
});
app.listen(9090);
So sánh cơ sở dữ liệu
| tính năng | Prometheus | FluxDB | Thang thời gianDB |
|---|---|---|---|
| Tốt nhất cho | Giám sát vận hành | Số liệu IoT / lượng số cao | Phân tích dựa trên SQL |
| Ngôn ngữ truy vấn | PromQL | thông lượng | SQL |
| giữ lại | Dựa trên cấu hình | Dựa trên chính sách | Lưu giữ PostgreSQL |
| Tích hợp Grafana | Bản địa | Bản địa | Bản địa |
| Đường cong học tập | Thấp | Trung bình | Thấp (nếu bạn biết SQL) |
| Tự lưu trữ | Có | Có | Có (phần mở rộng PostgreSQL) |
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Khoảng trống số liệu trong trang tổng quan | Cổng đẩy không nhận được dữ liệu | Kiểm tra mạng giữa bộ giải và cổng đẩy |
| Biểu đồ độ trễ hiển thị phần trăm sai | Ranh giới nhóm không khớp với khối lượng công việc | Điều chỉnh nhóm: [5, 10, 15, 20, 30, 45, 60, 90, 120] để giải CAPTCHA |
| Số liệu chi phí không khớp với chi tiêu thực tế | Các mức giá khác nhau cho mỗi loại CAPTCHA | Chi phí gắn thẻ theo loại; sử dụng giá thực tế cho mỗi loại |
| Quá nhiều bản số | Quá nhiều giá trị nhãn | Giới hạn nhãn ở type, status, error_code |
Câu hỏi thường gặp
Tôi nên sử dụng cơ sở dữ liệu chuỗi thời gian nào?
Prometheus nếu bạn đã có nó để giám sát cơ sở hạ tầng - chỉ cần thêm số liệu CAPTCHA. InfluxDB nếu bạn muốn lưu trữ số liệu độc lập. TimescaleDB nếu bạn muốn truy vấn SQL trên dữ liệu chuỗi thời gian.
Tôi nên lưu giữ số liệu CAPTCHA trong bao lâu?
Lưu giữ dữ liệu có độ phân giải cao (mỗi giây) trong 7 ngày, tổng hợp (mỗi giờ) trong 90 ngày và các bản tóm tắt hàng ngày vô thời hạn. Điều này cân bằng chi phí lưu trữ với khả năng hiển thị xu hướng.
Tôi có thể tự động phát hiện sự suy giảm tốc độ giải quyết không?
Vâng. Đặt cảnh báo theo mức trung bình luân phiên - ví dụ: cảnh báo khi tỷ lệ thành công trong 1 giờ giảm xuống dưới 90% hoặc khi độ trễ P95 vượt quá 45 giây. Cả cảnh báo Prometheus Alertmanager và InfluxDB đều hỗ trợ điều này.
Các bước tiếp theo
Theo dõi hiệu suất giải CAPTCHA của bạn theo thời gian —lấy khóa API CaptchaAI của bạnvà bắt đầu thu thập số liệu.
Hướng dẫn liên quan: