DevOps ve Ölçeklendirme

CaptchaAI Metrikleri için Grafana Kontrol Paneli Şablonları

İyi tasarlanmış bir Grafana kontrol paneli size bir bakışta CAPTCHA kanalınızda tam olarak neler olduğunu gösterir - çözüm oranları, gecikme yüzdelikleri, denge eğilimleri ve hata dökümleri. Bu şablonlar, veri kaynağı olarak Prometheus ile içe aktarılmaya hazırdır.

Kontrol Paneli Düzeni

┌───────────────────────────────────────────────┐
│ Row 1: Overview                               │
│ [Solve Rate %] [Balance $] [Queue Depth] [TPM]│
├───────────────────────────────────────────────┤
│ Row 2: Performance                            │
│ [Latency P50/P95/P99]  [Solve Rate Over Time] │
├───────────────────────────────────────────────┤
│ Row 3: Errors                                 │
│ [Error Rate %]  [Error Breakdown by Type]      │
├───────────────────────────────────────────────┤
│ Row 4: Workers                                │
│ [Active Workers]  [Tasks Per Worker]           │
└───────────────────────────────────────────────┘

Prometheus Metrik Kurulumu

Öncelikle CAPTCHA çözücünüzdeki metrikleri ortaya çıkarın:

Python – Prometheus İstemcisi

import os
import time
import requests
from prometheus_client import (
    Counter, Histogram, Gauge, start_http_server
)

API_KEY = os.environ["CAPTCHAAI_API_KEY"]

# Define metrics
captcha_solves = Counter(
    "captcha_solves_total",
    "Total CAPTCHA solve attempts",
    ["captcha_type", "status"]
)
captcha_latency = Histogram(
    "captcha_solve_duration_seconds",
    "CAPTCHA solve latency",
    ["captcha_type"],
    buckets=[5, 10, 15, 20, 30, 45, 60, 90, 120, 180, 300]
)
captcha_balance = Gauge(
    "captcha_balance_dollars",
    "CaptchaAI account balance"
)
captcha_queue_depth = Gauge(
    "captcha_queue_depth",
    "Pending tasks in queue"
)
captcha_workers_active = Gauge(
    "captcha_workers_active",
    "Number of active workers"
)

session = requests.Session()


def solve_with_metrics(sitekey, pageurl, captcha_type="recaptcha_v2"):
    start = time.time()

    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:
        captcha_solves.labels(captcha_type, "error").inc()
        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:
            elapsed = time.time() - start
            captcha_solves.labels(captcha_type, "success").inc()
            captcha_latency.labels(captcha_type).observe(elapsed)
            return {"solution": result["request"]}

        if result.get("request") != "CAPCHA_NOT_READY":
            captcha_solves.labels(captcha_type, "error").inc()
            return {"error": result.get("request")}

    captcha_solves.labels(captcha_type, "timeout").inc()
    return {"error": "TIMEOUT"}


def update_balance():
    resp = session.get("https://ocr.captchaai.com/res.php", params={
        "key": API_KEY, "action": "getbalance", "json": 1
    })
    if resp.json().get("status") == 1:
        captcha_balance.set(float(resp.json()["request"]))


# Start metrics server on port 9090
start_http_server(9090)

JavaScript

const promClient = require("prom-client");
const axios = require("axios");

const API_KEY = process.env.CAPTCHAAI_API_KEY;
const register = new promClient.Registry();

const solvesTotal = new promClient.Counter({
  name: "captcha_solves_total",
  help: "Total CAPTCHA solve attempts",
  labelNames: ["captcha_type", "status"],
  registers: [register],
});

const solveLatency = new promClient.Histogram({
  name: "captcha_solve_duration_seconds",
  help: "CAPTCHA solve latency",
  labelNames: ["captcha_type"],
  buckets: [5, 10, 15, 20, 30, 45, 60, 90, 120, 180, 300],
  registers: [register],
});

const balance = new promClient.Gauge({
  name: "captcha_balance_dollars",
  help: "CaptchaAI account balance",
  registers: [register],
});

const queueDepth = new promClient.Gauge({
  name: "captcha_queue_depth",
  help: "Pending tasks in queue",
  registers: [register],
});

