feat: add image route usage telemetry

This commit is contained in:
QiuSW
2026-07-08 22:44:17 +08:00
parent 25a4080177
commit d5656b4f56
13 changed files with 379 additions and 18 deletions
+64
View File
@@ -30,6 +30,12 @@ from apps.api.serializers import (
RechargeCreateRequestSerializer,
RechargeStatusRequestSerializer,
)
from apps.api.telemetry import (
log_generation_route_usage,
request_alias,
telemetry_elapsed_ms,
telemetry_start_time,
)
from apps.api.throttles import GenerateRateThrottle, throttle_api_auth_failure
from apps.ai.catalog import get_public_model_catalog
from apps.billing.models import RechargeOrder
@@ -95,12 +101,24 @@ class GenerateImageView(ExternalApiView):
throttle_classes = (GenerateRateThrottle,)
def post(self, request):
started = telemetry_start_time()
alias = request_alias(request.data)
serializer = GenerateImageRequestSerializer(data=request.data)
if not serializer.is_valid():
log_generation_route_usage(
route_type="sync",
request=request,
alias=alias,
status="error",
latency_ms=telemetry_elapsed_ms(started),
error_code="bad_request",
http_status=status.HTTP_400_BAD_REQUEST,
)
return Response(
api_error("bad_request", "参数错误"),
status=status.HTTP_400_BAD_REQUEST,
)
alias = serializer.validated_data.get("model") or alias
try:
data = generate_image_response(
user=request.user,
@@ -109,7 +127,24 @@ class GenerateImageView(ExternalApiView):
image_url_builder=request.build_absolute_uri,
)
except ApiRequestError as exc:
log_generation_route_usage(
route_type="sync",
request=request,
alias=alias,
status="error",
latency_ms=telemetry_elapsed_ms(started),
error_code=exc.code,
http_status=exc.http_status,
)
return Response(exc.as_response_data(), status=exc.http_status)
log_generation_route_usage(
route_type="sync",
request=request,
alias=data.get("alias") or alias,
status="success",
latency_ms=telemetry_elapsed_ms(started),
http_status=status.HTTP_200_OK,
)
return Response(data, status=status.HTTP_200_OK)
@@ -117,12 +152,24 @@ class GenerateImageTaskSubmitView(ExternalApiView):
throttle_classes = (GenerateRateThrottle,)
def post(self, request):
started = telemetry_start_time()
alias = request_alias(request.data)
serializer = GenerateImageRequestSerializer(data=request.data)
if not serializer.is_valid():
log_generation_route_usage(
route_type="async",
request=request,
alias=alias,
status="error",
latency_ms=telemetry_elapsed_ms(started),
error_code="bad_request",
http_status=status.HTTP_400_BAD_REQUEST,
)
return Response(
api_error("bad_request", "参数错误"),
status=status.HTTP_400_BAD_REQUEST,
)
alias = serializer.validated_data.get("model") or alias
try:
task, _created = create_image_generation_task(
user=request.user,
@@ -131,7 +178,24 @@ class GenerateImageTaskSubmitView(ExternalApiView):
idempotency_key=request.headers.get("Idempotency-Key", ""),
)
except ApiRequestError as exc:
log_generation_route_usage(
route_type="async",
request=request,
alias=alias,
status="error",
latency_ms=telemetry_elapsed_ms(started),
error_code=exc.code,
http_status=exc.http_status,
)
return Response(exc.as_response_data(), status=exc.http_status)
log_generation_route_usage(
route_type="async",
request=request,
alias=task.call_record.alias,
status="success",
latency_ms=telemetry_elapsed_ms(started),
http_status=status.HTTP_202_ACCEPTED,
)
return Response(task_submit_response(task), status=status.HTTP_202_ACCEPTED)