Skip to content

Commit b38ec65

Browse files
committed
update
1 parent c609ca0 commit b38ec65

File tree

3 files changed

+35
-16
lines changed

3 files changed

+35
-16
lines changed

src/components/queryBuilder/views/TraceQueryBuilder.tsx

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ import { OrderByEditor, getOrderByOptions } from '../OrderByEditor';
1919
import { LimitEditor } from '../LimitEditor';
2020
import { LabeledInput } from 'components/configEditor/LabeledInput';
2121
import { Switch } from '../Switch';
22-
import useTables from 'hooks/useTables';
23-
import otel from 'otel';
2422

2523
interface TraceQueryBuilderProps {
2624
datasource: Datasource;
@@ -60,11 +58,6 @@ interface TraceQueryBuilderState {
6058
export const TraceQueryBuilder = (props: TraceQueryBuilderProps) => {
6159
const { datasource, builderOptions, builderOptionsDispatch } = props;
6260
const allColumns = useColumns(datasource, builderOptions.database, builderOptions.table);
63-
const tables = useTables(datasource, builderOptions.database);
64-
const hasTraceTimestampTable = useMemo(
65-
() => tables.some((t) => t === builderOptions.table + otel.traceTimestampTableSuffix),
66-
[builderOptions.table, tables]
67-
);
6861
const isNewQuery = useIsNewQuery(builderOptions);
6962
const [showConfigWarning, setConfigWarningOpen] = useState(
7063
datasource.getDefaultTraceColumns().size === 0 && builderOptions.columns?.length === 0
@@ -142,7 +135,6 @@ export const TraceQueryBuilder = (props: TraceQueryBuilderProps) => {
142135
flattenNested: next.flattenNested,
143136
traceEventsColumnPrefix: next.traceEventsColumnPrefix,
144137
traceLinksColumnPrefix: next.traceLinksColumnPrefix,
145-
hasTraceTimestampTable,
146138
},
147139
})
148140
);

src/data/utils.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -154,12 +154,6 @@ export const transformQueryResponseWithTraceAndLogLinks = (
154154
const traceIdQuery: CHBuilderQuery = {
155155
datasource: datasource,
156156
editorType: EditorType.Builder,
157-
/**
158-
* Evil bug:
159-
* The rawSql value might contain time filters such as $__fromTime and $__toTime.
160-
* Grafana sees these time range filters as data links and will refuse to enable the traceID link if these are present.
161-
* Set rawSql to empty since it gets regenerated when the panel renders anyway.
162-
*/
163157
rawSql: '',
164158
builderOptions: {} as QueryBuilderOptions,
165159
pluginVersion,
@@ -209,6 +203,7 @@ export const transformQueryResponseWithTraceAndLogLinks = (
209203
otelVersion: otelVersion,
210204
traceEventsColumnPrefix: traceEventsColumnPrefix,
211205
traceLinksColumnPrefix: traceLinksColumnPrefix,
206+
hasTraceTimestampTable: Boolean(otelVersion),
212207
},
213208
};
214209

@@ -224,6 +219,11 @@ export const transformQueryResponseWithTraceAndLogLinks = (
224219
traceIdQuery.builderOptions = options;
225220
}
226221

222+
// Pre-generate rawSql so the query executes immediately when the link is opened.
223+
// Trace ID queries don't contain $__fromTime/$__toTime time macros, so they're
224+
// safe to include (unlike trace search queries which would break data link detection).
225+
traceIdQuery.rawSql = generateSql(traceIdQuery.builderOptions);
226+
227227
const traceLogsQuery: CHBuilderQuery = {
228228
datasource: datasource,
229229
editorType: EditorType.Builder,

src/views/CHQueryEditor.tsx

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useEffect, useRef } from 'react';
1+
import React, { useEffect, useMemo, useRef } from 'react';
22
import { QueryEditorProps } from '@grafana/data';
33
import { Datasource } from 'data/CHDatasource';
44
import { EditorTypeSwitcher } from 'components/queryBuilder/EditorTypeSwitcher';
@@ -10,9 +10,11 @@ import { QueryBuilder } from 'components/queryBuilder/QueryBuilder';
1010
import { generateSql } from 'data/sqlGenerator';
1111
import { SqlEditor } from 'components/SqlEditor';
1212
import { isBuilderOptionsRunnable, mapQueryBuilderOptionsToGrafanaFormat } from 'data/utils';
13-
import { setAllOptions, useBuilderOptionsState } from 'hooks/useBuilderOptionsState';
13+
import { setAllOptions, setOptions, useBuilderOptionsState } from 'hooks/useBuilderOptionsState';
1414
import { pluginVersion } from 'utils/version';
1515
import { migrateCHQuery } from 'data/migration';
16+
import useTables from 'hooks/useTables';
17+
import otel from 'otel';
1618

1719
export type CHQueryEditorProps = QueryEditorProps<Datasource, CHQuery, CHConfig>;
1820

@@ -65,6 +67,31 @@ const CHEditorByType = (props: CHQueryEditorProps) => {
6567
shouldSkipChanges.current = false;
6668
}
6769

70+
// Resolve hasTraceTimestampTable for OTel trace ID queries.
71+
// This runs at the CHEditorByType level (not inside TraceQueryBuilder)
72+
// so it works even when the builder is minimized via deep-links.
73+
const needsTraceTableCheck = Boolean(builderOptions.meta?.isTraceIdMode && builderOptions.meta?.otelEnabled);
74+
const traceDb = needsTraceTableCheck ? builderOptions.database : '';
75+
const traceTables = useTables(props.datasource, traceDb);
76+
const hasTraceTimestampTable = useMemo(
77+
() => traceTables.some((t) => t === builderOptions.table + otel.traceTimestampTableSuffix),
78+
[builderOptions.table, traceTables]
79+
);
80+
81+
useEffect(() => {
82+
if (!needsTraceTableCheck || traceTables.length === 0) {
83+
return;
84+
}
85+
86+
if (hasTraceTimestampTable !== builderOptions.meta?.hasTraceTimestampTable) {
87+
builderOptionsDispatch(
88+
setOptions({
89+
meta: { hasTraceTimestampTable },
90+
})
91+
);
92+
}
93+
}, [needsTraceTableCheck, traceTables, hasTraceTimestampTable, builderOptions.meta?.hasTraceTimestampTable, builderOptionsDispatch]);
94+
6895
useEffect(() => {
6996
if (shouldSkipChanges.current || query.editorType === EditorType.SQL) {
7097
return;

0 commit comments

Comments
 (0)