async function solveWithMetrics(sitekey, pageurl, captchaType = "recaptcha_v2") {
  const end = solveLatency.startTimer({ captcha_type: captchaType });

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

    if (resp.data.status !== 1) {
      solvesTotal.inc({ captcha_type: captchaType, status: "error" });
      return { error: resp.data.request };
    }

    const captchaId = resp.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) {
        end();
        solvesTotal.inc({ captcha_type: captchaType, status: "success" });
        return { solution: poll.data.request };
      }
      if (poll.data.request !== "CAPCHA_NOT_READY") {
        solvesTotal.inc({ captcha_type: captchaType, status: "error" });
        return { error: poll.data.request };
      }
    }
    solvesTotal.inc({ captcha_type: captchaType, status: "timeout" });
    return { error: "TIMEOUT" };
  } catch (err) {
    solvesTotal.inc({ captcha_type: captchaType, status: "error" });
    throw err;
  }
}

// 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);

Grafana Paneli Sorguları (PromQL)

Satır 1: Genel Bakış İstatistikleri

Çözme Oranı (İstatistik paneli):

sum(rate(captcha_solves_total{status="success"}[5m]))
/
sum(rate(captcha_solves_total[5m]))

* 100

Denge (Gösterge paneli):

captcha_balance_dollars

Sıra Derinliği (İstatistik paneli):

captcha_queue_depth

Dakika Başına Görev (İstatistik paneli):

sum(rate(captcha_solves_total[5m])) * 60

Satır 2: Performans

Gecikme Yüzdelikleri (Zaman serisi):

# p50
histogram_quantile(0.50, rate(captcha_solve_duration_seconds_bucket[5m]))

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

# p99
histogram_quantile(0.99, rate(captcha_solve_duration_seconds_bucket[5m]))

Zaman İçinde Çözme Oranı (Zaman serisi):

sum(rate(captcha_solves_total{status="success"}[5m])) by (captcha_type) * 60

3. Satır: Hatalar

Hata Oranı (Zaman serisi):

sum(rate(captcha_solves_total{status!="success"}[5m]))
/
sum(rate(captcha_solves_total[5m]))

* 100

Hata Dökümü (Pasta grafiği):

sum by (status) (increase(captcha_solves_total{status!="success"}[1h]))

Sıra 4: İşçiler

Aktif Çalışanlar (Zaman serisi):

captcha_workers_active

Uyarı Kuralları (Grafana Uyarısı)

# Grafana alert rules
groups:

  - name: captcha-alerts
    rules:

      - alert: LowBalance
        expr: captcha_balance_dollars < 10
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CaptchaAI balance low: {{ $value }}"

      - alert: HighErrorRate
        expr: |
          sum(rate(captcha_solves_total{status!="success"}[5m]))
          / sum(rate(captcha_solves_total[5m]))
          > 0.1
        for: 5m
        labels:
          severity: critical

      - alert: HighLatency
        expr: |
          histogram_quantile(0.95,
            rate(captcha_solve_duration_seconds_bucket[5m])
          ) > 120
        for: 10m
        labels:
          severity: warning

Sorun giderme

Sorun Sebep Düzeltme
Panellerde "Veri yok" Prometheus metriklerin uç noktasını kazımıyor prometheus.yml hedeflerini kontrol edin; /metrics'nin verileri döndürdüğünü doğrulayın
Gecikme yüzde dilimleri yanlış Yanlış rate() penceresi veya eksik paketler [5m] oran penceresini kullanın; daha ince taneli kovalar ekleyin
Kontrol paneli değişkenleri çalışmıyor Şablon değişkeni sorgusu hatalı label_values(captcha_solves_total, captcha_type)'yi kullanın
Uyarılar etkinleşmiyor Uyarı değerlendirme aralığı çok uzun Değerlendirme aralığını 1 dakikaya ayarlayın

SSS

Bu kontrol panellerini bir JSON dosyasından içe aktarabilir miyim?

Evet. Grafana, JSON kontrol panelinin içe aktarılmasını destekler. Kullanıcı arayüzünde kontrol panelini oluşturun, JSON olarak dışa aktarın ve ardından diğer Grafana örneklerine içe aktarın.

Hangi Prometheus kazıma aralığını kullanmalıyım?

15 saniye standarttır. Daha düşük hacimli CAPTCHA ardışık düzenleri için 30 saniye iyi sonuç verir. Gerçek zamanlı görünürlüğe ihtiyacınız olmadığı sürece 10 saniyenin altına inmeyin.

Kendi kendine barındırılanlar yerine Grafana Cloud'u kullanabilir miyim?

Evet. Grafana Cloud, Prometheus uzaktan yazmayı destekler. Ölçümleri Prometheus'unuzdan Grafana Cloud'a gönderin ve aynı PromQL sorgularını kullanın.

İlgili Makaleler

Sonraki Adımlar

CAPTCHA işlem hattınızı görselleştirin —CaptchaAI API anahtarınızı alınve Grafana kontrol panellerini ayarlayın.

İlgili kılavuzlar:

Bu makale için yorumlar devre dışı bırakılmıştır.