prometheus

Форк
0
/
GraphHeatmapHelpers.ts 
58 строк · 1.8 Кб
1
import { DataTableProps } from './DataTable';
2
import { GraphProps, GraphSeries } from './Graph';
3

4
export function isHeatmapData(data: DataTableProps['data']) {
5
  if (data?.resultType === 'scalar' || data?.resultType === 'string' || !data?.result?.length || data?.result?.length < 2) {
6
    return false;
7
  }
8
  // Type assertion to prevent TS2349 error.
9
  const result = data.result as GraphProps['data']['result'];
10
  const firstLabels = Object.keys(result[0].metric).filter((label) => label !== 'le');
11
  return result.every(({ metric }) => {
12
    const labels = Object.keys(metric).filter((label) => label !== 'le');
13
    const allLabelsMatch = labels.every((label) => metric[label] === result[0].metric[label]);
14
    return metric.le && labels.length === firstLabels.length && allLabelsMatch;
15
  });
16
}
17

18
export function prepareHeatmapData(buckets: GraphSeries[]) {
19
  if (!buckets.every((a) => a.labels.le)) {
20
    return buckets;
21
  }
22

23
  const sortedBuckets = buckets.sort((a, b) => promValueToNumber(a.labels.le) - promValueToNumber(b.labels.le));
24
  const result: GraphSeries[] = [];
25

26
  for (let i = 0; i < sortedBuckets.length; i++) {
27
    const values = [];
28
    const { data, labels, color } = sortedBuckets[i];
29

30
    for (const [timestamp, value] of data) {
31
      const prevVal = sortedBuckets[i - 1]?.data.find((v) => v[0] === timestamp)?.[1] || 0;
32
      const newVal = Number(value) - prevVal;
33
      values.push([Number(timestamp), newVal]);
34
    }
35

36
    result.push({
37
      data: values,
38
      labels,
39
      color,
40
      index: i,
41
    });
42
  }
43
  return result;
44
}
45

46
export function promValueToNumber(s: string) {
47
  switch (s) {
48
    case 'NaN':
49
      return NaN;
50
    case 'Inf':
51
    case '+Inf':
52
      return Infinity;
53
    case '-Inf':
54
      return -Infinity;
55
    default:
56
      return parseFloat(s);
57
  }
58
}
59

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.