メインコンテンツへスキップ
メインコンテンツへスキップ

system.trace_log

ClickHouse Cloud でのクエリ実行

このシステムテーブルのデータは、ClickHouse Cloud の各ノードにローカルに格納されています。そのため、すべてのデータを包括的に確認するには、clusterAllReplicas 関数を使用する必要があります。詳細についてはこちらを参照してください。

説明

サンプリングクエリプロファイラ によって収集されたスタックトレースを格納します。

ClickHouse は、サーバー構成セクション trace_log が設定されている場合にこのテーブルを作成します。あわせて次の設定も参照してください: query_profiler_real_time_period_nsquery_profiler_cpu_time_period_nsmemory_profiler_stepmemory_profiler_sample_probabilitytrace_profile_events

ログを分析するには、addressToLineaddressToLineWithInlinesaddressToSymboldemangle といったイントロスペクション関数を使用します。

カラム

  • hostname (LowCardinality(String)) — クエリを実行しているサーバーのホスト名。
  • event_date (Date) — サンプリング時点の日付。
  • event_time (DateTime) — サンプリング時点のタイムスタンプ。
  • event_time_microseconds (DateTime64(6)) — マイクロ秒精度のサンプリング時点のタイムスタンプ。
  • timestamp_ns (UInt64) — サンプリング時点のタイムスタンプ (ナノ秒単位) 。
  • revision (UInt32) — ClickHouse サーバーのビルドリビジョン。clickhouse-client でサーバーに接続すると、Connected to ClickHouse server version 19.18.1. のような文字列が表示されます。このフィールドにはサーバーの version ではなく、revision が含まれます。
  • trace_type (Enum8('Real' = 0, 'CPU' = 1, 'Memory' = 2, 'MemorySample' = 3, 'MemoryPeak' = 4, 'ProfileEvent' = 5, 'JemallocSample' = 6, 'MemoryAllocatedWithoutCheck' = 7, 'Instrumentation' = 8)) — トレースの種類: Real は、wall-clock time に基づいて stack traces を収集することを表します。CPU は、CPU 時間に基づいて stack traces を収集することを表します。Memory は、メモリ割り当てが次のウォーターマークを超えたときに、割り当てと解放を収集することを表します。MemorySample は、ランダムな割り当てと解放を収集することを表します。MemoryPeak は、Peak memory usage の更新を収集することを表します。ProfileEvent は、profile events の増分を収集することを表します。JemallocSample は、jemalloc のサンプルを収集することを表します。MemoryAllocatedWithoutCheck は、メモリ制限を無視して行われる大規模な割り当て (>16MiB) を収集することを表します (ClickHouse 開発者専用) 。Instrumentation は、XRay を通じて実行されるインストルメンテーションによって収集された traces を表します。
  • cpu_id (UInt64) — CPU の識別子。
  • thread_id (UInt64) — スレッド ID。
  • thread_name (LowCardinality(String)) — スレッド名。
  • query_id (String) — query_log system テーブルから、実行されていたクエリの詳細を取得するために使用できるクエリ識別子。
  • trace (Array(UInt64)) — サンプリング時点のスタックトレース。各要素は ClickHouse サーバープロセス内の仮想メモリアドレスです。
  • size (Int64) — トレースタイプが Memory、MemorySample、MemoryAllocatedWithoutCheck、または MemoryPeak の場合は割り当てられたメモリ量、それ以外のトレースタイプでは 0 です。
  • ptr (UInt64) — 割り当てられたchunkのアドレスです。
  • memory_context (Enum8('Unknown' = -1, 'Global' = 0, 'User' = 1, 'Process' = 2, 'Thread' = 3, 'Max' = 4)) — メモリトラッカーのコンテキスト (Memory/MemoryPeak のみ) : Unknown コンテキストは、この trace_type では定義されていません。Global はサーバーコンテキストを表します。User はユーザー/マージコンテキストを表します。Process はプロセス (つまりクエリ) コンテキストを表します。Thread はスレッド (特定のプロセスのスレッド) コンテキストを表します。Max は特殊な値で、メモリトラッカーがブロックされていないことを意味します (blocked_context カラム用) 。
  • memory_blocked_context (Enum8('Unknown' = -1, 'Global' = 0, 'User' = 1, 'Process' = 2, 'Thread' = 3, 'Max' = 4)) — メモリトラッカーがブロックされるコンテキスト (ClickHouse 開発者専用) : Unknown コンテキストは、この trace_type では定義されていません。Global はサーバーコンテキストを表します。User はユーザー/マージコンテキストを表します。Process はプロセス (つまりクエリ) コンテキストを表します。Thread はスレッドコンテキスト (特定のプロセスのスレッド) を表します。Max は特殊な値で、メモリトラッカーがブロックされていないことを意味します (blocked_context カラム用) 。
  • event (LowCardinality(String)) — トレースタイプが ProfileEvent の場合は、更新されたプロファイルイベントの名前を示します。それ以外のトレースタイプでは空文字列です。
  • increment (Int64) — トレースの種類が ProfileEvent の場合は、プロファイルイベントの増分量です。それ以外のトレースの種類では 0 です。
  • symbols (Array(LowCardinality(String))) — シンボル化が有効な場合は、trace に対応するデマングルされたシンボル名が含まれます。シンボル化は、サーバー設定ファイル内の trace_logsymbolize 設定で有効または無効にできます。
  • lines (Array(LowCardinality(String))) — シンボル化が有効な場合、trace に対応する行番号付きファイル名の文字列が格納されます。
  • function_id (Nullable(Int32)) — trace 型の Instrumentation では、ELF バイナリの xray_instr_map セクション内で関数に割り当てられる ID。
  • function_name (Nullable(String)) — trace 型の Instrumentation における、計装された関数の名前。
  • handler (Nullable(String)) — trace 型の Instrumentation の場合、計装対象の関数の handler。
  • entry_type (Nullable(Enum8('Entry' = 0, 'Exit' = 1))) — trace 型の Instrumentation における、計測対象関数のエントリ種別。
  • duration_nanoseconds (Nullable(UInt64)) — trace 型の Instrumentation における、関数の実行時間 (ナノ秒) 。

