getGraphSeriesModel.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import {
  2. GraphSeriesXY,
  3. NullValueMode,
  4. reduceField,
  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. field: {
  25. decimals: legendOptions.decimals,
  26. },
  27. });
  28. for (const series of data.series) {
  29. const fieldCache = new FieldCache(series.fields);
  30. const timeColumn = fieldCache.getFirstFieldOfType(FieldType.time);
  31. if (!timeColumn) {
  32. continue;
  33. }
  34. const numberFields = fieldCache.getFields(FieldType.number);
  35. for (let i = 0; i < numberFields.length; i++) {
  36. const field = numberFields[i];
  37. // Use external calculator just to make sure it works :)
  38. const points = getFlotPairs({
  39. series,
  40. xIndex: timeColumn.index,
  41. yIndex: field.index,
  42. nullValueMode: NullValueMode.Null,
  43. });
  44. if (points.length > 0) {
  45. const seriesStats = reduceField({
  46. series,
  47. reducers: legendOptions.stats,
  48. fieldIndex: field.index,
  49. });
  50. let statsDisplayValues: DisplayValue[];
  51. if (legendOptions.stats) {
  52. statsDisplayValues = legendOptions.stats.map<DisplayValue>(stat => {
  53. const statDisplayValue = displayProcessor(seriesStats[stat]);
  54. return {
  55. ...statDisplayValue,
  56. text: statDisplayValue.text,
  57. title: stat,
  58. };
  59. });
  60. }
  61. const seriesColor =
  62. seriesOptions[field.name] && seriesOptions[field.name].color
  63. ? getColorFromHexRgbOrName(seriesOptions[field.name].color)
  64. : colors[graphs.length % colors.length];
  65. graphs.push({
  66. label: field.name,
  67. data: points,
  68. color: seriesColor,
  69. info: statsDisplayValues,
  70. isVisible: true,
  71. yAxis: (seriesOptions[field.name] && seriesOptions[field.name].yAxis) || 1,
  72. });
  73. }
  74. }
  75. }
  76. return graphs;
  77. };