response_parser.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import Papa from 'papaparse';
  2. import groupBy from 'lodash/groupBy';
  3. import TableModel from 'app/core/table_model';
  4. const filterColumnKeys = key => key && key[0] !== '_' && key !== 'result' && key !== 'table';
  5. const IGNORE_FIELDS_FOR_NAME = ['result', '', 'table'];
  6. export const getNameFromRecord = record => {
  7. // Measurement and field
  8. const metric = [record._measurement, record._field];
  9. // Add tags
  10. const tags = Object.keys(record)
  11. .filter(key => key[0] !== '_')
  12. .filter(key => IGNORE_FIELDS_FOR_NAME.indexOf(key) === -1)
  13. .map(key => `${key}=${record[key]}`);
  14. return [...metric, ...tags].join(' ');
  15. };
  16. const parseCSV = (input: string) =>
  17. Papa.parse(input, {
  18. header: true,
  19. comments: '#',
  20. }).data;
  21. export const parseValue = (input: string) => {
  22. const value = parseFloat(input);
  23. return isNaN(value) ? null : value;
  24. };
  25. export const parseTime = (input: string) => Date.parse(input);
  26. export function parseResults(response: string): any[] {
  27. return response.trim().split(/\n\s*\s/);
  28. }
  29. export function getTableModelFromResult(result: string) {
  30. const data = parseCSV(result);
  31. const table = new TableModel();
  32. if (data.length > 0) {
  33. // First columns are fixed
  34. const firstColumns = [
  35. { text: 'Time', id: '_time' },
  36. { text: 'Measurement', id: '_measurement' },
  37. { text: 'Field', id: '_field' },
  38. ];
  39. // Dynamically add columns for tags
  40. const firstRecord = data[0];
  41. const tags = Object.keys(firstRecord)
  42. .filter(filterColumnKeys)
  43. .map(key => ({ id: key, text: key }));
  44. const valueColumn = { id: '_value', text: 'Value' };
  45. const columns = [...firstColumns, ...tags, valueColumn];
  46. columns.forEach(c => table.addColumn(c));
  47. // Add rows
  48. data.forEach(record => {
  49. const row = columns.map(c => record[c.id]);
  50. table.addRow(row);
  51. });
  52. }
  53. return table;
  54. }
  55. export function getTimeSeriesFromResult(result: string) {
  56. const data = parseCSV(result);
  57. if (data.length === 0) {
  58. return [];
  59. }
  60. // Group results by table ID (assume one table per timeseries for now)
  61. const tables = groupBy(data, 'table');
  62. const seriesList = Object.keys(tables)
  63. .map(id => tables[id])
  64. .map(series => {
  65. const datapoints = series.map(record => [parseValue(record._value), parseTime(record._time)]);
  66. const alias = getNameFromRecord(series[0]);
  67. return { datapoints, target: alias };
  68. });
  69. return seriesList;
  70. }