DevOps & Skalierung

Überwachung der CAPTCHA-Lösungsraten mit Prometheus und Grafana

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)

Noch keine Kommentare.