DevOps & Scaling

CaptchaAI Überwachung mit Datadog: Metriken und Warnungen

Was man nicht sieht, kann man nicht reparieren. Datadog bietet Ihnen Echtzeiteinblick in Ihre CAPTCHA-Lösungspipeline – Lösungsraten, Latenzperzentile, Fehleraufschlüsselungen und Anomaliewarnungen, die ausgelöst werden, bevor Ihre Pipeline unterbrochen wird.

Wichtige Kennzahlen zum Verfolgen

Metrisch Typ Warum es wichtig ist
captcha.solve.count Zähler Gesamtzahl der eingereichten Aufgaben
captcha.solve.success Zähler Erfolgreiche Lösungen
captcha.solve.error Zähler Fehlgeschlagene Lösungen (nach Fehlertyp)
captcha.solve.latency Histogramm Zeit von der Einreichung bis zur Lösung
captcha.queue.depth Messgerät Ausstehende Aufgaben in der Warteschlange
captcha.balance Messgerät Verbleibendes API-Guthaben
captcha.worker.active Messgerät Aktive Arbeitsprozesse

Python – DogStatsD-Integration

import os
import time
import functools
import requests
from datadog import initialize, statsd

# Initialize Datadog
initialize(
    statsd_host=os.environ.get("DD_AGENT_HOST", "localhost"),
    statsd_port=int(os.environ.get("DD_DOGSTATSD_PORT", "8125"))
)

API_KEY = os.environ["CAPTCHAAI_API_KEY"]
session = requests.Session()


def track_captcha_metrics(captcha_type="recaptcha_v2"):
    """Decorator to track solve metrics."""
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            tags = [f"captcha_type:{captcha_type}"]
            statsd.increment("captcha.solve.count", tags=tags)

            start = time.time()
            try:
                result = func(*args, **kwargs)
                elapsed = time.time() - start

                if "solution" in result:
                    statsd.increment("captcha.solve.success", tags=tags)
                    statsd.histogram("captcha.solve.latency", elapsed, tags=tags)
                else:
                    error = result.get("error", "unknown")
                    statsd.increment(
                        "captcha.solve.error",
                        tags=tags + [f"error:{error}"]
                    )
                return result
            except Exception as e:
                statsd.increment(
                    "captcha.solve.error",
                    tags=tags + [f"error:{type(e).__name__}"]
                )
                raise
        return wrapper
    return decorator


@track_captcha_metrics(captcha_type="recaptcha_v2")
def solve_recaptcha(sitekey, pageurl):
    resp = session.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:
        return {"error": data.get("request")}

    captcha_id = data["request"]
    for _ in range(60):
        time.sleep(5)
        result = session.get("https://ocr.captchaai.com/res.php", params={
            "key": API_KEY, "action": "get", "id": captcha_id, "json": 1
        }).json()
        if result.get("status") == 1:
            return {"solution": result["request"]}
        if result.get("request") != "CAPCHA_NOT_READY":
            return {"error": result.get("request")}
    return {"error": "TIMEOUT"}


def report_balance():
    """Send balance as a gauge metric."""
    resp = session.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "getbalance", "json": 1
    })
    data = resp.json()
    if data.get("status") == 1:
        balance = float(data["request"])
        statsd.gauge("captcha.balance", balance)
        return balance
    return None


def report_queue_depth(depth):
    """Report current queue depth."""
    statsd.gauge("captcha.queue.depth", depth)


def report_worker_count(active, total):
    """Report worker health."""
    statsd.gauge("captcha.worker.active", active)
    statsd.gauge("captcha.worker.total", total)

JavaScript – Datadog-Integration

const { StatsD } = require("hot-shots");
const axios = require("axios");

const API_KEY = process.env.CAPTCHAAI_API_KEY;

const dogstatsd = new StatsD({
  host: process.env.DD_AGENT_HOST || "localhost",
  port: parseInt(process.env.DD_DOGSTATSD_PORT || "8125", 10),
  prefix: "captcha.",
  globalTags: [`env:${process.env.NODE_ENV || "development"}`],
});

async function solveCaptchaWithMetrics(sitekey, pageurl, captchaType = "recaptcha_v2") {
  const tags = [`captcha_type:${captchaType}`];
  dogstatsd.increment("solve.count", 1, tags);
  const startTime = Date.now();

  try {
    const result = await solveCaptcha(sitekey, pageurl);
    const elapsed = (Date.now() - startTime) / 1000;

    if (result.solution) {
      dogstatsd.increment("solve.success", 1, tags);
      dogstatsd.histogram("solve.latency", elapsed, tags);
    } else {
      dogstatsd.increment("solve.error", 1, [...tags, `error:${result.error}`]);
    }

    return result;
  } catch (err) {
    dogstatsd.increment("solve.error", 1, [...tags, `error:${err.message}`]);
    throw err;
  }
}

