Cube can tag the queries it sends to your data source with a trace_id SQL
comment, letting you match a query in your data source’s query history back to
the API request that caused it.
This is useful when one API request fans out into several data source
queries — every one of them carries the same trace_id.
Configuration
Set CUBEJS_SQL_INCLUDE_TRACE_ID
to true:
Queries then reach your data source with the comment appended:
trace_id identifies the API request and matches the field of the same name in
the Query History export.
Trace ids longer than 128 characters are truncated, and any character outside
A-Z a-z 0-9 . _ : - is removed.
A unique comment per request makes each query textually distinct, which
prevents your data source from reusing cached results — Snowflake’s persisted
query results and BigQuery’s result cache both require identical query text.
Expect more queries to actually execute, and on Snowflake a warehouse that
would have stayed suspended may resume.
Some query history views truncate long SQL, and a few omit comments entirely.
If you can’t find the trace_id, check where you’re reading it from:
- Snowflake:
QUERY_HISTORY. Note that Snowflake strips leading comments,
which is why Cube appends.
- Redshift:
SYS_QUERY_TEXT, reassembled with LISTAGG.
SYS_QUERY_HISTORY and STL_QUERY truncate at 4000 characters.
- BigQuery:
INFORMATION_SCHEMA.JOBS. Cloud Audit Logs truncate at 50K
characters.
- Databricks:
system.query.history. Empty when customer-managed keys are
enabled.
- Postgres: server logs (
log_statement). pg_stat_activity.query
truncates at track_activity_query_size (1024 bytes by default).
- MySQL: the general or slow query log.
Supplying your own identifier
Clients calling the REST (JSON) API can
supply their own identifier through the x-request-id or traceparent request
header, letting you trace a query back to a request in your own application.
Otherwise Cube generates one.
Scope
Queries issued to serve an API request are tagged. Pre-aggregation builds,
export bucket operations, refresh keys, background refreshes, and Cube’s own
internal queries are left untagged, since there is no API request to trace them
back to.
A single request usually produces one tagged query, but not always — a query
reading a lambda pre-aggregation’s source table, for instance, is tagged too.
Match on trace_id rather than assuming one row per request.
Not every request produces a tagged query to find: one served from the cache or
from a pre-aggregation never reaches your data source, and when identical
queries arrive together Cube runs them once, under whichever request got there
first.