DevOps & Mise à l'Échelle

Surveillance des taux de résolution de CAPTCHA avec Prometheus et Grafana

La résolution de CAPTCHA en production nécessite de l'observabilité. Prometheus collecte des métriques, Grafana les visualise et les alertes détectent les problèmes avant qu'ils n'impactent votre pipeline.


Mesures à suivre

Métrique Tapez Objectif
captcha_solves_total Compteur Nombre total de tentatives de résolution
captcha_solves_success Compteur Des solutions réussies
captcha_solves_errors Compteur Résolutions ayant échoué (par type d'erreur)
captcha_solve_duration Histogramme Résoudre la distribution du temps
captcha_balance Jauge Solde du compte courant
captcha_queue_length Jauge Tâches en attente dans la file d'attente

Exportateur de métriques Python

# 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")

Configuration de Prométhée

# prometheus.yml
global:
  scrape_interval: 15s

scrape_configs:

  - job_name: "captcha-solver"
    static_configs:

      - targets: ["solver-app:8000"]
    scrape_interval: 10s

Pile de composition Docker

# 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:

Requêtes du tableau de bord Grafana

Taux de réussite (PromQL)

rate(captcha_solves_success[5m])
/ rate(captcha_solves_total[5m]) * 100

Temps de résolution moyen

rate(captcha_solve_duration_seconds_sum[5m])
/ rate(captcha_solve_duration_seconds_count[5m])

Taux d'erreur par type

sum by (error_code) (
  rate(captcha_solves_errors[5m])
)

Équilibre au fil du temps

captcha_balance_usd

P95 Durée de résolution

histogram_quantile(0.95,
  rate(captcha_solve_duration_seconds_bucket[5m])
)

Règles d'alerte

# 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"

Dépannage

Problème Parce que Corriger
Aucune métrique sur /metrics Le serveur n'a pas démarré Appeler start_http_server(8000)
Prométhée se montre "à terre" Mauvaise adresse cible Vérifiez le réseau et le port Docker
Grafana n'affiche aucune donnée Prométhée non ajouté comme source Ajouter une source de données Prometheus dans Grafana
Les métriques sont réinitialisées au redémarrage Réinitialisations du compteur attendues Utilisez rate() et non des compteurs bruts

FAQ

Combien de frais généraux Prometheus ajoute-t-il ?

Négligeable. La bibliothèque prometheus_client ajoute <1 ms par opération métrique. Gratter toutes les 10 à 15 secondes n’a aucun impact significatif.

Puis-je l'utiliser avec plusieurs instances de travail ?

Oui. Chaque travailleur expose son propre point de terminaison /metrics. Prometheus gratte toutes les cibles. Les requêtes Grafana se regroupent automatiquement sur toutes les instances.

Par quel tableau de bord dois-je commencer ?

Commencez avec quatre panneaux : taux de réussite, temps de résolution moyen, répartition des erreurs et équilibre. Ajoutez de la profondeur et du débit à la file d’attente à mesure que vous évoluez.


Guides connexes

  • Création d'un tableau de bord d'utilisation
  • Travailleurs à mise à l'échelle automatique

Observabilité totale –surveiller CaptchaAIavec Prométhée aujourd'hui.

Les commentaires sont désactivés pour cet article.