You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义C#反向代理导致New Relic分布式追踪异常的排查问询

New Relic分布式追踪头部篡改排查方案

1. 修复ProxyB的头部转发逻辑错误

你的代码存在关键问题:当前实现将所有请求头添加到requestMessage.Content.Headers,但traceparent、tracestate、newrelic这类追踪头部属于请求级别的HTTP头部,而非请求内容的头部。错误的头部位置会导致中间组件无法正确识别或转发这些追踪字段,甚至被丢弃。

修正后的转发逻辑示例:

private void CopyFromOriginalRequestContentAndHeaders(HttpContext context, HttpRequestMessage requestMessage)
{
    // 优先复制请求级头部(包含追踪字段)
    foreach (var header in context.Request.Headers)
    {
        // 跳过Content-Type/Content-Length,避免和Content头部冲突
        if (header.Key.Equals("Content-Type", StringComparison.OrdinalIgnoreCase) 
            || header.Key.Equals("Content-Length", StringComparison.OrdinalIgnoreCase))
        {
            continue;
        }
        
        // 先尝试添加到请求头,失败再尝试添加到内容头(针对内容相关字段)
        if (!requestMessage.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()) 
            && requestMessage.Content != null)
        {
            requestMessage.Content.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray());
        }
    }

    // 原有内容复制逻辑(如请求体等)...
}

2. 验证ProxyB的实际出站请求头部

不要仅依赖应用日志,直接抓包确认出站流量的真实头部:

  • 在AWS ECS的ProxyB容器内执行tcpdump命令,过滤目标AppC的流量:
    tcpdump -i any port <AppC的目标端口> -A -s 0 -w proxy_outbound.pcap
    
  • 将抓包文件下载后用Wireshark分析,确认traceparent、tracestate等字段的实际值是否与日志一致。如果抓包显示头部正确,问题必然出在后续中间组件;如果抓包就和日志不符,说明ProxyB的转发逻辑仍有问题。

3. 排查中间网络组件的头部处理规则

ProxyB到AppC之间的组件(NAT网关、防火墙、VPN/专线、负载均衡、本地代理等)可能存在头部过滤/改写规则,重点检查:

  • 是否有规则拦截或删除包含兄弟组织账号标识的tracestate字段;
  • 是否有头部大小限制,导致过长的tracestate被截断;
  • 是否有HTTP头部的规范校验(如字段名大小写、特殊字符),导致追踪头部被丢弃。

4. 确认New Relic跨账号追踪配置

  • 确保企业主账号已开启跨账号分布式追踪功能,允许兄弟组织的追踪数据在你的NR仪表盘展示;
  • 检查ProxyB和AppC的New Relic Agent配置:
    • 确认distributed_tracing.enabled设为true;
    • 确认trust_account_ids配置包含兄弟组织的New Relic账号ID,允许接收其追踪数据。

5. 构建简化测试链路定位问题

  • 临时搭建测试链路:让兄弟组织向ProxyB发送测试请求,ProxyB转发到AWS内部的一个测试服务(而非AppC),查看跨账号追踪是否正常。如果正常,直接锁定问题在ProxyB到AppC的中间组件;
  • 用curl模拟请求,携带兄弟组织的真实追踪头部,发送到ProxyB,验证测试服务收到的头部是否完整:
    curl -H "traceparent: <兄弟组织的traceparent值>" -H "tracestate: <兄弟组织的tracestate值>" -H "newrelic: <兄弟组织的newrelic值>" https://proxyb.example.com/test
    

内容的提问来源于stack exchange,提问作者Charles

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:10:27