Logs.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import React, { Fragment, PureComponent } from 'react';
  2. import { LogsModel, LogRow } from 'app/core/logs_model';
  3. interface LogsProps {
  4. className?: string;
  5. data: LogsModel;
  6. loading: boolean;
  7. }
  8. const EXAMPLE_QUERY = '{job="default/prometheus"}';
  9. const Entry: React.SFC<LogRow> = props => {
  10. const { entry, searchMatches } = props;
  11. if (searchMatches && searchMatches.length > 0) {
  12. let lastMatchEnd = 0;
  13. const spans = searchMatches.reduce((acc, match, i) => {
  14. // Insert non-match
  15. if (match.start !== lastMatchEnd) {
  16. acc.push(<>{entry.slice(lastMatchEnd, match.start)}</>);
  17. }
  18. // Match
  19. acc.push(
  20. <span className="logs-row-match-highlight" title={`Matching expression: ${match.text}`}>
  21. {entry.substr(match.start, match.length)}
  22. </span>
  23. );
  24. lastMatchEnd = match.start + match.length;
  25. // Non-matching end
  26. if (i === searchMatches.length - 1) {
  27. acc.push(<>{entry.slice(lastMatchEnd)}</>);
  28. }
  29. return acc;
  30. }, []);
  31. return <>{spans}</>;
  32. }
  33. return <>{props.entry}</>;
  34. };
  35. export default class Logs extends PureComponent<LogsProps, any> {
  36. render() {
  37. const { className = '', data } = this.props;
  38. const hasData = data && data.rows && data.rows.length > 0;
  39. return (
  40. <div className={`${className} logs`}>
  41. {hasData ? (
  42. <div className="logs-entries panel-container">
  43. {data.rows.map(row => (
  44. <Fragment key={row.key}>
  45. <div className={row.logLevel ? `logs-row-level logs-row-level-${row.logLevel}` : ''} />
  46. <div title={`${row.timestamp} (${row.timeFromNow})`}>{row.timeLocal}</div>
  47. <div>
  48. <Entry {...row} />
  49. </div>
  50. </Fragment>
  51. ))}
  52. </div>
  53. ) : null}
  54. {!hasData ? (
  55. <div className="panel-container">
  56. Enter a query like <code>{EXAMPLE_QUERY}</code>
  57. </div>
  58. ) : null}
  59. </div>
  60. );
  61. }
  62. }