İ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
- Rakip Analizi Kontrol Panelini Oluşturun Captchaai
- Captchaai İzleme Datadog Metrik Uyarıları
- Captchaai Kullanım Kontrol Paneli İzleme Oluşturma
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: