ResultProcessor.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { LogsModel, GraphSeriesXY, DataFrame, FieldType } from '@grafana/data';
  2. import { ExploreItemState, ExploreMode } from 'app/types/explore';
  3. import TableModel, { mergeTablesIntoModel } from 'app/core/table_model';
  4. import { sortLogsResult, refreshIntervalToSortOrder } from 'app/core/utils/explore';
  5. import { dataFrameToLogsModel } from 'app/core/logs_model';
  6. import { getGraphSeriesModel } from 'app/plugins/panel/graph2/getGraphSeriesModel';
  7. export class ResultProcessor {
  8. constructor(private state: ExploreItemState, private dataFrames: DataFrame[], private intervalMs: number) {}
  9. getGraphResult(): GraphSeriesXY[] {
  10. if (this.state.mode !== ExploreMode.Metrics) {
  11. return null;
  12. }
  13. const onlyTimeSeries = this.dataFrames.filter(isTimeSeries);
  14. if (onlyTimeSeries.length === 0) {
  15. return null;
  16. }
  17. return getGraphSeriesModel(
  18. onlyTimeSeries,
  19. {},
  20. { showBars: false, showLines: true, showPoints: false },
  21. { asTable: false, isVisible: true, placement: 'under' }
  22. );
  23. }
  24. getTableResult(): TableModel {
  25. if (this.state.mode !== ExploreMode.Metrics) {
  26. return null;
  27. }
  28. // For now ignore time series
  29. // We can change this later, just need to figure out how to
  30. // Ignore time series only for prometheus
  31. const onlyTables = this.dataFrames.filter(frame => !isTimeSeries(frame));
  32. if (onlyTables.length === 0) {
  33. return null;
  34. }
  35. const tables = onlyTables.map(frame => {
  36. const { fields } = frame;
  37. const fieldCount = fields.length;
  38. const rowCount = frame.length;
  39. const columns = fields.map(field => ({
  40. text: field.name,
  41. type: field.type,
  42. filterable: field.config.filterable,
  43. }));
  44. const rows: any[][] = [];
  45. for (let i = 0; i < rowCount; i++) {
  46. const row: any[] = [];
  47. for (let j = 0; j < fieldCount; j++) {
  48. row.push(frame.fields[j].values.get(i));
  49. }
  50. rows.push(row);
  51. }
  52. return new TableModel({
  53. columns,
  54. rows,
  55. meta: frame.meta,
  56. });
  57. });
  58. return mergeTablesIntoModel(new TableModel(), ...tables);
  59. }
  60. getLogsResult(): LogsModel {
  61. if (this.state.mode !== ExploreMode.Logs) {
  62. return null;
  63. }
  64. const newResults = dataFrameToLogsModel(this.dataFrames, this.intervalMs);
  65. const sortOrder = refreshIntervalToSortOrder(this.state.refreshInterval);
  66. const sortedNewResults = sortLogsResult(newResults, sortOrder);
  67. const rows = sortedNewResults.rows;
  68. const series = sortedNewResults.series;
  69. return { ...sortedNewResults, rows, series };
  70. }
  71. }
  72. export function isTimeSeries(frame: DataFrame): boolean {
  73. if (frame.fields.length === 2) {
  74. if (frame.fields[1].type === FieldType.time) {
  75. return true;
  76. }
  77. }
  78. return false;
  79. }