mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-13 20:35:56 +08:00
fix: add converting to ms for the durationNano attribute (#3072)
* fix: add converting to ms for the durationNano attrbute * fix: add ms title to the graph --------- Co-authored-by: Vishal Sharma <makeavish786@gmail.com>
This commit is contained in:
parent
2e85bd0264
commit
2b3934b845
@ -11,6 +11,7 @@ function TimeSeriesView({
|
|||||||
data,
|
data,
|
||||||
isLoading,
|
isLoading,
|
||||||
isError,
|
isError,
|
||||||
|
yAxisUnit,
|
||||||
}: TimeSeriesViewProps): JSX.Element {
|
}: TimeSeriesViewProps): JSX.Element {
|
||||||
const chartData = useMemo(
|
const chartData = useMemo(
|
||||||
() =>
|
() =>
|
||||||
@ -32,6 +33,7 @@ function TimeSeriesView({
|
|||||||
<Graph
|
<Graph
|
||||||
animate={false}
|
animate={false}
|
||||||
data={chartData}
|
data={chartData}
|
||||||
|
yAxisUnit={yAxisUnit}
|
||||||
name="tracesExplorerGraph"
|
name="tracesExplorerGraph"
|
||||||
type="line"
|
type="line"
|
||||||
/>
|
/>
|
||||||
@ -42,12 +44,14 @@ function TimeSeriesView({
|
|||||||
|
|
||||||
interface TimeSeriesViewProps {
|
interface TimeSeriesViewProps {
|
||||||
data?: SuccessResponse<MetricRangePayloadProps>;
|
data?: SuccessResponse<MetricRangePayloadProps>;
|
||||||
|
yAxisUnit?: string;
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
isError: boolean;
|
isError: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
TimeSeriesView.defaultProps = {
|
TimeSeriesView.defaultProps = {
|
||||||
data: undefined,
|
data: undefined,
|
||||||
|
yAxisUnit: 'short',
|
||||||
};
|
};
|
||||||
|
|
||||||
export default TimeSeriesView;
|
export default TimeSeriesView;
|
||||||
|
@ -2,23 +2,43 @@ import { initialQueriesMap, PANEL_TYPES } from 'constants/queryBuilder';
|
|||||||
import { REACT_QUERY_KEY } from 'constants/reactQueryKeys';
|
import { REACT_QUERY_KEY } from 'constants/reactQueryKeys';
|
||||||
import { useGetQueryRange } from 'hooks/queryBuilder/useGetQueryRange';
|
import { useGetQueryRange } from 'hooks/queryBuilder/useGetQueryRange';
|
||||||
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
import { useQueryBuilder } from 'hooks/queryBuilder/useQueryBuilder';
|
||||||
|
import { useMemo } from 'react';
|
||||||
import { useSelector } from 'react-redux';
|
import { useSelector } from 'react-redux';
|
||||||
import { AppState } from 'store/reducers';
|
import { AppState } from 'store/reducers';
|
||||||
import { DataSource } from 'types/common/queryBuilder';
|
import { DataSource } from 'types/common/queryBuilder';
|
||||||
import { GlobalReducer } from 'types/reducer/globalTime';
|
import { GlobalReducer } from 'types/reducer/globalTime';
|
||||||
|
|
||||||
import TimeSeriesView from './TimeSeriesView';
|
import TimeSeriesView from './TimeSeriesView';
|
||||||
|
import { convertDataValueToMs } from './utils';
|
||||||
|
|
||||||
function TimeSeriesViewContainer({
|
function TimeSeriesViewContainer({
|
||||||
dataSource = DataSource.TRACES,
|
dataSource = DataSource.TRACES,
|
||||||
}: TimeSeriesViewProps): JSX.Element {
|
}: TimeSeriesViewProps): JSX.Element {
|
||||||
const { stagedQuery, panelType } = useQueryBuilder();
|
const { stagedQuery, currentQuery, panelType } = useQueryBuilder();
|
||||||
|
|
||||||
const { selectedTime: globalSelectedTime, maxTime, minTime } = useSelector<
|
const { selectedTime: globalSelectedTime, maxTime, minTime } = useSelector<
|
||||||
AppState,
|
AppState,
|
||||||
GlobalReducer
|
GlobalReducer
|
||||||
>((state) => state.globalTime);
|
>((state) => state.globalTime);
|
||||||
|
|
||||||
|
const isValidToConvertToMs = useMemo(() => {
|
||||||
|
const isValid: boolean[] = [];
|
||||||
|
|
||||||
|
currentQuery.builder.queryData.forEach(
|
||||||
|
({ aggregateAttribute, aggregateOperator }) => {
|
||||||
|
const isExistDurationNanoAttribute =
|
||||||
|
aggregateAttribute.key === 'durationNano';
|
||||||
|
|
||||||
|
const isCountOperator =
|
||||||
|
aggregateOperator === 'count' || aggregateOperator === 'count_distinct';
|
||||||
|
|
||||||
|
isValid.push(!isCountOperator && isExistDurationNanoAttribute);
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
return isValid.every(Boolean);
|
||||||
|
}, [currentQuery]);
|
||||||
|
|
||||||
const { data, isLoading, isError } = useGetQueryRange(
|
const { data, isLoading, isError } = useGetQueryRange(
|
||||||
{
|
{
|
||||||
query: stagedQuery || initialQueriesMap[dataSource],
|
query: stagedQuery || initialQueriesMap[dataSource],
|
||||||
@ -41,7 +61,19 @@ function TimeSeriesViewContainer({
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
return <TimeSeriesView isError={isError} isLoading={isLoading} data={data} />;
|
const responseData = useMemo(
|
||||||
|
() => (isValidToConvertToMs ? convertDataValueToMs(data) : data),
|
||||||
|
[data, isValidToConvertToMs],
|
||||||
|
);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<TimeSeriesView
|
||||||
|
isError={isError}
|
||||||
|
isLoading={isLoading}
|
||||||
|
data={responseData}
|
||||||
|
yAxisUnit={isValidToConvertToMs ? 'ms' : 'short'}
|
||||||
|
/>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
interface TimeSeriesViewProps {
|
interface TimeSeriesViewProps {
|
||||||
|
26
frontend/src/container/TimeSeriesView/utils.ts
Normal file
26
frontend/src/container/TimeSeriesView/utils.ts
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import { SuccessResponse } from 'types/api/index';
|
||||||
|
import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange';
|
||||||
|
import { QueryData } from 'types/api/widgets/getQuery';
|
||||||
|
|
||||||
|
export const convertDataValueToMs = (
|
||||||
|
data?: SuccessResponse<MetricRangePayloadProps>,
|
||||||
|
): SuccessResponse<MetricRangePayloadProps> | undefined => {
|
||||||
|
const convertedData = data;
|
||||||
|
|
||||||
|
const convertedResult: QueryData[] = data?.payload?.data?.result
|
||||||
|
? data.payload.data.result.map((item) => {
|
||||||
|
const values: [number, string][] = item.values.map((value) => {
|
||||||
|
const [first = 0, second = ''] = value || [];
|
||||||
|
return [first, String(Number(second) / 1000000)];
|
||||||
|
});
|
||||||
|
|
||||||
|
return { ...item, values };
|
||||||
|
})
|
||||||
|
: [];
|
||||||
|
|
||||||
|
if (convertedData?.payload?.data?.result && convertedResult) {
|
||||||
|
convertedData.payload.data.result = convertedResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
return convertedData;
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user