async function solveCaptcha(sitekey, pageurl) {
  const submitResp = await axios.post("https://ocr.captchaai.com/in.php", null, {
    params: {
      key: API_KEY,
      method: "userrecaptcha",
      googlekey: sitekey,
      pageurl: pageurl,
      json: 1,
    },
  });

  if (submitResp.data.status !== 1) {
    return { error: submitResp.data.request };
  }

  const captchaId = submitResp.data.request;
  for (let i = 0; i < 60; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const pollResp = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "get", id: captchaId, json: 1 },
    });
    if (pollResp.data.status === 1) return { solution: pollResp.data.request };
    if (pollResp.data.request !== "CAPCHA_NOT_READY") {
      return { error: pollResp.data.request };
    }
  }
  return { error: "TIMEOUT" };
}

async function reportBalance() {
  try {
    const resp = await axios.get("https://ocr.captchaai.com/res.php", {
      params: { key: API_KEY, action: "getbalance", json: 1 },
    });
    if (resp.data.status === 1) {
      const balance = parseFloat(resp.data.request);
      dogstatsd.gauge("balance", balance);
      return balance;
    }
  } catch (err) {
    console.error("Balance check failed:", err.message);
  }
  return null;
}

// Report balance every minute
setInterval(reportBalance, 60000);

module.exports = { solveCaptchaWithMetrics, reportBalance };

Datadog Dashboard JSON

Importieren Sie diese JSON-Vorlage in Datadog, um ein CAPTCHA-Überwachungs-Dashboard zu erstellen:

{
  "title": "CaptchaAI Pipeline",
  "widgets": [
    {
      "definition": {
        "type": "timeseries",
        "title": "Solve Rate (Success vs Error)",
        "requests": [
          {"q": "sum:captcha.solve.success{*}.as_count()"},
          {"q": "sum:captcha.solve.error{*}.as_count()"}
        ]
      }
    },
    {
      "definition": {
        "type": "timeseries",
        "title": "Solve Latency (p50, p95, p99)",
        "requests": [
          {"q": "avg:captcha.solve.latency{*}"},
          {"q": "percentile:captcha.solve.latency{*},0.95"},
          {"q": "percentile:captcha.solve.latency{*},0.99"}
        ]
      }
    },
    {
      "definition": {
        "type": "query_value",
        "title": "API Balance",
        "requests": [{"q": "avg:captcha.balance{*}"}]
      }
    },
    {
      "definition": {
        "type": "timeseries",
        "title": "Queue Depth",
        "requests": [{"q": "avg:captcha.queue.depth{*}"}]
      }
    }
  ]
}

Warnungsdefinitionen

Alarm Zustand Schweregrad
Geringes Gleichgewicht captcha.balance < 10 Warnung
Kritisches Gleichgewicht captcha.balance < 2 Kritisch
Hohe Fehlerquote Fehlerquote > 10 % über 5 Minuten Warnung
Latenzspitze p95-Latenz > 120 Sekunden über 10 Minuten Warnung
Warteschlangensicherung Die Warteschlangentiefe > 100 wächst 5 Minuten lang Warnung
Arbeiter unten captcha.worker.active == 0 Kritisch
# Datadog monitor definition (API create)
- type: metric alert
  name: "CaptchaAI Low Balance"
  query: "avg(last_5m):avg:captcha.balance{*} < 10"
  message: "CaptchaAI balance is low: {{value}}. Top up to avoid solve failures."
  tags:

    - team:scraping
    - service:captcha

Fehlerbehebung

Problem Ursache Lösung
Metriken erscheinen nicht in Datadog API-Key fehlt oder statsd-Port nicht erreichbar Datadog-Agent-Status prüfen, UDP-Port 8125 freigeben
Latenz-Alerts führen zu viele False Positives Schwellenwert zu niedrig für normale Varianz P95-Latenz-Baseline bestimmen, Schwellenwert entsprechend anpassen
Dashboard zeigt keine Daten Tag-Filter oder Metrikname falsch Metriknamen und Tags in Datadog-Metrics-Explorer validieren
Alert löst nicht aus Evaluation-Fenster zu kurz Fenster auf mind. 5 Minuten verlängern, rollup-Methode prüfen

Verwandte Leitfäden

  • CaptchaAI-Monitoring mit New Relic APM
  • CaptchaAI-Benachrichtigungen mit PagerDuty
  • Grafana-Dashboard-Vorlagen für CaptchaAI
Kommentare sind für diesen Artikel deaktiviert.

Verwandte Beiträge

DevOps & Scaling Azure Functions + CaptchaAI: Cloud-Integration
Captcha AI in Azure Functions integrieren – serverlose CAPTCHA-Lösung mit Python, Key Vault, Queue Storage und Application Insights.

Captcha AI in Azure Functions integrieren – serverlose CAPTCHA-Lösung mit Python, Key Vault, Queue Storage und...

May 02, 2026
DevOps & Scaling Auto-Scaling CAPTCHA-Solver-Worker
CAPTCHA-Worker dynamisch skalieren – Thread-basiertes und prozessbasiertes Auto-Scaling mit Warteschlangentiefe, Auslastungssignalen und Kontostandprüfung.

CAPTCHA-Worker dynamisch skalieren – Thread-basiertes und prozessbasiertes Auto-Scaling mit Warteschlangentief...

May 01, 2026