OceanBaseデータベースのエンドツーエンド・トレース機能は、クライアントからOBProxy、さらにOBServerまでの全リンク各段階の所要時間および各コンポーネント診断に関連するTrace情報を記録できます。ここで、Trace Logが記録する最小単位はSpanであり、各Spanは特定の実行区間またはモジュールの開始から終了までの時間および関連情報(Tagsを使用して)を記録できます。これにより、運用保守担当者はデータベース内部の処理ロジックを理解し、問題の原因を特定するのに役立ちます。
SpanとTagの定義
SpanとTagの定義はob_trace_def.hファイルにあり、HIGH(Level 1)、MIDDLE(Level 2)、LOW(Level 3)の3つのレベルに分かれています。ここで、HIGHがデフォルト設定レベルであり、デフォルトではLevel 1に対応するSpanとTagが出力されます。他のレベルのSpanとTagを出力する必要がある場合は、制御コマンドを使用してTrace Level値を上げる必要があります。Level 2のSpanは、ユーザーが問題を分析する際により多くのSpan情報を得るために使用でき、Level 3 Spanは主にOceanBaseデータベースの研究開発における問題診断時により詳細な情報を得るために使用されます。設定されたLevel値がNの場合、TraceはLevel <= NのSpanとTagを出力します。
Spanの定義は以下のとおりです:
#define HIGH_LEVEL_SPAN
DEF_SPAN(span_type, comment)
#undef HIGH_LEVEL_SPAN
#define MIDDLE_LEVEL_SPAN
DEF_SPAN(span_type, comment)
#undef MIDDLE_LEVEL_SPAN
#define LOW_LEVEL_SPAN
DEF_SPAN(span_type, comment)
#undef LOW_LEVEL_SPAN
Tagの定義は以下のとおりです:
#define HIGH_LEVEL_TAG
DEF_SPAN(tag_type, comment)
#undef HIGH_LEVEL_TAG
#define MIDDLE_LEVEL_TAG
DEF_SPAN(tag_type, comment)
#undef MIDDLE_LEVEL_TAG
#define LOW_LEVEL_TAG
DEF_SPAN(tag_type, comment)
#undef LOW_LEVEL_TAG
関連するSpanの紹介は以下のとおりです:
com_query_entry:クエリプロセス。mpquery_single_stmt:単一ステートメントのアクセスパス。sql_compile:SQLのコンパイル。pc_get_plan:実行計画の取得。hard_parse:ハードパース。parse:ソフトパース。resolve:構文木の意味を解析し、ステートメントを生成する。rewrite:SQLのリライト。optimize:コストベースの最適化を行い、実行計画ログを生成する。code_generate:実行計画ログに基づいて物理実行計画を生成する。pc_add_plan:生成された実行計画をPlan Cacheに追加する。sql_execute:物理実行計画を実行する。open:実行計画を開きます。response_result:実行計画のプロセスと結果。px_schedule:PXによるタスクの分割。px_task:PXサブタスクの実行。close:実行計画を閉じます。cmd_execute:コマンドを実行します。cmd_open:コマンドを開始します。ps_prepare:Preprocess Statementの事前処理。ps_execute:Preprocess Statementの実行。ps_close:Preprocess Statementを閉じます。pl_entry:ストアドプロシージャ処理。pl_compile:ストアドプロシージャオブジェクトのコンパイル。pc_get_pl_object:Plan Cacheからストアドプロシージャオブジェクトを取得します。pc_add_pl_object:ストアドプロシージャオブジェクトをPlan Cacheに格納します。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トランザクションをロールバックします。
関連するTagの紹介は以下のとおりです:
com_query_entrylog_trace_id:現在のリクエストのログ内のTrace ID。err_code:現在のリクエストのエラーコード。
sql_compilesess_id:セッションID。sql_text:SQLテキスト。sql_id:SQL ID。hit_plan:実行計画が実行計画キャッシュにヒットした場合。
px_tasktask_id:パラレルタスクの論理ID。dfo_id:データフロー操作ID。sqc_id:サブクエリコーディネータID。qc_id:クエリコーディネータID。group_id:リソースグループID。
px_scheduledfo_id:データフロー操作ID。used_worker_cnt:使用中のPXワーカースレッドの数。qc_id:クエリコーディネータID。
ps_closeps_id:プリプロセスステートメントID。
Traceログの例
運用保守担当者は、必要に応じてPL/SQLパッケージDBMS_MONITORの関連メソッドを使用して、関連アプリケーションのさまざまな識別情報の次元でエンドツーエンドトレースを有効にするかどうか、およびそのトレースのポイント付けと関連情報をトレースログに出力するポリシーを制御できます。ログの出力は、サンプリング頻度に基づいてサンプリングされメモリに記録されるかどうかが判断され、一定の確率でトレースログに出力されます。詳細については、エンドツーエンドトレースを参照してください。 例:
+-------------------------------------------+----------------------------+------------+
| Operation | StartTime | ElapseTime |
+-------------------------------------------+----------------------------+------------+
| com_query_process | 2023-03-22 14:30:27.552259 | 0.405 ms |
| └── mpquery_single_stmt | 2023-03-22 14:30:27.552266 | 0.386 ms |
| ├── sql_compile | 2023-03-22 14:30:27.552283 | 0.083 ms |
| │ └── pc_get_plan | 2023-03-22 14:30:27.552286 | 0.025 ms |
| └── sql_execute | 2023-03-22 14:30:27.552379 | 0.242 ms |
| ├── open | 2023-03-22 14:30:27.552380 | 0.024 ms |
| ├── response_result | 2023-03-22 14:30:27.552417 | 0.140 ms |
| │ ├── get_das_id | 2023-03-22 14:30:27.552421 | 0.000 ms |
| │ └── do_local_das_task | 2023-03-22 14:30:27.552435 | 0.049 ms |
| └── close | 2023-03-22 14:30:27.552570 | 0.039 ms |
| ├── close_das_task | 2023-03-22 14:30:27.552571 | 0.012 ms |
| └── end_transaction | 2023-03-22 14:30:27.552596 | 0.003 ms |
+-------------------------------------------+----------------------------+------------+
12 rows in set (0.006 sec)