From 1ee120653e9984b91efce1c41eb18ed1c715d121 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Mon, 13 Jul 2026 14:39:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8E=A5=E5=85=A5=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E7=81=B0=E5=BA=A6=E8=A7=82=E6=B5=8B=E6=8C=87=E6=A0=87=E5=88=B0?= =?UTF-8?q?compose=5Fvideo=E5=92=8Cstream=5Fcopy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - compose_video 入口接入 render_task_metrics 上下文 自动记录:引擎选择、任务耗时、成功/失败、错误类型、活跃任务数 - unified_render_service 接入 stream_copy 埋点 三种状态:hit(命中直通)/ miss(条件不满足跳过)/ fallback(失败回退) miss 原因归一化为8类:编码/分辨率/帧率/字幕/像素格式/裁剪/多片段/其他 --- .../unified_render_service.py | 13 +++++++++++ apps/worker/worker_app/tasks/compose_video.py | 23 +++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/apps/worker/video_processing/unified_render_service.py b/apps/worker/video_processing/unified_render_service.py index 63e717d81..d1caf5fa0 100755 --- a/apps/worker/video_processing/unified_render_service.py +++ b/apps/worker/video_processing/unified_render_service.py @@ -728,6 +728,10 @@ class UnifiedRenderService: self.plan.id, reason, ) + # 灰度观测:stream_copy 未命中 + from video_processing.render_metrics import classify_stream_copy_miss_reason, record_stream_copy + miss_reason = classify_stream_copy_miss_reason(reason) + record_stream_copy("miss", miss_reason) return False # 构建 copy 命令 @@ -784,9 +788,15 @@ class UnifiedRenderService: self.plan.id, output_path.stat().st_size, ) + # 灰度观测:stream_copy 命中成功 + from video_processing.render_metrics import record_stream_copy + record_stream_copy("hit", "成功") return True else: logger.warning("[unified-render] stream_copy 输出为空: plan_id=%s", self.plan.id) + # 灰度观测:stream_copy 失败回退(输出为空) + from video_processing.render_metrics import record_stream_copy + record_stream_copy("fallback", "输出为空") return False except (subprocess.CalledProcessError, subprocess.TimeoutExpired) as e: logger.warning( @@ -794,6 +804,9 @@ class UnifiedRenderService: self.plan.id, str(e)[:200], ) + # 灰度观测:stream_copy 失败回退(ffmpeg错误) + from video_processing.render_metrics import record_stream_copy + record_stream_copy("fallback", "ffmpeg失败") # 清理可能的损坏输出文件 if output_path.exists(): try: diff --git a/apps/worker/worker_app/tasks/compose_video.py b/apps/worker/worker_app/tasks/compose_video.py index b02d4f686..2a6ddbb37 100755 --- a/apps/worker/worker_app/tasks/compose_video.py +++ b/apps/worker/worker_app/tasks/compose_video.py @@ -63,15 +63,30 @@ def compose_video(self, job_id: str, **kwargs): # 判断使用哪个渲染引擎 # 优先级:Redis Feature Flag(白名单 > 百分比) > 环境变量默认 from video_processing.render_engine_resolver import get_render_engine_resolver + from video_processing.render_metrics import render_task_metrics resolver = get_render_engine_resolver() user_id = job.created_by_user_id or None engine = resolver.get_engine(user_id=user_id) + # 灰度期间打印详细 flag 配置,便于排查 + config = resolver.get_config_snapshot() + logger.info( + "compose_video 引擎选择: job_id=%s engine=%s user_id=%s enabled=%s percentage=%s whitelist=%d default=%s", + job_id, + engine, + user_id, + config.get("enabled"), + config.get("percentage"), + len(config.get("whitelist", [])), + config.get("default_engine"), + ) - if engine == "unified": - return _compose_with_unified_engine(self, job_service, job, plan_id, db) - else: - return _compose_with_legacy_engine(self, job_service, job, plan_id, db) + # 灰度观测指标埋点 + with render_task_metrics(engine=engine, task_type="compose_video"): + if engine == "unified": + return _compose_with_unified_engine(self, job_service, job, plan_id, db) + else: + return _compose_with_legacy_engine(self, job_service, job, plan_id, db) except self.retry_exc as exc: logger.warning("视频合成重试中: job_id=%s, exc=%s", job_id, exc)