使用OB4.x的全链路追踪,通过OCP展示时不显示驱动侧的耗时

【 使用环境 】 测试环境
【 OB or 其他组件 】
使用OCP的
【 使用版本 】
OCP:4.2.2
OBClient:2.2.6
OBProxy:4.2.1 升级到4.3.0也是不行
OceanBase:4.2.1.9
【问题描述】清晰明确描述问题
1.使用OB4.x的全链路追踪,通过OCP展示时不显示驱动侧的耗时
在ODP侧,OB2.0协议已设置为true


2.通过show trace 可以显示驱动侧的耗时

【复现路径】问题出现前后相关操作
【附件及日志】推荐使用OceanBase敏捷诊断工具obdiag收集诊断信息,详情参见链接(右键跳转查看):

【SOP系列 22 】——故障诊断第一步(自助诊断和诊断信息收集)

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

1 个赞

根因分析场景: [无明确根因分析场景]
根因分析命令: [无]

日志采集场景: SQL性能问题
日志采集命令: obdiag gather scene run --scene=observer.perf_sql --env “{db_connect=’-h127.0.0.1 -P2881 -utest@test -p****** -Dtest’, trace_id=‘Yxx’}”

推荐您使用 obdiag 工具进行日志采集,以便我们确认 OCP 展示不显示驱动侧耗时的具体原因。通过执行上述命令,可以收集与 SQL 性能相关的诊断信息。

请您将采集到的日志压缩包提供给我们,以便进一步分析问题所在。

另外,为了更好地了解和解决您的问题,请您提供以下信息:

  1. 您当前使用的 OceanBase 数据库版本号是否为 4.x?具体是哪个小版本?
  2. 您提到的“全链路追踪”功能是否有启用特定参数或配置?如果有,请提供相关参数设置。
  3. 在 OCP 中展示的追踪信息中,是否有其他部分正常显示?还是完全缺失驱动侧耗时?
  4. 是否可以通过 show trace 命令稳定复现驱动侧耗时的正确显示?如果可以,请提供一个具体的 trace_id 示例。
  5. 您是否对 OCP 的展示逻辑进行了自定义配置或修改?如果有,请描述相关改动。

附上敏捷诊断工具 obdiag 使用帮助链接

1 个赞

通过java代码,使用OB 2.4.9版本的jdbc驱动连接数据库,驱动侧的耗时,会显示数据不完整,无法绘制时间线的异常



1 个赞

显示数据不完整,使用show trace是正常的么

1 个赞

根据您提供的信息,问题的核心是:在使用 Java 代码通过 JDBC 驱动连接 OceanBase 数据库(版本 2.4.9)时,全链路追踪显示驱动侧耗时数据不完整,并且无法绘制时间线。

以下是针对该问题的详细分析和可能的解决方案:


1. 问题分析

1.1 全链路追踪的工作原理

OceanBase 的全链路追踪功能通过 FLT_TRACE_ID 将客户端请求、OBProxy 和 OBServer 的处理过程串联起来。对于 JDBC 驱动,其会记录驱动侧的耗时并将其传递给 OBProxy 和 OBServer。如果驱动侧的耗时数据不完整或丢失,则可能导致时间线无法正确绘制。

1.2 可能的原因

  • JDBC 驱动版本问题
    您使用的 OceanBase JDBC 驱动版本是否与数据库版本兼容?如果驱动版本过旧,可能会导致部分追踪信息丢失。

  • 参数配置问题
    是否正确启用了全链路追踪功能?例如,是否设置了 ob_trace_enable=true 或其他相关参数。

  • SQL 执行逻辑问题
    如果 SQL 执行过程中存在异常(如无效日期、空值等),可能会导致某些阶段的耗时未被正确记录。

  • OBProxy 或 OBServer 的日志级别问题
    如果 OBProxy 或 OBServer 的日志级别设置不当,可能会导致部分追踪信息未被记录。


2. 解决方案