別名:

  • build_id'E2EEB60ED9503BFFA825B628D480CCDC40B2D416' のエイリアス。

シンボル化はサーバーの構成ファイル内の trace_log セクションの symbolize で有効または無効を切り替えることができます。

SELECT * FROM system.trace_log LIMIT 1 \G
Row 1:
──────
hostname:                clickhouse.eu-central1.internal
event_date:              2025-11-11
event_time:              2025-11-11 11:53:59
event_time_microseconds: 2025-11-11 11:53:59.128333
timestamp_ns:            1762862039128333000
revision:                54504
trace_type:              Instrumentation
cpu_id:                  19
thread_id:               3166432 -- 3.17 million
query_id:                ef462508-e189-4ea2-b231-4489506728e8
trace:                   [350594916,447733712,447742095,447727324,447726659,221642873,450882315,451852359,451905441,451885554,512404306,512509092,612861767,612863269,612466367,612455825,137631896259267,137631896856768]
size:                    0
ptr:                     0
memory_context:          Unknown
memory_blocked_context:  Unknown
event:
increment:               0
symbols:                 ['StackTrace::StackTrace()','DB::InstrumentationManager::createTraceLogElement(DB::InstrumentationManager::InstrumentedPointInfo const&, XRayEntryType, std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>) const','DB::InstrumentationManager::profile(XRayEntryType, DB::InstrumentationManager::InstrumentedPointInfo const&)','DB::InstrumentationManager::dispatchHandlerImpl(int, XRayEntryType)','DB::InstrumentationManager::dispatchHandler(int, XRayEntryType)','__xray_FunctionEntry','DB::QueryMetricLog::startQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>, unsigned long)','DB::logQueryStart(std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>> const&, std::__1::shared_ptr<DB::Context> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, unsigned long, std::__1::shared_ptr<DB::IAST> const&, DB::QueryPipeline const&, DB::IInterpreter const*, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, bool)','DB::executeQueryImpl(char const*, char const*, std::__1::shared_ptr<DB::Context>, DB::QueryFlags, DB::QueryProcessingStage::Enum, std::__1::unique_ptr<DB::ReadBuffer, std::__1::default_delete<DB::ReadBuffer>>&, std::__1::shared_ptr<DB::IAST>&, std::__1::shared_ptr<DB::ImplicitTransactionControlExecutor>, std::__1::function<void ()>)','DB::executeQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::shared_ptr<DB::Context>, DB::QueryFlags, DB::QueryProcessingStage::Enum)','DB::TCPHandler::runImpl()','DB::TCPHandler::run()','Poco::Net::TCPServerConnection::start()','Poco::Net::TCPServerDispatcher::run()','Poco::PooledThread::run()','Poco::ThreadImpl::runnableEntry(void*)','start_thread','__clone3']
lines:                   ['./build/../src/Common/StackTrace.cpp:395','./src/Common/StackTrace.h:62','./contrib/llvm-project/libcxx/include/__memory/shared_ptr.h:738','./build/./src/Interpreters/InstrumentationManager.cpp:257','./build/./src/Interpreters/InstrumentationManager.cpp:225','/home/ubuntu/ClickHouse/ClickHouse/build/programs/clickhouse','./build/./src/Interpreters/QueryMetricLog.cpp:0','./contrib/llvm-project/libcxx/include/__memory/shared_ptr.h:667','./build/./src/Interpreters/executeQuery.cpp:0','./build/./src/Interpreters/executeQuery.cpp:0','./contrib/llvm-project/libcxx/include/__memory/shared_ptr.h:744','./contrib/llvm-project/libcxx/include/__memory/shared_ptr.h:583','./build/../base/poco/Net/src/TCPServerConnection.cpp:54','../contrib/llvm-project/libcxx/include/__memory/unique_ptr.h:80','./build/../base/poco/Foundation/src/ThreadPool.cpp:219','../base/poco/Foundation/include/Poco/AutoPtr.h:77','/home/ubuntu/ClickHouse/ClickHouse/build/programs/clickhouse','/home/ubuntu/ClickHouse/ClickHouse/build/programs/clickhouse']
function_id:             231255
function_name:           DB::QueryMetricLog::startQuery(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&, std::__1::chrono::time_point<std::__1::chrono::system_clock, std::__1::chrono::duration<long long, std::__1::ratio<1l, 1000000l>>>, unsigned long)
handler:                 profile
entry_type:              Exit
duration_nanoseconds:   58435

