From a22e9a0e0aec4a69e82c4667cfa148e72b9dd94b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A1bor=20Farkas?= Date: Fri, 17 Jun 2022 11:42:46 +0200 Subject: [PATCH] logs: merge log-lines-based and full-range histogram (#50507) * logs: merge old-histogram and new-histogram * better variable names * better names * refactor * refactor * refactor * logs: remove log-volume-loading indicator --- public/app/features/explore/Logs.tsx | 35 ++---- .../features/explore/LogsVolumePanel.test.tsx | 2 + .../app/features/explore/LogsVolumePanel.tsx | 116 +++++++++++++----- 3 files changed, 97 insertions(+), 56 deletions(-) diff --git a/public/app/features/explore/Logs.tsx b/public/app/features/explore/Logs.tsx index 0e0628be007..5b34ad9c555 100644 --- a/public/app/features/explore/Logs.tsx +++ b/public/app/features/explore/Logs.tsx @@ -24,7 +24,6 @@ import { DataQueryResponse, } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime'; -import { TooltipDisplayMode } from '@grafana/schema'; import { RadioButtonGroup, LogRows, @@ -40,7 +39,6 @@ import { dedupLogRows, filterLogLevels } from 'app/core/logs_model'; import store from 'app/core/store'; import { ExploreId } from 'app/types/explore'; -import { ExploreGraph } from './ExploreGraph'; import { LogsMetaRow } from './LogsMetaRow'; import LogsNavigation from './LogsNavigation'; import { LogsVolumePanel } from './LogsVolumePanel'; @@ -330,30 +328,19 @@ class UnthemedLogs extends PureComponent { return ( <> - {logsSeries && logsSeries.length ? ( - <> -
- This datasource does not support full-range histograms. The graph is based on the logs seen in the - response. -
- - - ) : undefined} { overflow-y: visible; width: 100%; `, - infoText: css` - font-size: ${theme.typography.size.sm}; - color: ${theme.colors.text.secondary}; - `, }; }; diff --git a/public/app/features/explore/LogsVolumePanel.test.tsx b/public/app/features/explore/LogsVolumePanel.test.tsx index cd67dc85e11..057be0a42b4 100644 --- a/public/app/features/explore/LogsVolumePanel.test.tsx +++ b/public/app/features/explore/LogsVolumePanel.test.tsx @@ -21,6 +21,8 @@ function renderPanel(logsVolumeData?: DataQueryResponse) { width={100} onUpdateTimeRange={() => {}} logsVolumeData={logsVolumeData} + logLinesBasedData={undefined} + logLinesBasedDataVisibleRange={undefined} onLoadLogsVolume={() => {}} onHiddenSeriesChanged={() => null} /> diff --git a/public/app/features/explore/LogsVolumePanel.tsx b/public/app/features/explore/LogsVolumePanel.tsx index 436eb08da86..7d10b705d6d 100644 --- a/public/app/features/explore/LogsVolumePanel.tsx +++ b/public/app/features/explore/LogsVolumePanel.tsx @@ -1,14 +1,24 @@ import { css } from '@emotion/css'; import React, { useState } from 'react'; -import { AbsoluteTimeRange, DataQueryError, DataQueryResponse, LoadingState, SplitOpen, TimeZone } from '@grafana/data'; +import { + AbsoluteTimeRange, + DataQueryError, + DataQueryResponse, + GrafanaTheme2, + LoadingState, + SplitOpen, + TimeZone, +} from '@grafana/data'; import { Alert, Button, Collapse, InlineField, TooltipDisplayMode, useStyles2, useTheme2 } from '@grafana/ui'; import { ExploreGraph } from './ExploreGraph'; type Props = { - logsVolumeData?: DataQueryResponse; + logsVolumeData: DataQueryResponse | undefined; absoluteRange: AbsoluteTimeRange; + logLinesBasedData: DataQueryResponse | undefined; + logLinesBasedDataVisibleRange: AbsoluteTimeRange | undefined; timeZone: TimeZone; splitOpen: SplitOpen; width: number; @@ -46,29 +56,64 @@ function ErrorAlert(props: { error: DataQueryError }) { ); } +function createVisualisationData( + logLinesBased: DataQueryResponse | undefined, + logLinesBasedVisibleRange: AbsoluteTimeRange | undefined, + fullRangeData: DataQueryResponse | undefined, + absoluteRange: AbsoluteTimeRange +): + | { + logsVolumeData: DataQueryResponse; + fullRangeData: boolean; + range: AbsoluteTimeRange; + } + | undefined { + if (fullRangeData !== undefined) { + return { + logsVolumeData: fullRangeData, + fullRangeData: true, + range: absoluteRange, + }; + } + + if (logLinesBased !== undefined) { + return { + logsVolumeData: logLinesBased, + fullRangeData: false, + range: logLinesBasedVisibleRange || absoluteRange, + }; + } + + return undefined; +} + export function LogsVolumePanel(props: Props) { - const { - width, - logsVolumeData, - absoluteRange, - timeZone, - splitOpen, - onUpdateTimeRange, - onLoadLogsVolume, - onHiddenSeriesChanged, - } = props; + const { width, timeZone, splitOpen, onUpdateTimeRange, onLoadLogsVolume, onHiddenSeriesChanged } = props; const theme = useTheme2(); const styles = useStyles2(getStyles); const spacing = parseInt(theme.spacing(2).slice(0, -2), 10); const height = 150; + const data = createVisualisationData( + props.logLinesBasedData, + props.logLinesBasedDataVisibleRange, + props.logsVolumeData, + props.absoluteRange + ); + + if (data === undefined) { + return null; + } + + const { logsVolumeData, fullRangeData, range } = data; + + if (logsVolumeData.error !== undefined) { + return ; + } + let LogsVolumePanelContent; - if (!logsVolumeData) { - return null; - } else if (logsVolumeData?.error) { - return ; - } else if (logsVolumeData?.state === LoadingState.Loading) { + if (logsVolumeData?.state === LoadingState.Loading) { LogsVolumePanelContent = Log volume is loading...; } else if (logsVolumeData?.data) { if (logsVolumeData.data.length > 0) { @@ -79,7 +124,7 @@ export function LogsVolumePanel(props: Props) { data={logsVolumeData.data} height={height} width={width - spacing} - absoluteRange={absoluteRange} + absoluteRange={range} onChangeTime={onUpdateTimeRange} timeZone={timeZone} splitOpenFn={splitOpen} @@ -92,30 +137,37 @@ export function LogsVolumePanel(props: Props) { } } - const zoomRatio = logsLevelZoomRatio(logsVolumeData, absoluteRange); - let zoomLevelInfo; + let extraInfo; + if (fullRangeData) { + const zoomRatio = logsLevelZoomRatio(logsVolumeData, range); - if (zoomRatio !== undefined && zoomRatio < 1) { - zoomLevelInfo = ( - -