2.1 检查 JDBC 驱动版本

确保使用的 JDBC 驱动版本与 OceanBase 数据库版本兼容。您可以参考以下步骤:

  1. 下载最新版本的 OceanBase JDBC 驱动(适用于 2.4.x 版本)。
  2. 替换项目中的旧驱动,并重新运行测试代码。

2.2 启用全链路追踪功能

在 JDBC 连接 URL 中添加以下参数以启用全链路追踪功能:

String jdbcUrl = "jdbc:oceanbase://<host>:<port>/<database>?ob_trace_enable=true";

同时,确保 OBProxy 和 OBServer 的全链路追踪功能已启用。可以通过以下命令检查:

SHOW PROXYCONFIG LIKE 'enable_ob_protocol_v2_with_client';
SHOW PROXYCONFIG LIKE 'enable_ob_protocol_v2_with_server';

如果返回值为 false,请将其设置为 true

2.3 检查 SQL 执行逻辑

从您提供的图片中可以看到,SQL 执行过程中存在 Invalid date. 000000 的错误提示。这可能是由于 SQL 语句中包含无效日期或空值导致的。建议:

  1. 检查 SQL 语句的语法和数据类型是否正确。
  2. 确保插入或更新的数据符合目标表的字段定义。

2.4 调整 OBProxy 和 OBServer 的日志级别

为了捕获更详细的追踪信息,可以临时调整 OBProxy 和 OBServer 的日志级别为 DEBUG。具体操作如下:

  1. 修改 OBProxy 配置文件,将日志级别设置为 DEBUG

    vi /path/to/obproxy/config.ini
    

    找到 [log] 部分,修改 level=debug

  2. 修改 OBServer 配置文件,将日志级别设置为 DEBUG

    obclient> ALTER SYSTEM SET log_level='DEBUG' GLOBAL;
    
  3. 重启 OBProxy 和 OBServer 服务以使更改生效。

2.5 使用 show trace 验证

在执行 SQL 语句后,可以通过 show trace 命令查看完整的追踪信息。例如:

SET ob_enable_show_trace='ON';
SELECT COUNT(*) AS total FROM test_table;
SHOW TRACE;

检查输出结果中是否包含驱动侧的耗时信息。如果仍然缺失,请进一步排查。


3. 示例代码

以下是经过优化的 Java 代码示例,确保全链路追踪功能正常启用:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Main {
    private static final String JDBC_URL = "jdbc:oceanbase://<host>:<port>/<database>?ob_trace_enable=true";
    private static final String USERNAME = "your_username";
    private static final String PASSWORD = "your_password";

    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection(JDBC_URL, USERNAME, PASSWORD)) {
            String query = "SELECT COUNT(*) AS total FROM test_table";
            try (PreparedStatement stmt = conn.prepareStatement(query);
                 ResultSet rs = stmt.executeQuery()) {
                if (rs.next()) {
                    System.out.println("Total: " + rs.getInt("total"));
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. 后续步骤

如果按照上述步骤仍无法解决问题,请提供以下信息以便进一步分析:

  1. 当前使用的 JDBC 驱动版本号。
  2. OBProxy 和 OBServer 的配置文件内容(隐藏敏感信息)。
  3. 执行 show trace 后的完整输出结果。
  4. 通过 obdiag 工具收集的诊断日志。

希望以上信息对您有所帮助!如果还有其他问题,请随时联系。

详情请参考:

  1. DBCP 连接池连接 OceanBase 数据库示例程序
  2. GV$OB_SQL_AUDIT

(小助手的答复已结束,如未能解决您的问题,请继续提问并等待其他同学的回复,谢谢!)

1 个赞

是的 show trace正常的。只有OCP展示不出来驱动侧的耗时

1 个赞

使用最新版的ocp试试。

你好,麻烦复现一下。然后帮忙捞取一下obproxy_trace.log日志

:facepunch: :facepunch: :facepunch: :facepunch: