@@ -35,7 +35,11 @@ async function getMetadataColumnNames(greptimeDb: GreptimeDb) {
3535 `SELECT column_name
3636 FROM information_schema.columns
3737 WHERE table_name = 'opentelemetry_traces'
38- AND column_name LIKE '${ METADATA_PREFIX } %'` ,
38+ AND (column_name LIKE '${ METADATA_PREFIX } %'
39+ OR column_name IN (
40+ 'span_attributes.gen_ai.usage.cache_read.input_tokens',
41+ 'span_attributes.gen_ai.usage.reasoning.output_tokens'
42+ ))` ,
3943 ) ) as Array < { column_name : unknown } > ;
4044 metadataColumnsCache . set ( "metadata_columns" , result ) ;
4145 return result ;
@@ -54,7 +58,9 @@ export async function listTraces(
5458 statusFilter ?: "ok" | "error" ,
5559 operationFilter ?: "chat" | "embeddings" ,
5660) {
57- const metadataColumns = await getMetadataColumnNames ( greptimeDb ) ;
61+ const metadataColumns = ( await getMetadataColumnNames ( greptimeDb ) ) . filter ( ( { column_name } ) =>
62+ String ( column_name ) . startsWith ( METADATA_PREFIX ) ,
63+ ) ;
5864 const metadataKeys = metadataColumns . map ( ( { column_name } ) =>
5965 String ( column_name ) . slice ( METADATA_PREFIX . length ) ,
6066 ) ;
@@ -158,12 +164,18 @@ export async function getSpans(
158164 branchSlug : string ,
159165 traceId : string ,
160166) {
161- const metadataColumns = await getMetadataColumnNames ( greptimeDb ) ;
167+ const columnNames = await getMetadataColumnNames ( greptimeDb ) ;
162168
163- const metadataSelectSql = metadataColumns
169+ const metadataSelectSql = columnNames
170+ . filter ( ( { column_name } ) => String ( column_name ) . startsWith ( METADATA_PREFIX ) )
164171 . map ( ( { column_name } ) => `"${ escapeSqlIdentifier ( String ( column_name ) ) } "` )
165172 . join ( ",\n " ) ;
166173
174+ const optionalCol = ( col : string , alias : string ) =>
175+ columnNames . some ( ( { column_name } ) => String ( column_name ) === col )
176+ ? `"${ col } " AS ${ alias } `
177+ : `NULL AS ${ alias } ` ;
178+
167179 // Parametrized version to restore once https://github.com/GreptimeTeam/greptimedb/issues/7819 is fixed:
168180 // const params = [traceId, organizationId, agentSlug, branchSlug];
169181 // WHERE "trace_id" = $1
@@ -189,8 +201,8 @@ export async function getSpans(
189201 "span_attributes.gen_ai.usage.input_tokens" AS input_tokens,
190202 "span_attributes.gen_ai.usage.output_tokens" AS output_tokens,
191203 "span_attributes.gen_ai.usage.total_tokens" AS total_tokens,
192- "span_attributes.gen_ai.usage.cache_read.input_tokens" AS cache_read_input_tokens,
193- "span_attributes.gen_ai.usage.reasoning.output_tokens" AS reasoning_tokens,
204+ ${ optionalCol ( "span_attributes.gen_ai.usage.cache_read.input_tokens" , " cache_read_input_tokens" ) } ,
205+ ${ optionalCol ( "span_attributes.gen_ai.usage.reasoning.output_tokens" , " reasoning_tokens" ) } ,
194206 "span_attributes.hebo.agent.slug",
195207 "span_attributes.hebo.branch.slug",
196208 "span_attributes.hebo.organization.id"
0 commit comments