"""DLQ payload serializers for Taskiq dead-letter entries. Pure module: no FastAPI imports. """ from __future__ import annotations import os import socket import sys import traceback from datetime import datetime, timezone from taskiq.message import TaskiqMessage from taskiq_management.models import APP_VERSION def serialize_dlq_payload( message:TaskiqMessage, exception:BaseException, *, retries:int, queue:str|None=None, ) -> dict: now=datetime.now(timezone.utc).isoformat() return { "task_name":message.task_name, "task_id":message.task_id, "kwargs":message.kwargs or {}, "args":list(message.args or []), "exception":type(exception).__name__, "message":str(exception), "traceback":"".join(traceback.format_exception(type(exception),exception,exception.__traceback__)), "retry_count":retries, "worker":os.getenv("TASKIQ_WORKER_NAME") or os.getenv("HOSTNAME") or socket.gethostname(), "queue":message.labels.get("queue") or queue or "taskiq", "created_at":message.labels.get("created_at") or now, "failed_at":now, "correlation_id":message.labels.get("correlation_id") or message.task_id, "hostname":socket.gethostname(), "python_version":sys.version.split()[0], "app_version":APP_VERSION, }