Truncate large webhook payloads in log entries (#4701)
This commit is contained in:
@@ -3397,7 +3397,7 @@ class ForgeAgent:
|
|||||||
"Sending task response to webhook callback url",
|
"Sending task response to webhook callback url",
|
||||||
task_id=task.task_id,
|
task_id=task.task_id,
|
||||||
webhook_callback_url=task.webhook_callback_url,
|
webhook_callback_url=task.webhook_callback_url,
|
||||||
payload=signed_data.signed_payload,
|
payload=signed_data.payload_for_log,
|
||||||
headers=signed_data.headers,
|
headers=signed_data.headers,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -59,18 +59,29 @@ def generate_skyvern_signature(
|
|||||||
return hash_obj.hexdigest()
|
return hash_obj.hexdigest()
|
||||||
|
|
||||||
|
|
||||||
|
MAX_WEBHOOK_PAYLOAD_LOG_SIZE = 8000 # ~8KB – keeps Datadog log entries manageable
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
class WebhookSignature:
|
class WebhookSignature:
|
||||||
timestamp: str
|
timestamp: str
|
||||||
signature: str
|
signature: str
|
||||||
signed_payload: str
|
signed_payload: str
|
||||||
headers: dict[str, str]
|
headers: dict[str, str]
|
||||||
|
# Truncated version of signed_payload safe for logging
|
||||||
|
payload_for_log: str
|
||||||
|
|
||||||
|
|
||||||
def generate_skyvern_webhook_signature(payload: dict, api_key: str) -> WebhookSignature:
|
def generate_skyvern_webhook_signature(payload: dict, api_key: str) -> WebhookSignature:
|
||||||
payload_str = _normalize_json_dumps(payload)
|
payload_str = _normalize_json_dumps(payload)
|
||||||
signature = generate_skyvern_signature(payload=payload_str, api_key=api_key)
|
signature = generate_skyvern_signature(payload=payload_str, api_key=api_key)
|
||||||
timestamp = str(int(datetime.utcnow().timestamp()))
|
timestamp = str(int(datetime.utcnow().timestamp()))
|
||||||
|
if len(payload_str) > MAX_WEBHOOK_PAYLOAD_LOG_SIZE:
|
||||||
|
payload_for_log = (
|
||||||
|
payload_str[:MAX_WEBHOOK_PAYLOAD_LOG_SIZE] + f"... (truncated, original size: {len(payload_str)})"
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
payload_for_log = payload_str
|
||||||
return WebhookSignature(
|
return WebhookSignature(
|
||||||
timestamp=timestamp,
|
timestamp=timestamp,
|
||||||
signature=signature,
|
signature=signature,
|
||||||
@@ -80,4 +91,5 @@ def generate_skyvern_webhook_signature(payload: dict, api_key: str) -> WebhookSi
|
|||||||
"x-skyvern-signature": signature,
|
"x-skyvern-signature": signature,
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
},
|
},
|
||||||
|
payload_for_log=payload_for_log,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3176,7 +3176,7 @@ class WorkflowService:
|
|||||||
workflow_id=workflow_id,
|
workflow_id=workflow_id,
|
||||||
workflow_run_id=workflow_run.workflow_run_id,
|
workflow_run_id=workflow_run.workflow_run_id,
|
||||||
webhook_callback_url=workflow_run.webhook_callback_url,
|
webhook_callback_url=workflow_run.webhook_callback_url,
|
||||||
payload=signed_data.signed_payload,
|
payload=signed_data.payload_for_log,
|
||||||
headers=signed_data.headers,
|
headers=signed_data.headers,
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
@@ -3204,7 +3204,7 @@ class WorkflowService:
|
|||||||
"Webhook failed",
|
"Webhook failed",
|
||||||
workflow_id=workflow_id,
|
workflow_id=workflow_id,
|
||||||
workflow_run_id=workflow_run.workflow_run_id,
|
workflow_run_id=workflow_run.workflow_run_id,
|
||||||
webhook_data=signed_data.signed_payload,
|
webhook_data=signed_data.payload_for_log,
|
||||||
resp=resp,
|
resp=resp,
|
||||||
resp_code=resp.status_code,
|
resp_code=resp.status_code,
|
||||||
resp_text=resp.text,
|
resp_text=resp.text,
|
||||||
|
|||||||
Reference in New Issue
Block a user