mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-08-03 06:30:40 +08:00

* feat: added Billing usage graph - daily and weekly * feat: removed mocked response * feat: removed weekly chart and fixed data transformations * feat: added loading states * feat: moved function to util file * feat: fixed review comments * feat: fixed JEST test case * feat: test fix - commit * feat: test fix - commit * feat: test fix - commit * feat: edited title conditionally * feat: edited tooltip content * feat: removed time from tooltip content and skeleton for cycleInfo Alert --------- Co-authored-by: Sagar Rajput <sagarrajput@192.168.1.2>
88 lines
2.4 KiB
TypeScript
88 lines
2.4 KiB
TypeScript
import { isEmpty, isNull } from 'lodash-es';
|
|
import { MetricRangePayloadProps } from 'types/api/metrics/getQueryRange';
|
|
|
|
export const convertDataToMetricRangePayload = (
|
|
data: any,
|
|
): MetricRangePayloadProps => {
|
|
const emptyStateData = {
|
|
data: {
|
|
newResult: { data: { result: [], resultType: '' } },
|
|
result: [],
|
|
resultType: '',
|
|
},
|
|
};
|
|
if (isEmpty(data)) {
|
|
return emptyStateData;
|
|
}
|
|
const {
|
|
details: { breakdown = [] },
|
|
} = data || {};
|
|
|
|
if (isNull(breakdown) || breakdown.length === 0) {
|
|
return emptyStateData;
|
|
}
|
|
|
|
const payload = breakdown.map((info: any) => {
|
|
const metric = info.type;
|
|
const sortedBreakdownData = (info?.dayWiseBreakdown?.breakdown || []).sort(
|
|
(a: any, b: any) => a.timestamp - b.timestamp,
|
|
);
|
|
const values = (sortedBreakdownData || []).map((categoryInfo: any) => [
|
|
categoryInfo.timestamp,
|
|
categoryInfo.total,
|
|
]);
|
|
const queryName = info.type;
|
|
const legend = info.type;
|
|
const { unit } = info;
|
|
const quantity = sortedBreakdownData.map(
|
|
(categoryInfo: any) => categoryInfo.quantity,
|
|
);
|
|
return { metric, values, queryName, legend, quantity, unit };
|
|
});
|
|
|
|
const sortedData = payload.sort((a: any, b: any) => {
|
|
const sumA = a.values.reduce((acc: any, val: any) => acc + val[1], 0);
|
|
const avgA = a.values.length ? sumA / a.values.length : 0;
|
|
const sumB = b.values.reduce((acc: any, val: any) => acc + val[1], 0);
|
|
const avgB = b.values.length ? sumB / b.values.length : 0;
|
|
|
|
return sumA === sumB ? avgB - avgA : sumB - sumA;
|
|
});
|
|
|
|
return {
|
|
data: {
|
|
newResult: { data: { result: sortedData, resultType: '' } },
|
|
result: sortedData,
|
|
resultType: '',
|
|
},
|
|
};
|
|
};
|
|
|
|
export function fillMissingValuesForQuantities(
|
|
data: any,
|
|
timestampArray: number[],
|
|
): MetricRangePayloadProps {
|
|
const { result } = data.data;
|
|
|
|
const transformedResultArr: any[] = [];
|
|
result.forEach((item: any) => {
|
|
const timestampToQuantityMap: { [timestamp: number]: number } = {};
|
|
item.values.forEach((val: number[], index: number) => {
|
|
timestampToQuantityMap[val[0]] = item.quantity[index];
|
|
});
|
|
|
|
const quantityArray = timestampArray.map(
|
|
(timestamp: number) => timestampToQuantityMap[timestamp] ?? null,
|
|
);
|
|
transformedResultArr.push({ ...item, quantity: quantityArray });
|
|
});
|
|
|
|
return {
|
|
data: {
|
|
newResult: { data: { result: transformedResultArr, resultType: '' } },
|
|
result: transformedResultArr,
|
|
resultType: '',
|
|
},
|
|
};
|
|
}
|