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: