Skip to content

[feature] extend wasm abi, includes: injectEncodedDataToFilterChain for handle stream response body, getUpstreamHosts & setUpstreamOverrideHost for self-defined load balance policy #8

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 5, 2025

Conversation

rinfx
Copy link

@rinfx rinfx commented Jun 5, 2025

support wasm abi:

  • injectEncodedDataToFilterChain: inject encoded data while handling response body
  • getUpstreamHosts: get upstream host informations, such as address, metrics, health_status, etc.
  • setUpstreamOverrideHost: override upstream host, used for self-defined load balance policy

Copy link

lingma-agents bot commented Jun 5, 2025

扩展Wasm ABI以支持健康检查指标存储和上游主机操作

变更文件

文件路径 变更说明
api/​envoy/​api/​v2/​core/​health_check.proto 在健康检查配置中添加`store_metrics`布尔型字段,用于控制是否存储健康检查响应体数据
api/​envoy/​config/​core/​v3/​health_check.proto 与v2版本保持一致,添加`store_metrics`字段实现指标存储功能
envoy/upstream/upstream.h 新增`getEndpointMetrics`和`setEndpointMetrics`纯虚方法,用于获取/设置主机的指标数据字符串
source/common/upstream/upstream_impl.h 通过原子指针实现线程安全的指标数据存储,使用备用存储策略保证数据一致性
source/​extensions/​common/​wasm/​context.cc 实现三个核心接口: 1. `injectEncodedDataToFilterChain`:向过滤链注入编码数据 2. `getUpstreamHosts`:获取上游主机的地址、指标和健康状态(JSON格式) 3. `setUpstreamOverrideHost`:覆盖上游主机地址实现自定义负载均衡
source/​extensions/​health_checkers/​common/​health_checker_base_impl.cc 添加对`store_metrics`配置参数的解析与存储
source/​extensions/​health_checkers/​http/​health_checker_impl.cc 在HTTP健康检查响应处理时: 1. 当`store_metrics`启用时存储完整响应体 2. 将指标数据写入对应主机对象的`endpoint_metrics`
test/​common/​upstream/​health_checker_impl_test.cc 添加LLM服务健康检查成功场景测试,验证指标存储与健康状态判断逻辑

时序图

Sequence diagram
    participant Context as WasmContext
    participant Host as UpstreamHost
    participant HealthChecker as HealthCheckerImpl
    participant Test as TestFixture

    Context->>HealthChecker: getUpstreamHosts()
    HealthChecker->>Host: collectEndpointMetrics()
    Host-->>HealthChecker: return metrics data
    HealthChecker->>Context: return JSON formatted host info

    Note right of HealthChecker: Metrics storage flow:
    HealthChecker->>Host: store_metrics enabled?
    if yes
        HealthChecker->>Host: setEndpointMetrics(response_body)
    else
        deactivate
    endif

    Test->>HealthChecker: setupLLMServiceWithExpectedResponseHC()
    Test->>HealthChecker: respondBody("200", "Everything OK")
    Test->>Host: verify coarseHealth() == Healthy
Loading

💡 小贴士

与 lingma-agents 交流的方式

📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:

  • 在当前代码中添加详细的注释说明。

  • 请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。

📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:

  • @Lingma-Agent 分析这个方法的性能瓶颈并提供优化建议。

  • @Lingma-Agent 对这个方法生成优化代码。

📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:

  • @Lingma-Agent 请总结上述讨论并提出解决方案。

  • @Lingma-Agent 请根据讨论内容生成优化代码。

Copy link

@lingma-agents lingma-agents bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔍 代码评审报告

🎯 评审意见概览

严重度 数量 说明
🔴 Blocker 0 阻断性问题,需立即修复。例如:系统崩溃、关键功能不可用或严重安全漏洞。
🟠 Critical 1 严重问题,高优先级修复。例如:核心功能异常或性能瓶颈影响用户体验。
🟡 Major 1 主要问题,建议修复。例如:非核心功能缺陷或代码维护性较差。
🟢 Minor 0 次要问题,酌情优化。例如:代码格式不规范或注释缺失。

总计: 2 个问题


📋 评审意见详情

💡 单文件建议

以下是文件级别的代码建议,聚焦于代码的可读性、可维护性和潜在问题。
📄 source/extensions/health_checkers/http/health_checker_impl.cc (1 💬)
📄 test/common/upstream/health_checker_impl_test.cc (1 💬)

🚀 跨文件建议

以下是对代码架构和设计的综合分析,聚焦于跨文件交互、系统一致性和潜在优化空间。
🔍 1. store_metrics字段在多个proto版本中重复定义且缺乏版本协调

在api/v2/core/health_check.proto和api/config/core/v3/health_check.proto两个不同版本的健康检查配置中都新增了store_metrics字段,且tag号均为127。这可能导致版本兼容性问题:1. 不同版本proto的字段定义未同步到所有相关组件 2. 后端处理逻辑可能无法正确识别不同版本配置中的字段。建议统一版本策略,确保新功能字段在API版本演进中得到协调处理。

📌 关键代码:

bool store_metrics = 127;
bool store_metrics = 127;

⚠️ 潜在风险: 可能引发配置解析错误,导致健康检查配置失效或不一致的行为

🔍 2. proxy-wasm-cpp-host依赖版本突变未验证兼容性

在bazel/repository_locations.bzl中,proxy-wasm-cpp-host依赖的版本从71f6a9e突然变更为27df305,但未在提交说明中说明变更原因。此版本跳跃可能引入:1. 与现有WASM宿主实现的兼容性问题 2. 新的安全漏洞 3. 构建系统不兼容。建议补充版本变更说明,并验证新版本与Envoy当前架构的兼容性

📌 关键代码:

version = "27df3052072dd97527945c4167ef912020a0a92e"

⚠️ 潜在风险: 可能导致WASM扩展功能无法正常工作,或出现不可预知的运行时错误

🔍 3. 端点指标存储存在竞态条件风险

在source/common/upstream/upstream_impl.h中,HostImpl的endpoint_metrics_ptr_使用atomic指针管理,但setEndpointMetrics方法中存在状态切换逻辑(set_backup_变量)。这种手动管理指针的方案可能导致:1. 内存泄漏(未释放旧字符串) 2. 线程可见性问题。建议改用智能指针或原子字符串类型实现线程安全存储

📌 关键代码:

std::atomic<std::string*> endpoint_metrics_ptr_;

⚠️ 潜在风险: 多线程环境下可能出现数据不一致或内存泄漏问题

🔍 4. HIGRESS条件编译块导致代码分散维护困难

大量核心功能(如Context::getUpstreamHosts)被包裹在HIGRESS预处理宏中,这将:1. 降低代码可读性 2. 增加维护成本 3. 可能导致功能模块隔离不足。建议将扩展功能封装为可插拔模块,或通过编译选项统一管理特性开关

📌 关键代码:

#if defined(HIGRESS)

⚠️ 潜在风险: 长期维护可能导致功能模块相互污染,编译错误难以定位

🔍 5. 健康检查指标存储未实现清理机制

新增的endpoint_metrics存储功能未包含数据清理策略,可能导致:1. 内存持续增长 2. 过期指标数据未及时清除。建议添加指标数据生命周期管理策略,如设置最大存储时间或大小限制

⚠️ 潜在风险: 在大规模集群环境下可能引发内存溢出风险

🔍 6. JSON序列化未处理编码异常

在source/extensions/common/wasm/context.cc的getUpstreamHosts方法中,nlohmann::json::dump操作未捕获可能的异常(如内存不足)。当前仅捕获标准异常,但实现中可能存在其他异常未处理

📌 关键代码:

nlohmann::json j = info_map;

⚠️ 潜在风险: 可能导致未处理异常引发WASM插件崩溃


💡 小贴士

与 lingma-agents 交流的方式

📜 直接回复评论
直接回复本条评论,lingma-agents 将自动处理您的请求。例如:

  • 在当前代码中添加详细的注释说明。

  • 请详细介绍一下你说的 LRU 改造方案,并使用伪代码加以说明。

📜 在代码行处标记
在文件的特定位置创建评论并 @lingma-agents。例如:

  • @Lingma-Agent 分析这个方法的性能瓶颈并提供优化建议。

  • @Lingma-Agent 对这个方法生成优化代码。

📜 在讨论中提问
在任何讨论中 @lingma-agents 来获取帮助。例如:

  • @Lingma-Agent 请总结上述讨论并提出解决方案。

  • @Lingma-Agent 请根据讨论内容生成优化代码。

Comment on lines +217 to +222
if (parent_.store_metrics_) {
response_body_->move(data, data.length());
} else if (parent_.response_buffer_size_ != 0) {
#else
if (parent_.response_buffer_size_ != 0) {
#endif
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#if预处理块逻辑不完整

🟠 Critical | 🐞 Bugs

📋 问题详情

#if defined(HIGRESS)块未完全包裹条件代码,导致response_body_->move存在执行路径覆盖漏洞。

💡 解决方案

应修正为:

+#if defined(HIGRESS)
+if (parent_.store_metrics_ || parent_.response_buffer_size_ != 0) {
+#else
+if (parent_.response_buffer_size_ != 0) {
+#endif
🔧 建议代码

‼️AI 生成代码 - 请在应用前检查逻辑、规范并测试

Suggested change
if (parent_.store_metrics_) {
response_body_->move(data, data.length());
} else if (parent_.response_buffer_size_ != 0) {
#else
if (parent_.response_buffer_size_ != 0) {
#endif
if (parent_.store_metrics_ || parent_.response_buffer_size_ != 0) {
// 合并条件判断逻辑
}

您的反馈对我们很重要!(建议右键在新标签页中打开以下链接)

有用意见👍无用意见👎错误意见❌

Comment on lines +554 to +568
void setupLLMServiceWithExpectedResponseHC() {
// Response: Base64 string of "Everything OK".
std::string yaml = R"EOF(
timeout: 1s
interval: 1s
interval_jitter: 1s
unhealthy_threshold: 2
healthy_threshold: 2
store_metrics: true
http_health_check:
path: /metrics
)EOF";
allocHealthChecker(yaml);
addCompletionCallback();
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

测试用例未验证核心存储逻辑

🟡 Major | 🧹 Code Smells

📋 问题详情

新增的LLMServiceHealthCheckSuccess测试未验证setEndpointMetrics实际存储的值,无法确保功能正确性。

💡 解决方案

需补充:

+ auto host = cluster_->prioritySet().getMockHostSet(0)->hosts_[0];
+ EXPECT_EQ("Test Everything OK", host->getEndpointMetrics());

您的反馈对我们很重要!(建议右键在新标签页中打开以下链接)

有用意见👍无用意见👎错误意见❌

@rinfx rinfx changed the title Extend wasm abi [feature] extend wasm abi, includes: injectEncodedDataToFilterChain for handle stream response body, getUpstreamHosts & setUpstreamOverrideHost for self-defined load balance policy Jun 5, 2025
Copy link

@johnlanni johnlanni left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@johnlanni johnlanni merged commit b37a298 into envoy-1.27 Jun 5, 2025
5 checks passed
@rinfx rinfx deleted the extend-wasm-abi branch June 17, 2025 09:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants