getGraphSeriesModel.ts 2.2 KB

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