diff --git a/packages/page-explorer/src/Latency/index.tsx b/packages/page-explorer/src/Latency/index.tsx index e37a3f7a14..f63b314c7a 100644 --- a/packages/page-explorer/src/Latency/index.tsx +++ b/packages/page-explorer/src/Latency/index.tsx @@ -16,40 +16,86 @@ interface Props { className?: string; } -interface ChartInfo { +interface ChartContents { labels: string[]; values: number[][]; } -const COLORS = ['#8c2200']; -const LEGENDS: string[] = []; +interface ChartInfo { + events: ChartContents; + extrinsics: ChartContents; + times: ChartContents; +} + +const COLORS_TIMES = ['#8c2200', '#acacac']; +// const COLORS_EVENTS = ['#008c22', '#acacac']; +// const COLORS_TXS = ['#00228c', '#acacac']; const OPTIONS = { animation: { duration: 0 }, - aspectRatio: 4, + aspectRatio: 5, maintainAspectRatio: true }; -function getPoints (details: Detail[]): ChartInfo { - const labels = new Array(details.length); - const times = new Array(details.length); +function getPoints (details: Detail[], timeAvg: number): ChartInfo { + const events: ChartContents = { + labels: [], + values: [[], []] + }; + const extrinsics: ChartContents = { + labels: [], + values: [[], []] + }; + const times: ChartContents = { + labels: [], + values: [[], []] + }; + + const eventAvg = details.reduce((a, { countEvents }) => a + countEvents, 0); + const txAvg = details.reduce((a, { countExtrinsics }) => a + countExtrinsics, 0); for (let i = 0; i < details.length; i++) { - labels[i] = formatNumber(details[i].blockNumber); - times[i] = details[i].delay / 1000; + events.labels.push(formatNumber(details[i].blockNumber)); + events.values[0].push(details[i].countEvents); + events.values[1].push((eventAvg - details[i].countEvents) / (details.length - 1)); + + extrinsics.labels.push(formatNumber(details[i].blockNumber)); + extrinsics.values[0].push(details[i].countExtrinsics); + extrinsics.values[1].push((txAvg - details[i].countExtrinsics) / (details.length - 1)); } - return { labels, values: [times] }; + const filtered = details.filter(({ delay }) => delay); + const avgBase = timeAvg * filtered.length; + + for (let i = 0; i < filtered.length; i++) { + times.labels.push(formatNumber(filtered[i].blockNumber)); + times.values[0].push(filtered[i].delay / 1000); + times.values[1].push((avgBase - filtered[i].delay) / (filtered.length - 1) / 1000); + } + + return { + events, + extrinsics, + times + }; } function Latency ({ className }: Props): React.ReactElement | null { const { t } = useTranslation(); const { details, timeAvg, timeMax, timeMin } = useLatency(); - const { labels, values } = useMemo( - () => getPoints(details), - [details] + const { /* events, extrinsics, */ times } = useMemo( + () => getPoints(details, timeAvg), + [details, timeAvg] + ); + + const { /* eventsLegend, extrinsicsLegend, */ timesLegend } = useMemo( + () => ({ + eventsLegend: [t('events'), t('average')], + extrinsicsLegend: [t('extrinsics'), t('average')], + timesLegend: [t('blocktime'), t('average')] + }), [t] ); if (details.length <= 2) { @@ -64,18 +110,38 @@ function Latency ({ className }: Props): React.ReactElement | null { ('min')}>{(timeMin / 1000).toFixed(3)}s ('avg')}>{(timeAvg / 1000).toFixed(3)}s ('max')}>{(timeMax / 1000).toFixed(3)}s - ('last')}>{values[values.length - 1][0].toFixed(3)}s + ('last')}>{times.values[times.values.length - 1][0].toFixed(3)}s
-

{t('blocktimes (last {{num}} blocks)', { replace: { num: labels.length } })}

+

{t('blocktimes (last {{num}} blocks)', { replace: { num: times.labels.length } })}

+ {/*
+

{t('events (last {{num}} blocks)', { replace: { num: events.labels.length } })}

+ +
+
+

{t('extrinsics (last {{num}} blocks)', { replace: { num: extrinsics.labels.length } })}

+ +
*/} ); } @@ -87,4 +153,8 @@ export default styled(Latency)` border-radius: 0.25rem; padding: 1rem 1.5rem; } + + .container+.container { + margin-top: 1rem; + } `; diff --git a/packages/page-explorer/src/Latency/useLatency.ts b/packages/page-explorer/src/Latency/useLatency.ts index 8ac7b4a7cc..5f42ba7ac3 100644 --- a/packages/page-explorer/src/Latency/useLatency.ts +++ b/packages/page-explorer/src/Latency/useLatency.ts @@ -129,12 +129,13 @@ export default function useLatency (): Result { }, [api, details]); return useMemo((): Result => { - const filtered = details.filter(({ delay }) => delay); - const delays = filtered.map(({ delay }) => delay); + const delays = details + .map(({ delay }) => delay) + .filter((delay) => delay); - return filtered.length + return delays.length ? { - details: filtered, + details, timeAvg: delays.reduce((avg, d) => avg + (d / delays.length), 0), timeMax: Math.max(...delays), timeMin: Math.min(...delays)