フルスタックにおいて、異なるリクエストにはそれぞれ対応するリクエストチェーンが存在します。完全なリクエストチェーン(Trace)は、複数のリクエストプロセス(Span)で構成されており、OceanBaseデータベースでは内部処理の各プロセスを1つのSpanとして定義しています。リクエストチェーンはツリー構造として理解でき、親ノードSpanとその子ノードSpanを含みます。この情報はトレースログ(trace logs)に出力され、parent_id と id を用いて親子ノードが関連付けられます。同時に、trace logs内では各リクエストプロセスに実際に実行されたSQL情報が含まれ、これをtagと呼び、異なるtagで現在の操作の詳細情報を記録します。Spanとtagはtrace logsに記録され、運用保守担当者がデータベース内部の処理ロジックを理解し、問題箇所を特定するのに役立ちます。 アクセスチェーン全体を3つの部分に分けて紹介します。
主要な概念
- Trace:フルリンクトレースプロセスにおいて、TraceはOceanBaseのトランザクションと理解できます。
- Span:特定のTraceに属し、1つのTraceに複数のSpanが存在することがあります。Spanはステートメント、関数、匿名ブロックなどを指します。
- tag:KVであり、特定のSpanに属します。1つのSpanに複数のtagが存在することがあります。
- log:timestamp付きのKVであり、特定のSpanに属します。1つのSpanに複数のlogが存在することがあります。
クライアント
アプリケーションは、OBClientクライアントまたはJDBCドライバーを使用してOceanBaseデータベースに接続します。 クライアント関連のSpanには、obclientとJDBCの2種類があります。
obclient:OBClientクライアントを介してアクセスします。JDBC:JDBCドライバーを介して接続します。
クライアント関連のタグには、command_nameとclient_ipの2種類があります。OBClientとJDBCのタグ情報は一致しています。
command_nameは、テキスト、準備、実行など、異なるタイプのリクエストをマークするために使用されます。client_ipは、リクエストを送信したobclientのIPアドレスとポートをマークするために使用されます。
OBProxy
この段階では、3種類のレベルのSpanが定義されます。ここでのレベルは、DBMS_MONITORのTrace関連関数における変数levelに対応します。
レベル1
ここでは、ob_proxyとob_proxy_server_process_reqの2種類のSpanを定義します。
ob_proxyは、OceanBaseデータベースにおいて、フロントエンドドライバーレイヤーを除く、データベースリクエスト開始からデータ処理完了、結果フィードバックまでの全プロセスにかかる時間です。ob_proxy_server_process_reqは、OBProxyがSQLリクエストを処理するために要する時間と、アクセスの往復に伴うネットワークオーバーヘッドです。
レベル2
ここでは、ob_proxy_server_response_readとob_proxy_cluster_resource_createの2種類のSpanを定義します。
ob_proxy_server_response_readは、全体としてレスポンス結果を読み取るためにかかる時間です。ob_proxy_cluster_resource_createは、リクエスト転送段階において、OBProxyがクラスタリソースを準備するためにかかる時間です。
レベル3
ここでは、ob_proxy_partition_location_lookup、ob_proxy_do_OBServer_open、ob_proxy_client_response_write、ob_proxy_server_request_writeの4種類のSpanを定義します。
ob_proxy_partition_location_lookupは、リクエスト転送段階において、OBProxyがパーティションの位置情報を取得し、ルーティングを準備するためにかかる時間です。ob_proxy_do_OBServer_openは、リクエスト転送段階において、OBProxyがOBServerを選択し、接続などの処理を行うためにかかる時間です。ob_proxy_client_response_writeは、OBProxyがOBServerからのレスポンスを受信した後、そのレスポンスをクライアントに転送するためにかかる時間です。ob_proxy_server_request_writeは、OBProxyがクライアントのリクエストをOBServerに転送するためにかかる時間です。
OBServer
スパン
OBServer内部の処理メカニズムは、配布されたリクエストをリクエストタイプに応じてテキストSQL、プリプロセスステートメント、ストアドプロシージャの3つに分類し、さらにこれらの3つのカテゴリーにはトランザクション、内部SQL、およびデータベース内部に格納されるアクセスが含まれます。
以下の図は、異なるリクエストタイプのアクセスチェーンであり、スパン間の親子関係を示しています。例:スパンmpquery_single_stmtの親スパンはcom_query_entryです。スパンcom_query_entryの子スパンはmpquery_single_stmtです。

関連するスパンの紹介は以下のとおりです:
- com_query_entry:クエリプロセス。
- mpquery_single_stmt:単一ステートメントのアクセスパス。
- sql_compile:SQLのコンパイル。
- pc_get_plan:実行計画の取得。
- hard_parse:ハードパース。
- parse:ソフトパース。
- resolve:構文ツリーのセマンティクスを解析し、ステートメントを生成する。
- rewrite:SQLの書き換え。
- optimize:コストに基づく最適化を行い、実行計画ログを生成する。
- code_generate:実行計画ログに基づいて物理実行計画を生成する。
- pc_add_plan:生成された実行計画をプランキャッシュに追加する。
- sql_execute:物理実行計画を実行する。
- open:実行計画を開く。
- response_result:実行計画プロセスと結果。
- px_schedule:pxに基づいてタスクを分割する。
- px_task:pxサブタスクを実行する。
- close:実行計画を閉じる。
- cmd_execute:コマンドを実行する。
- cmd_open:cmd計画を開始する。
- ps_prepare:プリプロセスステートメントの事前処理。
- ps_execute:プリプロセスステートメントの実行。
- ps_close:プリプロセスステートメントを閉じる。
- pl_entry:ストアドプロシージャの処理。
- pl_compile:ストアドプロシージャオブジェクトのコンパイル。
- pc_get_pl_object:プランキャッシュからストアドプロシージャオブジェクトを取得する。
- pc_add_pl_object:ストアドプロシージャオブジェクトをプランキャッシュに保存する。
- pl_execute:ストアドプロシージャを実行する。
- pl_spi_query:ストアドプロシージャ内のSPIステートメントを実行する。
- pl_spi_prepare:ストアドプロシージャの事前処理段階。
- pl_spi_execute:ストアドプロシージャ内のSPIステートメントを実行する。
- inner_prepare:内部SQLの事前処理段階。
- inner_execute:内部SQLの実行段階。
- inner_execute_read:内部SQLの読み取り。
- inner_execute_write:内部SQLの書き込み。
- inner_commit:内部SQLトランザクションのコミット。
- inner_rollback:内部SQLトランザクションのロールバック。
関連タグの紹介
一部のSpanの情報を豊かにするため、以下のようにタグが定義されています。
- com_query_entry
- log_trace_id:現在のリクエストのログ内のトレースID。
- err_code:現在のリクエストのエラーコード。
- sql_compile
- sess_id:セッションID。
- sql_text:SQLテキスト。
- sql_id:SQL ID。
- hit_plan:実行計画が実行計画キャッシュにヒットしたことを示します。
- px_task
- task_id:パラレルタスクのロジックID。
- dfo_id:データストリーム操作ID。
- sqc_id:サブクエリコーディネーターID。
- qc_id:クエリコーディネーターID。
- group_id:リソースグループID。
- px_schedule
- dfo_id:データストリーム操作ID。
- used_worker_cnt:使用中のpxワーカースレッドの数。
- qc_id:クエリコーディネーターID。
- ps_close
- ps_id:プリプロセスステートメントID。