MySQL Router 9.0  /  部署 MySQL Router  /  MySQL Router 设置跟踪

3.7 MySQL Router 设置跟踪

MySQL Router 支持跟踪语句在从客户端到服务器以及对客户端的响应过程中由 MySQL Router 处理时的语句。跟踪以 JSON 格式返回。

这使得调试、测试、应用程序连接比较等成为可能。

配置

要配置 ROUTER SET trace,您必须将以下内容添加到您的 MySQL Router 配置文件中

  • max_idle_server_connections:添加到 DEFAULT 部分。这必须至少设置为 1。

  • 以下值可以添加到 DEFAULT 部分并应用于所有连接,或者您可以将它们添加到要详细检查的连接的各个 ROUTING: ... 部分。

    • client_ssl_mode:设置为 PREFERREDREQUIRED

    • server_ssl_mode:设置为 PREFERREDREQUIREDDISABLED

    • connection_sharing:设置为 1 以启用连接共享。

例如

[DEFAULT]
max_idle_server_connections=64 

[routing:{...}]
client_ssl_mode=PREFERRED 
server_ssl_mode=PREFERRED
connection_sharing=1

启用 ROUTER TRACE

可以在 MySQL 客户端的命令行上为每个会话或每个语句启用 ROUTER TRACE。

  • 为每个会话启用

    ROUTER SET TRACE = 1;
  • 为每个会话禁用

    ROUTER SET TRACE = 0;
  • 为每个语句启用

    query_attributes router.trace 1;
  • 为每个语句禁用

    query_attributes router.trace 0;

跟踪格式

跟踪在具有以下属性的 JSON 对象中返回

  • start_time:表示跨度开始的日期和时间字符串。

  • end_time:表示跨度结束的日期和时间字符串。

  • elapsed_in_span_us:在当前跨度中花费的微秒数。此值为 end_time 减去 start_time

  • status_code:表示已完成跨度的规范状态代码。默认值为空。

  • name:事件的名称。

  • attributes:事件的属性。

  • events:事件数组。这些包含以下内容

    • timestamp:日期和时间字符串。

    • name:事件的名称。

    • attributes:事件的属性。

例如

> mysql --host=127.0.0.1 --port=6446 --show-warnings
> ROUTER SET trace = 1;
> SELECT @@port;
+--------+
| @@port |
+--------+
|   3306 |
+--------+
1 row in set, 1 warning (0,02 sec)
Note (code 4600): {
  "start_time": "2023-03-23T15:31:08.052442Z",
  "end_time": "2023-03-23T15:31:08.052653Z",
  "elapsed_in_span_us": 211,
  "name": "mysql/query",
  "attributes": {
    "mysql.sharing_blocked": false
  },
  "events": [
    {
      "timestamp": "2023-03-23T15:31:08.052444Z",
      "name": "mysql/query_classify",
      "attributes": {
        "mysql.query.classification": "change_on_tracker"
      }
    },
    {
      "start_time": "2023-03-23T15:31:08.052455Z",
      "end_time": "2023-03-23T15:31:08.052495Z",
      "elapsed_in_span_us": 39,
      "name": "mysql/connect_and_forward",
      "attributes": {
        "mysql.remote.is_connected": true,
        "mysql.remote.endpoint": "localhost:3306",
        "mysql.remote.connection_id": 17,
        "db.name": ""
      },
      "events": [
        {
          "start_time": "2023-03-23T15:31:08.052458Z",
          "end_time": "2023-03-23T15:31:08.052495Z",
          "elapsed_in_span_us": 36,
          "name": "mysql/forward"
        }
      ]
    },
    {
      "start_time": "2023-03-23T15:31:08.052623Z",
      "end_time": "2023-03-23T15:31:08.052627Z",
      "elapsed_in_span_us": 3,
      "name": "mysql/response",
      "attributes": {
        "mysql.session.@@SESSION.statement_id": "84"
      }
    }
  ]
}

跟踪事件

支持以下跟踪事件和属性

mysql/query

MySQL Router 收到查询。

属性

  • mysql.sharing_blocked:布尔值。如果连接共享被阻止,则会显示 mysql.sharing_blocked_by 以及阻止共享的原因。

  • mysql.sharing_blocked_by:字符串。显示阻止连接共享的原因。这可以是以下值之一

    • trx-state:事务处于活动状态。

    • trx-characteristics:已设置事务状态。例如,SET TRANSACTION READ ONLY

    • some-state-changed:会话处于不可恢复状态。

    • session-track-gtidssession_track_gtids 不包含预期值。

    • session-track-state-changesession_track_state_change 不包含预期值。

    • session-track-transaction-infosession_track_state_change 不包含预期值。

mysql/query_classify

描述 MySQL Router 如何在连接共享的上下文中分析语句。

