diff --git a/packages/grafana-data/src/panel/PanelPlugin.ts b/packages/grafana-data/src/panel/PanelPlugin.ts index b30d547e0d7..092103ada26 100644 --- a/packages/grafana-data/src/panel/PanelPlugin.ts +++ b/packages/grafana-data/src/panel/PanelPlugin.ts @@ -38,7 +38,7 @@ export class PanelPlugin) => void; - panel: ComponentType>; + panel: ComponentType> | null; editor?: ComponentClass>; onPanelMigration?: PanelMigrationHandler; onPanelTypeChanged?: PanelTypeChangedHandler; @@ -49,7 +49,7 @@ export class PanelPlugin>) { + constructor(panel: ComponentType> | null) { super(); this.panel = panel; } diff --git a/packages/grafana-data/src/utils/labels.ts b/packages/grafana-data/src/utils/labels.ts index 4724480282f..3bc0bec04b8 100644 --- a/packages/grafana-data/src/utils/labels.ts +++ b/packages/grafana-data/src/utils/labels.ts @@ -51,7 +51,7 @@ export function findCommonLabels(labelsSets: Labels[]): Labels { /** * Returns a map of labels that are in `labels`, but not in `commonLabels`. */ -export function findUniqueLabels(labels: Labels, commonLabels: Labels): Labels { +export function findUniqueLabels(labels: Labels | undefined, commonLabels: Labels): Labels { const uncommonLabels: Labels = { ...labels }; Object.keys(commonLabels).forEach(key => { delete uncommonLabels[key]; diff --git a/public/app/core/logs_model.test.ts b/public/app/core/logs_model.test.ts index 94742306d5d..b7ba513fad9 100644 --- a/public/app/core/logs_model.test.ts +++ b/public/app/core/logs_model.test.ts @@ -218,7 +218,7 @@ describe('dataFrameToLogsModel', () => { }, }), ]; - const logsModel = dataFrameToLogsModel(series, 0, 'utc'); + const logsModel = dataFrameToLogsModel(series, 1, 'utc'); expect(logsModel.hasUniqueLabels).toBeFalsy(); expect(logsModel.rows).toHaveLength(2); expect(logsModel.rows).toMatchObject([ @@ -274,12 +274,12 @@ describe('dataFrameToLogsModel', () => { ], }), ]; - const logsModel = dataFrameToLogsModel(series, 0, 'utc'); + const logsModel = dataFrameToLogsModel(series, 1, 'utc'); expect(logsModel.rows).toHaveLength(1); expect(logsModel.rows).toMatchObject([ { entry: 'WARN boooo', - labels: undefined, + labels: {}, logLevel: LogLevel.debug, uniqueLabels: {}, }, @@ -338,7 +338,7 @@ describe('dataFrameToLogsModel', () => { ], }), ]; - const logsModel = dataFrameToLogsModel(series, 0, 'utc'); + const logsModel = dataFrameToLogsModel(series, 1, 'utc'); expect(logsModel.hasUniqueLabels).toBeTruthy(); expect(logsModel.rows).toHaveLength(3); expect(logsModel.rows).toMatchObject([ @@ -448,7 +448,7 @@ describe('dataFrameToLogsModel', () => { ], }), ]; - const logsModel = dataFrameToLogsModel(series, 0, 'utc'); + const logsModel = dataFrameToLogsModel(series, 1, 'utc'); expect(logsModel.hasUniqueLabels).toBeTruthy(); expect(logsModel.rows).toHaveLength(4); expect(logsModel.rows).toMatchObject([ @@ -497,7 +497,7 @@ describe('dataFrameToLogsModel', () => { ], }), ]; - const logsModel = dataFrameToLogsModel(series, 0, 'utc'); + const logsModel = dataFrameToLogsModel(series, 1, 'utc'); expect(logsModel.rows[0].uid).toBe('0'); }); diff --git a/public/app/core/logs_model.ts b/public/app/core/logs_model.ts index f49a8240c0a..7288aaac8d0 100644 --- a/public/app/core/logs_model.ts +++ b/public/app/core/logs_model.ts @@ -192,14 +192,19 @@ function isLogsData(series: DataFrame) { * @param dataFrame * @param intervalMs In case there are no metrics series, we use this for computing it from log rows. */ -export function dataFrameToLogsModel(dataFrame: DataFrame[], intervalMs: number, timeZone: TimeZone): LogsModel { +export function dataFrameToLogsModel( + dataFrame: DataFrame[], + intervalMs: number | undefined, + timeZone: TimeZone +): LogsModel { const { logSeries, metricSeries } = separateLogsAndMetrics(dataFrame); const logsModel = logSeriesToLogsModel(logSeries); if (logsModel) { if (metricSeries.length === 0) { // Create metrics from logs - logsModel.series = makeSeriesForLogs(logsModel.rows, intervalMs, timeZone); + // If interval is not defined or 0 we cannot really compute the series + logsModel.series = intervalMs ? makeSeriesForLogs(logsModel.rows, intervalMs, timeZone) : []; } else { // We got metrics in the dataFrame so process those logsModel.series = getGraphSeriesModel( @@ -270,7 +275,7 @@ export function logSeriesToLogsModel(logSeries: DataFrame[]): LogsModel | undefi // Assume the first string field in the dataFrame is the message. This was right so far but probably needs some // more explicit checks. const stringField = fieldCache.getFirstFieldOfType(FieldType.string); - if (stringField.labels) { + if (stringField?.labels) { allLabels.push(stringField.labels); } return { @@ -279,7 +284,7 @@ export function logSeriesToLogsModel(logSeries: DataFrame[]): LogsModel | undefi stringField, logLevelField: fieldCache.getFieldByName('level'), idField: getIdField(fieldCache), - }; + } as LogFields; }); const commonLabels = allLabels.length > 0 ? findCommonLabels(allLabels) : {}; @@ -334,7 +339,7 @@ export function logSeriesToLogsModel(logSeries: DataFrame[]): LogsModel | undefi searchWords, entry: hasAnsi ? ansicolor.strip(message) : message, raw: message, - labels: stringField.labels, + labels: stringField.labels || {}, uid: idField ? idField.values.get(j) : j.toString(), }); } diff --git a/public/app/core/utils/explore.ts b/public/app/core/utils/explore.ts index 78952430aec..ac46a2d3889 100644 --- a/public/app/core/utils/explore.ts +++ b/public/app/core/utils/explore.ts @@ -507,7 +507,7 @@ export enum SortOrder { export const refreshIntervalToSortOrder = (refreshInterval?: string) => RefreshPicker.isLive(refreshInterval) ? SortOrder.Ascending : SortOrder.Descending; -export const sortLogsResult = (logsResult: LogsModel, sortOrder: SortOrder): LogsModel => { +export const sortLogsResult = (logsResult: LogsModel | null, sortOrder: SortOrder): LogsModel => { const rows = logsResult ? logsResult.rows : []; sortOrder === SortOrder.Ascending ? rows.sort(sortInAscendingOrder) : rows.sort(sortInDescendingOrder); const result: LogsModel = logsResult ? { ...logsResult, rows } : { hasUniqueLabels: false, rows }; diff --git a/public/app/features/explore/utils/ResultProcessor.test.ts b/public/app/features/explore/utils/ResultProcessor.test.ts index e091e64f2e5..36339400f8e 100644 --- a/public/app/features/explore/utils/ResultProcessor.test.ts +++ b/public/app/features/explore/utils/ResultProcessor.test.ts @@ -179,7 +179,7 @@ describe('ResultProcessor', () => { entry: 'third', entryFieldIndex: 2, hasAnsi: false, - labels: undefined, + labels: {}, logLevel: 'unknown', raw: 'third', searchWords: [] as string[], @@ -196,7 +196,7 @@ describe('ResultProcessor', () => { entry: 'second message', entryFieldIndex: 2, hasAnsi: false, - labels: undefined, + labels: {}, logLevel: 'unknown', raw: 'second message', searchWords: [] as string[], @@ -213,7 +213,7 @@ describe('ResultProcessor', () => { entry: 'this is a message', entryFieldIndex: 2, hasAnsi: false, - labels: undefined, + labels: {}, logLevel: 'unknown', raw: 'this is a message', searchWords: [] as string[], diff --git a/public/app/plugins/panel/logs/LogsPanel.tsx b/public/app/plugins/panel/logs/LogsPanel.tsx index ab8d186eee5..437193db178 100644 --- a/public/app/plugins/panel/logs/LogsPanel.tsx +++ b/public/app/plugins/panel/logs/LogsPanel.tsx @@ -21,7 +21,7 @@ export const LogsPanel: React.FunctionComponent = ({ ); } - const newResults = data ? dataFrameToLogsModel(data.series, data.request.intervalMs, timeZone) : null; + const newResults = data ? dataFrameToLogsModel(data.series, data.request?.intervalMs, timeZone) : null; const sortedNewResults = sortLogsResult(newResults, sortOrder); return ( diff --git a/public/app/plugins/panel/singlestat/module.ts b/public/app/plugins/panel/singlestat/module.ts index 563cad821a6..850c9ac2cfd 100644 --- a/public/app/plugins/panel/singlestat/module.ts +++ b/public/app/plugins/panel/singlestat/module.ts @@ -658,7 +658,7 @@ class SingleStatCtrl extends MetricsPanelCtrl { window.location.href = linkInfo.href; } else { $timeout(() => { - $location.url(locationUtil.stripBaseFromUrl(linkInfo.href)); + $location.url(locationUtil.stripBaseFromUrl(linkInfo!.href)); }); } diff --git a/scripts/ci-frontend-metrics.sh b/scripts/ci-frontend-metrics.sh index af786911ab7..ceb37a317e8 100755 --- a/scripts/ci-frontend-metrics.sh +++ b/scripts/ci-frontend-metrics.sh @@ -4,7 +4,7 @@ echo -e "Collecting code stats (typescript errors & more)" -ERROR_COUNT_LIMIT=798 +ERROR_COUNT_LIMIT=795 DIRECTIVES_LIMIT=172 CONTROLLERS_LIMIT=139