Die Lösung von Produktions-CAPTCHAs erfordert Beobachtbarkeit. Prometheus sammelt Metriken, Grafana visualisiert sie und die Alarmierung erkennt Probleme, bevor sie sich auf Ihre Pipeline auswirken.
Zu verfolgende Metriken
| Metrisch | Typ | Zweck |
|---|---|---|
captcha_solves_total |
Zähler | Gesamte Lösungsversuche |
captcha_solves_success |
Zähler | Erfolgreiche Lösungen |
captcha_solves_errors |
Zähler | Fehlgeschlagene Lösungen (nach Fehlertyp) |
captcha_solve_duration |
Histogramm | Zeitverteilung lösen |
captcha_balance |
Messgerät | Aktueller Kontostand |
captcha_queue_length |
Messgerät | Ausstehende Aufgaben in der Warteschlange |
Python-Metrik-Exporter
# metrics.py
import time
import requests
from prometheus_client import (
Counter, Histogram, Gauge, start_http_server,
)
# Define metrics
SOLVES_TOTAL = Counter(
"captcha_solves_total",
"Total CAPTCHA solve attempts",
["method"],
)
SOLVES_SUCCESS = Counter(
"captcha_solves_success",
"Successful CAPTCHA solves",
["method"],
)
SOLVES_ERRORS = Counter(
"captcha_solves_errors",
"Failed CAPTCHA solves",
["method", "error_code"],
)
SOLVE_DURATION = Histogram(
"captcha_solve_duration_seconds",
"CAPTCHA solve duration in seconds",
["method"],
buckets=[5, 10, 15, 20, 30, 45, 60, 90, 120],
)
BALANCE = Gauge(
"captcha_balance_usd",
"Current CaptchaAI account balance in USD",
)
QUEUE_LENGTH = Gauge(
"captcha_queue_length",
"Number of pending CAPTCHA tasks",
)
class InstrumentedSolver:
"""Solver with Prometheus metric instrumentation."""
def __init__(self, api_key):
self.api_key = api_key
self.base = "https://ocr.captchaai.com"
def solve(self, method, **params):
"""Solve CAPTCHA with metric collection."""
SOLVES_TOTAL.labels(method=method).inc()
start = time.time()
try:
token = self._do_solve(method, params)
duration = time.time() - start
SOLVES_SUCCESS.labels(method=method).inc()
SOLVE_DURATION.labels(method=method).observe(duration)
return token
except Exception as e:
error_code = str(e)[:30]
SOLVES_ERRORS.labels(
method=method, error_code=error_code,
).inc()
raise
def update_balance(self):
"""Fetch and update balance metric."""
resp = requests.get(f"{self.base}/res.php", params={
"key": self.api_key,
"action": "getbalance",
"json": 1,
}, timeout=15)
balance = float(resp.json()["request"])
BALANCE.set(balance)
return balance
def _do_solve(self, method, params, timeout=120):
data = {"key": self.api_key, "method": method, "json": 1}
data.update(params)
resp = requests.post(
f"{self.base}/in.php", data=data, timeout=30,
)
result = resp.json()
if result.get("status") != 1:
raise RuntimeError(result.get("request"))
task_id = result["request"]
start = time.time()
while time.time() - start < timeout:
time.sleep(5)
resp = requests.get(f"{self.base}/res.php", params={
"key": self.api_key,
"action": "get",
"id": task_id,
"json": 1,
}, timeout=15)
data = resp.json()
if data["request"] != "CAPCHA_NOT_READY":
if data.get("status") == 1:
return data["request"]
raise RuntimeError(data["request"])
raise TimeoutError("Solve timeout")
# Start metrics server on port 8000
start_http_server(8000)
print("Metrics server running on :8000/metrics")
Prometheus-Konfiguration
# prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: "captcha-solver"
static_configs:
- targets: ["solver-app:8000"]
scrape_interval: 10s
Docker Compose Stack
# docker-compose.yml
version: "3.8"
services:
solver:
build: .
environment:
- CAPTCHAAI_KEY=${CAPTCHAAI_KEY}
ports:
- "8000:8000"
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana-data:/var/lib/grafana
volumes:
grafana-data:
Grafana-Dashboard-Abfragen
Erfolgsquote (PromQL)
rate(captcha_solves_success[5m])
/ rate(captcha_solves_total[5m]) * 100
Durchschnittliche Lösungszeit
rate(captcha_solve_duration_seconds_sum[5m])
/ rate(captcha_solve_duration_seconds_count[5m])
Fehlerrate nach Typ
sum by (error_code) (
rate(captcha_solves_errors[5m])
)
Balance im Laufe der Zeit
captcha_balance_usd
P95 Lösungsdauer
histogram_quantile(0.95,
rate(captcha_solve_duration_seconds_bucket[5m])
)
Alarmierungsregeln
# alert_rules.yml
groups:
- name: captcha-alerts
rules:
- alert: LowBalance
expr: captcha_balance_usd < 5
for: 5m
labels:
severity: warning
annotations:
summary: "CaptchaAI balance below $5"
- alert: HighErrorRate
expr: |
rate(captcha_solves_errors[5m])
/ rate(captcha_solves_total[5m]) > 0.1
for: 10m
labels:
severity: critical
annotations:
summary: "CAPTCHA error rate above 10%"
- alert: SlowSolveTime
expr: |
histogram_quantile(0.95,
rate(captcha_solve_duration_seconds_bucket[5m])
) > 60
for: 15m
labels:
severity: warning
annotations:
summary: "P95 solve time exceeds 60s"
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| Keine Metriken bei /metrics | Server nicht gestartet | Rufen Sie start_http_server(8000) an |
| Prometheus zeigt „unten“ | Falsche Zieladresse | Überprüfen Sie das Docker-Netzwerk und den Docker-Port |
| Grafana zeigt keine Daten | Prometheus nicht als Quelle hinzugefügt | Prometheus-Datenquelle in Grafana hinzufügen |
| Metriken werden beim Neustart zurückgesetzt | Zähler-Resets werden erwartet | Verwenden Sie rate(), keine Rohzähler |
FAQ
Wie viel Mehraufwand verursacht Prometheus?
Vernachlässigbar. Die prometheus_client-Bibliothek fügt <1 ms pro Metrikoperation hinzu. Das Kratzen alle 10–15 Sekunden hat keine nennenswerten Auswirkungen.
Kann ich dies mit mehreren Worker-Instanzen verwenden?
Ja. Jeder Worker stellt seinen eigenen /metrics-Endpunkt bereit. Prometheus kratzt alle Ziele ab. Grafana-Abfragen werden automatisch über alle Instanzen hinweg aggregiert.
Mit welchem Dashboard soll ich beginnen?
Beginnen Sie mit vier Bereichen: Erfolgsquote, durchschnittliche Lösungszeit, Fehleraufschlüsselung und Balance. Fügen Sie bei der Skalierung Warteschlangentiefe und Durchsatz hinzu.
Verwandte Leitfäden
- CaptchaAI Alerts und PagerDuty-Integration
- Auto-Scaling-Worker
Vollständige Beobachtbarkeit – CaptchaAI mit Prometheus überwachen.
Diskussionen (0)
Beteiligen Sie sich an der Unterhaltung
Melden Sie sich an, um Ihre Meinung zu teilen.
AnmeldenNoch keine Kommentare.