import React, { PureComponent } from 'react'; import { rangeUtil, RawTimeRange, LogLevel, TimeZone, AbsoluteTimeRange, LogsMetaKind, LogsModel, LogsDedupStrategy, LogRowModel, LogsDedupDescription, } from '@grafana/data'; import { Switch, LogLabels, ToggleButtonGroup, ToggleButton, LogRows } from '@grafana/ui'; import { ExploreGraphPanel } from './ExploreGraphPanel'; function renderMetaItem(value: any, kind: LogsMetaKind) { if (kind === LogsMetaKind.LabelsMap) { return ( []} /> ); } return value; } interface Props { data?: LogsModel; dedupedData?: LogsModel; width: number; highlighterExpressions: string[]; loading: boolean; absoluteRange: AbsoluteTimeRange; timeZone: TimeZone; scanning?: boolean; scanRange?: RawTimeRange; dedupStrategy: LogsDedupStrategy; onChangeTime: (range: AbsoluteTimeRange) => void; onClickLabel?: (label: string, value: string) => void; onStartScanning?: () => void; onStopScanning?: () => void; onDedupStrategyChange: (dedupStrategy: LogsDedupStrategy) => void; onToggleLogLevel: (hiddenLogLevels: LogLevel[]) => void; getRowContext?: (row: LogRowModel, options?: any) => Promise; } interface State { showLabels: boolean; showTime: boolean; } export class Logs extends PureComponent { state = { showLabels: false, showTime: true, }; onChangeDedup = (dedup: LogsDedupStrategy) => { const { onDedupStrategyChange } = this.props; if (this.props.dedupStrategy === dedup) { return onDedupStrategyChange(LogsDedupStrategy.none); } return onDedupStrategyChange(dedup); }; onChangeLabels = (event?: React.SyntheticEvent) => { const target = event && (event.target as HTMLInputElement); if (target) { this.setState({ showLabels: target.checked, }); } }; onChangeTime = (event?: React.SyntheticEvent) => { const target = event && (event.target as HTMLInputElement); if (target) { this.setState({ showTime: target.checked, }); } }; onToggleLogLevel = (hiddenRawLevels: string[]) => { const hiddenLogLevels: LogLevel[] = hiddenRawLevels.map(level => LogLevel[level as LogLevel]); this.props.onToggleLogLevel(hiddenLogLevels); }; onClickScan = (event: React.SyntheticEvent) => { event.preventDefault(); if (this.props.onStartScanning) { this.props.onStartScanning(); } }; onClickStopScan = (event: React.SyntheticEvent) => { event.preventDefault(); if (this.props.onStopScanning) { this.props.onStopScanning(); } }; render() { const { data, highlighterExpressions, loading = false, onClickLabel, timeZone, scanning, scanRange, width, dedupedData, absoluteRange, onChangeTime, } = this.props; if (!data) { return null; } const { showLabels, showTime } = this.state; const { dedupStrategy } = this.props; const hasData = data && data.rows && data.rows.length > 0; const dedupCount = dedupedData ? dedupedData.rows.reduce((sum, row) => (row.duplicates ? sum + row.duplicates : sum), 0) : 0; const meta = data && data.meta ? [...data.meta] : []; if (dedupStrategy !== LogsDedupStrategy.none) { meta.push({ label: 'Dedup count', value: dedupCount, kind: LogsMetaKind.Number, }); } const scanText = scanRange ? `Scanning ${rangeUtil.describeTimeRange(scanRange)}` : 'Scanning...'; const series = data && data.series ? data.series : []; return (
{Object.keys(LogsDedupStrategy).map((dedupType: string, i) => ( {dedupType} ))}
{hasData && meta && (
{meta.map(item => (
{item.label}: {renderMetaItem(item.value, item.kind)}
))}
)} {!loading && !hasData && !scanning && (
No logs found. Scan for older logs
)} {scanning && (
{scanText} Stop scan
)}
); } }