属性

  • mysql.query.classification:以下一项或多项的逗号分隔列表

    • accept_session_state_from_session_tracker:该语句导致会话跟踪器发出的通知按原样被接受。

    • ignore_session_tracker_some_state_changed:该语句导致会话跟踪器发出的通知被忽略。

    • session_not_sharable_on_error:诸如 SET known_variable = 1, unknown_variable = 2 之类的语句可能会导致会话状态更改,尽管该语句失败。服务器会响应错误,但不会响应会话跟踪器,即使会话状态已更改。

    • session_not_sharable_on_success:如果语句修改了会话状态,但会话跟踪器没有报告,则设置。

    • forbidden_function_with_connection_sharing:该语句包含无法与连接共享一起使用的函数或关键字。例如 GET DIAGNOSTICSLAST_INSERT_ID()

    • forbidden_set_with_connection_sharing:该语句尝试设置连接共享所需的会话跟踪器信息。

mysql/connect_and_forward

属性

  • mysql.remote.is_connected:布尔值。如果为 fale,则表示没有连接。如果为 true,则返回以下值

    • mysql.remote.endpoint:服务器连接端点的名称。

    • mysql.remote.connection_id:服务器连接的连接 ID。

    • db.name:模式的名称。

mysql/from_pool_or_connect

属性

  • mysql.remote.candidates:以逗号分隔的端点列表。

  • net.peer.name:此连接在其先前会话中连接到的端点的主机名。

  • net.peer.port:此连接在其先前会话中连接到的端点的端口。

mysql/from_pool

属性

  • mysql.error_message:如果 status_codeERROR,则显示。

  • mysql.remote.connection_id:服务器连接的连接 ID。

mysql/connect

属性

  • net.peer.name:端点的主机名。

  • net.peer.port:端点的端口。

mysql/authenticate

属性

  • mysql.remote.needs_full_authentication:布尔值。如果需要完全握手(true)或是否可以快速重置连接(false)。

    如果为 true,则后跟 mysql/change_user。如果为 false,则后跟 mysql/reset_connected

mysql/server_greeting

属性

  • mysql.remote.connection_id:服务器连接的连接 ID。

mysql/client_greeting

属性

  • db.name:模式的名称。

mysql/tls_connect

属性

  • tls.version:正在使用的 TLS 版本。

  • tls.cipher:用于连接的 TLS 密码。

  • tls.session_resused:布尔值。如果重用了 TLS 会话,则为 True

mysql/response

属性

  • mysql.session.@@SESSION.*:根据服务器会话跟踪器更改的会话变量。

  • mysql.session.transaction_state:以逗号分隔的事务状态列表。

  • mysql.session.transaction_characteristics:还原事务状态所需的语句。

mysql/set_var

属性

  • mysql.session.@@SESSION.*:重新连接后还原的会话变量。

以下事件具有与 mysql/query 相同的属性

  • mysql/ping

  • mysql/stmt_prepare

  • mysql/stmt_execute

  • mysql/kill

  • mysql/statistics

  • mysql/set_option

  • mysql/reload

  • mysql/list_fields

以下事件没有属性

  • mysql/prepare_server_connection:

  • mysql/reset_connection:

  • mysql/greeting:

  • mysql/forward:

跟踪示例

简单的查询转发

以下示例显示了简单转发查询的跟踪

  1. MySQL Router 收到查询。

  2. MySQL Router 将查询转发到服务器。

  3. MySQL Router 等待结果。

  4. MySQL Router 将结果转发给客户端。

$ mysql --host=127.0.0.1 --port=6446 --show-warnings
> ROUTER SET trace = 1;
> SELECT @@port;
+--------+
| @@port |
+--------+
|   3306 |
+--------+
1 row in set, 1 warning (0,02 sec)
Note (code 4600): {
  "start_time": "2023-03-23T15:31:08.052442Z",
  "end_time": "2023-03-23T15:31:08.052653Z",
  "elapsed_in_span_us": 211,
  "name": "mysql/query",
  "attributes": {
    "mysql.sharing_blocked": false
  },
  "events": [
    {
      "timestamp": "2023-03-23T15:31:08.052444Z",
      "name": "mysql/query_classify",
      "attributes": {
        "mysql.query.classification": "accept_session_state_from_session_tracker"
      }
    },
    {
      "start_time": "2023-03-23T15:31:08.052455Z",
      "end_time": "2023-03-23T15:31:08.052495Z",
      "elapsed_in_span_us": 39,
      "name": "mysql/connect_and_forward",
      "attributes": {
        "mysql.remote.is_connected": true,
        "mysql.remote.endpoint": "localhost:3306",
        "mysql.remote.connection_id": 17,
        "db.name": ""
      },
      "events": [
        {
          "start_time": "2023-03-23T15:31:08.052458Z",
          "end_time": "2023-03-23T15:31:08.052495Z",
          "elapsed_in_span_us": 36,
          "name": "mysql/forward"
        }
      ]
    },
    {
      "start_time": "2023-03-23T15:31:08.052623Z",
      "end_time": "2023-03-23T15:31:08.052627Z",
      "elapsed_in_span_us": 3,
      "name": "mysql/response",
      "attributes": {
        "mysql.session.@@SESSION.statement_id": "84"
      }
    }
  ]
}