2018-07-20 17:07:17 +02:00
|
|
|
import React, { Fragment, PureComponent } from 'react';
|
2018-10-05 13:00:45 +02:00
|
|
|
import Highlighter from 'react-highlight-words';
|
2018-07-20 17:07:17 +02:00
|
|
|
|
2018-10-05 13:00:45 +02:00
|
|
|
import { LogsModel } from 'app/core/logs_model';
|
|
|
|
|
import { findHighlightChunksInText } from 'app/core/utils/text';
|
2018-07-20 17:07:17 +02:00
|
|
|
|
|
|
|
|
interface LogsProps {
|
|
|
|
|
className?: string;
|
|
|
|
|
data: LogsModel;
|
2018-08-04 11:07:48 +02:00
|
|
|
loading: boolean;
|
2018-07-20 17:07:17 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const EXAMPLE_QUERY = '{job="default/prometheus"}';
|
|
|
|
|
|
2018-10-05 13:00:45 +02:00
|
|
|
export default class Logs extends PureComponent<LogsProps, {}> {
|
2018-07-20 17:07:17 +02:00
|
|
|
render() {
|
|
|
|
|
const { className = '', data } = this.props;
|
|
|
|
|
const hasData = data && data.rows && data.rows.length > 0;
|
|
|
|
|
return (
|
|
|
|
|
<div className={`${className} logs`}>
|
|
|
|
|
{hasData ? (
|
|
|
|
|
<div className="logs-entries panel-container">
|
|
|
|
|
{data.rows.map(row => (
|
|
|
|
|
<Fragment key={row.key}>
|
|
|
|
|
<div className={row.logLevel ? `logs-row-level logs-row-level-${row.logLevel}` : ''} />
|
|
|
|
|
<div title={`${row.timestamp} (${row.timeFromNow})`}>{row.timeLocal}</div>
|
|
|
|
|
<div>
|
2018-10-05 13:00:45 +02:00
|
|
|
<Highlighter
|
|
|
|
|
textToHighlight={row.entry}
|
|
|
|
|
searchWords={row.searchWords}
|
|
|
|
|
findChunks={findHighlightChunksInText}
|
|
|
|
|
highlightClassName="logs-row-match-highlight"
|
|
|
|
|
/>
|
2018-07-20 17:07:17 +02:00
|
|
|
</div>
|
|
|
|
|
</Fragment>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
) : null}
|
|
|
|
|
{!hasData ? (
|
|
|
|
|
<div className="panel-container">
|
|
|
|
|
Enter a query like <code>{EXAMPLE_QUERY}</code>
|
|
|
|
|
</div>
|
|
|
|
|
) : null}
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|