Relic APM mới cung cấp cho bạn khả năng hiển thị toàn diện về giải CAPTCHA — từ gửi API đến phân phối giải pháp. Theo dõi độ trễ giao dịch, phân tích lỗi và các sự kiện tùy chỉnh ánh xạ trực tiếp đến tình trạng quy trình giải quyết của bạn.
Những gì cần theo dõi
[Submit Task] → [Wait for Solution] → [Apply Token]
↓ ↓ ↓
Submit latency Poll duration Token usage
API errors Timeout rate Success rate
Python — Công cụ tùy chỉnh di tích mới
import os
import time
import requests
import newrelic.agent
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
session = requests.Session()
@newrelic.agent.background_task(name="captcha_solve", group="CaptchaAI")
def solve_captcha(sitekey, pageurl, captcha_type="recaptcha_v2"):
"""Solve a CAPTCHA with full New Relic instrumentation."""
# Add custom attributes for filtering
newrelic.agent.add_custom_attributes([
("captcha_type", captcha_type),
("target_url", pageurl),
])
# Submit phase
submit_result = _submit_task(sitekey, pageurl, captcha_type)
if "error" in submit_result:
newrelic.agent.record_custom_event("CaptchaSolveError", {
"error": submit_result["error"],
"phase": "submit",
"captcha_type": captcha_type,
})
return submit_result
# Poll phase
captcha_id = submit_result["captcha_id"]
poll_result = _poll_result(captcha_id, captcha_type)
# Record solve event
event_data = {
"captcha_type": captcha_type,
"captcha_id": captcha_id,
"success": "solution" in poll_result,
}
if "solution" in poll_result:
event_data["solve_time"] = poll_result.get("elapsed", 0)
newrelic.agent.record_custom_event("CaptchaSolveSuccess", event_data)
else:
event_data["error"] = poll_result.get("error", "unknown")
newrelic.agent.record_custom_event("CaptchaSolveError", event_data)
return poll_result
@newrelic.agent.function_trace(name="captcha_submit")
def _submit_task(sitekey, pageurl, captcha_type):
payload = {
"key": API_KEY,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": pageurl,
"json": 1
}
resp = session.post("https://ocr.captchaai.com/in.php", data=payload)
data = resp.json()
newrelic.agent.add_custom_attributes([
("submit_status", data.get("status")),
])
if data.get("status") != 1:
return {"error": data.get("request")}
return {"captcha_id": data["request"]}
@newrelic.agent.function_trace(name="captcha_poll")
def _poll_result(captcha_id, captcha_type):
start = time.time()
poll_count = 0
for _ in range(60):
time.sleep(5)
poll_count += 1
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
newrelic.agent.add_custom_attributes([
("poll_count", poll_count),
("solve_time_seconds", round(elapsed, 2)),
])
return {"solution": result["request"], "elapsed": elapsed}
if result.get("request") != "CAPCHA_NOT_READY":
return {"error": result.get("request")}
return {"error": "TIMEOUT"}
def report_balance():
"""Record balance as a custom event."""
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"])
newrelic.agent.record_custom_event("CaptchaBalance", {
"balance": balance,
"low": balance < 10,
})
return balance
return None
Cấu hình đại lý di tích mới
# newrelic.ini
[newrelic]
app_name = CaptchaAI Pipeline
license_key = YOUR_NEW_RELIC_LICENSE_KEY
monitor_mode = true
log_level = info
transaction_tracer.enabled = true
transaction_tracer.transaction_threshold = 5.0
custom_insights_events.enabled = true
custom_insights_events.max_samples_stored = 5000
JavaScript – Tích hợp di tích mới
const newrelic = require("newrelic");
const axios = require("axios");
const API_KEY = process.env.CAPTCHAAI_API_KEY;
async function solveCaptchaWithNewRelic(sitekey, pageurl, captchaType = "recaptcha_v2") {
return newrelic.startBackgroundTransaction(
"CaptchaSolve",
"CaptchaAI",
async () => {
const transaction = newrelic.getTransaction();
newrelic.addCustomAttributes({
captchaType,
targetUrl: pageurl,
});
const startTime = Date.now();
try {
// Submit
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) {
newrelic.recordCustomEvent("CaptchaSolveError", {
error: submitResp.data.request,
phase: "submit",
captchaType,
});
transaction.end();
return { error: submitResp.data.request };
}
const captchaId = submitResp.data.request;
newrelic.addCustomAttributes({ captchaId });
// Poll
let pollCount = 0;
for (let i = 0; i < 60; i++) {
await new Promise((r) => setTimeout(r, 5000));
pollCount++;
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) {
const elapsed = (Date.now() - startTime) / 1000;
newrelic.recordCustomEvent("CaptchaSolveSuccess", {
captchaType,
solveTime: elapsed,
pollCount,
});
newrelic.addCustomAttributes({
solveTime: elapsed,
pollCount,
});
transaction.end();
return { solution: pollResp.data.request, elapsed };
}
if (pollResp.data.request !== "CAPCHA_NOT_READY") {
newrelic.recordCustomEvent("CaptchaSolveError", {
error: pollResp.data.request,
phase: "poll",
captchaType,
});
transaction.end();
return { error: pollResp.data.request };
}
}
newrelic.recordCustomEvent("CaptchaSolveError", {
error: "TIMEOUT",
phase: "poll",
captchaType,
pollCount,
});
transaction.end();
return { error: "TIMEOUT" };
} catch (err) {
newrelic.noticeError(err);
transaction.end();
throw err;
}
}
);
}
// Balance monitoring
async function monitorBalance() {
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);
newrelic.recordCustomEvent("CaptchaBalance", { balance });
}
} catch (err) {
newrelic.noticeError(err);
}
}
setInterval(monitorBalance, 60000);
module.exports = { solveCaptchaWithNewRelic };
Truy vấn bảng điều khiển NRQL
Xây dựng bảng điều khiển Di tích mới với các truy vấn NRQL sau:
-- Solve success rate (last hour)
SELECT percentage(count(*), WHERE success = true)
FROM CaptchaSolveSuccess, CaptchaSolveError
SINCE 1 hour ago
-- Average solve time by CAPTCHA type
SELECT average(solveTime)
FROM CaptchaSolveSuccess
FACET captchaType
SINCE 1 hour ago TIMESERIES
-- Error breakdown
SELECT count(*)
FROM CaptchaSolveError
FACET error
SINCE 1 hour ago
-- P95 solve latency
SELECT percentile(solveTime, 95)
FROM CaptchaSolveSuccess
SINCE 1 hour ago TIMESERIES
-- Balance over time
SELECT latest(balance)
FROM CaptchaBalance
SINCE 24 hours ago TIMESERIES 5 minutes
-- Tasks per minute
SELECT rate(count(*), 1 minute)
FROM CaptchaSolveSuccess, CaptchaSolveError
SINCE 1 hour ago TIMESERIES
Chính sách cảnh báo
| Cảnh báo | Điều kiện NRQL | Ngưỡng |
|---|---|---|
| Tỷ lệ giải quyết thấp | SELECT percentage(count(*), WHERE success = true) |
< 85% trong 5 phút |
| Độ trễ cao | SELECT percentile(solveTime, 95) FROM CaptchaSolveSuccess |
> 120 giây trong 10 phút |
| Số dư thấp | SELECT latest(balance) FROM CaptchaBalance |
< $10 |
| Lỗi tăng đột biến | SELECT count(*) FROM CaptchaSolveError |
> 50 trong 5 phút |
Khắc phục sự cố
| Vấn đề | Nguyên nhân | Cách xử lý |
|---|---|---|
| Sự kiện tùy chỉnh không xuất hiện | custom_insights_events.enabled là sai |
Kích hoạt trong newrelic.ini |
| Dấu vết giao dịch bị thiếu | Ngưỡng quá cao | Giảm transaction_threshold xuống 1,0 giây |
| Thuộc tính bị cắt bớt | Giá trị quá dài | Giữ giá trị thuộc tính dưới 255 ký tự |
| Không có dữ liệu sau khi triển khai | Khóa cấp phép sai hoặc tác nhân không khởi động | Kiểm tra newrelic-admin validate-config newrelic.ini |
Câu hỏi thường gặp
APM di tích mới và các sự kiện tùy chỉnh - khi nào nên sử dụng từng sự kiện?
APM tự động thực hiện các cuộc gọi HTTP và truy vấn cơ sở dữ liệu. Sự kiện tùy chỉnh cung cấp cho bạn dữ liệu cụ thể về CAPTCHA (thời gian giải quyết, loại CAPTCHA, mã lỗi). Sử dụng cả hai — APM cho tình trạng cơ sở hạ tầng, sự kiện tùy chỉnh cho số liệu kinh doanh.
Làm cách nào để liên hệ việc giải quyết CAPTCHA với các giao dịch trên web?
Thêm captcha_id làm thuộc tính tùy chỉnh cho cả tác vụ nền CAPTCHA và giao dịch web đã kích hoạt nó. Liên kết chúng trong NRQL với WHERE captchaId = '...'.
APM Relic mới có thêm độ trễ cho việc giải CAPTCHA không?
Không đáng kể. Nhân viên hỗ trợ thêm chi phí micro giây cho mỗi cuộc gọi được điều chỉnh. Thời gian giải CAPTCHA (5–120 giây) khiến điều này không thể đo lường được.
bài viết liên quan
- Chức năng đám mây của Google Tích hợp Captchaai
- Tích hợp Crawlee Captchaai hiện đại
- Xây dựng hệ thống giám sát đánh giá Captchaai
Các bước tiếp theo
Có được khả năng hiển thị đầy đủ trong quy trình CAPTCHA của bạn —bắt đầu với khóa API CaptchaAIvà kết nối với Di tích mới.
Hướng dẫn liên quan: