Logs.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import React, { Fragment, PureComponent } from 'react';
  2. import Highlighter from 'react-highlight-words';
  3. import { LogsModel } from 'app/core/logs_model';
  4. import { findHighlightChunksInText } from 'app/core/utils/text';
  5. interface LogsProps {
  6. className?: string;
  7. data: LogsModel;
  8. loading: boolean;
  9. }
  10. const EXAMPLE_QUERY = '{job="default/prometheus"}';
  11. export default class Logs extends PureComponent<LogsProps, {}> {
  12. render() {
  13. const { className = '', data } = this.props;
  14. const hasData = data && data.rows && data.rows.length > 0;
  15. return (
  16. <div className={`${className} logs`}>
  17. {hasData ? (
  18. <div className="logs-entries panel-container">
  19. {data.rows.map(row => (
  20. <Fragment key={row.key}>
  21. <div className={row.logLevel ? `logs-row-level logs-row-level-${row.logLevel}` : ''} />
  22. <div title={`${row.timestamp} (${row.timeFromNow})`}>{row.timeLocal}</div>
  23. <div>
  24. <Highlighter
  25. textToHighlight={row.entry}
  26. searchWords={row.searchWords}
  27. findChunks={findHighlightChunksInText}
  28. highlightClassName="logs-row-match-highlight"
  29. />
  30. </div>
  31. </Fragment>
  32. ))}
  33. </div>
  34. ) : null}
  35. {!hasData ? (
  36. <div className="panel-container">
  37. Enter a query like <code>{EXAMPLE_QUERY}</code>
  38. </div>
  39. ) : null}
  40. </div>
  41. );
  42. }
  43. }