result_transformer.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { LokiLogsStream, LokiResponse } from './types';
  2. import {
  3. parseLabels,
  4. FieldType,
  5. Labels,
  6. DataFrame,
  7. ArrayVector,
  8. MutableDataFrame,
  9. findUniqueLabels,
  10. } from '@grafana/data';
  11. /**
  12. * Transforms LokiLogStream structure into a dataFrame. Used when doing standard queries.
  13. */
  14. export function logStreamToDataFrame(stream: LokiLogsStream, reverse?: boolean, refId?: string): DataFrame {
  15. let labels: Labels = stream.parsedLabels;
  16. if (!labels && stream.labels) {
  17. labels = parseLabels(stream.labels);
  18. }
  19. const times = new ArrayVector<string>([]);
  20. const lines = new ArrayVector<string>([]);
  21. for (const entry of stream.entries) {
  22. times.add(entry.ts || entry.timestamp);
  23. lines.add(entry.line);
  24. }
  25. if (reverse) {
  26. times.buffer = times.buffer.reverse();
  27. lines.buffer = lines.buffer.reverse();
  28. }
  29. return {
  30. refId,
  31. labels,
  32. fields: [
  33. { name: 'ts', type: FieldType.time, config: { title: 'Time' }, values: times }, // Time
  34. { name: 'line', type: FieldType.string, config: {}, values: lines }, // Line
  35. ],
  36. length: times.length,
  37. };
  38. }
  39. /**
  40. * Transform LokiResponse data and appends it to MutableDataFrame. Used for streaming where the dataFrame can be
  41. * a CircularDataFrame creating a fixed size rolling buffer.
  42. * TODO: Probably could be unified with the logStreamToDataFrame function.
  43. */
  44. export function appendResponseToBufferedData(response: LokiResponse, data: MutableDataFrame) {
  45. // Should we do anythign with: response.dropped_entries?
  46. const streams: LokiLogsStream[] = response.streams;
  47. if (streams && streams.length) {
  48. for (const stream of streams) {
  49. // Find unique labels
  50. const labels = parseLabels(stream.labels);
  51. const unique = findUniqueLabels(labels, data.labels);
  52. // Add each line
  53. for (const entry of stream.entries) {
  54. data.values.ts.add(entry.ts || entry.timestamp);
  55. data.values.line.add(entry.line);
  56. data.values.labels.add(unique);
  57. }
  58. }
  59. }
  60. }