ResultProcessor.ts 2.7 KB

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