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 内容,请启用以下配置之一:
在 V2 扩展中也可使用官方参数:
-Dotel.instrumentation.jdbc.experimental.capture-query-parameters=true
# or k8s
export OTEL_INSTRUMENTATION_JDBC_EXPERIMENTAL_CAPTURE_QUERY_PARAMETERS=true
最终在 观测云 上看到的链路详情类似:
常见问题¶
- 开启
-Dotel.jdbc.sql.obfuscation=true后仍有参数被替换。
部分参数可能在 db.statement 处理阶段已被替换,占位符与 origin_sql_x 数量不一致属于正常现象。
- 开启原始 SQL 后内容很长、换行较多。
这会产生更大的链路体积,建议结合 trace 保留策略与字段长度策略评估存储影响。
更多说明可参考: