logo
logo

AutoTracing - 支持 bRPC 协议,增强 gRPC、Dubbo、HTTP 协议

向阳 2024-06-13

AutoTracing 在 v6.5 中对 RPC/HTTP 类型的协议进行了增强,包括:

  1. 新增支持 bRPC 协议
  2. 增强 gRPC 协议,支持 Streaming 模式
  3. 增强 Dubbo 协议,支持 Kyro 序列化
  4. 增强 HTTP/HTTP2 协议,支持自定义采集 HTTP 头

接下来我们依次看看这些新特性。

0x0: 支持 bRPC 协议

Apache bRPC 是用 C++ 语言编写的工业级 RPC 框架,常用于搜索、存储、机器学习、广告、推荐等高性能系统。

在 v6.5 中,deepflow-agent 默认会采集 bRPC 协议的如下字段:

  • service_name
  • method_name
  • correlation_id
  • status_code
  • error_code
  • error_text
  • log_id

详细的字段映射关系请参考 DeepFlow 文档

0x1: 支持 gRPC Streaming 模式

感谢 ZhuoZhuoCrayon@TencentFR #6042。在 gRPC 的单次服务调用中,客户端和服务端在 HTTP/2 连接中使用相同的流 ID(Stream Identifier)进行通信,即在两端之间,帧(Frame)所携带的流 ID 相同。gRPC 支持的 RPC 类型有以下几种(RPC life cycle):

  • Unary RPC:最简单的 RPC 类型,客户端请求,服务端应答
  • Server Streaming RPC:服务端返回信息流(多个 DATA 帧)以响应客户端请求
  • Client Streaming RPC:客户端向服务端发送信息流(多个 DATA 帧),服务端通常在接收到所有客户端请求后,以一条消息进行响应
  • Bidirectional Streaming RPC:由客户端发起调用,客户端和服务端可以按任意顺序读写消息,在这种模式下,可以是服务端接收到客户端所有消息后再写入消息,或者基于一答一应的模式进行处理。

在此之前,DeepFlow 仅支持 Unary RPC。在腾讯的业务场景中涉及到了所有四类 RPC,在 FR #6042 的推动下,我们支持了剩余三种 Streaming 模式的 RPC。

v6.5 支持 gRPC Streaming 模式v6.5 支持 gRPC Streaming 模式

相比 v6.4,支持 gRPC Streaming 带来的好处包括:

  • 对于 Server Streaming RPC 或 Bidirectional Streaming RPC,DeepFlow 的调用日志能体现整个调用的结束时间和耗时
  • 对于三种 Streaming RPC,DeepFlow 增加了 _DATA_HEADER 类型的调用日志,支持呈现在分布式追踪结果中以表征请求、响应发生的时间

0x2: 支持 Kyro 序列化的 Dubbo 协议

v6.5 发布后,deepflow-agent 可解析的 Dubbo 协议序列化类型有:

  • Hessian
  • Kyro 新增支持

关于 Dubbo 协议的序列化方式,可参考 Apache Dubbo 文档

0x3: 支持自定义采集 HTTP/HTTP2 头字段

DeepFlow 默认只会采集关键的 HTTP/HTTP2 头部字段。当你希望获取特定头部字段时,以往的做法是使用 WebAssembly 插件来进行协议解析增强。现在我们提供了一种更为便捷的方式,支持配置 l7-protocol-advanced-features.extra-log-fields 即可完成采集。

1
2
3
4
5
6
7
static_config:
l7-protocol-advanced-features:
extra-log-fields:
http: # HTTP, HTTP2
- field-name: "user-agent"
- field-name: "cookie"
# sub-field-names: ["SESSION", "PATH"] # 未来版本支持

按上述配置里配置之后,你可以在调用日志中通过 attribute.user_agentattribute.cookie 查看这些字段。

未来,我们也有计划持续迭代此项能力,欢迎大家提交 Feature Request。可能的演进包括:

  • 支持提取 HTTP URL 中的参数
  • 支持配置 sub-field-names 从复合字段中提取子字段的值

0x4: 什么是 DeepFlow

DeepFlow 是云杉网络开发的一款可观测性产品,旨在为复杂的云原生AI 应用提供深度可观测性。DeepFlow 基于 eBPF 实现了应用性能指标、分布式追踪、持续性能剖析等观测信号的零侵扰Zero Code)采集,并结合智能标签SmartEncoding)技术实现了所有观测信号的全栈Full Stack)关联和高效存取。使用 DeepFlow,可以让云原生及 AI 应用自动具有深度可观测性,从而消除开发者不断插桩的沉重负担,并为 DevOps/SRE 团队提供从代码到基础设施的监控及诊断能力。

GitHub 地址:https://github.com/deepflowio/deepflow

访问 DeepFlow Demo,体验零侵扰、全栈的可观测性。