Eğitimler

CAPTCHA Çözme Performans Trendleri için Zaman Serisi Verileri

Belirli bir noktaya ait ölçümler size şu anda neler olduğunu anlatır. Zaman serisi verileri size neyin değiştiğini, ne zaman değiştiğini ve bir şeyin soruna doğru ilerleyip ilerlemediğini söyler. CAPTCHA çözüm oranlarını, gecikmeyi ve zaman içindeki maliyeti takip ederek bozulmayı satış hattınızı etkilemeden önce yakalayın.

Ne Takip Edilmeli?

Metrik Tür neden
Çözme oranı (%) Ölçer Sağlayıcı kalitesindeki değişiklikleri tespit edin
Gecikmeyi çözme (ms) Histogram Yavaşlamaları tespit edin, zaman aşımlarını planlayın
Kod bazında hata oranı Sayaç Ortaya çıkan hata modellerini tanımlayın
Çözüm başına maliyet ($) Ölçer Bütçe takibi, anormallik tespiti
Kuyruk derinliği Ölçer Kapasite planlaması
Jetonların kullanımdan önce süresi doldu Sayaç TTL ayarlama sinyali
API dengesi Ölçer Yeniden doldurma tetiği

Prometheus + Python (İtme Ağ Geçidi)

Çözücünüzü Araçlandırı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

Prometheus Sorguları

# 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

Çözme Metriklerini Yaz

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)

InfluxDB Sorguları (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")

JavaScript Uygulaması (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);

Veritabanı Karşılaştırması

Özellik Prometheus AkışDB Zaman ÖlçeğiDB
Şunun için en iyisi: Operasyonel izleme IoT / yüksek kardinaliteli ölçümler SQL tabanlı analiz
Sorgu dili PromQL Akı SQL
Saklama Yapılandırma tabanlı Politika tabanlı PostgreSQL saklama
Grafana entegrasyonu Yerli Yerli Yerli
Öğrenme eğrisi Düşük Orta Düşük (SQL biliyorsanız)
Kendi kendine barındırılan Evet Evet Evet (PostgreSQL uzantısı)

Sorun giderme

Sorun Sebep Düzeltme
Kontrol panelindeki metrik boşlukları Push ağ geçidi veri almıyor Çözücü ve push ağ geçidi arasındaki ağı kontrol edin
Gecikme histogramı yanlış yüzdelik dilimleri gösteriyor Paket sınırları iş yüküyle eşleşmiyor Kovaları ayarlayın: CAPTCHA çözümü için [5, 10, 15, 20, 30, 45, 60, 90, 120]
Maliyet metrikleri gerçek harcamayla eşleşmiyor CAPTCHA türüne göre farklı fiyatlar Maliyeti türe göre etiketleyin; tür başına gerçek fiyatlandırmayı kullanın
Çok fazla kardinalite Çok fazla etiket değeri Etiketleri type, status, error_code ile sınırlayın

SSS

Hangi zaman serisi veritabanını kullanmalıyım?

Altyapı izleme için zaten sahipseniz Prometheus - CAPTCHA metriklerini eklemeniz yeterli. Bağımsız bir metrik deposu istiyorsanız InfluxDB. Zaman serisi verileri üzerinde SQL sorguları istiyorsanız TimescaleDB.

CAPTCHA ölçümlerini ne kadar süre saklamalıyım?

Yüksek çözünürlüklü verileri (saniye başına) 7 gün, toplu (saat başına) 90 gün ve günlük özetleri süresiz olarak saklayın. Bu, depolama maliyetini trend görünürlüğüyle dengeler.

Çözme oranındaki bozulmayı otomatik olarak tespit edebilir miyim?

Evet. Değişen ortalamalara ilişkin uyarılar ayarlayın; örneğin, 1 saatlik başarı oranı %90'ın altına düştüğünde veya P95 gecikmesi 45 saniyeyi aştığında uyarı verin. Hem Prometheus Alertmanager hem de InfluxDB uyarıları bunu destekler.

Sonraki Adımlar

CAPTCHA çözme performansınızı zaman içinde izleyin —CaptchaAI API anahtarınızı alınve metrikleri toplamaya başlayın.

İlgili kılavuzlar:

Bu makale için yorumlar devre dışı bırakılmıştır.