refactor(metrics): 解耦 Portal 指标打点与 Exporter - #814
Open
feng-95 wants to merge 5 commits into
Open
Conversation
feng-95
force-pushed
the
refactor/apmplus-meter-uploader
branch
from
August 4, 2026 16:02
2d60db9 to
1e6c1aa
Compare
feng-95
force-pushed
the
refactor/apmplus-meter-uploader
branch
from
August 5, 2026 08:01
15fa31d to
e064701
Compare
feng-95
force-pushed
the
refactor/apmplus-meter-uploader
branch
from
August 11, 2026 12:51
e064701 to
064ba19
Compare
feng-95
marked this pull request as ready for review
August 11, 2026 13:21
feng-95
force-pushed
the
refactor/apmplus-meter-uploader
branch
from
August 11, 2026 14:06
064ba19 to
ac889d3
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
改动说明
本次改造将 VeADK Portal 指标的“执行打点”和“创建导出链路”拆分为两项独立职责:
ENABLE_APMPLUS、APMPlusExporter或其他 Exporter 是否存在;PortalMetricRecorder直接通过 OpenTelemetry GlobalMeterProvider创建测量工具并记录;APMPlusExporter不再创建或注册指标记录器,只在当前仍为_ProxyMeterProvider时兜底创建带 APMPlus Reader 的 GlobalMeterProvider;MeterProvider时,APMPlus 不替换 Provider、不追加 Reader,也不接管其生命周期;MetricUploaderRegistry,进程内只保留一份portal_metrics.portal_metric_recorder。修改原因
旧实现把 Portal 指标是否打点绑定在 APMPlus Exporter 注册流程上,会产生两个问题:
MeterProvider、但没有启用 APMPlus 时,VeADK 指标不会执行打点;改造后,VeADK 的指标记录不再根据 Exporter 做开关判断;由业务配置、自动埋点或 APMPlus 兜底创建的 Global
MeterProvider决定是否以及向哪里导出。运行规则
_ProxyMeterProviderMeterProvider,没有OpentelemetryTracer或任何 VeADK ExporterOpenTelemetry 1.37.0 会在安装真实 Provider 后,将已有代理测量工具绑定到真实 Provider。安装前发生的打点不会缓存或补报。
Portal Hook 的当前边界
本 MR 解耦的是“指标记录”与“Exporter / Provider 创建”,没有调整 Portal 遥测 Hook 的安装时机:
OpentelemetryTracer.model_post_init()中的patch_google_adk_telemetry()安装;OpentelemetryTracer,或通过ENABLE_APMPLUS、ENABLE_COZELOOP、ENABLE_TLS创建 Tracer 时,Hook 会安装;opentelemetry-instrument不等于安装 VeADK Portal Hook;自动埋点与ENABLE_APMPLUS=true同时使用时,会因为 VeADK 创建OpentelemetryTracer而安装 Hook;MeterProvider,但没有创建OpentelemetryTracer或启用任何 VeADK Exporter,当前只会上报其他组件自身产生的指标,不会产生 VeADK Portal 指标;与 Trace 的关系
Provider 和导出链路保持独立:
TracerProvider时,沿用 fix(tracing): trust preconfigured provider for APMPlus #813 的规则,跳过 APMPlus Span Processor 注册,避免 Trace 重复上报;MeterProvider决定,不依赖 APMPlus Span Processor 是否注册;OpentelemetryTracer初始化,边界见上一节;MeterProvider时,指标交给该 Provider。E2E 验证
gen_ai_chat_count_ProxyMeterProvider/ 0OpentelemetryTracerMeterProvider/ 1MeterProvider/ 1APMPlusExporter(),无预配置 ProviderMeterProvider/ 1MeterProvider/ 1APMPlusExporter(),代码预配置全局 ProviderMeterProvider/ 1MeterProvider/ 1opentelemetry-instrument自动埋点并启用 APMPlus(命令行 Agent)MeterProvider/ 17 个存在导出链路的
gen_ai_chat_count查询都只有 1 条时序,且current=min=max=1。所有云端 Trace 的 span 总数与唯一 span 数一致,错误 span 为 0。最新服务级 E2E
gen_ai_chat_countfeng_local_test_no_autofeng_local_test_autoopentelemetry-instrument启动 FastAPI自动埋点场景多出的 Span 来自 FastAPI、HTTP 和 Jinja2 自动埋点,11 个 Span ID 全部不同,不属于重复上报。自动埋点场景使用更新后的 APMPlus appkey,MR 和测试报告不记录明文。
gen_ai.client.token.usage同时存在gen_ai_operation_name=generate_content和gen_ai_operation_name=chat两套属性维度;自动埋点与非自动埋点场景均存在,因此不是重复 Exporter 导出。查询 Token 时需要按指标来源或gen_ai_operation_name区分,避免宽泛聚合造成重复计算。自动化检查
pytest -q tests/test_agent.py tests/test_portal_metrics.py tests/test_tracing.py tests/test_tracing_content.py:49 项通过;git diff --check:通过;测试报告