logs_model.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import _ from 'lodash';
  2. import { TimeSeries } from 'app/core/core';
  3. import colors from 'app/core/utils/colors';
  4. export enum LogLevel {
  5. crit = 'crit',
  6. warn = 'warn',
  7. err = 'error',
  8. error = 'error',
  9. info = 'info',
  10. debug = 'debug',
  11. trace = 'trace',
  12. none = 'none',
  13. }
  14. export const LogLevelColor = {
  15. [LogLevel.crit]: colors[7],
  16. [LogLevel.warn]: colors[1],
  17. [LogLevel.err]: colors[4],
  18. [LogLevel.error]: colors[4],
  19. [LogLevel.info]: colors[0],
  20. [LogLevel.debug]: colors[3],
  21. [LogLevel.trace]: colors[3],
  22. [LogLevel.none]: '#eee',
  23. };
  24. export interface LogSearchMatch {
  25. start: number;
  26. length: number;
  27. text: string;
  28. }
  29. export interface LogRow {
  30. entry: string;
  31. key: string; // timestamp + labels
  32. labels: string;
  33. logLevel: LogLevel;
  34. searchWords?: string[];
  35. timestamp: string; // ISO with nanosec precision
  36. timeFromNow: string;
  37. timeEpochMs: number;
  38. timeLocal: string;
  39. uniqueLabels?: string;
  40. }
  41. export interface LogsMetaItem {
  42. label: string;
  43. value: string;
  44. }
  45. export interface LogsModel {
  46. meta?: LogsMetaItem[];
  47. rows: LogRow[];
  48. series?: TimeSeries[];
  49. }
  50. export interface LogsStream {
  51. labels: string;
  52. entries: LogsStreamEntry[];
  53. search?: string;
  54. parsedLabels?: LogsStreamLabels;
  55. uniqueLabels?: string;
  56. }
  57. export interface LogsStreamEntry {
  58. line: string;
  59. timestamp: string;
  60. }
  61. export interface LogsStreamLabels {
  62. [key: string]: string;
  63. }
  64. export function makeSeriesForLogs(rows: LogRow[], intervalMs: number): TimeSeries[] {
  65. // Graph time series by log level
  66. const seriesByLevel = {};
  67. rows.forEach(row => {
  68. if (!seriesByLevel[row.logLevel]) {
  69. seriesByLevel[row.logLevel] = { lastTs: null, datapoints: [], alias: row.logLevel };
  70. }
  71. const levelSeries = seriesByLevel[row.logLevel];
  72. // Bucket to nearest minute
  73. const time = Math.round(row.timeEpochMs / intervalMs / 10) * intervalMs * 10;
  74. // Entry for time
  75. if (time === levelSeries.lastTs) {
  76. levelSeries.datapoints[levelSeries.datapoints.length - 1][0]++;
  77. } else {
  78. levelSeries.datapoints.push([1, time]);
  79. levelSeries.lastTs = time;
  80. }
  81. });
  82. return Object.keys(seriesByLevel).reduce((acc, level) => {
  83. if (seriesByLevel[level]) {
  84. const gs = new TimeSeries(seriesByLevel[level]);
  85. gs.setColor(LogLevelColor[level]);
  86. acc.push(gs);
  87. }
  88. return acc;
  89. }, []);
  90. }