Logs: Store queries that were run to get log results (#33971)

* Store queries that were run to get log results

* Fix typing

* Update public/app/features/explore/Logs.tsx

Co-authored-by: Gábor Farkas <gabor.farkas@gmail.com>

* Add changes based on feedback

Co-authored-by: Gábor Farkas <gabor.farkas@gmail.com>
This commit is contained in:
Ivana Huckova
2021-05-12 12:54:15 +02:00
committed by GitHub
parent 0992cedbf4
commit 73335ebbcb
7 changed files with 27 additions and 15 deletions

View File

@@ -2,6 +2,7 @@ import { Labels } from './data';
import { GraphSeriesXY } from './graph'; import { GraphSeriesXY } from './graph';
import { DataFrame } from './dataFrame'; import { DataFrame } from './dataFrame';
import { AbsoluteTimeRange } from './time'; import { AbsoluteTimeRange } from './time';
import { DataQuery } from './datasource';
/** /**
* Mapping of log level abbreviation to canonical log level. * Mapping of log level abbreviation to canonical log level.
@@ -85,6 +86,7 @@ export interface LogsModel {
rows: LogRowModel[]; rows: LogRowModel[];
series?: GraphSeriesXY[]; series?: GraphSeriesXY[];
visibleRange?: AbsoluteTimeRange; visibleRange?: AbsoluteTimeRange;
queries?: DataQuery[];
} }
export interface LogSearchMatch { export interface LogSearchMatch {

View File

@@ -30,6 +30,7 @@ import {
AbsoluteTimeRange, AbsoluteTimeRange,
sortInAscendingOrder, sortInAscendingOrder,
rangeUtil, rangeUtil,
DataQuery,
} from '@grafana/data'; } from '@grafana/data';
import { getThemeColor } from 'app/core/utils/colors'; import { getThemeColor } from 'app/core/utils/colors';
import { config } from '@grafana/runtime'; import { config } from '@grafana/runtime';
@@ -202,7 +203,8 @@ export function dataFrameToLogsModel(
dataFrame: DataFrame[], dataFrame: DataFrame[],
intervalMs: number | undefined, intervalMs: number | undefined,
timeZone: TimeZone, timeZone: TimeZone,
absoluteRange?: AbsoluteTimeRange absoluteRange?: AbsoluteTimeRange,
queries?: DataQuery[]
): LogsModel { ): LogsModel {
const { logSeries } = separateLogsAndMetrics(dataFrame); const { logSeries } = separateLogsAndMetrics(dataFrame);
const logsModel = logSeriesToLogsModel(logSeries); const logsModel = logSeriesToLogsModel(logSeries);
@@ -225,6 +227,7 @@ export function dataFrameToLogsModel(
} else { } else {
logsModel.series = []; logsModel.series = [];
} }
logsModel.queries = queries;
return logsModel; return logsModel;
} }
@@ -233,6 +236,7 @@ export function dataFrameToLogsModel(
rows: [], rows: [],
meta: [], meta: [],
series: [], series: [],
queries,
}; };
} }

View File

@@ -47,6 +47,7 @@ interface Props {
logRows: LogRowModel[]; logRows: LogRowModel[];
logsMeta?: LogsMetaItem[]; logsMeta?: LogsMetaItem[];
logsSeries?: GraphSeriesXY[]; logsSeries?: GraphSeriesXY[];
logsQueries?: DataQuery[];
visibleRange?: AbsoluteTimeRange; visibleRange?: AbsoluteTimeRange;
width: number; width: number;
theme: GrafanaTheme; theme: GrafanaTheme;
@@ -56,7 +57,6 @@ interface Props {
timeZone: TimeZone; timeZone: TimeZone;
scanning?: boolean; scanning?: boolean;
scanRange?: RawTimeRange; scanRange?: RawTimeRange;
queries: DataQuery[];
showContextToggle?: (row?: LogRowModel) => boolean; showContextToggle?: (row?: LogRowModel) => boolean;
onChangeTime: (range: AbsoluteTimeRange) => void; onChangeTime: (range: AbsoluteTimeRange) => void;
onClickFilterLabel?: (key: string, value: string) => void; onClickFilterLabel?: (key: string, value: string) => void;
@@ -243,7 +243,7 @@ export class UnthemedLogs extends PureComponent<Props, State> {
onChangeTime, onChangeTime,
getFieldLinks, getFieldLinks,
theme, theme,
queries, logsQueries,
} = this.props; } = this.props;
const { const {
@@ -353,12 +353,12 @@ export class UnthemedLogs extends PureComponent<Props, State> {
</div> </div>
<LogsNavigation <LogsNavigation
logsSortOrder={logsSortOrder} logsSortOrder={logsSortOrder}
visibleRange={visibleRange} visibleRange={visibleRange ?? absoluteRange}
absoluteRange={absoluteRange} absoluteRange={absoluteRange}
timeZone={timeZone} timeZone={timeZone}
onChangeTime={onChangeTime} onChangeTime={onChangeTime}
loading={loading} loading={loading}
queries={queries} queries={logsQueries ?? []}
scrollToTopLogs={this.scrollToTopLogs} scrollToTopLogs={this.scrollToTopLogs}
/> />
</div> </div>

View File

@@ -64,6 +64,7 @@ export class LogsContainer extends PureComponent<PropsFromRedux & LogsContainerP
logRows, logRows,
logsMeta, logsMeta,
logsSeries, logsSeries,
logsQueries,
onClickFilterLabel, onClickFilterLabel,
onClickFilterOutLabel, onClickFilterOutLabel,
onStartScanning, onStartScanning,
@@ -76,7 +77,6 @@ export class LogsContainer extends PureComponent<PropsFromRedux & LogsContainerP
width, width,
isLive, isLive,
exploreId, exploreId,
queries,
} = this.props; } = this.props;
if (!logRows) { if (!logRows) {
@@ -117,6 +117,7 @@ export class LogsContainer extends PureComponent<PropsFromRedux & LogsContainerP
logRows={logRows} logRows={logRows}
logsMeta={logsMeta} logsMeta={logsMeta}
logsSeries={logsSeries} logsSeries={logsSeries}
logsQueries={logsQueries}
highlighterExpressions={logsHighlighterExpressions} highlighterExpressions={logsHighlighterExpressions}
loading={loading} loading={loading}
onChangeTime={this.onChangeTime} onChangeTime={this.onChangeTime}
@@ -133,7 +134,6 @@ export class LogsContainer extends PureComponent<PropsFromRedux & LogsContainerP
width={width} width={width}
getRowContext={this.getLogRowContext} getRowContext={this.getLogRowContext}
getFieldLinks={this.getFieldLinks} getFieldLinks={this.getFieldLinks}
queries={queries}
/> />
</Collapse> </Collapse>
</LogsCrossFadeTransition> </LogsCrossFadeTransition>
@@ -156,7 +156,6 @@ function mapStateToProps(state: StoreState, { exploreId }: { exploreId: string }
isPaused, isPaused,
range, range,
absoluteRange, absoluteRange,
queries,
} = item; } = item;
const timeZone = getTimeZone(state.user); const timeZone = getTimeZone(state.user);
@@ -166,6 +165,7 @@ function mapStateToProps(state: StoreState, { exploreId }: { exploreId: string }
logRows: logsResult?.rows, logRows: logsResult?.rows,
logsMeta: logsResult?.meta, logsMeta: logsResult?.meta,
logsSeries: logsResult?.series, logsSeries: logsResult?.series,
logsQueries: logsResult?.queries,
visibleRange: logsResult?.visibleRange, visibleRange: logsResult?.visibleRange,
scanning, scanning,
timeZone, timeZone,
@@ -174,7 +174,6 @@ function mapStateToProps(state: StoreState, { exploreId }: { exploreId: string }
isPaused, isPaused,
range, range,
absoluteRange, absoluteRange,
queries,
}; };
} }

View File

@@ -10,7 +10,7 @@ type Props = {
timeZone: TimeZone; timeZone: TimeZone;
queries: DataQuery[]; queries: DataQuery[];
loading: boolean; loading: boolean;
visibleRange?: AbsoluteTimeRange; visibleRange: AbsoluteTimeRange;
logsSortOrder?: LogsSortOrder | null; logsSortOrder?: LogsSortOrder | null;
onChangeTime: (range: AbsoluteTimeRange) => void; onChangeTime: (range: AbsoluteTimeRange) => void;
scrollToTopLogs: () => void; scrollToTopLogs: () => void;
@@ -28,8 +28,8 @@ function LogsNavigation({
loading, loading,
onChangeTime, onChangeTime,
scrollToTopLogs, scrollToTopLogs,
visibleRange = absoluteRange, visibleRange,
queries = [], queries,
}: Props) { }: Props) {
const [pages, setPages] = useState<LogsPage[]>([]); const [pages, setPages] = useState<LogsPage[]>([]);
const [currentPageIndex, setCurrentPageIndex] = useState(0); const [currentPageIndex, setCurrentPageIndex] = useState(0);

View File

@@ -357,7 +357,7 @@ export const runQueries = (exploreId: ExploreId, options?: { replaceUrl?: boolea
map((data: PanelData) => preProcessPanelData(data, queryResponse)), map((data: PanelData) => preProcessPanelData(data, queryResponse)),
map(decorateWithFrameTypeMetadata), map(decorateWithFrameTypeMetadata),
map(decorateWithGraphResult), map(decorateWithGraphResult),
map(decorateWithLogsResult({ absoluteRange, refreshInterval })), map(decorateWithLogsResult({ absoluteRange, refreshInterval, queries })),
mergeMap(decorateWithTableResult) mergeMap(decorateWithTableResult)
) )
.subscribe( .subscribe(

View File

@@ -6,6 +6,7 @@ import {
PanelData, PanelData,
sortLogsResult, sortLogsResult,
standardTransformers, standardTransformers,
DataQuery,
} from '@grafana/data'; } from '@grafana/data';
import { config } from '@grafana/runtime'; import { config } from '@grafana/runtime';
import { groupBy } from 'lodash'; import { groupBy } from 'lodash';
@@ -129,7 +130,7 @@ export const decorateWithTableResult = (data: ExplorePanelData): Observable<Expl
}; };
export const decorateWithLogsResult = ( export const decorateWithLogsResult = (
options: { absoluteRange?: AbsoluteTimeRange; refreshInterval?: string } = {} options: { absoluteRange?: AbsoluteTimeRange; refreshInterval?: string; queries?: DataQuery[] } = {}
) => (data: ExplorePanelData): ExplorePanelData => { ) => (data: ExplorePanelData): ExplorePanelData => {
if (data.logsFrames.length === 0) { if (data.logsFrames.length === 0) {
return { ...data, logsResult: null }; return { ...data, logsResult: null };
@@ -137,7 +138,13 @@ export const decorateWithLogsResult = (
const timeZone = data.request?.timezone ?? 'browser'; const timeZone = data.request?.timezone ?? 'browser';
const intervalMs = data.request?.intervalMs; const intervalMs = data.request?.intervalMs;
const newResults = dataFrameToLogsModel(data.logsFrames, intervalMs, timeZone, options.absoluteRange); const newResults = dataFrameToLogsModel(
data.logsFrames,
intervalMs,
timeZone,
options.absoluteRange,
options.queries
);
const sortOrder = refreshIntervalToSortOrder(options.refreshInterval); const sortOrder = refreshIntervalToSortOrder(options.refreshInterval);
const sortedNewResults = sortLogsResult(newResults, sortOrder); const sortedNewResults = sortLogsResult(newResults, sortOrder);
const rows = sortedNewResults.rows; const rows = sortedNewResults.rows;