getGraphSeriesModel.ts 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import {
  2. GraphSeriesXY,
  3. NullValueMode,
  4. calculateStats,
  5. colors,
  6. getFlotPairs,
  7. getColorFromHexRgbOrName,
  8. getDisplayProcessor,
  9. DisplayValue,
  10. PanelData,
  11. FieldCache,
  12. FieldType,
  13. } from '@grafana/ui';
  14. import { SeriesOptions, GraphOptions } from './types';
  15. import { GraphLegendEditorLegendOptions } from './GraphLegendEditor';
  16. export const getGraphSeriesModel = (
  17. data: PanelData,
  18. seriesOptions: SeriesOptions,
  19. graphOptions: GraphOptions,
  20. legendOptions: GraphLegendEditorLegendOptions
  21. ) => {
  22. const graphs: GraphSeriesXY[] = [];
  23. const displayProcessor = getDisplayProcessor({
  24. decimals: legendOptions.decimals,
  25. });
  26. for (const series of data.series) {
  27. const fieldCache = new FieldCache(series.fields);
  28. const timeColumn = fieldCache.getFirstFieldOfType(FieldType.time);
  29. if (!timeColumn) {
  30. continue;
  31. }
  32. const numberFields = fieldCache.getFields(FieldType.number);
  33. for (let i = 0; i < numberFields.length; i++) {
  34. const field = numberFields[i];
  35. // Use external calculator just to make sure it works :)
  36. const points = getFlotPairs({
  37. series,
  38. xIndex: timeColumn.index,
  39. yIndex: field.index,
  40. nullValueMode: NullValueMode.Null,
  41. });
  42. if (points.length > 0) {
  43. const seriesStats = calculateStats({ series, stats: legendOptions.stats, fieldIndex: field.index });
  44. let statsDisplayValues;
  45. if (legendOptions.stats) {
  46. statsDisplayValues = legendOptions.stats.map<DisplayValue>(stat => {
  47. const statDisplayValue = displayProcessor(seriesStats[stat]);
  48. return {
  49. ...statDisplayValue,
  50. text: statDisplayValue.text,
  51. title: stat,
  52. };
  53. });
  54. }
  55. const seriesColor =
  56. seriesOptions[field.name] && seriesOptions[field.name].color
  57. ? getColorFromHexRgbOrName(seriesOptions[field.name].color)
  58. : colors[graphs.length % colors.length];
  59. graphs.push({
  60. label: field.name,
  61. data: points,
  62. color: seriesColor,
  63. info: statsDisplayValues,
  64. isVisible: true,
  65. yAxis: (seriesOptions[field.name] && seriesOptions[field.name].yAxis) || 1,
  66. });
  67. }
  68. }
  69. }
  70. return graphs;
  71. };