Chrome Event Trace Format への変換

プロファイリングデータは、次のクエリを使用して Chrome の Event Trace Format に変換できます。クエリを chrome_trace.sql ファイルとして保存してください:

WITH traces AS (
    SELECT * FROM system.trace_log
    WHERE event_date >= today() AND trace_type = 'Instrumentation' AND handler = 'profile'
    ORDER BY event_time, entry_type
)
SELECT
    format(
        '{{"traceEvents": [{}\n]}}',
        arrayStringConcat(
            groupArray(
                format(
                    '\n{{"name": "{}", "cat": "clickhouse", "ph": "{}", "ts": {}, "pid": 1, "tid": {}, "args": {{"query_id": "{}", "cpu_id": {}, "stack": [{}]}}}},',
                    function_name,
                    if(entry_type = 0, 'B', 'E'),
                    timestamp_ns/1000,
                    toString(thread_id),
                    query_id,
                    cpu_id,
                    arrayStringConcat(arrayMap((x, y) -> concat('"', x, ': ', y, '", '), lines, symbols))
                )
            )
        )
    )
FROM traces;

そして、ClickHouse Client でこれを実行して trace.json ファイルとしてエクスポートし、そのファイルを Perfetto または speedscope にインポートします。

echo $(clickhouse client --query "$(cat chrome_trace.sql)") > trace.json

よりコンパクトだが情報量の少ないトレースにしたい場合は、スタック部分を省略できます。

関連項目