mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-16 19:05:54 +08:00
feat: fixed bugs in saved views for traces
This commit is contained in:
parent
9a7bec31a7
commit
308bf6e523
@ -4,9 +4,14 @@ import { Compass, Cone, TowerControl } from 'lucide-react';
|
|||||||
import SaveView from 'pages/SaveView';
|
import SaveView from 'pages/SaveView';
|
||||||
import TracesExplorer from 'pages/TracesExplorer';
|
import TracesExplorer from 'pages/TracesExplorer';
|
||||||
import TracesFunnels from 'pages/TracesFunnels';
|
import TracesFunnels from 'pages/TracesFunnels';
|
||||||
|
import { PreferenceContextProvider } from 'providers/preferences/context/PreferenceContextProvider';
|
||||||
|
|
||||||
export const tracesExplorer: TabRoutes = {
|
export const tracesExplorer: TabRoutes = {
|
||||||
Component: TracesExplorer,
|
Component: (): JSX.Element => (
|
||||||
|
<PreferenceContextProvider>
|
||||||
|
<TracesExplorer />
|
||||||
|
</PreferenceContextProvider>
|
||||||
|
),
|
||||||
name: (
|
name: (
|
||||||
<div className="tab-item">
|
<div className="tab-item">
|
||||||
<Compass size={16} /> Explorer
|
<Compass size={16} /> Explorer
|
||||||
|
@ -29,10 +29,11 @@ const getLogsUpdaterConfig = (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mode === 'direct') {
|
if (mode === 'direct') {
|
||||||
// redirectWithOptionsData({
|
// just need to update the columns see for remove props
|
||||||
// ...defaultOptionsQuery,
|
redirectWithOptionsData({
|
||||||
// selectColumns: newColumns,
|
...defaultOptionsQuery,
|
||||||
// });
|
selectColumns: newColumns,
|
||||||
|
});
|
||||||
|
|
||||||
// Also update local storage
|
// Also update local storage
|
||||||
const local = JSON.parse(
|
const local = JSON.parse(
|
||||||
|
@ -1,17 +1,41 @@
|
|||||||
import setLocalStorageKey from 'api/browser/localstorage/set';
|
import setLocalStorageKey from 'api/browser/localstorage/set';
|
||||||
import { LOCALSTORAGE } from 'constants/localStorage';
|
import { LOCALSTORAGE } from 'constants/localStorage';
|
||||||
|
import { defaultOptionsQuery } from 'container/OptionsMenu/constants';
|
||||||
|
import { FontSize, OptionsQuery } from 'container/OptionsMenu/types';
|
||||||
|
import { Dispatch, SetStateAction } from 'react';
|
||||||
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
|
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
|
||||||
|
|
||||||
|
import { Preferences } from '../types';
|
||||||
|
|
||||||
// --- TRACES preferences updater config ---
|
// --- TRACES preferences updater config ---
|
||||||
const tracesUpdater = {
|
const getTracesUpdaterConfig = (
|
||||||
|
redirectWithOptionsData: (options: OptionsQuery) => void,
|
||||||
|
setSavedViewPreferences: Dispatch<SetStateAction<Preferences | null>>,
|
||||||
|
): {
|
||||||
|
updateColumns: (newColumns: BaseAutocompleteData[], mode: string) => void;
|
||||||
|
updateFormatting: () => void;
|
||||||
|
} => ({
|
||||||
updateColumns: (newColumns: BaseAutocompleteData[], mode: string): void => {
|
updateColumns: (newColumns: BaseAutocompleteData[], mode: string): void => {
|
||||||
const url = new URL(window.location.href);
|
// remove the formatting props
|
||||||
const options = JSON.parse(url.searchParams.get('options') || '{}');
|
if (mode === 'savedView') {
|
||||||
options.selectColumns = newColumns;
|
setSavedViewPreferences({
|
||||||
url.searchParams.set('options', JSON.stringify(options));
|
columns: newColumns,
|
||||||
window.history.replaceState({}, '', url.toString());
|
formatting: {
|
||||||
|
maxLines: 2,
|
||||||
|
format: 'table',
|
||||||
|
fontSize: 'small' as FontSize,
|
||||||
|
version: 1,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (mode === 'direct') {
|
if (mode === 'direct') {
|
||||||
|
// just need to update the columns see for remove props
|
||||||
|
redirectWithOptionsData({
|
||||||
|
...defaultOptionsQuery,
|
||||||
|
selectColumns: newColumns,
|
||||||
|
});
|
||||||
|
|
||||||
const local = JSON.parse(
|
const local = JSON.parse(
|
||||||
localStorage.getItem(LOCALSTORAGE.TRACES_LIST_OPTIONS) || '{}',
|
localStorage.getItem(LOCALSTORAGE.TRACES_LIST_OPTIONS) || '{}',
|
||||||
);
|
);
|
||||||
@ -20,6 +44,6 @@ const tracesUpdater = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
updateFormatting: (): void => {}, // no-op for traces
|
updateFormatting: (): void => {}, // no-op for traces
|
||||||
};
|
});
|
||||||
|
|
||||||
export default tracesUpdater;
|
export default getTracesUpdaterConfig;
|
||||||
|
@ -1,17 +1,12 @@
|
|||||||
/* eslint-disable sonarjs/cognitive-complexity */
|
/* eslint-disable sonarjs/cognitive-complexity */
|
||||||
/* eslint-disable no-empty */
|
/* eslint-disable no-empty */
|
||||||
// import {
|
|
||||||
// defaultLogsSelectedColumns,
|
|
||||||
// defaultTraceSelectedColumns,
|
|
||||||
// } from 'container/OptionsMenu/constants';
|
|
||||||
import { useGetAllViews } from 'hooks/saveViews/useGetAllViews';
|
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
|
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
|
||||||
import { DataSource } from 'types/common/queryBuilder';
|
import { DataSource } from 'types/common/queryBuilder';
|
||||||
|
|
||||||
import logsLoaderConfig from '../configs/logsLoaderConfig';
|
import logsLoaderConfig from '../configs/logsLoaderConfig';
|
||||||
import tracesLoaderConfig from '../configs/tracesLoaderConfig';
|
import tracesLoaderConfig from '../configs/tracesLoaderConfig';
|
||||||
import { FormattingOptions, PreferenceMode, Preferences } from '../types';
|
import { FormattingOptions, Preferences } from '../types';
|
||||||
|
|
||||||
// Generic preferences loader that works with any config
|
// Generic preferences loader that works with any config
|
||||||
async function preferencesLoader<T>(config: {
|
async function preferencesLoader<T>(config: {
|
||||||
@ -53,13 +48,9 @@ async function tracesPreferencesLoader(): Promise<{
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function usePreferenceLoader({
|
export function usePreferenceLoader({
|
||||||
mode,
|
|
||||||
savedViewId,
|
|
||||||
dataSource,
|
dataSource,
|
||||||
reSync,
|
reSync,
|
||||||
}: {
|
}: {
|
||||||
mode: PreferenceMode;
|
|
||||||
savedViewId: string;
|
|
||||||
dataSource: DataSource;
|
dataSource: DataSource;
|
||||||
reSync: number;
|
reSync: number;
|
||||||
}): {
|
}): {
|
||||||
@ -71,46 +62,20 @@ export function usePreferenceLoader({
|
|||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
const [error, setError] = useState<Error | null>(null);
|
const [error, setError] = useState<Error | null>(null);
|
||||||
|
|
||||||
const { data: viewsData } = useGetAllViews(dataSource);
|
|
||||||
|
|
||||||
useEffect((): void => {
|
useEffect((): void => {
|
||||||
async function loadPreferences(): Promise<void> {
|
async function loadPreferences(): Promise<void> {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
setError(null);
|
setError(null);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (mode === 'savedView' && savedViewId) {
|
if (dataSource === DataSource.LOGS) {
|
||||||
// we can also switch to the URL options params
|
const { columns, formatting } = await logsPreferencesLoader();
|
||||||
// as we are essentially setting the options in the URL
|
setPreferences({ columns, formatting });
|
||||||
// in ExplorerOptions.tsx#430 (updateOrRestoreSelectColumns)
|
}
|
||||||
// const extraData = viewsData?.data?.data?.find(
|
|
||||||
// (view) => view.id === savedViewId,
|
|
||||||
// )?.extraData;
|
|
||||||
// const parsedExtraData = JSON.parse(extraData || '{}');
|
|
||||||
// let columns: BaseAutocompleteData[] = [];
|
|
||||||
// let formatting: FormattingOptions | undefined;
|
|
||||||
// if (dataSource === DataSource.LOGS) {
|
|
||||||
// columns = parsedExtraData?.selectColumns || defaultLogsSelectedColumns;
|
|
||||||
// formatting = {
|
|
||||||
// maxLines: parsedExtraData?.maxLines ?? 2,
|
|
||||||
// format: parsedExtraData?.format ?? 'table',
|
|
||||||
// fontSize: parsedExtraData?.fontSize ?? 'small',
|
|
||||||
// version: parsedExtraData?.version ?? 1,
|
|
||||||
// };
|
|
||||||
// } else if (dataSource === DataSource.TRACES) {
|
|
||||||
// columns = parsedExtraData?.selectColumns || defaultTraceSelectedColumns;
|
|
||||||
// }
|
|
||||||
// setPreferences(savedViewPreferences);
|
|
||||||
} else {
|
|
||||||
if (dataSource === DataSource.LOGS) {
|
|
||||||
const { columns, formatting } = await logsPreferencesLoader();
|
|
||||||
setPreferences({ columns, formatting });
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dataSource === DataSource.TRACES) {
|
if (dataSource === DataSource.TRACES) {
|
||||||
const { columns } = await tracesPreferencesLoader();
|
const { columns } = await tracesPreferencesLoader();
|
||||||
setPreferences({ columns });
|
setPreferences({ columns });
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
setError(e as Error);
|
setError(e as Error);
|
||||||
@ -119,7 +84,7 @@ export function usePreferenceLoader({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
loadPreferences();
|
loadPreferences();
|
||||||
}, [mode, savedViewId, dataSource, reSync, viewsData]);
|
}, [dataSource, reSync]);
|
||||||
|
|
||||||
return { preferences, loading, error };
|
return { preferences, loading, error };
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { defaultLogsSelectedColumns } from 'container/OptionsMenu/constants';
|
import { defaultLogsSelectedColumns } from 'container/OptionsMenu/constants';
|
||||||
|
import { defaultSelectedColumns as defaultTracesSelectedColumns } from 'container/TracesExplorer/ListView/configs';
|
||||||
import { useGetAllViews } from 'hooks/saveViews/useGetAllViews';
|
import { useGetAllViews } from 'hooks/saveViews/useGetAllViews';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
|
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';
|
||||||
@ -24,6 +25,7 @@ export function usePreferenceSync({
|
|||||||
updateFormatting: (newFormatting: FormattingOptions) => void;
|
updateFormatting: (newFormatting: FormattingOptions) => void;
|
||||||
} {
|
} {
|
||||||
const { data: viewsData } = useGetAllViews(dataSource);
|
const { data: viewsData } = useGetAllViews(dataSource);
|
||||||
|
|
||||||
const [
|
const [
|
||||||
savedViewPreferences,
|
savedViewPreferences,
|
||||||
setSavedViewPreferences,
|
setSavedViewPreferences,
|
||||||
@ -35,6 +37,10 @@ export function usePreferenceSync({
|
|||||||
)?.extraData;
|
)?.extraData;
|
||||||
|
|
||||||
const parsedExtraData = JSON.parse(extraData || '{}');
|
const parsedExtraData = JSON.parse(extraData || '{}');
|
||||||
|
console.log('uncaught extraData', {
|
||||||
|
extraData,
|
||||||
|
parsedExtraData,
|
||||||
|
});
|
||||||
let columns: BaseAutocompleteData[] = [];
|
let columns: BaseAutocompleteData[] = [];
|
||||||
let formatting: FormattingOptions | undefined;
|
let formatting: FormattingOptions | undefined;
|
||||||
if (dataSource === DataSource.LOGS) {
|
if (dataSource === DataSource.LOGS) {
|
||||||
@ -46,6 +52,9 @@ export function usePreferenceSync({
|
|||||||
version: parsedExtraData?.version ?? 1,
|
version: parsedExtraData?.version ?? 1,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
if (dataSource === DataSource.TRACES) {
|
||||||
|
columns = parsedExtraData?.selectColumns || defaultTracesSelectedColumns;
|
||||||
|
}
|
||||||
setSavedViewPreferences({ columns, formatting });
|
setSavedViewPreferences({ columns, formatting });
|
||||||
}, [viewsData, dataSource, savedViewId, mode]);
|
}, [viewsData, dataSource, savedViewId, mode]);
|
||||||
|
|
||||||
@ -53,8 +62,6 @@ export function usePreferenceSync({
|
|||||||
// and we want to make sure we are always using the latest preferences
|
// and we want to make sure we are always using the latest preferences
|
||||||
const [reSync, setReSync] = useState(0);
|
const [reSync, setReSync] = useState(0);
|
||||||
const { preferences, loading, error } = usePreferenceLoader({
|
const { preferences, loading, error } = usePreferenceLoader({
|
||||||
mode,
|
|
||||||
savedViewId: savedViewId || '',
|
|
||||||
dataSource,
|
dataSource,
|
||||||
reSync,
|
reSync,
|
||||||
});
|
});
|
||||||
|
@ -9,7 +9,7 @@ import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteRe
|
|||||||
import { DataSource } from 'types/common/queryBuilder';
|
import { DataSource } from 'types/common/queryBuilder';
|
||||||
|
|
||||||
import getLogsUpdaterConfig from '../configs/logsUpdaterConfig';
|
import getLogsUpdaterConfig from '../configs/logsUpdaterConfig';
|
||||||
import tracesUpdater from '../configs/tracesUpdaterConfig';
|
import getTracesUpdaterConfig from '../configs/tracesUpdaterConfig';
|
||||||
import { FormattingOptions, Preferences } from '../types';
|
import { FormattingOptions, Preferences } from '../types';
|
||||||
|
|
||||||
const metricsUpdater = {
|
const metricsUpdater = {
|
||||||
@ -31,7 +31,10 @@ const getUpdaterConfig = (
|
|||||||
redirectWithOptionsData,
|
redirectWithOptionsData,
|
||||||
setSavedViewPreferences,
|
setSavedViewPreferences,
|
||||||
),
|
),
|
||||||
[DataSource.TRACES]: tracesUpdater,
|
[DataSource.TRACES]: getTracesUpdaterConfig(
|
||||||
|
redirectWithOptionsData,
|
||||||
|
setSavedViewPreferences,
|
||||||
|
),
|
||||||
[DataSource.METRICS]: metricsUpdater,
|
[DataSource.METRICS]: metricsUpdater,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user