2022-03-31 03:43:59 -05:00
|
|
|
import { useMemo, useState } from 'react';
|
2023-04-17 02:30:27 -05:00
|
|
|
import { v4 as uuidv4 } from 'uuid';
|
2022-04-22 08:33:13 -05:00
|
|
|
|
2023-07-19 08:31:58 -05:00
|
|
|
import { filterSpans, TraceSpan } from './components';
|
2023-04-17 02:30:27 -05:00
|
|
|
|
|
|
|
export interface SearchProps {
|
|
|
|
serviceName?: string;
|
|
|
|
serviceNameOperator: string;
|
|
|
|
spanName?: string;
|
|
|
|
spanNameOperator: string;
|
|
|
|
from?: string;
|
|
|
|
fromOperator: string;
|
|
|
|
to?: string;
|
|
|
|
toOperator: string;
|
|
|
|
tags: Tag[];
|
2023-11-28 07:29:04 -06:00
|
|
|
query?: string;
|
2023-04-17 02:30:27 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
export interface Tag {
|
|
|
|
id: string;
|
|
|
|
key?: string;
|
|
|
|
operator: string;
|
|
|
|
value?: string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export const randomId = () => uuidv4().slice(0, 12);
|
|
|
|
|
|
|
|
export const defaultTagFilter = {
|
|
|
|
id: randomId(),
|
|
|
|
operator: '=',
|
|
|
|
};
|
|
|
|
|
|
|
|
export const defaultFilters = {
|
|
|
|
spanNameOperator: '=',
|
|
|
|
serviceNameOperator: '=',
|
|
|
|
fromOperator: '>',
|
|
|
|
toOperator: '<',
|
|
|
|
tags: [defaultTagFilter],
|
|
|
|
};
|
2020-04-08 10:16:22 -05:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Controls the state of search input that highlights spans if they match the search string.
|
|
|
|
* @param spans
|
|
|
|
*/
|
2020-06-24 13:58:42 -05:00
|
|
|
export function useSearch(spans?: TraceSpan[]) {
|
2023-07-19 08:31:58 -05:00
|
|
|
const [search, setSearch] = useState<SearchProps>(defaultFilters);
|
|
|
|
const spanFilterMatches: Set<string> | undefined = useMemo(() => {
|
|
|
|
return spans && filterSpans(search, spans);
|
2020-04-15 09:04:01 -05:00
|
|
|
}, [search, spans]);
|
|
|
|
|
2023-07-19 08:31:58 -05:00
|
|
|
return { search, setSearch, spanFilterMatches };
|
2020-04-08 10:16:22 -05:00
|
|
|
}
|