From e6c945b535f5861ae7756bbc0fcf214f3575bb3b Mon Sep 17 00:00:00 2001 From: Galen Kistler <109082771+gtk-grafana@users.noreply.github.com> Date: Thu, 10 Apr 2025 09:02:17 -0500 Subject: [PATCH] Logs Panel: Explore - Condense line limit copy (#103739) * chore: condense line limit copy, fix forward search calculation --- public/app/features/logs/logsModel.test.ts | 38 +++++++++++----------- public/app/features/logs/logsModel.ts | 20 +++++++----- 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/public/app/features/logs/logsModel.test.ts b/public/app/features/logs/logsModel.test.ts index 093814633f4..69bf270c891 100644 --- a/public/app/features/logs/logsModel.test.ts +++ b/public/app/features/logs/logsModel.test.ts @@ -356,8 +356,8 @@ describe('dataFrameToLogsModel', () => { kind: LogsMetaKind.LabelsMap, }); expect(logsModel.meta![1]).toMatchObject({ - label: LIMIT_LABEL, - value: `1000 (2 returned)`, + label: '', + value: `2 lines returned`, kind: LogsMetaKind.String, }); }); @@ -437,8 +437,8 @@ describe('dataFrameToLogsModel', () => { kind: LogsMetaKind.LabelsMap, }); expect(logsModel.meta![1]).toMatchObject({ - label: LIMIT_LABEL, - value: `1000 (2 returned)`, + label: '', + value: `2 lines returned`, kind: LogsMetaKind.String, }); }); @@ -474,8 +474,8 @@ describe('dataFrameToLogsModel', () => { ]; const logsModel = dataFrameToLogsModel(series, 1); expect(logsModel.meta![0]).toMatchObject({ - label: LIMIT_LABEL, - value: `1000 (1 displayed)`, + label: '', + value: `1 line displayed`, kind: LogsMetaKind.String, }); @@ -486,8 +486,8 @@ describe('dataFrameToLogsModel', () => { const series: DataFrame[] = getTestDataFrame(); const logsModel = dataFrameToLogsModel(series, 1); expect(logsModel.meta![1]).toMatchObject({ - label: LIMIT_LABEL, - value: `1000 (2 returned)`, + label: '', + value: `2 lines returned`, kind: LogsMetaKind.String, }); }); @@ -500,8 +500,8 @@ describe('dataFrameToLogsModel', () => { }, }; const timeRange = { - from: 1556270800000, - to: 1556270899999, + from: 1556270899999, + to: 1556357299999, }; const queries = [ { @@ -522,8 +522,8 @@ describe('dataFrameToLogsModel', () => { kind: 2, }, { - label: 'Line limit', - value: '2 reached, received logs cover 8.65% (9sec) of your selected time range (1min 40sec)', + label: '', + value: '2 lines shown — 21.85% (5h 14min 40sec) of 24h', kind: 1, }, ]); @@ -560,7 +560,7 @@ describe('dataFrameToLogsModel', () => { kind: 2, }, { - label: 'Line limit', + label: '', value: '2 reached', kind: 1, }, @@ -654,8 +654,8 @@ describe('dataFrameToLogsModel', () => { kind: LogsMetaKind.LabelsMap, }); expect(logsModel.meta![1]).toMatchObject({ - label: LIMIT_LABEL, - value: `1000 (2 returned)`, + label: '', + value: `2 lines returned`, kind: LogsMetaKind.String, }); }); @@ -773,8 +773,8 @@ describe('dataFrameToLogsModel', () => { kind: LogsMetaKind.LabelsMap, }); expect(logsModel.meta![1]).toMatchObject({ - label: LIMIT_LABEL, - value: `1000 (2 returned)`, + label: '', + value: `2 lines returned`, kind: LogsMetaKind.String, }); expect(logsModel.meta![2]).toMatchObject({ @@ -1115,8 +1115,8 @@ describe('dataFrameToLogsModel', () => { kind: LogsMetaKind.LabelsMap, }); expect(logsModel.meta![1]).toMatchObject({ - label: LIMIT_LABEL, - value: `2 reached, received logs cover 98.44% (5h 14min 40sec) of your selected time range (5h 19min 40sec)`, + label: '', + value: `2 lines shown — 98.44% (5h 14min 40sec) of 5h 19min 40sec`, kind: LogsMetaKind.String, }); }); diff --git a/public/app/features/logs/logsModel.ts b/public/app/features/logs/logsModel.ts index 12a0b727c1a..12aebd4368e 100644 --- a/public/app/features/logs/logsModel.ts +++ b/public/app/features/logs/logsModel.ts @@ -259,6 +259,7 @@ export function dataFrameToLogsModel( * @param intervalMs Dynamic data interval based on available pixel width * @param absoluteRange Requested time range * @param pxPerBar Default: 20, buckets will be rendered as bars, assuming 10px per histogram bar plus some free space around it + * @param minimumBucketSize */ export function getSeriesProperties( sortedRows: LogRowModel[], @@ -274,18 +275,21 @@ export function getSeriesProperties( let requestedRangeMs; // Clamp time range to visible logs otherwise big parts of the graph might look empty if (absoluteRange) { - const earliestTsLogs = sortedRows[0].timeEpochMs; + const firstTimeStamp = sortedRows[0].timeEpochMs; + const lastTimeStamp = sortedRows[sortedRows.length - 1].timeEpochMs; + const earliestTsLogs = firstTimeStamp < lastTimeStamp ? firstTimeStamp : lastTimeStamp; + const earliestLogToTimeRangeEnd = absoluteRange.to - earliestTsLogs; requestedRangeMs = absoluteRange.to - absoluteRange.from; - visibleRangeMs = absoluteRange.to - earliestTsLogs; + visibleRangeMs = Math.abs(firstTimeStamp - lastTimeStamp); if (visibleRangeMs > 0) { // Adjust interval bucket size for potentially shorter visible range - const clampingFactor = visibleRangeMs / requestedRangeMs; + const clampingFactor = earliestLogToTimeRangeEnd / requestedRangeMs; resolutionIntervalMs *= clampingFactor; // Minimum bucketsize of 1s for nicer graphing bucketSize = Math.max(Math.ceil(resolutionIntervalMs * pxPerBar), minimumBucketSize); - // makeSeriesForLogs() aligns dataspoints with time buckets, so we do the same here to not cut off data + // makeSeriesForLogs() aligns data points with time buckets, so we do the same here to not cut off data const adjustedEarliest = Math.floor(earliestTsLogs / bucketSize) * bucketSize; visibleRange = { from: adjustedEarliest, to: absoluteRange.to }; } else { @@ -564,17 +568,15 @@ function adjustMetaInfo(logsModel: LogsModel, visibleRangeMs?: number, requested if (canShowCoverage) { const coverage = ((visibleRangeMs / requestedRangeMs) * 100).toFixed(2); - metaLimitValue += `, received logs cover ${coverage}% (${rangeUtil.msRangeToTimeString( - visibleRangeMs - )}) of your selected time range (${rangeUtil.msRangeToTimeString(requestedRangeMs)})`; + metaLimitValue = `${limit} lines shown — ${coverage}% (${rangeUtil.msRangeToTimeString(visibleRangeMs)}) of ${rangeUtil.msRangeToTimeString(requestedRangeMs)}`; } } else { const description = config.featureToggles.logsInfiniteScrolling ? 'displayed' : 'returned'; - metaLimitValue = `${limit} (${logsModel.rows.length} ${description})`; + metaLimitValue = `${logsModel.rows.length} ${logsModel.rows.length > 1 ? 'lines' : 'line'} ${description}`; } logsModelMeta[limitIndex] = { - label: LIMIT_LABEL, + label: '', value: metaLimitValue, kind: LogsMetaKind.String, };