mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
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:
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user