Hướng Dẫn Thực Hành

Dữ liệu chuỗi thời gian cho CAPTCHA giải quyết xu hướng hiệu suất

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ó (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:

Os comentários estão desativados para este artigo.