跳转至

Java 扩展

作者:宋龙奇

SQL 脱敏

OpenTelemetry Java Agent 默认会对 SQL 进行脱敏:db.statement 中的参数值会被替换为 ?,以降低敏感信息泄露风险。 官方说明见: DB statement sanitization

默认脱敏行为包括:

  • 替换值(字符串、数字)为占位符
  • 压缩空白字符(多空格、换行)以便统一展示

示例

ps = conn.prepareStatement("SELECT name,password,id FROM student where name=? and password=?");
ps.setString(1, username);   // set 了参数占位符 1
ps.setString(2, password);   // set 了参数占位符 2

链路中看到的会是:

SELECT name,password,id FROM student where name=? and password=?

如果使用内联 SQL(不建议在敏感数据场景下使用):

ps = conn.prepareStatement("SELECT name,password,id FROM student where name='abc' and password='123456'");

链路会保留原始 SQL 文本。

开启脱敏参数采集(扩展)

如果需要拿到经过 setXXX 参数填充的 SQL 内容,请启用以下配置之一:

-Dotel.jdbc.sql.obfuscation=true
# or k8s
export OTEL_JDBC_SQL_OBFUSCATION=true

在 V2 扩展中也可使用官方参数:

-Dotel.instrumentation.jdbc.experimental.capture-query-parameters=true
# or k8s
export OTEL_INSTRUMENTATION_JDBC_EXPERIMENTAL_CAPTURE_QUERY_PARAMETERS=true

最终在 观测云 上看到的链路详情类似:

trace
链路详情

常见问题

  1. 开启 -Dotel.jdbc.sql.obfuscation=true 后仍有参数被替换。

部分参数可能在 db.statement 处理阶段已被替换,占位符与 origin_sql_x 数量不一致属于正常现象。

  1. 开启原始 SQL 后内容很长、换行较多。

这会产生更大的链路体积,建议结合 trace 保留策略与字段长度策略评估存储影响。

更多说明可参考:

文档评价

文档内容是否对您有帮助? ×