import React, { FC, ReactNode } from 'react'; import { Alert, Table } from 'reactstrap'; import SeriesName from './SeriesName'; import { Metric } from '../../types/types'; import moment from 'moment'; export interface QueryResult { data: | null | { resultType: 'vector'; result: InstantSample[]; } | { resultType: 'matrix'; result: RangeSamples[]; } | { resultType: 'scalar'; result: SampleValue; } | { resultType: 'string'; result: string; }; useLocalTime: boolean; } interface InstantSample { metric: Metric; value: SampleValue; } interface RangeSamples { metric: Metric; values: SampleValue[]; } type SampleValue = [number, string]; const limitSeries = (series: S[]): S[] => { const maxSeries = 10000; if (series.length > maxSeries) { return series.slice(0, maxSeries); } return series; }; const DataTable: FC = ({ data, useLocalTime }) => { if (data === null) { return No data queried yet; } if (data.result === null || data.result.length === 0) { return Empty query result; } const maxFormattableSize = 1000; let rows: ReactNode[] = []; let limited = false; const doFormat = data.result.length <= maxFormattableSize; switch (data.resultType) { case 'vector': rows = (limitSeries(data.result) as InstantSample[]).map((s: InstantSample, index: number): ReactNode => { return ( {s.value[1]} ); }); limited = rows.length !== data.result.length; break; case 'matrix': rows = (limitSeries(data.result) as RangeSamples[]).map((s, index) => { const valuesAndTimes = s.values.map((v) => { const printedDatetime = moment.unix(v[0]).toISOString(useLocalTime); return ( {v[1]} @{{v[0]}}
); }); return ( {valuesAndTimes} ); }); limited = rows.length !== data.result.length; break; case 'scalar': rows.push( scalar {data.result[1]} ); break; case 'string': rows.push( string {data.result[1]} ); break; default: return Unsupported result value type; } return ( <> {limited && ( Warning: Fetched {data.result.length} metrics, only displaying first {rows.length}. )} {!doFormat && ( Notice: Showing more than {maxFormattableSize} series, turning off label formatting for performance reasons. )} {rows}
); }; export default DataTable;