mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Correlation: Fix loki dataplane field change (#94088)
* Fix loki dataplane field change * Add test for dataplane * Reset feature toggle in test
This commit is contained in:
parent
4cc28c76fb
commit
32de1a00d3
@ -1,15 +1,17 @@
|
|||||||
import { DataFrame, DataSourceInstanceSettings, FieldType, toDataFrame } from '@grafana/data';
|
import { DataFrame, DataFrameType, DataSourceInstanceSettings, FieldType, toDataFrame } from '@grafana/data';
|
||||||
|
import { config } from '@grafana/runtime';
|
||||||
|
|
||||||
import { CorrelationData } from './useCorrelations';
|
import { CorrelationData } from './useCorrelations';
|
||||||
import { attachCorrelationsToDataFrames } from './utils';
|
import { attachCorrelationsToDataFrames } from './utils';
|
||||||
|
|
||||||
describe('correlations utils', () => {
|
describe('correlations utils', () => {
|
||||||
it('attaches correlations defined in the configuration', () => {
|
it('attaches correlations defined in the configuration', () => {
|
||||||
|
config.featureToggles.lokiLogsDataplane = false;
|
||||||
const { testDataFrames, correlations, refIdMap, prometheus, elastic } = setup();
|
const { testDataFrames, correlations, refIdMap, prometheus, elastic } = setup();
|
||||||
attachCorrelationsToDataFrames(testDataFrames, correlations, refIdMap);
|
attachCorrelationsToDataFrames(testDataFrames, correlations, refIdMap);
|
||||||
|
|
||||||
// Loki line (no links)
|
// Loki line
|
||||||
expect(testDataFrames[0].fields[0].config.links).toHaveLength(0);
|
expect(testDataFrames[0].fields[0].config.links).toHaveLength(1);
|
||||||
// Loki traceId (linked to Prometheus and Elastic)
|
// Loki traceId (linked to Prometheus and Elastic)
|
||||||
expect(testDataFrames[0].fields[1].config.links).toHaveLength(2);
|
expect(testDataFrames[0].fields[1].config.links).toHaveLength(2);
|
||||||
expect(testDataFrames[0].fields[1].config.links).toMatchObject([
|
expect(testDataFrames[0].fields[1].config.links).toMatchObject([
|
||||||
@ -68,10 +70,29 @@ describe('correlations utils', () => {
|
|||||||
// Prometheus value (linked to Elastic)
|
// Prometheus value (linked to Elastic)
|
||||||
expect(testDataFrames[2].fields[0].config.links).toHaveLength(1);
|
expect(testDataFrames[2].fields[0].config.links).toHaveLength(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('changes the config field if loki dataplane is being used and the correlation is pointing to the legacy body field (Line)', () => {
|
||||||
|
const originalDataplaneState = config.featureToggles.lokiLogsDataplane;
|
||||||
|
config.featureToggles.lokiLogsDataplane = true;
|
||||||
|
const { correlations, refIdMap } = setup();
|
||||||
|
const testDataFrame = toDataFrame({
|
||||||
|
name: 'Loki Logs',
|
||||||
|
refId: 'Loki Query',
|
||||||
|
fields: [
|
||||||
|
{ name: 'timestamp', values: [], type: FieldType.time },
|
||||||
|
{ name: 'body', values: [], type: FieldType.string },
|
||||||
|
{ name: 'traceId', values: [], type: FieldType.string },
|
||||||
|
],
|
||||||
|
meta: { type: DataFrameType.LogLines },
|
||||||
|
});
|
||||||
|
const dataFrameOut = attachCorrelationsToDataFrames([testDataFrame], [correlations[3]], refIdMap);
|
||||||
|
expect(dataFrameOut[0].fields[1].config.links).toHaveLength(1);
|
||||||
|
config.featureToggles.lokiLogsDataplane = originalDataplaneState;
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function setup() {
|
function setup() {
|
||||||
const loki = { uid: 'loki-uid', name: 'loki' } as DataSourceInstanceSettings;
|
const loki = { uid: 'loki-uid', name: 'loki', meta: { id: 'loki' } } as DataSourceInstanceSettings;
|
||||||
const elastic = { uid: 'elastic-uid', name: 'elastic' } as DataSourceInstanceSettings;
|
const elastic = { uid: 'elastic-uid', name: 'elastic' } as DataSourceInstanceSettings;
|
||||||
const prometheus = { uid: 'prometheus-uid', name: 'prometheus' } as DataSourceInstanceSettings;
|
const prometheus = { uid: 'prometheus-uid', name: 'prometheus' } as DataSourceInstanceSettings;
|
||||||
|
|
||||||
@ -86,15 +107,15 @@ function setup() {
|
|||||||
name: 'Loki Logs',
|
name: 'Loki Logs',
|
||||||
refId: 'Loki Query',
|
refId: 'Loki Query',
|
||||||
fields: [
|
fields: [
|
||||||
{ name: 'line', values: [] },
|
{ name: 'Line', values: [], type: FieldType.string },
|
||||||
{ name: 'traceId', values: [] },
|
{ name: 'traceId', values: [], type: FieldType.string },
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
toDataFrame({
|
toDataFrame({
|
||||||
name: 'Elastic Logs',
|
name: 'Elastic Logs',
|
||||||
refId: 'Elastic Query',
|
refId: 'Elastic Query',
|
||||||
fields: [
|
fields: [
|
||||||
{ name: 'line', values: [] },
|
{ name: 'Line', values: [] },
|
||||||
{ name: 'traceId', values: [] },
|
{ name: 'traceId', values: [] },
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
@ -134,7 +155,16 @@ function setup() {
|
|||||||
config: { field: 'value', target: { expr: 'target Elastic query' } },
|
config: { field: 'value', target: { expr: 'target Elastic query' } },
|
||||||
provisioned: false,
|
provisioned: false,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
uid: 'loki-to-loki',
|
||||||
|
label: 'logs to logs',
|
||||||
|
source: loki,
|
||||||
|
target: loki,
|
||||||
|
type: 'query',
|
||||||
|
config: { field: 'Line', target: { expr: 'target loki query' } },
|
||||||
|
provisioned: false,
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
return { testDataFrames, correlations, refIdMap, prometheus, elastic };
|
return { testDataFrames, correlations, refIdMap, loki, prometheus, elastic };
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
import { lastValueFrom } from 'rxjs';
|
import { lastValueFrom } from 'rxjs';
|
||||||
|
|
||||||
import { DataFrame, DataLinkConfigOrigin } from '@grafana/data';
|
import { DataFrame, DataLinkConfigOrigin } from '@grafana/data';
|
||||||
import { createMonitoringLogger, getBackendSrv, getDataSourceSrv } from '@grafana/runtime';
|
import { config, createMonitoringLogger, getBackendSrv, getDataSourceSrv } from '@grafana/runtime';
|
||||||
import { ExploreItemState } from 'app/types';
|
import { ExploreItemState } from 'app/types';
|
||||||
|
|
||||||
import { formatValueName } from '../explore/PrometheusListView/ItemLabels';
|
import { formatValueName } from '../explore/PrometheusListView/ItemLabels';
|
||||||
|
import { parseLogsFrame } from '../logs/logsFrame';
|
||||||
|
|
||||||
import { CreateCorrelationParams, CreateCorrelationResponse } from './types';
|
import { CreateCorrelationParams, CreateCorrelationResponse } from './types';
|
||||||
import {
|
import {
|
||||||
@ -43,7 +44,7 @@ export const attachCorrelationsToDataFrames = (
|
|||||||
}
|
}
|
||||||
|
|
||||||
const sourceCorrelations = correlations.filter((correlation) => correlation.source.uid === dataSourceUid);
|
const sourceCorrelations = correlations.filter((correlation) => correlation.source.uid === dataSourceUid);
|
||||||
decorateDataFrameWithInternalDataLinks(dataFrame, sourceCorrelations);
|
decorateDataFrameWithInternalDataLinks(dataFrame, fixLokiDataplaneFields(sourceCorrelations, dataFrame));
|
||||||
});
|
});
|
||||||
|
|
||||||
return dataFrames;
|
return dataFrames;
|
||||||
@ -83,6 +84,27 @@ const decorateDataFrameWithInternalDataLinks = (dataFrame: DataFrame, correlatio
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
If a correlation was made based on the log line field prior to the loki data plane, they would use the field "Line"
|
||||||
|
|
||||||
|
Change it to use whatever the body field name is post-loki data plane
|
||||||
|
*/
|
||||||
|
const fixLokiDataplaneFields = (correlations: CorrelationData[], dataFrame: DataFrame) => {
|
||||||
|
return correlations.map((correlation) => {
|
||||||
|
if (
|
||||||
|
correlation.source.meta?.id === 'loki' &&
|
||||||
|
config.featureToggles.lokiLogsDataplane === true &&
|
||||||
|
correlation.config.field === 'Line'
|
||||||
|
) {
|
||||||
|
const logsFrame = parseLogsFrame(dataFrame);
|
||||||
|
if (logsFrame != null && logsFrame.bodyField.name !== undefined) {
|
||||||
|
correlation.config.field = logsFrame?.bodyField.name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return correlation;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
export const getCorrelationsBySourceUIDs = async (sourceUIDs: string[]): Promise<CorrelationsData> => {
|
export const getCorrelationsBySourceUIDs = async (sourceUIDs: string[]): Promise<CorrelationsData> => {
|
||||||
return lastValueFrom(
|
return lastValueFrom(
|
||||||
getBackendSrv().fetch<CorrelationsResponse>({
|
getBackendSrv().fetch<CorrelationsResponse>({
|
||||||
|
Loading…
Reference in New Issue
Block a user