AutoTracing 在 v6.5 中对 SQL 命令的解析进行了增强,主要包括以下两点:
-
支持采集 SQL 预编译语句的参数值 -
支持采集 MySQL 登录用户名和使用的数据库名
这些能力的增强,能够让 DeepFlow 的下游消费者获取到更丰富的数据,更好的解决流量回放、数据库审计等方面的痛点。
01
SQL 预编译参数
在某运营商客户中,测试团队希望使用 DeepFlow 的 SQL 调用日志用于回放测试。以往该团队使用 APM 来实现此目的,但受限于插桩的困难,测试覆盖度非常低。DeepFlow 使用 eBPF 零侵扰采集的 SQL 调用日志能够非常好的解决这个痛点。
然而,该客户的业务中绝大多数使用了预编译 SQL 命令模式。在以往的版本中,DeepFlow 仅会采集类似下面这样含有 ?
参数的 COM_STMT_PREPARE
预编译命令:
SELECT * FROM `resource_event` WHERE domain = ? AND sub_domain = ?
在 v6.5 中,DeepFlow 支持了采集与预编译命令对应的 COM_STMT_EXECUTE
命令中的参数值。例如,上面的预编译语句中有 2 个参数,他们的值会使用 ,
拼接后赋值给 request_resource
:
476db5ae-a5c6-5b0b-84ce-b29dcf3ee76d , 1
更详细的说明,请参考 DeepFlow 文档[1]。
注意:当开启 MySQL 脱敏时,COM_STMT_EXECUTE
中的参数值将不会被解析和传输。
02
登录用户名、数据库名
感谢 chluknight@ChinaMobile
的 FR #6798[2]。在中国移动,DeepFlow 的零侵扰调用日志为 SQL 审计系统提供数据。安全团队希望能在此前已有的能力基础上支持数据库登录命令、设置当前数据库命令的采集能力,以使得安全审计能力更为完善。
当客户端发送如下第一行所示的 MySQL 登录命令时,deepflow-agent 会采集并解析,并将类似如下第二行的内容赋值到调用日志的 request_resource
字段中:
Login Request user=cmp_operation
Login username: cmp_operation
当客户端发送如下切换数据库的命令时,deepflow-agent 也会采集并将整体语句赋值到调用日志的 request_resource
字段中:
use `cmp_operation`
新增的这两个能力对数据库审计场景意义重大。
03
什么是 DeepFlow
DeepFlow 是云杉网络开发的一款可观测性产品,旨在为复杂的云原生及 AI 应用提供深度可观测性。DeepFlow 基于 eBPF
实现了应用性能指标、分布式追踪、持续性能剖析等观测信号的零侵扰(Zero Code
)采集,并结合智能标签(SmartEncoding
)技术实现了所有观测信号的全栈(Full Stack
)关联和高效存取。使用 DeepFlow,可以让云原生及 AI 应用自动具有深度可观测性,从而消除开发者不断插桩的沉重负担,并为 DevOps/SRE 团队提供从代码到基础设施的监控及诊断能力。