From ec2bfa79031ef9f0f3148efde06ef82880f0bfcb Mon Sep 17 00:00:00 2001 From: Spencer Torres Date: Thu, 22 Feb 2024 01:12:54 -0500 Subject: [PATCH 1/3] Optimize OTel trace lookups with skip index --- CHANGELOG.md | 2 ++ src/data/sqlGenerator.test.ts | 55 +++++++++++++++++++++++++++++++---- src/data/sqlGenerator.ts | 31 ++++++++++++++++++-- src/otel.ts | 12 +++++++- 4 files changed, 91 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 320b42ea..4cf29bde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,11 +7,13 @@ - Added `$__fromTime_ms` macro that represents the dashboard "from" time in milliseconds using a `DateTime64(3)` - Added `$__toTime_ms` macro that represents the dashboard "to" time in milliseconds using a `DateTime64(3)` - Added `$__timeFilter_ms` macro that uses `DateTime64(3)` for millisecond precision time filtering +- When OTel is enabled, Trace ID queries now use a skip index to optimize exact ID lookups on large trace datasets (#724) ### Fixes - Fixed performance issues caused by `$__timeFilter` using a `DateTime64(3)` instead of `DateTime` (#699) - Fixed trace queries from rounding span durations under 1ms to `0` (#720) +- Fixed missing `AND` keyword when adding a filter to a Trace ID query ## 4.0.2 diff --git a/src/data/sqlGenerator.test.ts b/src/data/sqlGenerator.test.ts index 9d672b3d..d821398e 100644 --- a/src/data/sqlGenerator.test.ts +++ b/src/data/sqlGenerator.test.ts @@ -181,7 +181,50 @@ describe('SQL Generator', () => { expect(sql).toEqual(expectedSqlParts.join(' ')); }); - it('generates trace ID query', () => { + it('generates trace ID query without OTel enabled', () => { + const opts: QueryBuilderOptions = { + database: 'default', + table: 'otel_traces', + queryType: QueryType.Traces, + columns: [ + { name: 'TraceId', type: 'String', hint: ColumnHint.TraceId }, + { name: 'SpanId', type: 'String', hint: ColumnHint.TraceSpanId }, + { name: 'ParentSpanId', type: 'String', hint: ColumnHint.TraceParentSpanId }, + { name: 'ServiceName', type: 'LowCardinality(String)', hint: ColumnHint.TraceServiceName }, + { name: 'SpanName', type: 'LowCardinality(String)', hint: ColumnHint.TraceOperationName }, + { name: 'Timestamp', type: 'DateTime64(9)', hint: ColumnHint.Time }, + { name: 'Duration', type: 'Int64', hint: ColumnHint.TraceDurationTime }, + { name: 'SpanAttributes', type: 'Map(LowCardinality(String), String)', hint: ColumnHint.TraceTags }, + { name: 'ResourceAttributes', type: 'Map(LowCardinality(String), String)', hint: ColumnHint.TraceServiceTags }, + ], + filters: [], + meta: { + minimized: true, + otelEnabled: false, + otelVersion: 'latest', + traceDurationUnit: TimeUnit.Nanoseconds, + isTraceIdMode: true, + traceId: 'abcdefg' + }, + limit: 1000, + orderBy: [] + }; + const expectedSqlParts = [ + 'SELECT "TraceId" as traceID, "SpanId" as spanID, "ParentSpanId" as parentSpanID,', + '"ServiceName" as serviceName, "SpanName" as operationName, "Timestamp" as startTime,', + 'multiply("Duration", 0.000001) as duration,', + `arrayMap(key -> map('key', key, 'value',"SpanAttributes"[key]),`, + `mapKeys("SpanAttributes")) as tags,`, + `arrayMap(key -> map('key', key, 'value',"ResourceAttributes"[key]), mapKeys("ResourceAttributes")) as serviceTags`, + `FROM "default"."otel_traces" WHERE traceID = 'abcdefg'`, + 'LIMIT 1000' + ]; + + const sql = generateSql(opts); + expect(sql).toEqual(expectedSqlParts.join(' ')); + }); + + it('generates trace ID query with OTel enabled', () => { const opts: QueryBuilderOptions = { database: 'default', table: 'otel_traces', @@ -210,13 +253,15 @@ describe('SQL Generator', () => { orderBy: [] }; const expectedSqlParts = [ + `WITH 'abcdefg' as trace_id, (SELECT min(Start) FROM "default"."otel_traces_trace_id_ts" WHERE TraceId = trace_id) as trace_start,`, + `(SELECT max(End) + 1 FROM "default"."otel_traces_trace_id_ts" WHERE TraceId = trace_id) as trace_end`, 'SELECT "TraceId" as traceID, "SpanId" as spanID, "ParentSpanId" as parentSpanID,', '"ServiceName" as serviceName, "SpanName" as operationName, "Timestamp" as startTime,', 'multiply("Duration", 0.000001) as duration,', - 'arrayMap(key -> map(\'key\', key, \'value\',"SpanAttributes"[key]),', - 'mapKeys("SpanAttributes")) as tags,', - 'arrayMap(key -> map(\'key\', key, \'value\',"ResourceAttributes"[key]), mapKeys("ResourceAttributes")) as serviceTags', - 'FROM "default"."otel_traces" WHERE traceID = \'abcdefg\'', + `arrayMap(key -> map('key', key, 'value',"SpanAttributes"[key]),`, + `mapKeys("SpanAttributes")) as tags,`, + `arrayMap(key -> map('key', key, 'value',"ResourceAttributes"[key]), mapKeys("ResourceAttributes")) as serviceTags`, + `FROM "default"."otel_traces" WHERE traceID = trace_id AND startTime >= trace_start AND startTime <= trace_end`, 'LIMIT 1000' ]; diff --git a/src/data/sqlGenerator.ts b/src/data/sqlGenerator.ts index fa20097f..0ac49766 100644 --- a/src/data/sqlGenerator.ts +++ b/src/data/sqlGenerator.ts @@ -1,4 +1,5 @@ import { BooleanFilter, BuilderMode, ColumnHint, DateFilterWithValue, FilterOperator, MultiFilter, NumberFilter, QueryBuilderOptions, QueryType, SelectedColumn, StringFilter, TimeUnit } from 'types/queryBuilder'; +import { getVersion as getOtelVersion } from 'otel'; /** * Generates a SQL string for the given QueryBuilderOptions @@ -145,12 +146,24 @@ const generateTraceIdQuery = (options: QueryBuilderOptions): string => { } const selectPartsSql = selectParts.join(', '); + // Optimize trace ID filtering for OTel enabled trace lookups + const hasTraceIdFilter = options.meta?.isTraceIdMode && options.meta?.traceId; + const otelVersion = getOtelVersion(options.meta?.otelVersion); + const applyTraceIdOptimization = options.meta?.otelEnabled && hasTraceIdFilter && otelVersion; + if (applyTraceIdOptimization) { + const traceId = options.meta!.traceId; + const timestampTable = getTableIdentifier(database, otelVersion.traceTimestampTable); + queryParts.push('WITH'); + queryParts.push(`'${traceId}' as trace_id,`); + queryParts.push(`(SELECT min(Start) FROM ${timestampTable} WHERE TraceId = trace_id) as trace_start,`); + queryParts.push(`(SELECT max(End) + 1 FROM ${timestampTable} WHERE TraceId = trace_id) as trace_end`); + } + queryParts.push('SELECT'); queryParts.push(selectPartsSql); queryParts.push('FROM'); queryParts.push(getTableIdentifier(database, table)); - const hasTraceIdFilter = options.meta?.isTraceIdMode && options.meta?.traceId const filterParts = getFilters(options); if (hasTraceIdFilter || filterParts) { @@ -158,11 +171,23 @@ const generateTraceIdQuery = (options: QueryBuilderOptions): string => { } if (hasTraceIdFilter) { - const traceId = options.meta!.traceId; - queryParts.push(`traceID = '${traceId}'`); + if (applyTraceIdOptimization) { + queryParts.push('traceID = trace_id'); + queryParts.push('AND'); + queryParts.push(`startTime >= trace_start`); + queryParts.push('AND'); + queryParts.push(`startTime <= trace_end`); + } else { + const traceId = options.meta!.traceId; + queryParts.push(`traceID = '${traceId}'`); + } } if (filterParts) { + if (hasTraceIdFilter) { + queryParts.push('AND'); + } + queryParts.push(filterParts); } diff --git a/src/otel.ts b/src/otel.ts index 3046715a..118ca298 100644 --- a/src/otel.ts +++ b/src/otel.ts @@ -1,7 +1,8 @@ import { ColumnHint, TimeUnit } from "types/queryBuilder"; const defaultLogsTable = 'otel_logs'; -const defaultTraceTable = 'otel_traces' +const defaultTraceTable = 'otel_traces'; +const defaultTraceTimestampTable = 'otel_traces_trace_id_ts'; export interface OtelVersion { name: string; @@ -11,6 +12,7 @@ export interface OtelVersion { logColumnMap: Map; logLevels: string[]; traceTable: string; + traceTimestampTable: string; traceColumnMap: Map; traceDurationUnit: TimeUnit.Nanoseconds; } @@ -35,6 +37,7 @@ const otel129: OtelVersion = { 'FATAL' ], traceTable: defaultTraceTable, + traceTimestampTable: defaultTraceTimestampTable, traceColumnMap: new Map([ [ColumnHint.Time, 'Timestamp'], [ColumnHint.TraceId, 'TraceId'], @@ -56,3 +59,10 @@ export const versions: readonly OtelVersion[] = [ ]; export const getLatestVersion = (): OtelVersion => versions[0]; +export const getVersion = (version: string | undefined): OtelVersion | undefined => { + if (!version) { + return; + } + + return versions.find(v => v.version === version); +}; From 4f43df48113170e9e2fb43993302d24a3061da51 Mon Sep 17 00:00:00 2001 From: Spencer Torres Date: Thu, 22 Feb 2024 02:47:07 -0500 Subject: [PATCH 2/3] re-format "if" --- src/data/sqlGenerator.ts | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/data/sqlGenerator.ts b/src/data/sqlGenerator.ts index 0ac49766..5930cb2e 100644 --- a/src/data/sqlGenerator.ts +++ b/src/data/sqlGenerator.ts @@ -149,7 +149,7 @@ const generateTraceIdQuery = (options: QueryBuilderOptions): string => { // Optimize trace ID filtering for OTel enabled trace lookups const hasTraceIdFilter = options.meta?.isTraceIdMode && options.meta?.traceId; const otelVersion = getOtelVersion(options.meta?.otelVersion); - const applyTraceIdOptimization = options.meta?.otelEnabled && hasTraceIdFilter && otelVersion; + const applyTraceIdOptimization = hasTraceIdFilter && options.meta?.otelEnabled && otelVersion; if (applyTraceIdOptimization) { const traceId = options.meta!.traceId; const timestampTable = getTableIdentifier(database, otelVersion.traceTimestampTable); @@ -170,17 +170,15 @@ const generateTraceIdQuery = (options: QueryBuilderOptions): string => { queryParts.push('WHERE'); } - if (hasTraceIdFilter) { - if (applyTraceIdOptimization) { - queryParts.push('traceID = trace_id'); - queryParts.push('AND'); - queryParts.push(`startTime >= trace_start`); - queryParts.push('AND'); - queryParts.push(`startTime <= trace_end`); - } else { - const traceId = options.meta!.traceId; - queryParts.push(`traceID = '${traceId}'`); - } + if (applyTraceIdOptimization) { + queryParts.push('traceID = trace_id'); + queryParts.push('AND'); + queryParts.push(`startTime >= trace_start`); + queryParts.push('AND'); + queryParts.push(`startTime <= trace_end`); + } else if (hasTraceIdFilter) { + const traceId = options.meta!.traceId; + queryParts.push(`traceID = '${traceId}'`); } if (filterParts) { From 4d76a8dbbcb66e636f52c335f95860256241e1cb Mon Sep 17 00:00:00 2001 From: Spencer Torres Date: Wed, 28 Feb 2024 15:27:42 -0500 Subject: [PATCH 3/3] update otel exports/imports to have a better naming scheme --- src/components/configEditor/LogsConfig.tsx | 4 ++-- src/components/configEditor/TracesConfig.tsx | 4 ++-- src/components/queryBuilder/OtelVersionSelect.test.tsx | 4 ++-- src/components/queryBuilder/OtelVersionSelect.tsx | 8 ++++---- .../queryBuilder/views/logsQueryBuilderHooks.test.ts | 4 ++-- .../queryBuilder/views/logsQueryBuilderHooks.ts | 4 ++-- .../queryBuilder/views/traceQueryBuilderHooks.test.ts | 4 ++-- .../queryBuilder/views/traceQueryBuilderHooks.ts | 4 ++-- src/data/CHDatasource.ts | 6 +++--- src/data/sqlGenerator.ts | 4 ++-- src/otel.ts | 6 ++++++ 11 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/components/configEditor/LogsConfig.tsx b/src/components/configEditor/LogsConfig.tsx index bd017e4f..ea4a26ed 100644 --- a/src/components/configEditor/LogsConfig.tsx +++ b/src/components/configEditor/LogsConfig.tsx @@ -3,7 +3,7 @@ import { ConfigSection, ConfigSubSection } from '@grafana/experimental'; import { Input, Field } from '@grafana/ui'; import { OtelVersionSelect } from 'components/queryBuilder/OtelVersionSelect'; import { ColumnHint } from 'types/queryBuilder'; -import { versions as otelVersions } from 'otel'; +import otel from 'otel'; import { LabeledInput } from './LabeledInput'; import { CHLogsConfig } from 'types/config'; import allLabels from 'labels'; @@ -33,7 +33,7 @@ export const LogsConfig = (props: LogsConfigProps) => { } = (props.logsConfig || {}); const labels = allLabels.components.Config.LogsConfig; - const otelConfig = otelVersions.find(v => v.version === otelVersion); + const otelConfig = otel.getVersion(otelVersion); if (otelEnabled && otelConfig) { timeColumn = otelConfig.logColumnMap.get(ColumnHint.Time); levelColumn = otelConfig.logColumnMap.get(ColumnHint.LogLevel); diff --git a/src/components/configEditor/TracesConfig.tsx b/src/components/configEditor/TracesConfig.tsx index 7a80847f..b365a2ee 100644 --- a/src/components/configEditor/TracesConfig.tsx +++ b/src/components/configEditor/TracesConfig.tsx @@ -4,7 +4,7 @@ import { ConfigSection, ConfigSubSection } from '@grafana/experimental'; import { Input, Field } from '@grafana/ui'; import { OtelVersionSelect } from 'components/queryBuilder/OtelVersionSelect'; import { ColumnHint, TimeUnit } from 'types/queryBuilder'; -import { versions as otelVersions } from 'otel'; +import otel from 'otel'; import { LabeledInput } from './LabeledInput'; import { DurationUnitSelect } from 'components/queryBuilder/DurationUnitSelect'; import { CHTracesConfig } from 'types/config'; @@ -45,7 +45,7 @@ export const TracesConfig = (props: TraceConfigProps) => { } = (props.tracesConfig || {}) as CHTracesConfig; const labels = allLabels.components.Config.TracesConfig; - const otelConfig = otelVersions.find(v => v.version === otelVersion); + const otelConfig = otel.getVersion(otelVersion); if (otelEnabled && otelConfig) { startTimeColumn = otelConfig.traceColumnMap.get(ColumnHint.Time); traceIdColumn = otelConfig.traceColumnMap.get(ColumnHint.TraceId); diff --git a/src/components/queryBuilder/OtelVersionSelect.test.tsx b/src/components/queryBuilder/OtelVersionSelect.test.tsx index 996fdd9b..6cd3c7aa 100644 --- a/src/components/queryBuilder/OtelVersionSelect.test.tsx +++ b/src/components/queryBuilder/OtelVersionSelect.test.tsx @@ -1,10 +1,10 @@ import React from 'react'; import { render, fireEvent } from '@testing-library/react'; import { OtelVersionSelect } from './OtelVersionSelect'; -import { versions as allVersions } from 'otel'; +import otel from 'otel'; describe('OtelVersionSelect', () => { - const testVersion = allVersions[0]; + const testVersion = otel.getLatestVersion(); const testVersionName = testVersion.name; it('should render with empty properties', () => { diff --git a/src/components/queryBuilder/OtelVersionSelect.tsx b/src/components/queryBuilder/OtelVersionSelect.tsx index 7cc4870b..8cf28e40 100644 --- a/src/components/queryBuilder/OtelVersionSelect.tsx +++ b/src/components/queryBuilder/OtelVersionSelect.tsx @@ -1,7 +1,7 @@ import React, { useEffect } from 'react'; import { SelectableValue } from '@grafana/data'; import { InlineFormLabel, Select, Switch as GrafanaSwitch, useTheme } from '@grafana/ui'; -import { versions as allVersions } from 'otel'; +import otel from 'otel'; import selectors from 'labels'; interface OtelVersionSelectProps { @@ -15,15 +15,15 @@ interface OtelVersionSelectProps { export const OtelVersionSelect = (props: OtelVersionSelectProps) => { const { enabled, onEnabledChange, selectedVersion, onVersionChange, wide } = props; const { label, tooltip } = selectors.components.OtelVersionSelect; - const options: SelectableValue[] = allVersions.map(v => ({ + const options: SelectableValue[] = otel.versions.map(v => ({ label: v.name, value: v.version })); useEffect(() => { // Use latest version if not set or doesn't exist (which may happen if config is broken) - if (selectedVersion === '' || !allVersions.find(v => selectedVersion === v.version)) { - onVersionChange(allVersions[0].version); + if (selectedVersion === '' || !otel.getVersion(selectedVersion)) { + onVersionChange(otel.getLatestVersion().version); } }, [selectedVersion, onVersionChange]); diff --git a/src/components/queryBuilder/views/logsQueryBuilderHooks.test.ts b/src/components/queryBuilder/views/logsQueryBuilderHooks.test.ts index b3fe05c5..046fdfb2 100644 --- a/src/components/queryBuilder/views/logsQueryBuilderHooks.test.ts +++ b/src/components/queryBuilder/views/logsQueryBuilderHooks.test.ts @@ -3,7 +3,7 @@ import { useDefaultFilters, useDefaultTimeColumn, useLogDefaultsOnMount, useOtel import { mockDatasource } from '__mocks__/datasource'; import { ColumnHint, QueryBuilderOptions, SelectedColumn, TableColumn } from 'types/queryBuilder'; import { setColumnByHint, setOptions } from 'hooks/useBuilderOptionsState'; -import { versions as otelVersions } from 'otel'; +import otel from 'otel'; describe('useLogDefaultsOnMount', () => { it('should call builderOptionsDispatch with default log columns', async () => { @@ -47,7 +47,7 @@ describe('useLogDefaultsOnMount', () => { }); describe('useOtelColumns', () => { - const testOtelVersion = otelVersions[0]; // use latest version + const testOtelVersion = otel.getLatestVersion(); it('should not call builderOptionsDispatch if OTEL is already enabled', async () => { const builderOptionsDispatch = jest.fn(); diff --git a/src/components/queryBuilder/views/logsQueryBuilderHooks.ts b/src/components/queryBuilder/views/logsQueryBuilderHooks.ts index ef2ca6c5..acfb8b4a 100644 --- a/src/components/queryBuilder/views/logsQueryBuilderHooks.ts +++ b/src/components/queryBuilder/views/logsQueryBuilderHooks.ts @@ -3,7 +3,7 @@ import { columnFilterDateTime } from "data/columnFilters"; import { BuilderOptionsReducerAction, setColumnByHint, setOptions } from "hooks/useBuilderOptionsState"; import { useEffect, useMemo, useRef } from "react"; import { ColumnHint, DateFilterWithoutValue, Filter, FilterOperator, OrderBy, OrderByDirection, QueryBuilderOptions, SelectedColumn, StringFilter, TableColumn } from "types/queryBuilder"; -import { versions as otelVersions } from 'otel'; +import otel from 'otel'; /** * Loads the default configuration for new queries. (Only runs on new queries) @@ -53,7 +53,7 @@ export const useOtelColumns = (otelEnabled: boolean, otelVersion: string, builde return; } - const otelConfig = otelVersions.find(v => v.version === otelVersion); + const otelConfig = otel.getVersion(otelVersion); const logColumnMap = otelConfig?.logColumnMap; if (!logColumnMap) { return; diff --git a/src/components/queryBuilder/views/traceQueryBuilderHooks.test.ts b/src/components/queryBuilder/views/traceQueryBuilderHooks.test.ts index 9224f520..63b7efaf 100644 --- a/src/components/queryBuilder/views/traceQueryBuilderHooks.test.ts +++ b/src/components/queryBuilder/views/traceQueryBuilderHooks.test.ts @@ -3,7 +3,7 @@ import { useTraceDefaultsOnMount, useOtelColumns, useDefaultFilters } from './tr import { mockDatasource } from '__mocks__/datasource'; import { ColumnHint, QueryBuilderOptions, SelectedColumn } from 'types/queryBuilder'; import { setOptions } from 'hooks/useBuilderOptionsState'; -import { versions as otelVersions } from 'otel'; +import otel from 'otel'; describe('useTraceDefaultsOnMount', () => { it('should call builderOptionsDispatch with default trace columns', async () => { @@ -48,7 +48,7 @@ describe('useTraceDefaultsOnMount', () => { }); describe('useOtelColumns', () => { - const testOtelVersion = otelVersions[0]; // use latest version + const testOtelVersion = otel.getLatestVersion(); it('should not call builderOptionsDispatch if OTEL is already enabled', async () => { const builderOptionsDispatch = jest.fn(); diff --git a/src/components/queryBuilder/views/traceQueryBuilderHooks.ts b/src/components/queryBuilder/views/traceQueryBuilderHooks.ts index 4787c565..f8747839 100644 --- a/src/components/queryBuilder/views/traceQueryBuilderHooks.ts +++ b/src/components/queryBuilder/views/traceQueryBuilderHooks.ts @@ -1,6 +1,6 @@ import React, { useEffect, useRef } from 'react'; import { Datasource } from 'data/CHDatasource'; -import { versions as otelVersions } from 'otel'; +import otel from 'otel'; import { ColumnHint, DateFilterWithoutValue, Filter, FilterOperator, NumberFilter, OrderBy, OrderByDirection, QueryBuilderOptions, SelectedColumn, StringFilter } from 'types/queryBuilder'; import { BuilderOptionsReducerAction, setOptions } from 'hooks/useBuilderOptionsState'; @@ -54,7 +54,7 @@ export const useOtelColumns = (otelEnabled: boolean, otelVersion: string, builde return; } - const otelConfig = otelVersions.find(v => v.version === otelVersion); + const otelConfig = otel.getVersion(otelVersion); const traceColumnMap = otelConfig?.traceColumnMap; if (!traceColumnMap) { return; diff --git a/src/data/CHDatasource.ts b/src/data/CHDatasource.ts index c375e707..4beb4faa 100644 --- a/src/data/CHDatasource.ts +++ b/src/data/CHDatasource.ts @@ -45,7 +45,7 @@ import { TIME_FIELD_ALIAS, } from './logs'; import { generateSql, getColumnByHint, logAliasToColumnHints } from './sqlGenerator'; -import { versions as otelVersions } from 'otel'; +import otel from 'otel'; import { ReactNode } from 'react'; import { transformQueryResponseWithTraceAndLogLinks } from './utils'; import { pluginVersion } from 'utils/version'; @@ -414,7 +414,7 @@ export class Datasource const otelEnabled = logsConfig.otelEnabled; const otelVersion = logsConfig.otelVersion; - const otelConfig = otelVersions.find(v => v.version === otelVersion); + const otelConfig = otel.getVersion(otelVersion); if (otelEnabled && otelConfig) { return otelConfig.logColumnMap; } @@ -452,7 +452,7 @@ export class Datasource const otelEnabled = traceConfig.otelEnabled; const otelVersion = traceConfig.otelVersion; - const otelConfig = otelVersions.find(v => v.version === otelVersion); + const otelConfig = otel.getVersion(otelVersion); if (otelEnabled && otelConfig) { return otelConfig.traceColumnMap; } diff --git a/src/data/sqlGenerator.ts b/src/data/sqlGenerator.ts index 5930cb2e..2937c5d9 100644 --- a/src/data/sqlGenerator.ts +++ b/src/data/sqlGenerator.ts @@ -1,5 +1,5 @@ import { BooleanFilter, BuilderMode, ColumnHint, DateFilterWithValue, FilterOperator, MultiFilter, NumberFilter, QueryBuilderOptions, QueryType, SelectedColumn, StringFilter, TimeUnit } from 'types/queryBuilder'; -import { getVersion as getOtelVersion } from 'otel'; +import otel from 'otel'; /** * Generates a SQL string for the given QueryBuilderOptions @@ -148,7 +148,7 @@ const generateTraceIdQuery = (options: QueryBuilderOptions): string => { // Optimize trace ID filtering for OTel enabled trace lookups const hasTraceIdFilter = options.meta?.isTraceIdMode && options.meta?.traceId; - const otelVersion = getOtelVersion(options.meta?.otelVersion); + const otelVersion = otel.getVersion(options.meta?.otelVersion); const applyTraceIdOptimization = hasTraceIdFilter && options.meta?.otelEnabled && otelVersion; if (applyTraceIdOptimization) { const traceId = options.meta!.traceId; diff --git a/src/otel.ts b/src/otel.ts index 118ca298..4a482f6c 100644 --- a/src/otel.ts +++ b/src/otel.ts @@ -66,3 +66,9 @@ export const getVersion = (version: string | undefined): OtelVersion | undefined return versions.find(v => v.version === version); }; + +export default { + versions, + getLatestVersion, + getVersion +};